Java tutorial
/******************************************************************************* * 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); } }