CONNECTORS-1739: Reuse escaping facilities.

git-svn-id: https://svn.apache.org/repos/asf/manifoldcf/branches/CONNECTORS-1739@1905590 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/LdapEscaper.java b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/LdapEscaper.java
new file mode 100644
index 0000000..beeb982
--- /dev/null
+++ b/framework/connector-common/src/main/java/org/apache/manifoldcf/connectorcommon/common/LdapEscaper.java
@@ -0,0 +1,90 @@
+package org.apache.manifoldcf.connectorcommon.common;

+

+/**

+ * Helper class to encode LDAP names and filter values.

+ */

+public class LdapEscaper {

+

+  private LdapEscaper() {

+    // private

+  }

+

+  /**

+   * Escape data for use in a LDAP distinguished name (DN).

+   *

+   * @param name the data to escape for a DN.

+   *

+   * @return name escaped for use in a DN.

+   */

+  public static String escapeDN(String name) {

+    StringBuilder sb = new 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();

+  }

+

+  /**

+   * Escape data for use in a LDAP filter query.

+   *

+   * @param filter the data to escape for a filter query.

+   *

+   * @return name escaped for use in a filter query.

+   */

+  public static String escapeFilter(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();

+  }}