com.google.enterprise.connector.sharepoint.spiimpl.SharepointConnectorType.java Source code

Java tutorial

Introduction

Here is the source code for com.google.enterprise.connector.sharepoint.spiimpl.SharepointConnectorType.java

Source

// Copyright 2007 Google Inc.
//
// 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 com.google.enterprise.connector.sharepoint.spiimpl;

import static com.google.common.base.Charsets.UTF_8;

import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.common.io.ByteStreams;
import com.google.enterprise.connector.sharepoint.client.BulkAuthorizationHelper;
import com.google.enterprise.connector.sharepoint.client.SPConstants;
import com.google.enterprise.connector.sharepoint.client.SharepointClientContext;
import com.google.enterprise.connector.sharepoint.client.SPConstants.FeedType;
import com.google.enterprise.connector.sharepoint.client.SPConstants.SPType;
import com.google.enterprise.connector.sharepoint.client.Util;
import com.google.enterprise.connector.sharepoint.client.WebsHelper;
import com.google.enterprise.connector.sharepoint.ldap.LdapConstants.AuthType;
import com.google.enterprise.connector.sharepoint.ldap.LdapConstants.LdapConnectionError;
import com.google.enterprise.connector.sharepoint.ldap.LdapConstants.Method;
import com.google.enterprise.connector.sharepoint.ldap.UserGroupsService.LdapConnection;
import com.google.enterprise.connector.sharepoint.ldap.UserGroupsService.LdapConnectionSettings;
import com.google.enterprise.connector.sharepoint.wsclient.client.ClientFactory;
import com.google.enterprise.connector.spi.ConfigureResponse;
import com.google.enterprise.connector.spi.ConnectorFactory;
import com.google.enterprise.connector.spi.ConnectorType;
import com.google.enterprise.connector.spi.SocialCollectionHandler;
import com.google.enterprise.connector.spi.XmlUtils;

import org.apache.commons.httpclient.auth.AuthPolicy;
import org.apache.commons.httpclient.contrib.auth.NegotiateScheme;

import gnu.regexp.RE;
import gnu.regexp.REMatch;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.Set;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.naming.InvalidNameException;
import javax.naming.NameNotFoundException;
import javax.naming.NamingException;
import javax.naming.ldap.LdapContext;

/**
 * ConnectorType implementation for Sharepoint This class is mainly desinged for
 * controlling the connector configuration which incompasses creation of
 * connector configuration form, validating the configuration values etc.
 */
public class SharepointConnectorType implements ConnectorType {
    private final Logger LOGGER = Logger.getLogger(SharepointConnectorType.class.getName());

    public static final String GOOGLE_CONN_WORK_DIR = "googleConnectorWorkDir";

    private final static List<String> CONFIG_LABELS;

    @VisibleForTesting
    final static List<String> CONFIG_FIELDS;

    static {
        ImmutableList<String> prefix = ImmutableList.of("sharepointUrl", "kdcserver", "domain", "username",
                "password", "mySiteBaseURL", "includedURls", "excludedURls", "aliasMap");
        ImmutableList<String> suffix = ImmutableList.of("authorization",
                // Push ACLs configuration
                "pushAcls", "usernameFormatInAce", "groupnameFormatInAce",
                // ldap configuration
                "ldapServerHostAddress", "portNumber", "searchBase", "authenticationType", "connectMethod",
                // LDAP user groups membership cache settings
                "useCacheToStoreLdapUserGroupsMembership", "initialCacheSize", "cacheRefreshInterval",
                // User profile settings
                "socialOption", "userProfileCollection");
        CONFIG_LABELS = ImmutableList.<String>builder().addAll(prefix).add("sharepointCrawlingOptions")
                .addAll(suffix).build();
        CONFIG_FIELDS = ImmutableList.<String>builder().addAll(prefix).add("useSPSearchVisibility")
                .add("feedUnPublishedDocuments").addAll(suffix).build();
    }

    private String sharepointUrl = null;
    private String domain = null;
    private String username = null;
    private String password = null;
    private String includeURL = null;
    private String excludeURL = null;
    private String mySiteUrl = null;
    private Map<String, ArrayList<String>> aliasMap = null;
    private String useSPSearchVisibility = null;

    // Create dummy context for doing validations.
    private SharepointClientContext sharepointClientContext = null;

    private ResourceBundle rb = null;
    private String pushAcls = null;
    private String usernameFormatInAce;
    private String groupnameFormatInAce;
    private String ldapServerHostAddress;
    private String portNumber;
    private String authenticationType;
    private String connectMethod;
    private String searchBase;
    private String initialCacheSize;
    private String useCacheToStoreLdapUserGroupsMembership;
    private String cacheRefreshInterval;
    private LdapConnectionSettings ldapConnectionSettings;
    private boolean editMode;

    /**
     * The client factory used to configure and instantiate the
     * client web service facade.
     */
    private ClientFactory clientFactory;

    /**
     * Returns the client factory for the web services.
     *
     * @return a client factory object
     */
    public ClientFactory getClientFactory() {
        return clientFactory;
    }

    /**
     * Sets the client factory for the web services.
     *
     * @param clientFactory the client factory to use for the web services
     */
    public void setClientFactory(final ClientFactory clientFactory) {
        this.clientFactory = clientFactory;
    }

    /**
     * Makes a config form snippet using the keys (in the supplied order) and, if
     * passed a non-null config map, pre-filling values in from that map.
     *
     * @param configMap
     *          The configuration keys and their values
     * @param ed
     *          Contains the validation error, if any
     */
    private String makeConfigForm(final Map<String, String> configMap, final ErrorDignostics ed) {
        final StringBuffer buf = new StringBuffer();
        for (String key : CONFIG_LABELS) {
            String configKey = rb.getString(key);

            boolean isError = (ed != null) && key.equals(ed.error_key);
            appendStartRow(buf, key, configKey, isError);

            if (key.equals(SPConstants.ALIAS_MAP)) {
                addAliasMap(buf, key, configMap);
            }

            String value = null;
            if (configMap != null) {
                value = configMap.get(key);
            }
            if (value == null) {
                value = "";
            }

            if (key.equals(SPConstants.SOCIAL_OPTION)) {
                addSocialOption(value, buf, key);
            } else if (key.equals(SPConstants.AUTHORIZATION)) {
                addAuthorization(value, buf, key);
            } else if (key.equals(SPConstants.SHAREPOINT_CRAWLING_OPTIONS)) {
                addSharePointCrawlingOptions(value, buf, key, configMap);
            } else if (key.equals(SPConstants.AUTHENTICATION_TYPE)) {
                addAuthentication(value, buf, key);
            } else if (key.equals(SPConstants.CONNECT_METHOD)) {
                addConnectMethod(value, buf, key);
            } else if (key.equals(SPConstants.PUSH_ACLS)) {
                addPushAcls(value, buf, key);
            } else if (key.equals(SPConstants.USE_CACHE_TO_STORE_LDAP_USER_GROUPS_MEMBERSHIP)) {
                addUseLdapCache(value, buf, key);
            } else if ((key.equals(SPConstants.EXCLUDED_URLS)) || (key.equals(SPConstants.INCLUDED_URLS))) {
                addUrlPatterns(value, buf, key);
            } else if (key.equals(SPConstants.USERNAME_FORMAT_IN_ACE)) {
                addUserFormat(value, buf, key);
            } else if (key.equals(SPConstants.GROUPNAME_FORMAT_IN_ACE)) {
                addGroupFormat(value, buf, key);
            } else {
                addTextField(value, buf, key);
            }
            buf.append(SPConstants.TD_END);
            buf.append(SPConstants.TR_END);
        }

        buf.append(SPConstants.START_BOLD);
        buf.append(rb.getString(SPConstants.MANDATORY_FIELDS));
        buf.append(SPConstants.END_BOLD);

        addJavaScript(buf);

        return buf.toString();
    }

    private void addAliasMap(StringBuffer buf, String key, Map<String, String> configMap) {
        appendTableForAliasMapping(buf);
        if (configMap == null) {
            appendRowForAliasMapping(buf, SPConstants.BLANK_STRING, SPConstants.BLANK_STRING, false);
        } else {
            final String aliasMapString = configMap.get(key);
            parseAlias(aliasMapString, null);
            if (aliasMap == null) {
                appendRowForAliasMapping(buf, SPConstants.BLANK_STRING, SPConstants.BLANK_STRING, false);
            } else {
                final Set<String> aliasValues = aliasMap.keySet();
                int i = 0;
                for (final Iterator<String> aliasItr = aliasValues.iterator(); aliasItr.hasNext();) {
                    final String alias_source_pattern = aliasItr.next();
                    String alias_host_port = "";
                    final ArrayList<String> aliases = aliasMap.get(alias_source_pattern);
                    if (aliases.size() == 0) {
                        if (i % 2 == 0) {
                            appendRowForAliasMapping(buf, SPConstants.BLANK_STRING, SPConstants.BLANK_STRING,
                                    false);
                        } else {
                            appendRowForAliasMapping(buf, SPConstants.BLANK_STRING, SPConstants.BLANK_STRING, true);
                        }
                        ++i;
                    } else {
                        try {
                            for (final Iterator<String> it = aliases.iterator(); it.hasNext();) {
                                alias_host_port = it.next();
                                if (it.hasNext() || aliasItr.hasNext()) {
                                    if (i % 2 == 0) {
                                        appendRowForAliasMapping(buf, alias_source_pattern, alias_host_port, false);
                                    } else {
                                        appendRowForAliasMapping(buf, alias_source_pattern, alias_host_port, true);
                                    }
                                } else {
                                    if (i % 2 == 0) {
                                        appendRowForAliasMapping(buf, alias_source_pattern, alias_host_port, false);
                                    } else {
                                        appendRowForAliasMapping(buf, alias_source_pattern, alias_host_port, true);
                                    }
                                }
                                ++i;
                            }
                        } catch (final Exception e) {
                            final String logMessage = "Could not find the alias value for the pattern ["
                                    + alias_source_pattern + "].";
                            LOGGER.log(Level.WARNING, logMessage, e);
                        }
                    }
                }
            }
        }
        buf.append(SPConstants.TR_START);
        buf.append(SPConstants.TD_START_ADDMRE);
        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.INPUT);
        appendAttribute(buf, SPConstants.TYPE, SPConstants.SUBMIT);
        appendAttribute(buf, SPConstants.VALUE, rb.getString(SPConstants.ADD_MORE));
        appendAttribute(buf, SPConstants.ONCLICK, "addRow(); return false");
        buf.append(SPConstants.SLASH + SPConstants.CLOSE_ELEMENT);
        buf.append(SPConstants.TD_END);
        buf.append(SPConstants.TR_END);

