blob: 8b9cd72499cbfd68a7dfe9609b1aef575f5537d2 [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*******************************************************************************/
package org.apache.ofbiz.solr;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrRequest.METHOD;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrInputDocument;
import org.apache.ofbiz.base.component.ComponentConfig;
import org.apache.ofbiz.base.component.ComponentConfig.WebappInfo;
import org.apache.ofbiz.base.component.ComponentException;
import org.apache.ofbiz.base.util.Debug;
import org.apache.ofbiz.base.util.UtilGenerics;
import org.apache.ofbiz.base.util.UtilHttp;
import org.apache.ofbiz.base.util.UtilProperties;
import org.apache.ofbiz.base.util.UtilValidate;
import org.apache.ofbiz.entity.GenericEntityException;
/**
* Solr utility class.
*/
public final class SolrUtil {
private SolrUtil() {}
public static final String module = SolrUtil.class.getName();
private static final String[] solrProdAttribute = { "productId", "internalName", "manu", "size", "smallImage", "mediumImage", "largeImage", "listPrice", "defaultPrice", "inStock", "isVirtual" };
private static final String solrConfigName = "solrconfig.properties";
private static final String solrUrl = makeSolrWebappUrl();
private static final String socketTimeoutString = UtilProperties.getPropertyValue(solrConfigName, "solr.client.socket.timeout");
private static final String connectionTimeoutString = UtilProperties.getPropertyValue(solrConfigName, "solr.client.connection.timeout");
private static final String clientUsername = UtilProperties.getPropertyValue(solrConfigName, "solr.client.username");
private static final String clientPassword = UtilProperties.getPropertyValue(solrConfigName, "solr.client.password");
private static final Integer socketTimeout = getSocketTimeout();
private static final Integer connectionTimeout = getConnectionTimeout();
private static final String trustSelfSignedCertString = UtilProperties.getPropertyValue(solrConfigName, "solr.client.trust.selfsigned.cert", "false");
private static final boolean trustSelfSignedCert = getTrustSelfSignedCert();
public static String makeSolrWebappUrl() {
final String solrWebappProtocol = UtilProperties.getPropertyValue(solrConfigName, "solr.webapp.protocol");
final String solrWebappDomainName = UtilProperties.getPropertyValue(solrConfigName, "solr.webapp.domainName");
final String solrWebappPath = UtilProperties.getPropertyValue(solrConfigName, "solr.webapp.path");
final String solrWebappPortOverride = UtilProperties.getPropertyValue(solrConfigName, "solr.webapp.portOverride");
String solrPort;
if (UtilValidate.isNotEmpty(solrWebappPortOverride)) {
solrPort = solrWebappPortOverride;
} else {
solrPort = UtilProperties.getPropertyValue("url", ("https".equals(solrWebappProtocol) ? "port.https" : "port.http"));
}
return solrWebappProtocol + "://" + solrWebappDomainName + ":" + solrPort + solrWebappPath;
}
private static Integer getSocketTimeout() {
if (UtilValidate.isNotEmpty(socketTimeoutString)) {
try {
return Integer.parseInt(socketTimeoutString);
} catch (Exception e) {
return null;
}
}
return null;
}
private static Integer getConnectionTimeout() {
if (UtilValidate.isNotEmpty(connectionTimeoutString)) {
try {
return Integer.parseInt(connectionTimeoutString);
} catch (Exception e) {
return null;
}
}
return null;
}
private static boolean getTrustSelfSignedCert() {
if ("true".equals(trustSelfSignedCertString)) {
return true;
}
return false;
}
public static boolean isSolrEcaEnabled() {
Boolean ecaEnabled = null;
String sysProp = System.getProperty("ofbiz.solr.eca.enabled");
if (UtilValidate.isNotEmpty(sysProp)) {
if ("true".equalsIgnoreCase(sysProp)) {
ecaEnabled = Boolean.TRUE;
}
else if ("false".equalsIgnoreCase(sysProp)) {
ecaEnabled = Boolean.FALSE;
}
}
if (ecaEnabled == null) {
ecaEnabled = UtilProperties.getPropertyAsBoolean(SolrUtil.solrConfigName, "solr.eca.enabled", false);
}
return Boolean.TRUE.equals(ecaEnabled);
}
public static WebappInfo getSolrWebappInfo() {
WebappInfo solrApp = null;
try {
ComponentConfig cc = ComponentConfig.getComponentConfig("solr");
for(WebappInfo currApp : cc.getWebappInfos()) {
if ("solr".equals(currApp.getName())) {
solrApp = currApp;
break;
}
}
}
catch(ComponentException e) {
throw new IllegalStateException(e);
}
return solrApp;
}
public static boolean isEcaTreatConnectErrorNonFatal() {
Boolean treatConnectErrorNonFatal = UtilProperties.getPropertyAsBoolean(solrConfigName, "solr.eca.treatConnectErrorNonFatal", true);
return Boolean.TRUE.equals(treatConnectErrorNonFatal);
}
public static SolrInputDocument generateSolrDocument(Map<String, Object> context) throws GenericEntityException {
SolrInputDocument doc1 = new SolrInputDocument();
// add defined attributes
for (int i = 0; i < solrProdAttribute.length; i++) {
if (context.get(solrProdAttribute[i]) != null) {
doc1.addField(solrProdAttribute[i], context.get(solrProdAttribute[i]).toString());
}
}
// add catalog
if (context.get("catalog") != null) {
List<String> catalog = UtilGenerics.<String>checkList(context.get("catalog"));
for (String c : catalog) {
doc1.addField("catalog", c);
}
}
// add categories
if (context.get("category") != null) {
List<String> category = UtilGenerics.<String>checkList(context.get("category"));
Iterator<String> catIter = category.iterator();
while (catIter.hasNext()) {
String cat = (String) catIter.next();
doc1.addField("cat", cat);
}
}
// add features
if (context.get("features") != null) {
Set<String> features = UtilGenerics.<String>checkSet(context.get("features"));
Iterator<String> featIter = features.iterator();
while (featIter.hasNext()) {
String feat = featIter.next();
doc1.addField("features", feat);
}
}
// add attributes
if (context.get("attributes") != null) {
List<String> attributes = UtilGenerics.<String>checkList(context.get("attributes"));
Iterator<String> attrIter = attributes.iterator();
while (attrIter.hasNext()) {
String attr = attrIter.next();
doc1.addField("attributes", attr);
}
}
// add title
if (context.get("title") != null) {
Map<String, String> title = UtilGenerics.<String, String>checkMap(context.get("title"));
for (Map.Entry<String, String> entry : title.entrySet()) {
doc1.addField("title_i18n_" + entry.getKey(), entry.getValue());
}
}
// add short_description
if (context.get("description") != null) {
Map<String, String> description = UtilGenerics.<String, String>checkMap(context.get("description"));
for (Map.Entry<String, String> entry : description.entrySet()) {
doc1.addField("description_i18n_" + entry.getKey(), entry.getValue());
}
}
// add short_description
if (context.get("longDescription") != null) {
Map<String, String> longDescription = UtilGenerics.<String, String>checkMap(context.get("longDescription"));
for (Map.Entry<String, String> entry : longDescription.entrySet()) {
doc1.addField("longdescription_i18n_" + entry.getKey(), entry.getValue());
}
}
return doc1;
}
public static Map<String, Object> categoriesAvailable(String catalogId, String categoryId, String productId, boolean displayproducts, int viewIndex, int viewSize, String solrIndexName) {
return categoriesAvailable(catalogId, categoryId, productId, null, displayproducts, viewIndex, viewSize, solrIndexName);
}
public static Map<String, Object> categoriesAvailable(String catalogId, String categoryId, String productId, String facetPrefix, boolean displayproducts, int viewIndex, int viewSize, String solrIndexName) {
// create the data model
Map<String, Object> result = new HashMap<String, Object>();
HttpSolrClient client = null;
QueryResponse returnMap = new QueryResponse();
try {
// do the basic query
client = getHttpSolrClient(solrIndexName);
// create Query Object
String query = "inStock[1 TO *]";
if (categoryId != null)
query += " +cat:"+ categoryId;
else if (productId != null)
query += " +productId:" + productId;
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery(query);
if (catalogId != null)
solrQuery.setFilterQueries("catalog:" + catalogId);
if (displayproducts) {
if (viewSize > -1) {
solrQuery.setRows(viewSize);
} else
solrQuery.setRows(50000);
if (viewIndex > -1) {
solrQuery.setStart(viewIndex);
}
} else {
solrQuery.setFields("cat");
solrQuery.setRows(0);
}
if(UtilValidate.isNotEmpty(facetPrefix)){
solrQuery.setFacetPrefix(facetPrefix);
}
solrQuery.setFacetMinCount(0);
solrQuery.setFacet(true);
solrQuery.addFacetField("cat");
solrQuery.setFacetLimit(-1);
Debug.logVerbose("solr: solrQuery: " + solrQuery, module);
returnMap = client.query(solrQuery, METHOD.POST);
result.put("rows", returnMap);
result.put("numFound", returnMap.getResults().getNumFound());
} catch (Exception e) {
Debug.logError(e.getMessage(), module);
}
return result;
}
public static SolrUtil getInstance() {
return new SolrUtil();
}
public static HttpSolrClient getHttpSolrClient(String solrIndexName) throws ClientProtocolException, IOException {
HttpClientContext httpContext = HttpClientContext.create();
CloseableHttpClient httpClient = null;
if (trustSelfSignedCert) {
httpClient = UtilHttp.getAllowAllHttpClient();
} else {
httpClient = HttpClients.createDefault();
}
RequestConfig requestConfig = null;
if (UtilValidate.isNotEmpty(socketTimeout) && UtilValidate.isNotEmpty(connectionTimeout)) {
requestConfig = RequestConfig.custom()
.setSocketTimeout(socketTimeout)
.setConnectTimeout(connectionTimeout)
.setRedirectsEnabled(true)
.build();
} else if (UtilValidate.isNotEmpty(socketTimeout)) {
requestConfig = RequestConfig.custom()
.setSocketTimeout(socketTimeout)
.setRedirectsEnabled(true)
.build();
} else if (UtilValidate.isNotEmpty(connectionTimeout)) {
requestConfig = RequestConfig.custom()
.setConnectTimeout(connectionTimeout)
.setRedirectsEnabled(true)
.build();
} else {
requestConfig = RequestConfig.custom()
.setRedirectsEnabled(true)
.build();
}
HttpGet httpLogin = new HttpGet(solrUrl + "/control/login?USERNAME=" + clientUsername + "&PASSWORD=" + clientPassword);
httpLogin.setConfig(requestConfig);
CloseableHttpResponse loginResponse = httpClient.execute(httpLogin, httpContext);
loginResponse.close();
return new HttpSolrClient(solrUrl + "/" + solrIndexName, httpClient);
}
}