blob: 4729a72b4e7e90e0c3bd7e5b8f2a092b20c21bf9 [file] [log] [blame]
/**
*
*/
package org.eclipse.smila.solr.service;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.lang.NotImplementedException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.request.SolrPing;
import org.apache.solr.client.solrj.response.SolrPingResponse;
import org.apache.solr.common.util.NamedList;
import org.eclipse.smila.datamodel.Any;
import org.eclipse.smila.datamodel.util.AnyUtil;
import org.eclipse.smila.solr.SolrConfig.Mode;
import org.eclipse.smila.solr.SolrOperationService;
import org.eclipse.smila.solr.SolrServerService;
import org.eclipse.smila.solr.SolrUtils;
import org.eclipse.smila.solr.administration.SchemaRequest;
import org.eclipse.smila.solr.administration.SmilaCollectionAdminRequest;
import org.eclipse.smila.solr.administration.SmilaCoreAdminRequest;
/**
* @author pwissel
*
*/
public class SolrOperationServiceImpl implements SolrOperationService {
private final Log _log = LogFactory.getLog(getClass());
private final HttpClient _httpClient;
private SolrServerService _serverService;
public SolrOperationServiceImpl() {
final MultiThreadedHttpConnectionManager manager = new MultiThreadedHttpConnectionManager();
_httpClient = new HttpClient(manager);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.smila.solr.SolrOperationService#processAdminOperation(java.lang.String, java.util.Map)
*/
@Override
public Any processAdminOperation(String action, Map<String, String[]> params) {
try {
SolrRequest request = null;
final Mode mode = _serverService.getConfig().getMode();
switch (mode) {
case CLOUD:
request = new SmilaCollectionAdminRequest(action, params);
break;
case EMBEDDED:
case HTTP:
request = new SmilaCoreAdminRequest(action, params);
break;
default:
final String message = String.format("Unknown mode: %s", mode.toString());
throw new UnsupportedOperationException(message);
}
final NamedList<Object> response = _serverService.getServer().request(request);
return SolrUtils.parseNamedList(response);
} catch (Exception exception) {
return AnyUtil.exceptionToAny(exception);
}
}
@Override
public Any processPingOperation(final String index) {
try {
// get server
final SolrServer server = _serverService.getServer(index);
// create ping request
final SolrPing ping = new SolrPing();
ping.getParams().add("distrib", "true");
// process request on server
final SolrPingResponse pingResponse = ping.process(server);
// parse server response
final NamedList<Object> response = pingResponse.getResponse();
return SolrUtils.parseNamedList(response);
} catch (SolrServerException | IOException exception) {
return AnyUtil.exceptionToAny(exception);
}
}
@Override
public Any processSchemaRequest(final String index, final Map<String, String[]> params, final List<String> path)
throws HttpException, IOException {
final Mode mode = _serverService.getConfig().getMode();
switch (mode) {
case CLOUD:
case HTTP:
final String restUri = _serverService.getConfig().getRestUri();
final SchemaRequest schemaRequest = new SchemaRequest(_httpClient, restUri);
return schemaRequest.getAsAny(index, params, path);
default:
final String message = String.format("Can not process schema request for mode: %s", mode.toString());
throw new NotImplementedException(message);
}
}
protected void bindSolrServerService(final SolrServerService serverService) {
if (_log.isDebugEnabled()) {
_log.debug("Bind SolrServerService...");
}
_serverService = serverService;
}
protected void unbindSolrServerService(final SolrServerService serverService) {
if (_serverService == serverService) {
if (_log.isDebugEnabled()) {
_log.debug("Unbind SolrServerService...");
}
_serverService = null;
}
}
}