        buf.append(SPConstants.END_TABLE);
    }

    private void addSocialOption(String value, StringBuffer buf, String key) {
        // TODO : Enable Yes option back after fixing b/7048149
        /*
          buf.append(SPConstants.BREAK_LINE);
          buf.append(SPConstants.OPEN_ELEMENT);
          buf.append(SPConstants.INPUT);
          appendAttribute(buf, SPConstants.TYPE, SPConstants.RADIO);
          appendAttribute(buf, SPConstants.CONFIG_NAME, key);
          appendAttribute(buf, SPConstants.CONFIG_ID, key);
          appendAttribute(buf, SPConstants.VALUE, SPConstants.SOCIAL_OPTION_YES);
          appendAttribute(buf, SPConstants.TITLE,
              rb.getString(SPConstants.SOCIAL_OPTION_YES));
          if (value.equalsIgnoreCase(SPConstants.SOCIAL_OPTION_YES)) {
            appendAttribute(buf, SPConstants.CHECKED, SPConstants.CHECKED);
          }
          buf.append(" /" + SPConstants.CLOSE_ELEMENT);
          buf.append(rb.getString(SPConstants.SOCIAL_OPTION_YES));
        */
        buf.append(SPConstants.BREAK_LINE);
        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.INPUT);
        appendAttribute(buf, SPConstants.TYPE, SPConstants.RADIO);
        appendAttribute(buf, SPConstants.CONFIG_NAME, key);
        appendAttribute(buf, SPConstants.CONFIG_ID, key);
        appendAttribute(buf, SPConstants.VALUE, SPConstants.SOCIAL_OPTION_NO);
        appendAttribute(buf, SPConstants.TITLE, rb.getString(SPConstants.SOCIAL_OPTION_NO));
        // Checking radio button for No if value is blank or No or any
        // other value other than Yes and Social Only.
        if (value.equalsIgnoreCase(SPConstants.SOCIAL_OPTION_YES) == false
                && value.equalsIgnoreCase(SPConstants.SOCIAL_OPTION_ONLY) == false) {
            appendAttribute(buf, SPConstants.CHECKED, SPConstants.CHECKED);
        }
        buf.append(" /" + SPConstants.CLOSE_ELEMENT);
        buf.append(rb.getString(SPConstants.SOCIAL_OPTION_NO));
        buf.append(SPConstants.BREAK_LINE);
        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.INPUT);
        appendAttribute(buf, SPConstants.TYPE, SPConstants.RADIO);
        appendAttribute(buf, SPConstants.CONFIG_NAME, key);
        appendAttribute(buf, SPConstants.CONFIG_ID, key);
        appendAttribute(buf, SPConstants.VALUE, SPConstants.SOCIAL_OPTION_ONLY);
        appendAttribute(buf, SPConstants.TITLE, rb.getString(SPConstants.SOCIAL_OPTION_ONLY));
        if (value.equalsIgnoreCase(SPConstants.SOCIAL_OPTION_ONLY)) {
            appendAttribute(buf, SPConstants.CHECKED, SPConstants.CHECKED);
        }
        buf.append(" /" + SPConstants.CLOSE_ELEMENT);
        buf.append(rb.getString(SPConstants.SOCIAL_OPTION_ONLY));
    }

    private void addAuthorization(String value, StringBuffer buf, String key) {
        buf.append(SPConstants.BREAK_LINE);
        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.INPUT);
        appendAttribute(buf, SPConstants.TYPE, SPConstants.RADIO);
        appendAttribute(buf, SPConstants.CONFIG_NAME, key);
        appendAttribute(buf, SPConstants.CONFIG_ID, key);
        appendAttribute(buf, SPConstants.VALUE, FeedType.METADATA_URL_FEED.toString());
        appendAttribute(buf, SPConstants.TITLE, rb.getString(SPConstants.HELP_AUTHZ_BY_GSA));
        if ((value.length() == 0) || value.equalsIgnoreCase(FeedType.METADATA_URL_FEED.toString())) {
            appendAttribute(buf, SPConstants.CHECKED, SPConstants.CHECKED);
        }
        buf.append(" /" + SPConstants.CLOSE_ELEMENT);
        buf.append(rb.getString(SPConstants.AUTHZ_BY_GSA));
        buf.append(SPConstants.BREAK_LINE);
        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.INPUT);
        appendAttribute(buf, SPConstants.TYPE, SPConstants.RADIO);
        appendAttribute(buf, SPConstants.CONFIG_NAME, key);
        appendAttribute(buf, SPConstants.CONFIG_ID, key);
        appendAttribute(buf, SPConstants.VALUE, FeedType.CONTENT_FEED.toString());
        appendAttribute(buf, SPConstants.TITLE, rb.getString(SPConstants.HELP_AUTHZ_BY_CONNECTOR));
        if (value.equalsIgnoreCase(FeedType.CONTENT_FEED.toString())) {
            appendAttribute(buf, SPConstants.CHECKED, SPConstants.CHECKED);
        }
        buf.append(" /" + SPConstants.CLOSE_ELEMENT);
        buf.append(rb.getString(SPConstants.AUTHZ_BY_CONNECTOR));
    }

    private void addSharePointCrawlingOptions(String value, StringBuffer buf, String key,
            Map<String, String> configMap) {
        addUseSpSearchVisibility(value, buf, key, configMap);
        addFeedUnpublishedContent(value, buf, key, configMap);
    }

    private void addUseSpSearchVisibility(String value, StringBuffer buf, String key,
            Map<String, String> configMap) {
        String spSearchVisibilityValue = null;
        String spSearchVisibilityKey = SPConstants.USE_SP_SEARCH_VISIBILITY;
        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.INPUT);
        appendAttribute(buf, SPConstants.TYPE, SPConstants.CHECKBOX);
        appendAttribute(buf, SPConstants.CONFIG_NAME, spSearchVisibilityKey);
        appendAttribute(buf, SPConstants.CONFIG_ID, spSearchVisibilityKey);
        appendAttribute(buf, SPConstants.TITLE, rb.getString(SPConstants.USE_SP_SEARCH_VISIBILITY_HELP));
        // The value can be true if its a pre-configured connector
        // being edited and blank if the default connector form is
        // being displayed.
        if (configMap != null) {
            spSearchVisibilityValue = configMap.get(SPConstants.USE_SP_SEARCH_VISIBILITY);
        }

        if (spSearchVisibilityValue == null) {
            spSearchVisibilityValue = "";
        }
        if (spSearchVisibilityValue.equalsIgnoreCase("true") || spSearchVisibilityValue.length() == 0) {
            appendAttribute(buf, SPConstants.CHECKED, Boolean.toString(true));
        }
        buf.append(" /" + SPConstants.CLOSE_ELEMENT);
        // It allows to select check box using it's label.
        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.LABEL_FOR + SPConstants.EQUAL_TO + "\""
                + SPConstants.USE_SP_SEARCH_VISIBILITY + "\"" + SPConstants.CLOSE_ELEMENT);
        buf.append(rb.getString(SPConstants.USE_SP_SEARCH_VISIBILITY_LABEL));
        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.SLASH + SPConstants.LABEL + SPConstants.CLOSE_ELEMENT);
    }

    private void addFeedUnpublishedContent(String value, StringBuffer buf, String key,
            Map<String, String> configMap) {
        String unpublishedContentKey = SPConstants.FEED_UNPUBLISHED_CONTENT;
        buf.append(SPConstants.BREAK_LINE);
        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.INPUT);
        appendAttribute(buf, SPConstants.TYPE, SPConstants.CHECKBOX);
        appendAttribute(buf, SPConstants.CONFIG_NAME, unpublishedContentKey);
        appendAttribute(buf, SPConstants.CONFIG_ID, unpublishedContentKey);
        appendAttribute(buf, SPConstants.TITLE, rb.getString(unpublishedContentKey));
        String feedUnpublishedContentValue = null;
        if (configMap != null) {
            feedUnpublishedContentValue = configMap.get(SPConstants.FEED_UNPUBLISHED_CONTENT);
        }
        if (feedUnpublishedContentValue == null) {
            feedUnpublishedContentValue = "";
        }
        if (feedUnpublishedContentValue.equalsIgnoreCase("true") || feedUnpublishedContentValue.length() == 0) {
            appendAttribute(buf, SPConstants.CHECKED, Boolean.toString(true));
        } else {
            appendAttribute(buf, SPConstants.UNCHECKED, Boolean.toString(false));
        }
        buf.append(" /" + SPConstants.CLOSE_ELEMENT);
        // It allows to select check box using it's label.
        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.LABEL_FOR + SPConstants.EQUAL_TO + "\""
                + SPConstants.FEED_UNPUBLISHED_CONTENT + "\"" + SPConstants.CLOSE_ELEMENT);
        buf.append(rb.getString(SPConstants.FEED_UNPUBLISHED_CONTENT_LABEL));
        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.SLASH + SPConstants.LABEL + SPConstants.CLOSE_ELEMENT);
        buf.append(SPConstants.BREAK_LINE);
    }

    private void addAuthentication(String value, StringBuffer buf, String key) {
        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.SELECT);
        appendAttribute(buf, SPConstants.CONFIG_NAME, key);
        appendAttribute(buf, SPConstants.CONFIG_ID, key);
        buf.append(SPConstants.SPACE + SPConstants.STYLE);
        if (editMode) {
            if (this.pushAcls.equalsIgnoreCase(SPConstants.OFF)) {
                buf.append(SPConstants.SPACE + SPConstants.DISABLED + SPConstants.EQUAL_TO + "\"" + SPConstants.TRUE
                        + "\"");
            }
        }
        buf.append(SPConstants.CLOSE_ELEMENT + SPConstants.NEW_LINE);
        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.OPTION + SPConstants.SPACE + SPConstants.VALUE
                + SPConstants.EQUAL_TO + "\"");
        buf.append(SPConstants.AUTHENTICATION_TYPE_SIMPLE);
        buf.append("\"");
        if (Strings.isNullOrEmpty(value) || value.equalsIgnoreCase(SPConstants.AUTHENTICATION_TYPE_SIMPLE)) {
            buf.append(SPConstants.SPACE + SPConstants.SELECTED + SPConstants.EQUAL_TO + "\"" + SPConstants.SELECTED
                    + "\"");
        }
        buf.append(SPConstants.CLOSE_ELEMENT + SPConstants.AUTHENTICATION_TYPE_SIMPLE);
        buf.append(SPConstants.OPEN_ELEMENT + "/" + SPConstants.OPTION + SPConstants.CLOSE_ELEMENT);
        buf.append(SPConstants.NEW_LINE + SPConstants.OPEN_ELEMENT + SPConstants.OPTION + SPConstants.SPACE
                + SPConstants.VALUE + SPConstants.EQUAL_TO + "\"");
        buf.append(SPConstants.AUTHENTICATION_TYPE_ANONYMOUS);
        buf.append("\"");
        if (value.equalsIgnoreCase(SPConstants.AUTHENTICATION_TYPE_ANONYMOUS)) {
            buf.append(SPConstants.SPACE + SPConstants.SELECTED + SPConstants.EQUAL_TO + "\"" + SPConstants.SELECTED
                    + "\"");
        }
        buf.append(SPConstants.CLOSE_ELEMENT + SPConstants.AUTHENTICATION_TYPE_ANONYMOUS);
        buf.append(SPConstants.OPEN_ELEMENT + "/" + SPConstants.OPTION + SPConstants.CLOSE_ELEMENT);
        buf.append(SPConstants.NEW_LINE + SPConstants.OPEN_ELEMENT + "/" + SPConstants.SELECT
                + SPConstants.CLOSE_ELEMENT);
    }

    private void addConnectMethod(String value, StringBuffer buf, String key) {
        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.SELECT);
        appendAttribute(buf, SPConstants.CONFIG_NAME, key);
        appendAttribute(buf, SPConstants.CONFIG_ID, key);
        buf.append(SPConstants.SPACE + SPConstants.STYLE);
        if (editMode) {
            if ((this.pushAcls == null) || (this.pushAcls.equalsIgnoreCase(SPConstants.OFF))) {
                buf.append(SPConstants.SPACE + SPConstants.DISABLED + SPConstants.EQUAL_TO + "\"" + SPConstants.TRUE
                        + "\"");
            }
        }
        buf.append(SPConstants.CLOSE_ELEMENT + SPConstants.NEW_LINE);
        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.OPTION + SPConstants.SPACE + SPConstants.VALUE
                + SPConstants.EQUAL_TO + "\"");
        buf.append(SPConstants.CONNECT_METHOD_STANDARD);
        buf.append("\"");
        if (Strings.isNullOrEmpty(value) || value.equalsIgnoreCase(SPConstants.CONNECT_METHOD_STANDARD)) {
            buf.append(SPConstants.SPACE + SPConstants.SELECTED + SPConstants.EQUAL_TO + "\"" + SPConstants.SELECTED
                    + "\"");
        }
        buf.append(SPConstants.CLOSE_ELEMENT + SPConstants.CONNECT_METHOD_STANDARD);
        buf.append(SPConstants.OPEN_ELEMENT + "/" + SPConstants.OPTION + SPConstants.CLOSE_ELEMENT);
        buf.append(SPConstants.NEW_LINE + SPConstants.OPEN_ELEMENT + SPConstants.OPTION + SPConstants.SPACE
                + SPConstants.VALUE + SPConstants.EQUAL_TO + "\"");
        buf.append(SPConstants.CONNECT_METHOD_SSL);
        buf.append("\"");
        if (value.equalsIgnoreCase(SPConstants.CONNECT_METHOD_SSL)) {
            buf.append(SPConstants.SPACE + SPConstants.SELECTED + SPConstants.EQUAL_TO + "\"" + SPConstants.SELECTED
                    + "\"");
        }
        buf.append(SPConstants.CLOSE_ELEMENT + SPConstants.CONNECT_METHOD_SSL);
        buf.append(SPConstants.OPEN_ELEMENT + "/" + SPConstants.OPTION + SPConstants.CLOSE_ELEMENT);
        buf.append(SPConstants.NEW_LINE + SPConstants.OPEN_ELEMENT + "/" + SPConstants.SELECT
                + SPConstants.CLOSE_ELEMENT);
    }

    private void addPushAcls(String value, StringBuffer buf, String key) {
        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.INPUT);
        appendAttribute(buf, SPConstants.TYPE, SPConstants.CHECKBOX);
        appendAttribute(buf, SPConstants.CONFIG_NAME, key);
        appendAttribute(buf, SPConstants.CONFIG_ID, key);
        appendAttribute(buf, SPConstants.TITLE, rb.getString(SPConstants.PUSH_ACLS_LABEL));
        if (value.equalsIgnoreCase("true") || value.length() == 0) {
            appendAttribute(buf, SPConstants.CHECKED, Boolean.toString(true));
        } else {
            appendAttribute(buf, SPConstants.UNCHECKED, Boolean.toString(false));
            this.pushAcls = SPConstants.OFF;
        }
        buf.append(SPConstants.SPACE + SPConstants.ON_CLICK);
        buf.append("\"enableFeedAclsRelatedHtmlControls();\"");
        buf.append(" /" + SPConstants.CLOSE_ELEMENT);
        // It allows to select check box using it's label.
        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.LABEL_FOR + SPConstants.EQUAL_TO + "\"" + key + "\""
                + SPConstants.CLOSE_ELEMENT);
        buf.append(rb.getString(SPConstants.PUSH_ACLS_LABEL));
        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.SLASH + SPConstants.LABEL + SPConstants.CLOSE_ELEMENT);
    }

    private void addUseLdapCache(String value, StringBuffer buf, String key) {
        buf.append(SPConstants.BREAK_LINE);
        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.INPUT);
        appendAttribute(buf, SPConstants.TYPE, SPConstants.CHECKBOX);
        appendAttribute(buf, SPConstants.CONFIG_NAME, key);
        appendAttribute(buf, SPConstants.CONFIG_ID, key);
        appendAttribute(buf, SPConstants.TITLE,
                rb.getString(SPConstants.USE_CACHE_TO_STORE_LDAP_USER_GROUPS_MEMBERSHIP_LABEL));
        if (value.equalsIgnoreCase("false") || value.length() == 0) {
            appendAttribute(buf, SPConstants.UNCHECKED, Boolean.toString(false));
            if (editMode) {
                buf.append(SPConstants.SPACE + SPConstants.DISABLED + SPConstants.EQUAL_TO + "\"" + SPConstants.TRUE
                        + "\"");
            }
        } else {
            appendAttribute(buf, SPConstants.CHECKED, Boolean.toString(true));
        }

        buf.append(SPConstants.SPACE + SPConstants.ON_CLICK);
        buf.append("\"enableOrDisableUserGroupsCacheControls();\"");
        buf.append(" /" + SPConstants.CLOSE_ELEMENT);
        // It allows to select check box using it's label.
        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.LABEL_FOR + SPConstants.EQUAL_TO + "\"" + key + "\""
                + SPConstants.CLOSE_ELEMENT);
        buf.append(rb.getString(SPConstants.USE_CACHE_TO_STORE_LDAP_USER_GROUPS_MEMBERSHIP_LABEL));
        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.SLASH + SPConstants.LABEL + SPConstants.CLOSE_ELEMENT);
    }

    private void addUrlPatterns(String value, StringBuffer buf, String key) {
        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.TEXTAREA);
        appendAttribute(buf, SPConstants.CONFIG_NAME, key);
        appendAttribute(buf, SPConstants.CONFIG_ID, key);
        appendAttribute(buf, SPConstants.ROWS, SPConstants.ROWS_VALUE);
        appendAttribute(buf, SPConstants.COLS, SPConstants.COLS_VALUE);
        appendAttribute(buf, SPConstants.TEXTBOX_SIZE, SPConstants.TEXTBOX_SIZE_VALUE);
        buf.append(SPConstants.CLOSE_ELEMENT);

        buf.append(value.replace(SPConstants.SPACE, SPConstants.NEW_LINE));

        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.END_TEXTAREA);
        buf.append(SPConstants.CLOSE_ELEMENT);
    }

    private void addUserFormat(String value, StringBuffer buf, String key) {
        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.SELECT);
        appendAttribute(buf, SPConstants.CONFIG_NAME, key);
        appendAttribute(buf, SPConstants.CONFIG_ID, key);
        buf.append(SPConstants.SPACE + SPConstants.STYLE);
        if (editMode) {
            if ((this.pushAcls == null) || (this.pushAcls.equalsIgnoreCase(SPConstants.OFF))) {
                buf.append(SPConstants.SPACE + SPConstants.DISABLED + SPConstants.EQUAL_TO + "\"" + SPConstants.TRUE
                        + "\"");
            }
        }
        buf.append(SPConstants.CLOSE_ELEMENT + SPConstants.NEW_LINE);
        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.OPTION + SPConstants.SPACE + SPConstants.VALUE
                + SPConstants.EQUAL_TO + "\"");
        buf.append(SPConstants.USERNAME_FORMAT_IN_ACE_DOMAINNAME_SLASH_USERNAME);
        buf.append("\"");
        if (Strings.isNullOrEmpty(value)
                || value.equalsIgnoreCase(SPConstants.USERNAME_FORMAT_IN_ACE_DOMAINNAME_SLASH_USERNAME)) {
            buf.append(SPConstants.SPACE + SPConstants.SELECTED + SPConstants.EQUAL_TO + "\"" + SPConstants.SELECTED
                    + "\"");
        }
        buf.append(SPConstants.CLOSE_ELEMENT + SPConstants.USERNAME_FORMAT_IN_ACE_DOMAINNAME_SLASH_USERNAME);
        buf.append(SPConstants.OPEN_ELEMENT + "/" + SPConstants.OPTION + SPConstants.CLOSE_ELEMENT);
        buf.append(SPConstants.NEW_LINE + SPConstants.OPEN_ELEMENT + SPConstants.OPTION + SPConstants.SPACE
                + SPConstants.VALUE + SPConstants.EQUAL_TO + "\"");
        buf.append(SPConstants.USERNAME_FORMAT_IN_ACE_USERNAME_AT_DOMAINNAME);
        buf.append("\"");
        if (value.equalsIgnoreCase(SPConstants.USERNAME_FORMAT_IN_ACE_USERNAME_AT_DOMAINNAME)) {
            buf.append(SPConstants.SPACE + SPConstants.SELECTED + SPConstants.EQUAL_TO + "\"" + SPConstants.SELECTED
                    + "\"");
        }
        buf.append(SPConstants.CLOSE_ELEMENT + SPConstants.USERNAME_FORMAT_IN_ACE_USERNAME_AT_DOMAINNAME);
        buf.append(SPConstants.OPEN_ELEMENT + "/" + SPConstants.OPTION + SPConstants.CLOSE_ELEMENT);
        buf.append(SPConstants.NEW_LINE + SPConstants.OPEN_ELEMENT + SPConstants.OPTION + SPConstants.SPACE
                + SPConstants.VALUE + SPConstants.EQUAL_TO + "\"");
        buf.append(SPConstants.USERNAME_FORMAT_IN_ACE_ONLY_USERNAME);
        buf.append("\"");
        if (value.equalsIgnoreCase(SPConstants.USERNAME_FORMAT_IN_ACE_ONLY_USERNAME)) {
            buf.append(SPConstants.SPACE + SPConstants.SELECTED + SPConstants.EQUAL_TO + "\"" + SPConstants.SELECTED
                    + "\"");
        }
        buf.append(SPConstants.SPACE + ">" + SPConstants.USERNAME_FORMAT_IN_ACE_ONLY_USERNAME + SPConstants.SPACE);
        buf.append(SPConstants.OPEN_ELEMENT + "/" + SPConstants.OPTION + SPConstants.CLOSE_ELEMENT);
        buf.append(SPConstants.NEW_LINE + SPConstants.OPEN_ELEMENT + "/" + SPConstants.SELECT
                + SPConstants.CLOSE_ELEMENT);
    }

    private void addGroupFormat(String value, StringBuffer buf, String key) {
        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.SELECT);
        appendAttribute(buf, SPConstants.CONFIG_NAME, key);
        appendAttribute(buf, SPConstants.CONFIG_ID, key);
        buf.append(SPConstants.SPACE + SPConstants.STYLE);
        if (editMode) {
            if (this.pushAcls.equalsIgnoreCase(SPConstants.OFF)) {
                buf.append(SPConstants.SPACE + SPConstants.DISABLED + SPConstants.EQUAL_TO + "\"" + SPConstants.TRUE
                        + "\"");
            }
        }
        buf.append(SPConstants.CLOSE_ELEMENT + SPConstants.NEW_LINE);
        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.OPTION + SPConstants.SPACE + SPConstants.VALUE
                + SPConstants.EQUAL_TO + "\"");
        buf.append(SPConstants.GROUPNAME_FORMAT_IN_ACE_ONLY_GROUP_NAME);
        buf.append("\"");
        if (value.equalsIgnoreCase(SPConstants.GROUPNAME_FORMAT_IN_ACE_ONLY_GROUP_NAME)) {
            buf.append(SPConstants.SPACE + SPConstants.SELECTED + SPConstants.EQUAL_TO + "\"" + SPConstants.SELECTED
                    + "\"");
        }
        buf.append(SPConstants.CLOSE_ELEMENT + SPConstants.GROUPNAME_FORMAT_IN_ACE_ONLY_GROUP_NAME);
        buf.append(SPConstants.OPEN_ELEMENT + "/" + SPConstants.OPTION + SPConstants.CLOSE_ELEMENT);
        buf.append(SPConstants.NEW_LINE + SPConstants.OPEN_ELEMENT + SPConstants.OPTION + SPConstants.SPACE
                + SPConstants.VALUE + SPConstants.EQUAL_TO + "\"");
        buf.append(SPConstants.GROUPNAME_FORMAT_IN_ACE_DOMAINNAME_SLASH_GROUPNAME);
        buf.append("\"");
        if (Strings.isNullOrEmpty(value)
                || value.equalsIgnoreCase(SPConstants.GROUPNAME_FORMAT_IN_ACE_DOMAINNAME_SLASH_GROUPNAME)) {
            buf.append(SPConstants.SPACE + SPConstants.SELECTED + SPConstants.EQUAL_TO + "\"" + SPConstants.SELECTED
                    + "\"");
        }
        buf.append(SPConstants.CLOSE_ELEMENT + SPConstants.GROUPNAME_FORMAT_IN_ACE_DOMAINNAME_SLASH_GROUPNAME);
        buf.append(SPConstants.OPEN_ELEMENT + "/" + SPConstants.OPTION + SPConstants.CLOSE_ELEMENT);
        buf.append(SPConstants.NEW_LINE + SPConstants.OPEN_ELEMENT + SPConstants.OPTION + SPConstants.SPACE
                + SPConstants.VALUE + SPConstants.EQUAL_TO + "\"");
        buf.append(SPConstants.GROUPNAME_FORMAT_IN_ACE_GROUPNAME_AT_DOMAIN);
        buf.append("\"");
        if (value.equalsIgnoreCase(SPConstants.GROUPNAME_FORMAT_IN_ACE_GROUPNAME_AT_DOMAIN)) {
            buf.append(SPConstants.SPACE + SPConstants.SELECTED + SPConstants.EQUAL_TO + "\"" + SPConstants.SELECTED
                    + "\"");
        }
        buf.append(">" + SPConstants.GROUPNAME_FORMAT_IN_ACE_GROUPNAME_AT_DOMAIN);
        buf.append(SPConstants.OPEN_ELEMENT + "/" + SPConstants.OPTION + SPConstants.CLOSE_ELEMENT);
        buf.append(SPConstants.NEW_LINE + SPConstants.OPEN_ELEMENT + "/" + SPConstants.SELECT
                + SPConstants.CLOSE_ELEMENT);
        buf.append(SPConstants.TD_END);
        buf.append(SPConstants.TR_END);
        buf.append(SPConstants.BREAK_LINE);
        buf.append(SPConstants.TR_START + SPConstants.TD_START + SPConstants.START_BOLD);
        buf.append(rb.getString(SPConstants.LDAP_CONFIGURATION_SETTINGS));
        buf.append(SPConstants.END_BOLD);
    }

    private void addTextField(String value, StringBuffer buf, String key) {
        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.INPUT);
        if (key.equals(SPConstants.PASSWORD)) {
            appendAttribute(buf, SPConstants.TYPE, SPConstants.PASSWORD);
        } else if (key.equals(SPConstants.ALIAS_MAP)) {
            appendAttribute(buf, SPConstants.TYPE, SPConstants.HIDDEN);
        } else {
            appendAttribute(buf, SPConstants.TYPE, SPConstants.TEXT);
        }
        appendAttribute(buf, SPConstants.CONFIG_NAME, key);
        appendAttribute(buf, SPConstants.CONFIG_ID, key);
        if (key.equals(SPConstants.PORT_NUMBER) || key.equals(SPConstants.INITAL_CACHE_SIZE)
                || key.equals(SPConstants.CACHE_REFRESH_INTERVAL)) {
            if (key.equals(SPConstants.PORT_NUMBER)) {
                if (Strings.isNullOrEmpty(value)) {
                    appendAttribute(buf, SPConstants.VALUE, SPConstants.LDAP_DEFAULT_PORT_NUMBER);
                } else if (value.equalsIgnoreCase(SPConstants.LDAP_DEFAULT_PORT_NUMBER)) {
                    appendAttribute(buf, SPConstants.VALUE, SPConstants.LDAP_DEFAULT_PORT_NUMBER);
                } else {
                    appendAttribute(buf, SPConstants.VALUE, value.trim());
                }
                if (editMode) {
                    if (this.pushAcls.equalsIgnoreCase(SPConstants.OFF)) {
                        buf.append(SPConstants.SPACE + SPConstants.DISABLED + SPConstants.EQUAL_TO + "\""
                                + SPConstants.TRUE + "\"");
                    }
                }
            } else if (key.equals(SPConstants.INITAL_CACHE_SIZE)) {
                if (Strings.isNullOrEmpty(value)) {
                    if (null == this.useCacheToStoreLdapUserGroupsMembership
                            || this.useCacheToStoreLdapUserGroupsMembership.equalsIgnoreCase(SPConstants.OFF)) {
                        buf.append(SPConstants.SPACE + SPConstants.DISABLED + SPConstants.EQUAL_TO + "\""
                                + SPConstants.TRUE + "\"");
                    }
                    appendAttribute(buf, SPConstants.VALUE, SPConstants.LDAP_INITIAL_CACHE_SIZE);
                } else if (value.equalsIgnoreCase(SPConstants.LDAP_INITIAL_CACHE_SIZE)) {
                    appendAttribute(buf, SPConstants.VALUE, SPConstants.LDAP_INITIAL_CACHE_SIZE);
                } else {
                    appendAttribute(buf, SPConstants.VALUE, value);
                }
            } else if (key.equals(SPConstants.CACHE_REFRESH_INTERVAL)) {
                if (Strings.isNullOrEmpty(value)) {
                    if (null == this.useCacheToStoreLdapUserGroupsMembership
                            || this.useCacheToStoreLdapUserGroupsMembership.equalsIgnoreCase(SPConstants.OFF)) {
                        buf.append(SPConstants.SPACE + SPConstants.DISABLED + SPConstants.EQUAL_TO + "\""
                                + SPConstants.TRUE + "\"");
                    }
                    appendAttribute(buf, SPConstants.VALUE, SPConstants.LDAP_CACHE_REFRESH_INTERVAL_TIME);
                } else if (value.equalsIgnoreCase(SPConstants.LDAP_CACHE_REFRESH_INTERVAL_TIME)) {
                    appendAttribute(buf, SPConstants.VALUE, SPConstants.LDAP_CACHE_REFRESH_INTERVAL_TIME);
                } else {
                    appendAttribute(buf, SPConstants.VALUE, value.trim());
                }
            }
            buf.append(SPConstants.SPACE + SPConstants.ONKEY_PRESS);
            buf.append("\"return onlyNumbers(event);\"");
        } else {
            appendAttribute(buf, SPConstants.VALUE, value);
        }
        if (key.equals(SPConstants.SHAREPOINT_URL) || key.equals(SPConstants.MYSITE_BASE_URL)) {
            appendAttribute(buf, SPConstants.TEXTBOX_SIZE, SPConstants.TEXTBOX_SIZE_VALUE);
        }

        if (key.equals(SPConstants.LDAP_SERVER_HOST_ADDRESS) || key.equals(SPConstants.SEARCH_BASE)) {
            appendAttribute(buf, SPConstants.TEXTBOX_SIZE, SPConstants.TEXTBOX_SIZE_VALUE);
            if (editMode) {
                if (this.pushAcls.equalsIgnoreCase(SPConstants.OFF)) {
                    buf.append(SPConstants.SPACE + SPConstants.DISABLED + SPConstants.EQUAL_TO + "\""
                            + SPConstants.TRUE + "\"");
                }
            }
        }

        buf.append(SPConstants.SLASH + SPConstants.CLOSE_ELEMENT);
    }

    /**
     * For creating the region Site Alias Mapping field
     *
     * @param buf
     *          Contains the form snippet
     */
    private void appendTableForAliasMapping(final StringBuffer buf) {
        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.TABLE);
        appendAttribute(buf, SPConstants.CONFIG_ID, SPConstants.ALIASCONTAINER);
        appendAttribute(buf, SPConstants.CELLSPACING, "1");
        appendAttribute(buf, SPConstants.CELLPADDING, "2");
        buf.append(SPConstants.CLOSE_ELEMENT);

        buf.append(SPConstants.TR_START);

        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.TH);
        appendAttribute(buf, SPConstants.TITLE, rb.getString(SPConstants.ALIAS_SOURCE_PATTERN_HELP));
        buf.append(SPConstants.CLOSE_ELEMENT);
        buf.append(rb.getString(SPConstants.ALIAS_SOURCE_PATTERN));
        buf.append(SPConstants.TH_END);

        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.TH);
        appendAttribute(buf, SPConstants.TITLE, rb.getString(SPConstants.ALIAS_HELP));
        buf.append(SPConstants.CLOSE_ELEMENT);
        buf.append(rb.getString(SPConstants.ALIAS));
        buf.append(SPConstants.TH_END);

        buf.append(SPConstants.OPEN_ELEMENT + SPConstants.TH + SPConstants.CLOSE_ELEMENT);
        buf.append(SPConstants.TH_END);

        buf.append(SPConstants.TR_END);
    }

    /**
     * Appends a new row for Site Alias Mapping
     *
     * @param buf
     *          Contains form snippet
     * @param sourceValue
     *          Source_URL_Pattern
     * @param aliasValue
     *          Alias
     * @param color
     *          To keep track of the alternate background color
     */
    private void appendRowForAliasMapping(final StringBuffer buf, final String sourceValue, final String aliasValue,
            final boolean color) {
        buf.append(SPConstants.TR_START);

        if (color) {
            buf.append(SPConstants.TD_START_FORMAT);
        } else {
            buf.append(SPConstants.TD_START);
        }
        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.INPUT);
        appendAttribute(buf, SPConstants.TYPE, SPConstants.TEXT);
        appendAttribute(buf, SPConstants.TEXTBOX_SIZE, SPConstants.ALIAS_TEXTBOX_SIZE_VALUE);
        appendAttribute(buf, SPConstants.VALUE, sourceValue);
        appendAttribute(buf, SPConstants.ONCHANGE, "readAlias()");
        buf.append(SPConstants.SLASH + SPConstants.CLOSE_ELEMENT);
        buf.append(SPConstants.TD_END);

        if (color) {
            buf.append(SPConstants.TD_START_FORMAT);
        } else {
            buf.append(SPConstants.TD_START);
        }
        buf.append(SPConstants.OPEN_ELEMENT);
        buf.append(SPConstants.INPUT);
        appendAttribute(buf, SPConstants.TYPE, SPConstants.TEXT);
        appendAttribute(buf, SPConstants.TEXTBOX_SIZE, SPConstants.ALIAS_TEXTBOX_SIZE_VALUE);
        appendAttribute(buf, SPConstants.VALUE, aliasValue);
        appendAttribute(buf, SPConstants.ONCHANGE, "readAlias()");
        buf.append(SPConstants.SLASH + SPConstants.CLOSE_ELEMENT);
        buf.append(SPConstants.TD_END);

        buf.append(SPConstants.TR_END);
    }

    /**
     * Starts a new row in the configuration page. used while designing the
     * configuration form
     *
     * @param buf
     */
    private void appendStartRow(final StringBuffer buf, final String key, final String configKey,
            final boolean red/*
                             * , final String displayValue
                             */) {
        buf.append(SPConstants.TR_START);
        buf.append(SPConstants.TD_START);

        if (red) {
            buf.append("<font color=\"red\">");
        }
        if (isRequired(key)) {
            buf.append("<div style=\"float: left;\">");
            buf.append(SPConstants.START_BOLD);
        }

        buf.append(configKey);

        if (isRequired(key)) {
            buf.append(SPConstants.END_BOLD);
            buf.append("</div><div style=\"text-align: right; ").append("color: red; font-weight: bold; ")
                    .append("margin-right: 0.3em;\">*</div>");
        }
        if (red) {
            buf.append("</font>");
        }
        buf.append(SPConstants.TD_END);
        buf.append(SPConstants.TD_START);
    }

    /**
     * Adds a property to the current HTML element. used while designing the
     * configuration form
     *
     * @param buf
     * @param attrName
     * @param attrValue
     */
    private void appendAttribute(final StringBuffer buf, final String attrName, final String attrValue) {
        buf.append(" ");
        buf.append(attrName);
        buf.append("=\"");
        try {
            // XML-encode the special characters (< > " etc.)
            // Check the basic requirement mentioned in ConnectorType as part of
            // CM-Issue 186
            XmlUtils.xmlAppendAttrValue(attrValue, buf);
        } catch (IOException e) {
            String msg = new StringBuffer("Exceptions while constructing the config form for attribute : ")
                    .append(attrName).append(" with value : ").append(attrValue).toString();
            LOGGER.log(Level.WARNING, msg, e);
        }
        buf.append("\"");
    }

    /**
     * initialize the instance variables for furhter processing.
     *
     * @param key
     * @param val
     */
    private void setSharepointCredentials(final String key, final String val) {
        if (val == null) {
            return;
        }
        if (key.equals(SPConstants.USERNAME)) {
            username = val.trim();
        } else if (key.equals(SPConstants.DOMAIN)) {
            domain = val.trim();
        } else if (key.equals(SPConstants.PASSWORD)) {
            password = val;
        } else if (key.equals(SPConstants.SHAREPOINT_URL)) {
            sharepointUrl = val.trim();
        } else if (key.equals(SPConstants.INCLUDED_URLS)) {
            includeURL = val;
        } else if (key.equals(SPConstants.EXCLUDED_URLS)) {
            excludeURL = val;
        } else if (key.equals(SPConstants.MYSITE_BASE_URL)) {
            mySiteUrl = val.trim();
        } else if (key.equals(SPConstants.USE_SP_SEARCH_VISIBILITY)) {
            useSPSearchVisibility = val.trim();
        } else if (key.equals(SPConstants.PUSH_ACLS)) {
            this.pushAcls = val.trim();
        } else if (key.equals(SPConstants.USERNAME_FORMAT_IN_ACE)) {
            this.usernameFormatInAce = val.trim();
        } else if (key.equals(SPConstants.GROUPNAME_FORMAT_IN_ACE)) {
            this.groupnameFormatInAce = val.trim();
        } else if (key.equals(SPConstants.LDAP_SERVER_HOST_ADDRESS)) {
            this.ldapServerHostAddress = val.trim();
        } else if (key.equals(SPConstants.PORT_NUMBER)) {
            this.portNumber = val.trim();
        } else if (key.equals(SPConstants.SEARCH_BASE)) {
            this.searchBase = val.trim();
        } else if (key.equals(SPConstants.AUTHENTICATION_TYPE)) {
            this.authenticationType = val.trim();
        } else if (key.equals(SPConstants.CONNECT_METHOD)) {
            this.connectMethod = val.trim();
        } else if (key.equals(SPConstants.USE_CACHE_TO_STORE_LDAP_USER_GROUPS_MEMBERSHIP)) {
            this.useCacheToStoreLdapUserGroupsMembership = val.trim();
        } else if (key.equals(SPConstants.INITAL_CACHE_SIZE)) {
            this.initialCacheSize = val.trim();
        } else if (key.equals(SPConstants.CACHE_REFRESH_INTERVAL)) {
            this.cacheRefreshInterval = val.trim();
        }
    }

    /**
     * Validates the values filled-in by the user at the connector's configuration
     * page.
     */
    private boolean validateConfigMap(final Map<String, String> configData, final ErrorDignostics ed) {
        if (configData == null) {
            LOGGER.warning("configData map is not found");
            return false;
        }
        LOGGER.info("push acls validate :" + configData.get("pushAcls"));
        if (!configData.containsKey(SPConstants.USE_CACHE_TO_STORE_LDAP_USER_GROUPS_MEMBERSHIP)) {
            this.useCacheToStoreLdapUserGroupsMembership = SPConstants.OFF;
        }
        if (null == configData.get(SPConstants.PUSH_ACLS)) {
            this.pushAcls = SPConstants.OFF;
        }

        FeedType feedType = null;
        String kdcServer = configData.get(SPConstants.KDC_SERVER);

        if (!Strings.isNullOrEmpty(kdcServer)) {
            kerberosSetUp(configData);
        } else {
            unregisterKerberosSetUp(configData);
        }

        // Check boxes (like PUSH_ACLS, USE_SP_SEARCH_VISIBILITY, etc) are
        // specified by the connector manager as either being set to "on" or being
        // nonexistent in configData. These need to be modified to "true" and
        // "false", respectively, so that they are interpreted correctly by the
        // connector. This must be done prior to the rest of the checks being
        // performed, or else if the save fails and the form is presented again,
        // they will be presented with the opposite value that they were saved
        // with.
        convertCheckBoxes(configData);

        for (String key : CONFIG_FIELDS) {
            final String val = configData.get(key);

            if (isRequired(key)) {
                if ((val == null) || val.equals(SPConstants.BLANK_STRING) || (val.length() == 0)) {
                    ed.set(key,
                            rb.getString(SPConstants.REQ_FIELDS_MISSING) + SPConstants.SPACE + rb.getString(key));
                    return false;
                } else if (key.equals(SPConstants.SHAREPOINT_URL)) {
                    if (!isURL(val)) {
                        ed.set(key, rb.getString(SPConstants.MALFORMED_URL));
                        return false;
                    }
                    if (!isInFQDN(val)) {
                        ed.set(key, rb.getString(SPConstants.REQ_FQDN_URL));
                        return false;
                    }
                } else if (key.equals(SPConstants.INCLUDED_URLS)) {
                    final Set<String> invalidSet = validatePatterns(val);
                    if (invalidSet != null) {
                        ed.set(SPConstants.INCLUDED_URLS,
                                rb.getString(SPConstants.INVALID_INCLUDE_PATTERN) + invalidSet.toString());
                        return false;
                    }
                }
            } else if (key.equals(SPConstants.ALIAS_MAP) && (val != null)
                    && !val.equals(SPConstants.BLANK_STRING)) {
                final Set<String> wrongEntries = new HashSet<String>();
                final String message = parseAlias(val, wrongEntries);
                if (message != null) {
                    ed.set(SPConstants.ALIAS_MAP, rb.getString(message) + " " + wrongEntries);
                    return false;
                }
            } else if (key.equals(SPConstants.EXCLUDED_URLS)) {
                final Set<String> invalidSet = validatePatterns(val);
                if (invalidSet != null) {
                    ed.set(SPConstants.EXCLUDED_URLS,
                            rb.getString(SPConstants.INVALID_EXCLUDE_PATTERN) + invalidSet.toString());
                    LOGGER.warning("Invalid Exclude pattern:" + val);
                    return false;
                }
            } else if (key.equals(SPConstants.AUTHORIZATION)) {
                feedType = FeedType.getFeedType(val);
            } else if (!Strings.isNullOrEmpty(kdcServer) && key.equals(SPConstants.KDC_SERVER)) {
                boolean isFQDN = false;
                if (!Util.isFQDN(kdcServer)) {
                    ed.set(SPConstants.KDC_SERVER, rb.getString(SPConstants.KERBEROS_KDC_HOST_BLANK));
                    return false;
                } else {
                    try {
                        Integer.parseInt(kdcServer.substring(0, kdcServer.indexOf(".")));
                    } catch (NumberFormatException nfe) {
                        isFQDN = true;
                    }
                    if (!isFQDN && !validateIPAddress(kdcServer)) {
                        ed.set(SPConstants.KDC_SERVER, rb.getString(SPConstants.KERBEROS_KDC_HOST_BLANK));
                        return false;
                    }
                }
            } else if (key.equals(SPConstants.SOCIAL_OPTION)) {
                if ((val != null)) {
                    String option = val.trim();
                    if ((!option.equalsIgnoreCase(SPConstants.BLANK_STRING))
                            && (!option.equalsIgnoreCase(SPConstants.SOCIAL_OPTION_YES))
                            && (!option.equalsIgnoreCase(SPConstants.SOCIAL_OPTION_NO))
                            && (!option.equalsIgnoreCase(SPConstants.SOCIAL_OPTION_ONLY))) {
                        LOGGER.warning("Invalid social option " + val);
                        ed.set(SPConstants.SOCIAL_OPTION, rb.getString(SPConstants.SOCIAL_OPTION_INVALID));
                        return false;
                    }
                    if (!option.equalsIgnoreCase(SPConstants.SOCIAL_OPTION_NO)) {
                        // Validate collection name is well-formed.
                        String collectionName = configData.get(SPConstants.SOCIAL_USER_PROFILE_COLLECTION);
                        if (!(SocialCollectionHandler.validateCollectionName(collectionName))) {
                            ed.set(SPConstants.SOCIAL_USER_PROFILE_COLLECTION,
                                    rb.getString(SPConstants.SOCIAL_COLLECTION_INVALID));
                            return false;
                        }
                    }
                }
            }
            setSharepointCredentials(key, val);
        }

        if ((username != null) && ((username.indexOf("@") != -1) || (username.indexOf("\\") != -1))
                && (domain != null) && !domain.equals(SPConstants.BLANK_STRING)) {
            ed.set(SPConstants.USERNAME, rb.getString(SPConstants.DUPLICATE_DOMAIN));
            return false;
        }

        try {
            sharepointClientContext = new SharepointClientContext(clientFactory, sharepointUrl, domain, kdcServer,
                    username, password, "", "", "", includeURL, excludeURL, mySiteUrl, "", feedType,
                    Boolean.parseBoolean(useSPSearchVisibility));
        } catch (final Exception e) {
            LOGGER.log(Level.SEVERE,
                    "Failed to create SharePointClientContext with the received configuration values. ");
        }
        String status = checkPattern(sharepointUrl);
        if (status != null) {
            ed.set(null, rb.getString(SPConstants.SHAREPOINT_URL) + " " + status);
            return false;
        }
        status = null;

        if (FeedType.CONTENT_FEED == feedType) {
            status = checkGSConnectivity(sharepointUrl);
            if (!SPConstants.CONNECTIVITY_SUCCESS.equalsIgnoreCase(status)) {
                ed.set(null, rb.getString(SPConstants.BULKAUTH_ERROR_CRAWL_URL) + rb.getString(SPConstants.REASON)
                        + status);
                return false;
            }
        }
        status = null;

        status = checkConnectivity(sharepointUrl);
        if (!SPConstants.CONNECTIVITY_SUCCESS.equalsIgnoreCase(status)) {
            ed.set(null, rb.getString(SPConstants.CANNOT_CONNECT) + rb.getString(SPConstants.REASON) + status);
            return false;
        }
        status = null;

        if (!validateFeedAclsRelatedHtmlControls(ed)) {
            return false;
        }

        final SPType SPVersion = sharepointClientContext.checkSharePointType(sharepointUrl);
        if (SPType.SP2007 == SPVersion && mySiteUrl != null && !mySiteUrl.equals(SPConstants.BLANK_STRING)) {
            if (!isURL(mySiteUrl)) {
                ed.set(SPConstants.MYSITE_BASE_URL, rb.getString(SPConstants.MALFORMED_MYSITE_URL));
                return false;
            }
            if (!isInFQDN(mySiteUrl)) {
                ed.set(SPConstants.MYSITE_BASE_URL, rb.getString(SPConstants.REQ_FQDN_MYSITE_URL));
                return false;
            }

            status = checkPattern(mySiteUrl);
            if (status != null) {
                ed.set(null, rb.getString(SPConstants.MYSITE_BASE_URL) + " " + status);
                return false;
            }
            status = null;

            status = checkConnectivity(mySiteUrl);
            if (!SPConstants.CONNECTIVITY_SUCCESS.equalsIgnoreCase(status)) {
                ed.set(SPConstants.MYSITE_BASE_URL, rb.getString(SPConstants.CANNOT_CONNECT_MYSITE)
                        + rb.getString(SPConstants.REASON) + status);
                return false;
            }

            if (FeedType.CONTENT_FEED == feedType) {
                status = checkGSConnectivity(mySiteUrl);
                if (!SPConstants.CONNECTIVITY_SUCCESS.equalsIgnoreCase(status)) {
                    ed.set(SPConstants.MYSITE_BASE_URL, rb.getString(SPConstants.BULKAUTH_ERROR_MYSITE_URL)
                            + rb.getString(SPConstants.REASON) + status);
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * Used while re-displaying the connector configuration page after any
     * validation error occurs.
     */
    private ConfigureResponse makeValidatedForm(final Map<String, String> configMap, final ErrorDignostics ed) {
        if (configMap == null) {
            LOGGER.warning("configMap is not found");
            if (rb != null) {
                return new ConfigureResponse(rb.getString("CONFIGMAP_NOT_FOUND"), "");
            } else {
                return new ConfigureResponse("resource bundle not found", "");
            }
        }
        return new ConfigureResponse(ed.error_message, makeConfigForm(configMap, ed));
    }

    /**
     * Called by connector-manager to display the connector configuration page.
     */
    public ConfigureResponse getConfigForm(final Locale locale) {
        LOGGER.config("Locale " + locale);
        this.editMode = false;
        rb = ResourceBundle.getBundle("SharepointConnectorResources", locale);
        return new ConfigureResponse("", makeConfigForm(null, null));
    }

    /**
     * Called by connector-manager to display the connector configuration page
     * with filled in values.
     */
    public ConfigureResponse getPopulatedConfigForm(final Map<String, String> configMap, final Locale locale) {
        LOGGER.config("Locale " + locale);
        String isSelected = configMap.get(SPConstants.PUSH_ACLS);
        this.editMode = (null != isSelected && !isSelected.equalsIgnoreCase(SPConstants.TRUE));
        rb = ResourceBundle.getBundle("SharepointConnectorResources", locale);
        return new ConfigureResponse("", makeConfigForm(configMap, null));
    }

    /**
     * Called by connector-manager to validate the connector configuration values.
     */
    public ConfigureResponse validateConfig(final Map<String, String> configData, final Locale locale,
            final ConnectorFactory unused) {
        LOGGER.config("Locale " + locale);

        rb = ResourceBundle.getBundle("SharepointConnectorResources", locale);

        final ErrorDignostics ed = new ErrorDignostics();
        if (validateConfigMap(configData, ed)) {
            // all is ok
            return null;
        }
        final ConfigureResponse configureResponse = makeValidatedForm(configData, ed);

        LOGGER.config("message: " + configureResponse.getMessage());
        return configureResponse;
    }

    /**
     * Stores any error message corresponding to any field on the connector's
     * configuration page. *
     */
    class ErrorDignostics {
        String error_key;
        String error_message;

        void set(final String key, final String msg) {
            error_key = key;
            error_message = msg;
        }
    }

    /**
     * Returns true if the config key is a mandatory field.
     *
     * @return is this field is mandatory?
     */
    // TODO: sharepointUrl and includedUrls should not always be
    // required, but the tests should be updated to include testing when
    // they are required if they are removed from this list.
    @VisibleForTesting
    boolean isRequired(String configKey) {
        if (configKey.equals(SPConstants.SHAREPOINT_URL) || configKey.equals(SPConstants.USERNAME)
                || configKey.equals(SPConstants.PASSWORD) || configKey.equals(SPConstants.INCLUDED_URLS)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * JavaScript required on the connector configuration page.
     *
     * @param buf
     *          contains the Form snippet
     */
    public void addJavaScript(final StringBuffer buf) {
        if (buf != null) {
            String js = "\r\n <script type=\"text/javascript\"> \r\n <![CDATA[ ";
            js += "\r\n function addRow() {"
                    + "\r\n var i=1;    var aliasTable = document.getElementById('aliasContainer');    var len=aliasTable.rows.length;"
                    + "\r\n for(i=1;i<len-1;i++){"
                    + "\r\n row = aliasTable.rows[i]; leftBox = row.cells[0].childNodes[0]; rightBox = row.cells[1].childNodes[0];"
                    + "\r\n if(leftBox.value=='' || rightBox.value=='') {" + "\r\n alert(\""
                    + rb.getString(SPConstants.EMPTY_FIELD) + "\"); return;" + "\r\n }" + "\r\n }"
                    + "\r\n var newrow = aliasTable.insertRow(len-1);" + "\r\n newCell0 = newrow.insertCell(0); "
                    + "newCell0.innerHTML= '<input type=\"text\" size=\"" + SPConstants.ALIAS_TEXTBOX_SIZE_VALUE
                    + "\" onchange=\"readAlias()\"/> '; "
                    + "\r\n newCell1 = newrow.insertCell(1); newCell1.innerHTML= '<input type=\"text\" size=\""
                    + SPConstants.ALIAS_TEXTBOX_SIZE_VALUE + "\" onchange=\"readAlias()\"/> '; "
                    + "\r\n if(row.cells[0].style.backgroundColor=='') { "
                    + "newCell0.style.backgroundColor='#DDDDDD'; " + "newCell1.style.backgroundColor='#DDDDDD'; }"
                    + "\r\n }";

            js += "\r\n function readAlias(){"
                    + "\r\n var aliasString=''; var i=1; var aliasTable = document.getElementById('aliasContainer'); var SOURCE_ALIAS_SEPARATOR=/\\$\\$EQUAL\\$\\$/; var ALIAS_ENTRIES_SEPARATOR=/\\$\\$CRLF\\$\\$/;"
                    + "\r\n for(i=1;i<aliasTable.rows.length-1;i++){"
                    + "\r\n row = aliasTable.rows[i]; leftBoxVal = trim(row.cells[0].childNodes[0].value); rightBoxVal = trim(row.cells[1].childNodes[0].value);"
                    + "\r\n if(leftBoxVal=='' || leftBoxVal==null || leftBoxVal==undefined || rightBoxVal=='' || rightBoxVal==null || rightBoxVal==undefined) {continue;}"
                    + "\r\n if(leftBoxVal.search(" + SPConstants.SOURCE_ALIAS_SEPARATOR
                    + ")!=-1 || rightBoxVal.search(" + SPConstants.SOURCE_ALIAS_SEPARATOR
                    + ")!=-1 || leftBoxVal.search(" + SPConstants.ALIAS_ENTRIES_SEPARATOR
                    + ")!=-1 || rightBoxVal.search(" + SPConstants.ALIAS_ENTRIES_SEPARATOR + ")!=-1) {continue;}"
                    + "\r\n aliasString += leftBoxVal + '" + SPConstants.SOURCE_ALIAS_SEPARATOR
                    + "' + rightBoxVal + '" + SPConstants.ALIAS_ENTRIES_SEPARATOR + "';" + "\r\n }"
                    + "\r\n document.getElementById('" + SPConstants.ALIAS_MAP + "').value=aliasString;" + "\r\n }";

            js += "\r\n function enableOrDisableUserGroupsCacheControls() {"
                    + "\r\n if (document.getElementById(\"useCacheToStoreLdapUserGroupsMembership\").checked == true){ "
                    + "\r\n document.getElementById(\"initialCacheSize\").disabled=false"
                    + "\r\n document.getElementById(\"cacheRefreshInterval\").disabled=false" + "\r\n } else {"
                    + "\r\n document.getElementById(\"cacheRefreshInterval\").disabled=true"
                    + "\r\n document.getElementById(\"initialCacheSize\").disabled=true" + "\r\n }" + "\r\n }";

            js += "\r\n function enableFeedAclsRelatedHtmlControls() {"
                    + "\r\n if (document.getElementById(\"pushAcls\").checked == true){ "
                    + "\r\n document.getElementById(\"portNumber\").disabled=false"
                    + "\r\n document.getElementById(\"ldapServerHostAddress\").disabled=false"
                    + "\r\n document.getElementById(\"groupnameFormatInAce\").disabled=false"
                    + "\r\n document.getElementById(\"usernameFormatInAce\").disabled=false"
                    + "\r\n document.getElementById(\"searchBase\").disabled=false"
                    + "\r\n document.getElementById(\"authenticationType\").disabled=false"
                    + "\r\n document.getElementById(\"connectMethod\").disabled=false"
                    + "\r\n document.getElementById(\"useCacheToStoreLdapUserGroupsMembership\").disabled=false"
                    + "\r\n if (document.getElementById(\"useCacheToStoreLdapUserGroupsMembership\").checked == true){ "
                    + "\r\n document.getElementById(\"initialCacheSize\").disabled=false"
                    + "\r\n document.getElementById(\"cacheRefreshInterval\").disabled=false" + "\r\n } else {"
                    + "\r\n document.getElementById(\"initialCacheSize\").disabled=true"
                    + "\r\n document.getElementById(\"cacheRefreshInterval\").disabled=true" + "\r\n }"
                    + "\r\n } else {" + "\r\n document.getElementById(\"portNumber\").disabled=true"
                    + "\r\n document.getElementById(\"ldapServerHostAddress\").disabled=true"
                    + "\r\n document.getElementById(\"groupnameFormatInAce\").disabled=true"
                    + "\r\n document.getElementById(\"usernameFormatInAce\").disabled=true"
                    + "\r\n document.getElementById(\"searchBase\").disabled=true"
                    + "\r\n document.getElementById(\"authenticationType\").disabled=true"
                    + "\r\n document.getElementById(\"connectMethod\").disabled=true"
                    + "\r\n document.getElementById(\"useCacheToStoreLdapUserGroupsMembership\").disabled=true"
                    + "\r\n document.getElementById(\"cacheRefreshInterval\").disabled=true"
                    + "\r\n document.getElementById(\"initialCacheSize\").disabled=true" + "\r\n }" + "\r\n }";

            js += "\r\n function onlyNumbers(evt){" + "\r\n  var charCode = (evt.which) ? evt.which : event.keyCode"
                    + "\r\n if (charCode > 31 && (charCode < 48 || charCode > 57))" + "\r\n return false;"
                    + "\r\n return true;" + "\r\n }";

            js += "\r\n function trim(s) {return s.replace( /^\\s*/, \"\" ).replace( /\\s*$/, \"\" );}";

            js += "\r\n document.getElementById('" + SPConstants.SHAREPOINT_URL + "').focus();";

            js += "\r\n enableFeedAclsRelatedHtmlControls();";

            js += "\r\n ]]> \r\n </script> \r\n";
            buf.append(js);
        }
    }

    /**
     * Checks if the value is in FQDN *
     */
    private boolean isInFQDN(final String val) {
        LOGGER.config("Checking " + val + " for FQDN");
        try {
            final URL url = new URL(val);
            final String host = url.getHost();
            if (host.indexOf(".") == -1) {
                return false;
            }
        } catch (final Exception e) {
            return false;
        }
        return true;
    }

    /**
     * Checks if the url is a malformed url *
     */
    private boolean isURL(final String url) {
        LOGGER.config("Checking " + url + " for malformed URL");
        try {
            final URL chkURL = new URL(url);
            /*
             * Check for port value greater then allowed range is added because of a
             * bug in Axis where a NullPointer Exception was being returned as a value
             * during Web Service call.
             */
            if (null == chkURL || chkURL.getPort() > SPConstants.MAX_PORT_VALUE) {
                return false;
            }
        } catch (final MalformedURLException e) {
            final String logMessage = "Malformed URL.";
            LOGGER.log(Level.WARNING, logMessage, e);
            return false;
        }
        return true;
    }

    /**
     * Matches the provided url against included and excluded patterns Function
     * Signature changed by nitendra_thakur. This is to make the function
     * re-usable.
     */
    private String checkPattern(final String url) {
        LOGGER.info("Matching patterns for [" + url + "]");
        String[] includeList = null;
        String[] excludeList = null;
        if (includeURL != null) {
            includeList = includeURL.split(SPConstants.SEPARATOR);
        }
        if (excludeURL != null) {
            excludeList = excludeURL.split(SPConstants.SEPARATOR);
        }

        if (includeList == null) {
            return rb.getString(SPConstants.INCLUDED_PATTERN_MISMATCH);
        }
        if (Util.match(includeList, url, null)) {
            final StringBuffer matchedPattern = new StringBuffer();
            if ((excludeList != null) && Util.match(excludeList, url, matchedPattern)) {
                return rb.getString(SPConstants.EXCLUDED_PATTERN_MATCH) + matchedPattern.toString();
            }
            return null;
        } else {
            return rb.getString(SPConstants.INCLUDED_PATTERN_MISMATCH);
        }
    }

    /**
     * Validates all the patterns under included / excluded to check if any of
     * them is not a valid pattern.
     *
     * @param patterns
     *          The pattern to be validated
     * @return the set of wrong patterns, if any. Otherwise returns null
     */
    private Set<String> validatePatterns(final String patterns) {
        LOGGER.info("validating patterns [ " + patterns + " ]. ");
        String[] patternsList = null;
        if ((patterns != null) && (patterns.trim().length() != 0)) {
            patternsList = patterns.split(SPConstants.SEPARATOR);
        }
        if (patternsList == null) {
            return null;
        }

        final Set<String> invalidPatterns = new HashSet<String>();

        for (final String pattern : patternsList) {
            if (pattern.startsWith(SPConstants.HASH) || pattern.startsWith(SPConstants.MINUS)) {
                continue;
            }
            if (pattern.startsWith(SPConstants.CONTAINS)) {
                final StringBuffer tempBuffer = new StringBuffer(pattern);
                if (tempBuffer == null) {
                    invalidPatterns.add(pattern);
                }
                final String strContainKey = new String(tempBuffer.delete(0, SPConstants.CONTAINS.length()));
                try {
                    new RE(strContainKey); // with case
                } catch (final Exception e) {
                    invalidPatterns.add(pattern);
                }
                continue;
            }

            if (pattern.startsWith(SPConstants.REGEXP)) {
                final StringBuffer tempBuffer = new StringBuffer(pattern);
                if (tempBuffer == null) {
                    invalidPatterns.add(pattern);
                }
                final String strRegexPattrn = new String(tempBuffer.delete(0, SPConstants.REGEXP.length()));
                try {
                    new RE(strRegexPattrn);
                } catch (final Exception e) {
                    invalidPatterns.add(pattern);
                }
                continue;
            }

            if (pattern.startsWith(SPConstants.REGEXP_CASE)) {
                final StringBuffer tempBuffer = new StringBuffer(pattern);
                if (tempBuffer == null) {
                    invalidPatterns.add(pattern);
                }
                final String strRegexCasePattrn = new String(
                        tempBuffer.delete(0, SPConstants.REGEXP_CASE.length()));
                try {
                    new RE(strRegexCasePattrn);
                } catch (final Exception e) {
                    invalidPatterns.add(pattern);
                }
                continue;
            }

            if (pattern.startsWith(SPConstants.REGEXP_IGNORE_CASE)) {
                final StringBuffer tempBuffer = new StringBuffer(pattern);
                if (tempBuffer == null) {
                    invalidPatterns.add(pattern);
                }
                final String strRegexIgnoreCasePattrn = new String(
                        tempBuffer.delete(0, SPConstants.REGEXP_IGNORE_CASE.length()));
                try {
                    new RE(strRegexIgnoreCasePattrn, RE.REG_ICASE); // ignore
                    // case
                } catch (final Exception e) {
                    invalidPatterns.add(pattern);
                }
                continue;
            }

            if (pattern.startsWith(SPConstants.CARET) || pattern.endsWith(SPConstants.DOLLAR)) {
                StringBuffer tempBuffer = new StringBuffer(pattern);
                boolean bDollar = false;
                if (pattern.startsWith(SPConstants.CARET)) {
                    tempBuffer = new StringBuffer(pattern);
                    final int indexOfStar = tempBuffer.indexOf("*");
                    if (indexOfStar != -1) {
                        tempBuffer.replace(indexOfStar, indexOfStar + "*".length(), "[0-9].*");
                    } else {
                        tempBuffer.delete(0, "^".length());
                        if (pattern.endsWith(SPConstants.DOLLAR)) {
                            bDollar = true;
                            tempBuffer.delete(tempBuffer.length() - SPConstants.DOLLAR.length(),
                                    tempBuffer.length());
                        }
                        try {
                            final URL urlPatt = new URL(tempBuffer.toString());
                            final int port = urlPatt.getPort();
                            final String strHost = urlPatt.getHost().toString();
                            if ((port == -1) && (strHost != null) && (strHost.length() != 0)) {
                                tempBuffer = new StringBuffer("^" + urlPatt.getProtocol() + SPConstants.URL_SEP
                                        + urlPatt.getHost() + ":[0-9].*" + urlPatt.getPath());
                            }
                            if (bDollar) {
                                tempBuffer.append(SPConstants.DOLLAR);
                            }
                        } catch (final Exception e) {
                            tempBuffer = new StringBuffer(pattern);
                        }
                    }
                }

                try {
                    new RE(tempBuffer);
                } catch (final Exception e) {
                    invalidPatterns.add(pattern);
                }
                continue;
            }

            String patternDecoded = pattern;
            try {
                patternDecoded = URLDecoder.decode(pattern, "UTF-8");
            } catch (final Exception e) {
                // eatup exception. use the original value
                patternDecoded = pattern;
            }

            if (patternDecoded == null) {
                invalidPatterns.add(pattern);
            }

            boolean containProtocol = false;
            try {
                final RE re = new RE(SPConstants.URL_SEP);
                final REMatch reMatch = re.getMatch(patternDecoded);
                if (reMatch != null) {
                    containProtocol = true; // protocol is present
                }

            } catch (final Exception e) {
                containProtocol = false;
            }

            if (containProtocol) {
                String urlPatt1stPart = null;
                String urlPatt2ndPart = null;
                boolean bPortStar = false;
                try {
                    final URL urlPatt = new URL(patternDecoded);
                    final int port = urlPatt.getPort();
                    String strPort = "";
                    if (port == -1) {
                        strPort = "[0-9].*";
                    } else {
                        strPort = port + "";
                    }
                    urlPatt1stPart = "^" + urlPatt.getProtocol() + SPConstants.URL_SEP + urlPatt.getHost()
                            + SPConstants.COLON + strPort;
                    if (!(urlPatt.getFile()).startsWith(SPConstants.SLASH)) { // The pattern must have "/" 
                                                                              // after the port
                        invalidPatterns.add(pattern);
                    }
                    urlPatt2ndPart = "^" + urlPatt.getFile();
                } catch (final Exception e) {
                    bPortStar = true;
                }

                if (bPortStar) {
                    final int indexOfStar = patternDecoded.indexOf("*");
                    if (indexOfStar != -1) {
                        urlPatt1stPart = "^" + patternDecoded.substring(0, indexOfStar) + "[0-9].*";
                        if (!(patternDecoded.substring(indexOfStar + 1)).startsWith(SPConstants.SLASH)) {
                            invalidPatterns.add(pattern);
                        }
                        urlPatt2ndPart = "^" + patternDecoded.substring(indexOfStar + 1);
                    }
                }

                try {
                    new RE(urlPatt1stPart);
                    new RE(urlPatt2ndPart);
                } catch (final Exception e) {
                    invalidPatterns.add(pattern);
                }
            } else {
                String urlPatt1stPart = null;
                String urlPatt2ndPart = null;
                if (patternDecoded.indexOf(SPConstants.SLASH) != -1) {
                    if (patternDecoded.indexOf(SPConstants.COLON) == -1) {
                        urlPatt1stPart = patternDecoded.substring(0, patternDecoded.indexOf(SPConstants.SLASH))
                                + ":[0-9].*";
                    } else {
                        urlPatt1stPart = patternDecoded.substring(0, patternDecoded.indexOf(SPConstants.SLASH));
                    }
                    urlPatt2ndPart = patternDecoded.substring(patternDecoded.indexOf(SPConstants.SLASH));
                } else {
                    invalidPatterns.add(pattern);
                }

                urlPatt1stPart = "^.*://.*" + urlPatt1stPart;
                urlPatt2ndPart = "^" + urlPatt2ndPart;
                try {
                    new RE(urlPatt1stPart);
                    new RE(urlPatt2ndPart);
                } catch (final Exception e) {
                    invalidPatterns.add(pattern);
                }
            }
        }
        if (invalidPatterns.size() == 0) {
            return null;
        } else {
            return invalidPatterns;
        }
    }

    /**
     * Checks if the endpoint provided is a sharepoint url and is connectable.
     * Function Signature changed by nitendra_thakur. This is to make the function
     * re-usable.
     */
    private String checkConnectivity(final String endpoint) {
        LOGGER.config("Checking connectivity for [" + endpoint + "]");

        if ((endpoint == null) || !isURL(endpoint)) {
            return rb.getString(SPConstants.ENDPOINT_NOT_FOUND);
        }

        try {
            sharepointClientContext.setSiteURL(endpoint);
            final WebsHelper webs = new WebsHelper(sharepointClientContext);
            return webs.checkConnectivity();
        } catch (final Exception e) {
            final String logMessage = "Problem while connecting.";
            LOGGER.log(Level.WARNING, logMessage, e);
            return e.getLocalizedMessage();
        }
    }

    /**
     * Check for the connectivtity to the google services for SharePoint
     *
     * @param endpoint
     *          the Web URL to which the Web Service call will be made
     * @return the connectivity status
     */
    private String checkGSConnectivity(final String endpoint) {
        LOGGER.config("Checking Google Services connectivity for [" + endpoint + "]");

        if ((endpoint == null) || !isURL(endpoint)) {
            return rb.getString(SPConstants.ENDPOINT_NOT_FOUND);
        }

        try {
            sharepointClientContext.setSiteURL(endpoint);
            final BulkAuthorizationHelper testBulkAuth = new BulkAuthorizationHelper(sharepointClientContext);
            return testBulkAuth.checkConnectivity();
        } catch (final Exception e) {
            final String logMessage = "Problem while connecting.";
            LOGGER.log(Level.WARNING, logMessage, e);
            return e.getLocalizedMessage();
        }
    }

    /**
     * Parses the received value of Alias source pattern and values in a string
     * and updates the map.
     *
     * @param aliasMapString
     *          The comples string containg all the entries made on the
     *          configuration form. Entries of two consecutive rows are separated
     *          by /$$CRLF$$/ A Source pattern is separated by its corresponding
     *          Alias pattern by /$$EQUAL$$/
     */
    private String parseAlias(final String aliasMapString, Set<String> wrongEntries) {
        LOGGER.config("parsing aliasString: " + aliasMapString);
        aliasMap = null;
        if ((aliasMapString == null) || aliasMapString.equals(SPConstants.BLANK_STRING)) {
            return null;
        }
        String message = null;
        if (null == wrongEntries) {
            wrongEntries = new HashSet<String>();
        }

        try {
            final String[] alias_map = aliasMapString.split(SPConstants.ALIAS_ENTRIES_SEPARATOR);
            for (final String nextEntry : alias_map) {
                if ((nextEntry == null) || nextEntry.equals(SPConstants.BLANK_STRING)) {
                    continue;
                } else {
                    try {
                        final String[] alias_entry = nextEntry.split(SPConstants.SOURCE_ALIAS_SEPARATOR);
                        if (alias_entry.length != 2) {
                            LOGGER.warning("Skipping alias entry [ " + nextEntry
                                    + " ] because required values are not found.");
                            continue;
                        } else {
                            final String source_url = alias_entry[0];
                            final String alias_url = alias_entry[1];

                            String sourceURL = source_url;
                            if (source_url.startsWith(SPConstants.GLOBAL_ALIAS_IDENTIFIER)) {
                                sourceURL = source_url.substring(1);
                            }

                            if ((null == message) || message.equals(SPConstants.MALFORMED_ALIAS_PATTERN)) {
                                if (!isURL(sourceURL)) {
                                    message = SPConstants.MALFORMED_ALIAS_PATTERN;
                                    wrongEntries.add(sourceURL);
                                }
                                if (!isURL(alias_url)) {
                                    message = SPConstants.MALFORMED_ALIAS_PATTERN;
                                    wrongEntries.add(alias_url);
                                }
                            }

                            ArrayList<String> aliases = null;
                            if (aliasMap == null) {
                                aliasMap = new LinkedHashMap<String, ArrayList<String>>();
                            }
                            if (aliasMap.containsKey(source_url)) {
                                aliases = aliasMap.get(source_url);
                                if ((null == message) || message.equals(SPConstants.DUPLICATE_ALIAS)) {
                                    message = SPConstants.DUPLICATE_ALIAS;
                                    wrongEntries.add(source_url);
                                }
                            }
                            if (aliases == null) {
                                aliases = new ArrayList<String>();
                            }
                            aliases.add(alias_url);
                            aliasMap.put(source_url, aliases);
                        }
                    } catch (final Exception e) {
                        final String logMessage = "Exception thrown while parsing AliasMap [ " + aliasMapString
                                + " ] Values:";
                        LOGGER.log(Level.WARNING, logMessage, e);
                        continue;
                    }
                }
            }
        } catch (final Exception e) {
            LOGGER.log(Level.WARNING, "Problem while parsing alias string [ " + aliasMapString + " ].", e);
        }
        return message;
    }

    /**
     * Validates the String to check whether it represents an IP address or not
     * and returns the boolean status.
     *
     * @param ip
     *          IP adress to be validated in the form of string.
     * @return If ip address matches the regular expression then true else false
     *         is returned.
     */
    private boolean validateIPAddress(String ip) {
        // if(ip.matches("[0-255]+.[0-255]+.[0-255]+.[0-255]+"))
        if (ip.matches(
                "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"))
            return true;
        else
            return false;
    }

    /**
     * All the initial set-up and pre-requisites for Kerberos Authentication.
     * Following are the responsibilities: - If KDC Host is provided on UI
     * configuration then the Negotiate AuthScheme is registered with AuthPolicy
     * of Httpclient. - krb5.conf and login.conf files are copied to the connector
     * instance's directory. - Values of KDC Server and Realm are changed at
     * runtime in krb5.conf. - System properties required for the Kerberos AuthN
     * are set.
     */
    private void kerberosSetUp(Map<String, String> configData) {
        String kdcServer = configData.get(SPConstants.KDC_SERVER).toString();
        String googleConnWorkDir = configData.get(GOOGLE_CONN_WORK_DIR);

        if (!kdcServer.equalsIgnoreCase(SPConstants.BLANK_STRING)) {
            AuthPolicy.registerAuthScheme(SPConstants.NEGOTIATE, NegotiateScheme.class);

            InputStream krb5In = SharepointConnectorType.class.getClassLoader()
                    .getResourceAsStream(SPConstants.CONFIG_KRB5);
            if (krb5In != null) {
                try {
                    File krb5File = new File(googleConnWorkDir, SPConstants.FILE_KRB5);
                    String krb5Config = new String(ByteStreams.toByteArray(krb5In), UTF_8);
                    krb5Config = krb5Config.replace(SPConstants.VAR_KRB5_REALM_UPPERCASE,
                            configData.get(SPConstants.DOMAIN).toString().toUpperCase());
                    krb5Config = krb5Config.replace(SPConstants.VAR_KRB5_REALM_LOWERCASE,
                            configData.get(SPConstants.DOMAIN).toString().toLowerCase());
                    krb5Config = krb5Config.replace(SPConstants.VAR_KRB5_KDC_SERVER,
                            configData.get(SPConstants.KDC_SERVER).toString().toUpperCase());
                    FileOutputStream out = new FileOutputStream(krb5File);
                    out.write(krb5Config.getBytes(UTF_8));
                    out.close();
                } catch (IOException e) {
                    LOGGER.log(Level.SEVERE, "Failed to create krb5.conf in connector instance's directory.");
                }
            }

            InputStream loginIn = SharepointConnectorType.class.getClassLoader()
                    .getResourceAsStream(SPConstants.CONFIG_LOGIN);
            if (loginIn != null) {
                try {
                    File loginFile = new File(googleConnWorkDir, SPConstants.FILE_LOGIN);
                    String loginConfig = new String(ByteStreams.toByteArray(loginIn), UTF_8);
                    FileOutputStream out = new FileOutputStream(loginFile);
                    out.write(loginConfig.getBytes(UTF_8));
                    out.close();
                } catch (IOException e) {
                    LOGGER.log(Level.SEVERE, "Failed to create login.conf in connector instance's directory.");
                }
            }

            System.setProperty(SPConstants.SYS_PROP_AUTH_LOGIN_CONFIG,
                    googleConnWorkDir + File.separator + SPConstants.FILE_LOGIN);
            System.setProperty(SPConstants.SYS_PROP_AUTH_KRB5_CONFIG,
                    googleConnWorkDir + File.separator + SPConstants.FILE_KRB5);
            System.setProperty(SPConstants.SYS_PROP_AUTH_USESUBJETCREDSONLY, SPConstants.FALSE);
        }
    }

    private void unregisterKerberosSetUp(Map<String, String> configData) {
        AuthPolicy.unregisterAuthScheme(SPConstants.NEGOTIATE);
        String googleConnWorkDir = configData.get(GOOGLE_CONN_WORK_DIR);
        File fileKrb5 = new File(googleConnWorkDir, SPConstants.FILE_KRB5);
        if (fileKrb5 != null && fileKrb5.exists()) {
            fileKrb5.delete();
        }
        File fileLogin = new File(googleConnWorkDir, SPConstants.FILE_LOGIN);
        if (fileLogin != null && fileLogin.exists()) {
            fileLogin.delete();
        }
    }

    /**
     * Returns the flag if SharePoint search visibility options are to be fetched
     * and used
     *
     * @return the useSPSearchVisibility The search visibility flag
     */
    public String getUseSPSearchVisibility() {
        return useSPSearchVisibility;
    }

    /**
     * Sets the flag if SharePoint search visibility options are to be fetched and
     * used
     *
     * @param useSPSearchVisibility
     *          The useSPSearchVisibility flag to set
     */
    public void setUseSPSearchVisibility(String useSPSearchVisibility) {
        this.useSPSearchVisibility = useSPSearchVisibility;
    }

    /**
     * Convert check boxes from being either not in the map or set to "on" to
     * being set to either "false" or "true".
     *
     * @param configData
     */
    private void convertCheckBoxes(final Map<String, String> configData) {
        String[] keys = { SPConstants.USE_SP_SEARCH_VISIBILITY, SPConstants.PUSH_ACLS,
                SPConstants.FEED_UNPUBLISHED_CONTENT, SPConstants.USE_CACHE_TO_STORE_LDAP_USER_GROUPS_MEMBERSHIP };

        for (String key : keys) {
            configData.put(key, Boolean.toString(configData.containsKey(key)));
        }
    }

    /**
     * Validating feed ACLs related HTML controls against blank, specific formats
     * and for valid LDAP context.
     *
     * @return true if feed ACLs is not selected by the connector administrator
     *         during setting of connector configuration at GSA and false in case
     *         if any of its fields are blank, wrong user name format or couldn't
     *         get valid initial LDAP context.
     */
    private boolean validateFeedAclsRelatedHtmlControls(final ErrorDignostics ed) {
        if (null != pushAcls && this.pushAcls.equalsIgnoreCase(SPConstants.ON)) {
            LOGGER.config("Selected Feed ACLs option.");
            if (!Strings.isNullOrEmpty(usernameFormatInAce) && !Strings.isNullOrEmpty(groupnameFormatInAce)) {
                if (!checkForSpecialCharacters(usernameFormatInAce)) {
                    ed.set(SPConstants.USERNAME_FORMAT_IN_ACE,
                            rb.getString(SPConstants.SPECIAL_CHARACTERS_IN_USERNAME_FORMAT));
                    return false;
                }
                if (!checkForSpecialCharacters(groupnameFormatInAce)) {
                    ed.set(SPConstants.GROUPNAME_FORMAT_IN_ACE,
                            rb.getString(SPConstants.SPECIAL_CHARACTERS_IN_GROUPNAME_FORMAT));
                    return false;
                }
                if (!Strings.isNullOrEmpty(ldapServerHostAddress) && !Strings.isNullOrEmpty(portNumber)
                        && !Strings.isNullOrEmpty(domain)) {

                    LOGGER.config("Checking for a valid port number.");
                    if (!checkForInteger(portNumber)) {
                        ed.set(SPConstants.PORT_NUMBER,
                                MessageFormat.format(rb.getString(SPConstants.INVALID_PORT_NUMBER), portNumber));
                        return false;
                    }
                    Method method;
                    if (Method.SSL.toString().equalsIgnoreCase(this.connectMethod.toString())) {
                        method = Method.SSL;
                    } else {
                        method = Method.STANDARD;
                    }

                    AuthType authType;
                    if (AuthType.ANONYMOUS.toString().equalsIgnoreCase(this.authenticationType.toString())) {
                        authType = AuthType.ANONYMOUS;
                    } else {
                        authType = AuthType.SIMPLE;
                    }
                    LdapConnectionSettings settings = new LdapConnectionSettings(method, this.ldapServerHostAddress,
                            Integer.parseInt(this.portNumber), this.searchBase, authType, this.username,
                            this.password, this.domain);
                    LOGGER.config("Created LDAP connection settings object to obtain LDAP context "
                            + ldapConnectionSettings);
                    LdapConnection ldapConnection = new LdapConnection(settings);
                    if (ldapConnection.getLdapContext() == null) {
                        Map<LdapConnectionError, String> errors = ldapConnection.getErrors();
                        Iterator<Entry<LdapConnectionError, String>> iterator = errors.entrySet().iterator();
                        StringBuffer errorMessage = new StringBuffer();
                        errorMessage.append(rb.getString(SPConstants.LDAP_CONNECTVITY_ERROR));
                        while (iterator.hasNext()) {
                            Map.Entry<LdapConnectionError, String> entry = iterator.next();
                            errorMessage.append(SPConstants.SPACE + entry.getValue());
                        }
                        ed.set(SPConstants.LDAP_SERVER_HOST_ADDRESS, errorMessage.toString());
                        return false;
                    }

                    if (ldapConnection.getLdapContext() == null) {
                        LOGGER.log(Level.WARNING,
                                "Couldn't obtain context object to query LDAP (AD) directory server.");
                        ed.set(SPConstants.LDAP_SERVER_HOST_ADDRESS,
                                rb.getString(SPConstants.LDAP_CONNECTVITY_ERROR));
                        return false;
                    }

                    if (!checkForSearchBase(ldapConnection.getLdapContext(), searchBase, ed)) {
                        return false;
                    }
                    LOGGER.log(Level.CONFIG,
                            "Sucessfully created initial LDAP context to query LDAP directory server.");
                } else {
                    if (Strings.isNullOrEmpty(ldapServerHostAddress)) {
                        ed.set(SPConstants.LDAP_SERVER_HOST_ADDRESS,
                                rb.getString(SPConstants.LDAP_SERVER_HOST_ADDRESS_BLANK));
                        return false;
                    } else if (Strings.isNullOrEmpty(portNumber)) {
                        ed.set(SPConstants.PORT_NUMBER, rb.getString(SPConstants.PORT_NUMBER_BLANK));
                        return false;
                    } else if (Strings.isNullOrEmpty(searchBase)) {
                        ed.set(SPConstants.SEARCH_BASE, rb.getString(SPConstants.SEARCH_BASE_BLANK));
                        return false;
                    } else if (Strings.isNullOrEmpty(domain)) {
                        ed.set(SPConstants.DOMAIN, rb.getString(SPConstants.BLANK_DOMAIN_NAME_LDAP));
                        return false;
                    }
                }
                if (!Strings.isNullOrEmpty(useCacheToStoreLdapUserGroupsMembership)) {
                    if (null != useCacheToStoreLdapUserGroupsMembership
                            && this.useCacheToStoreLdapUserGroupsMembership.equalsIgnoreCase(SPConstants.ON)) {
                        if (!Strings.isNullOrEmpty(initialCacheSize)
                                && !Strings.isNullOrEmpty(cacheRefreshInterval)) {
                            if (!checkForInteger(this.initialCacheSize)) {
                                ed.set(SPConstants.INITAL_CACHE_SIZE, MessageFormat.format(
                                        rb.getString(SPConstants.INVALID_INITIAL_CACHE_SIZE), initialCacheSize));
                                return false;
                            }
                            if (!checkForInteger(this.cacheRefreshInterval)) {
                                ed.set(SPConstants.CACHE_REFRESH_INTERVAL,
                                        MessageFormat.format(
                                                rb.getString(SPConstants.INVALID_CACHE_REFRESH_INTERVAL),
                                                cacheRefreshInterval));
                                return false;
                            }
                        } else {
                            if (Strings.isNullOrEmpty(initialCacheSize)) {
                                ed.set(SPConstants.INITAL_CACHE_SIZE,
                                        rb.getString(SPConstants.BLANK_INITIAL_CACHE_SIZE));
                                return false;
                            }
                            if (Strings.isNullOrEmpty(cacheRefreshInterval)) {
                                ed.set(SPConstants.CACHE_REFRESH_INTERVAL,
                                        rb.getString(SPConstants.BLANK_CACHE_REFRESH_INTERVAL));
                                return false;
                            }
                        }
                    }
                }
            } else {
                if (Strings.isNullOrEmpty(groupnameFormatInAce)) {
                    ed.set(SPConstants.GROUPNAME_FORMAT_IN_ACE, MessageFormat
                            .format(rb.getString(SPConstants.BLANK_GROUPNAME_FORMAT), groupnameFormatInAce));
                    return false;
                }
                if (Strings.isNullOrEmpty(usernameFormatInAce)) {
                    ed.set(SPConstants.USERNAME_FORMAT_IN_ACE, MessageFormat
                            .format(rb.getString(SPConstants.BLANK_USERNAME_FORMAT), usernameFormatInAce));
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * Parses the string argument as a signed decimal integer. The characters in
     * the string must all be decimal digits.
     *
     * @param number
     * @return true if given string
     */
    private boolean checkForInteger(String number) {
        try {
            Integer.parseInt(number);
        } catch (NumberFormatException ne) {
            LOGGER.log(Level.WARNING, "Exception thrown while parsing LDAP port number.", ne);
            return false;
        }
        return true;
    }

    public boolean checkForSearchBase(LdapContext ldapContext, String searchBase, ErrorDignostics ed) {
        /**
         * InvalidNameException indicates that specified name does not conform to
         * the naming syntax for search base naming convention
         */
        try {
            if (ldapContext.lookup(searchBase) != null) {
                return true;
            }
        } catch (InvalidNameException e) {
            LOGGER.log(Level.WARNING, "Invalid name for search base lookup." + "\n" + e);
            ed.set(SPConstants.SEARCH_BASE, rb.getString(SPConstants.SEARCH_BASE_INVALID_SYNTAX));
        } catch (NameNotFoundException e) {
            LOGGER.log(Level.WARNING, "Invalid name for search base" + "\n" + e);
            ed.set(SPConstants.SEARCH_BASE, rb.getString(SPConstants.SEARCH_BASE_INVALID_NAME));
        } catch (NamingException e) {
            LOGGER.log(Level.WARNING, "Invalid naming exception for search base lookup." + "\n" + e);
            ed.set(SPConstants.SEARCH_BASE, rb.getString(SPConstants.SEARCH_BASE_INVALID));
        }
        return false;
    }

    /**
     * Checks if the given name consist of special characters or not and returns
     * true if there is no special characters found in the given name.
     *
     * @param nameFormat
     * @return false if given name consist of at least on special character other
     *         than '@' and '\'
     */
    private boolean checkForSpecialCharacters(String nameFormat) {
        Pattern pattern = Pattern.compile("[^a-zA-Z0-9@\\\\]");
        Matcher matcher = pattern.matcher(nameFormat);
        if (matcher.find()) {
            return false;
        }
        return true;
    }
}