/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.airavata.datacat.server.db.solr;

import org.apache.airavata.datacat.server.util.Constants;
import org.apache.airavata.datacat.server.util.ServerProperties;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.solr.client.solrj.impl.HttpClientUtil;
import org.apache.solr.client.solrj.impl.HttpSolrServer;

public class SolrClientFactory {
    public HttpSolrServer createSolrMetadataClient() {
        HttpSolrServer server = new HttpSolrServer(
                ServerProperties.getInstance().getProperty(Constants.SOLR_METADATA_URL,""));
        HttpClientUtil.setBasicAuth((DefaultHttpClient) server.getHttpClient(),
                ServerProperties.getInstance().getProperty(Constants.SOLR_USERNAME, ""),
                ServerProperties.getInstance().getProperty(Constants.SOLR_PASSWORD, "")
        );
        return server;
    }

    public HttpSolrServer createSolrAclClient() {
        HttpSolrServer server = new HttpSolrServer(
                ServerProperties.getInstance().getProperty(Constants.SOLR_ACL_URL,""));
        HttpClientUtil.setBasicAuth((DefaultHttpClient) server.getHttpClient(),
                ServerProperties.getInstance().getProperty(Constants.SOLR_USERNAME, ""),
                ServerProperties.getInstance().getProperty(Constants.SOLR_PASSWORD, "")
        );
        return server;
    }
}
