Thank you Jacques!

I'll check the problem you mentioned.

-----邮件原件-----
发件人: Jacques Le Roux [mailto:[email protected]] 
发送时间: 2016年2月14日 22:12
收件人: [email protected]
主题: Re: svn commit: r1730320 - in /ofbiz/trunk/specialpurpose/solr: config/ 
home/solrdefault/conf/ lib/runtime/ servicedef/ src/org/ofbiz/solr/ 
webapp/solr/WEB-INF/lib/

Sorry Jinghai

With this commit a lot of tests don't pass
Must be related with the httpmime-4.4.1.jar change or a dependency on solr 
component, I did not check

Jacques

Le 14/02/2016 12:59, [email protected] a écrit :
> Author: shijh
> Date: Sun Feb 14 11:59:59 2016
> New Revision: 1730320
>
> URL: http://svn.apache.org/viewvc?rev=1730320&view=rev
> Log:
> Refs OFBIZ-6715 Solr rebuild problem
>
> Added:
>      ofbiz/trunk/specialpurpose/solr/lib/runtime/httpmime-4.4.1.jar   (with 
> props)
> Removed:
>      
> ofbiz/trunk/specialpurpose/solr/webapp/solr/WEB-INF/lib/httpmime-4.4.1.jar
> Modified:
>      ofbiz/trunk/specialpurpose/solr/config/solrconfig.properties
>      ofbiz/trunk/specialpurpose/solr/home/solrdefault/conf/schema.xml
>      ofbiz/trunk/specialpurpose/solr/servicedef/solrservices.xml
>      ofbiz/trunk/specialpurpose/solr/src/org/ofbiz/solr/SolrProductSearch.java
>      ofbiz/trunk/specialpurpose/solr/src/org/ofbiz/solr/SolrUtil.java
>
> Modified: ofbiz/trunk/specialpurpose/solr/config/solrconfig.properties
> URL: 
> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/solr/config/solrconfig.properties?rev=1730320&r1=1730319&r2=1730320&view=diff
> ==============================================================================
> --- ofbiz/trunk/specialpurpose/solr/config/solrconfig.properties (original)
> +++ ofbiz/trunk/specialpurpose/solr/config/solrconfig.properties Sun Feb 14 
> 11:59:59 2016
> @@ -19,7 +19,7 @@
>   # Solr configuration for custom OFBiz solr modules
>   
>   # Webapp access details
> -solr.webapp.protocol=http
> +solr.webapp.protocol=https
>   solr.webapp.domainName=localhost
>   # By default, port is same as OFBiz server, but can be overridden here.
>   solr.webapp.portOverride=
> @@ -33,4 +33,15 @@ solr.eca.enabled=false
>   
>   # If true, connection errors during ECAs/SECAs are treated as 
> warnings/failures rather than errors.
>   # If false, connection errors are treated as errors, and parent 
> transactions are aborted.
> -solr.eca.treatConnectErrorNonFatal=true
> \ No newline at end of file
> +solr.eca.treatConnectErrorNonFatal=true
> +
> +# The username and password of a solr client to CRUD an index
> +solr.client.username=admin
> +solr.client.password=ofbiz
> +
> +# Socket and connection timeout of a solr client
> +solr.client.socket.timeout=
> +solr.client.connection.timeout=
> +
> +# If true, trust self signed certification, default is false.
> +solr.client.trust.selfsigned.cert=true
>
> Modified: ofbiz/trunk/specialpurpose/solr/home/solrdefault/conf/schema.xml
> URL: 
> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/solr/home/solrdefault/conf/schema.xml?rev=1730320&r1=1730319&r2=1730320&view=diff
> ==============================================================================
> --- ofbiz/trunk/specialpurpose/solr/home/solrdefault/conf/schema.xml 
> (original)
> +++ ofbiz/trunk/specialpurpose/solr/home/solrdefault/conf/schema.xml Sun Feb 
> 14 11:59:59 2016
> @@ -45,7 +45,7 @@
>       that avoids logging every request
>   -->
>   
> -<schema name="example" version="1.5">
> +<schema name="products" version="1.5">
>     <!-- attribute "name" is the name of this schema and is only used for 
> display purposes.
>          version="x.y" is Solr's version number for the schema syntax and
>          semantics.  It should not normally be changed by applications.
> @@ -127,20 +127,27 @@
>        in a compatible way. Any analysis applied to the <uniqueKey> should 
> _not_ produce multiple
>        tokens
>      -->
> -   <field name="id" type="string" indexed="true" stored="true" 
> required="true" multiValued="false" />
> +   <!-- <field name="id" type="string" indexed="true" stored="true" 
> required="true" multiValued="false" /> -->
>           
> -   <field name="sku" type="text_en_splitting_tight" indexed="true" 
> stored="true" omitNorms="true"/>
> -   <field name="name" type="text_general" indexed="true" stored="true"/>
> +   <field name="productId" type="string" indexed="true" stored="true" 
> required="true" multiValued="false" />
> +
> +   <field name="sku" type="text_general" indexed="true" stored="true"/>
> +   <field name="internalName" type="text_general" indexed="true" 
> stored="true" multiValued="true"/>
> +   <field name="alphaNameSort" type="alphaOnlySort" indexed="true" 
> stored="false"/>
>      <field name="manu" type="text_general" indexed="true" stored="true" 
> omitNorms="true"/>
>      <field name="cat" type="string" indexed="true" stored="true" 
> multiValued="true"/>
> +   <field name="catalog" type="string" indexed="true" stored="true" 
> multiValued="true"/>
>      <field name="features" type="text_general" indexed="true" stored="true" 
> multiValued="true"/>
> -   <field name="includes" type="text_general" indexed="true" stored="true" 
> termVectors="true" termPositions="true" termOffsets="true" />
> -
> +   <field name="attributes" type="text_general" indexed="true" stored="true" 
> multiValued="true"/>
>      <field name="weight" type="float" indexed="true" stored="true"/>
> -   <field name="price"  type="float" indexed="true" stored="true"/>
> +   <field name="listPrice"  type="float" indexed="true" stored="true"/>
> +   <field name="defaultPrice"  type="float" indexed="true" stored="true"/>
>      <field name="popularity" type="int" indexed="true" stored="true" />
> -   <field name="inStock" type="boolean" indexed="true" stored="true" />
> -
> +   <field name="inStock" type="int" indexed="true" stored="true" />
> +   <field name="isVirtual" type="boolean" indexed="true" stored="true" />
> +   <field name="isDigital" type="boolean" indexed="true" stored="true" />
> +   <field name="isPhysical" type="boolean" indexed="true" stored="true" />
> +
>      <field name="store" type="location" indexed="true" stored="true"/>
>   
>      <!-- Common metadata fields, named specifically to match up with
> @@ -152,18 +159,27 @@
>          "resourcename": From SolrCell request param resource.name
>      -->
>      <field name="title" type="text_general" indexed="true" stored="true" 
> multiValued="true"/>
> +   <field name="title_i18n_en" type="text_general" indexed="true" 
> stored="true" multiValued="true"/>
> +   <field name="title_i18n_de" type="text_general" indexed="true" 
> stored="true" multiValued="true"/>
> +   <field name="title_i18n_fr" type="text_general" indexed="true" 
> stored="true" multiValued="true"/>
>      <field name="subject" type="text_general" indexed="true" stored="true"/>
>      <field name="description" type="text_general" indexed="true" 
> stored="true"/>
> +   <field name="description_i18n_en" type="text_general" indexed="true" 
> stored="true"/>
> +   <field name="description_i18n_de" type="text_general" indexed="true" 
> stored="true"/>
> +   <field name="description_i18n_fr" type="text_general" indexed="true" 
> stored="true"/>
> +   <field name="longdescription" type="text_general" indexed="true" 
> stored="true"/>
> +   <field name="longdescription_i18n_en" type="text_general" indexed="true" 
> stored="true"/>
> +   <field name="longdescription_i18n_de" type="text_general" indexed="true" 
> stored="true"/>
> +   <field name="longdescription_i18n_fr" type="text_general" indexed="true" 
> stored="true"/>
>      <field name="comments" type="text_general" indexed="true" stored="true"/>
>      <field name="author" type="text_general" indexed="true" stored="true"/>
>      <field name="keywords" type="text_general" indexed="true" stored="true"/>
> -   <field name="category" type="text_general" indexed="true" stored="true"/>
> -   <field name="resourcename" type="text_general" indexed="true" 
> stored="true"/>
> -   <field name="url" type="text_general" indexed="true" stored="true"/>
>      <field name="content_type" type="string" indexed="true" stored="true" 
> multiValued="true"/>
>      <field name="last_modified" type="date" indexed="true" stored="true"/>
>      <field name="links" type="string" indexed="true" stored="true" 
> multiValued="true"/>
> -   <field name="_src_" type="string" indexed="false" stored="true"/>
> +   <field name="smallImage" type="text_general" indexed="true" 
> stored="true"/>
> +   <field name="mediumImage" type="text_general" indexed="true" 
> stored="true"/>
> +   <field name="largeImage" type="text_general" indexed="true" 
> stored="true"/>
>   
>      <!-- Main body of document extracted by SolrCell.
>           NOTE: This field is not indexed by default, since it is also copied 
> to "text"
> @@ -255,7 +271,7 @@
>    <!-- Field to use to determine and enforce document uniqueness.
>         Unless this field is marked with required="false", it will be a 
> required field
>      -->
> - <uniqueKey>id</uniqueKey>
> + <uniqueKey>productId</uniqueKey>
>   
>    <!-- DEPRECATED: The defaultSearchField is consulted by various query 
> parsers when
>     parsing a query string that isn't explicit about the field.  Machine 
> (non-user)
> @@ -277,28 +293,15 @@
>           or to add multiple fields to the same field for easier/faster 
> searching.  -->
>   
>      <copyField source="cat" dest="text"/>
> -   <copyField source="name" dest="text"/>
> +   <copyField source="internalName" dest="text"/>
>      <copyField source="manu" dest="text"/>
>      <copyField source="features" dest="text"/>
> -   <copyField source="includes" dest="text"/>
> +   <copyField source="attributes" dest="text"/>
> +   <copyField source="*_i18n_en"  dest="text" />
> +   <copyField source="*_i18n_de"  dest="text" />
> +   <copyField source="*_i18n_fr"  dest="text" />
>      <copyField source="manu" dest="manu_exact"/>
>   
> -   <!-- Copy the price into a currency enabled field (default USD) -->
> -   <copyField source="price" dest="price_c"/>
> -
> -   <!-- Text fields from SolrCell to search by default in our catch-all 
> field -->
> -   <copyField source="title" dest="text"/>
> -   <copyField source="author" dest="text"/>
> -   <copyField source="description" dest="text"/>
> -   <copyField source="keywords" dest="text"/>
> -   <copyField source="content" dest="text"/>
> -   <copyField source="content_type" dest="text"/>
> -   <copyField source="resourcename" dest="text"/>
> -   <copyField source="url" dest="text"/>
> -
> -   <!-- Create a string version of author for faceting -->
> -   <copyField source="author" dest="author_s"/>
> -     
>      <!-- Above, multiple source fields are copied to the [text] field.
>         Another way to map multiple source fields to the same
>         destination field is to use the dynamic field syntax.
>
> Added: ofbiz/trunk/specialpurpose/solr/lib/runtime/httpmime-4.4.1.jar
> URL: 
> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/solr/lib/runtime/httpmime-4.4.1.jar?rev=1730320&view=auto
> ==============================================================================
> Binary file - no diff available.
>
> Propchange: ofbiz/trunk/specialpurpose/solr/lib/runtime/httpmime-4.4.1.jar
> ------------------------------------------------------------------------------
>      svn:mime-type = application/octet-stream
>
> Modified: ofbiz/trunk/specialpurpose/solr/servicedef/solrservices.xml
> URL: 
> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/solr/servicedef/solrservices.xml?rev=1730320&r1=1730319&r2=1730320&view=diff
> ==============================================================================
> --- ofbiz/trunk/specialpurpose/solr/servicedef/solrservices.xml (original)
> +++ ofbiz/trunk/specialpurpose/solr/servicedef/solrservices.xml Sun Feb 14 
> 11:59:59 2016
> @@ -24,20 +24,13 @@ under the License.
>       <description>Content Component Services</description>
>       <vendor>OFBiz</vendor>
>       
> -    <!-- Test Case -->
> -    <service name="SolrProductSearch" engine="java"
> -        transaction-timeout="72000"
> -        location="org.ofbiz.solr.SolrProductSearch"
> -        invoke="SolrProductSearch" debug="true" validate="true">
> -        <description>First Test with Solr</description>
> -    </service>
> -
>       <!-- Rebuild the Solr Tree -->
>       <service name="rebuildSolrIndex" engine="java"
>           transaction-timeout="72000"
>           location="org.ofbiz.solr.SolrProductSearch"
>           invoke="rebuildSolrIndex" debug="true" validate="true">
>           <description>rebuild SOLR Index</description>
> +        <attribute mode="IN" name="indexName" optional="false" 
> type="String"/>
>           <attribute mode="IN" name="treatConnectErrorNonFatal" 
> optional="true" type="Boolean" default-value="false" />
>       </service>
>   
> @@ -48,6 +41,7 @@ under the License.
>           invoke="addToSolr" debug="true" validate="true">
>           <description>Adds product to solr, with product denoted by 
> productId field in instance attribute
>               - intended for use with ECAs/SECAs</description>
> +        <attribute mode="IN" name="indexName" optional="false" 
> type="String"/>
>           <attribute mode="IN" name="instance" optional="false" 
> type="org.ofbiz.entity.GenericValue" />
>       </service>
>   
> @@ -56,6 +50,7 @@ under the License.
>           location="org.ofbiz.solr.SolrProductSearch"
>           invoke="addToSolrIndex" debug="true" validate="true">
>           <description>Add a Product to Solr Index</description>
> +        <attribute mode="IN" name="indexName" optional="false" 
> type="String"/>
>           <attribute mode="IN" name="treatConnectErrorNonFatal" 
> optional="true" type="Boolean" />
>           <attribute mode="IN" name="productId" optional="false" 
> type="String" />
>           <attribute mode="IN" name="sku" optional="true" type="String" />
> @@ -88,6 +83,7 @@ under the License.
>           location="org.ofbiz.solr.SolrProductSearch"
>           invoke="addListToSolrIndex" debug="true" validate="true">
>           <description>Add a List of Products to Solr Index and flush after 
> all have been added</description>
> +        <attribute mode="IN" name="indexName" optional="false" 
> type="String"/>
>           <attribute mode="IN" name="treatConnectErrorNonFatal" 
> optional="true" type="Boolean" />
>           <attribute mode="IN" name="fieldList" optional="false" type="List" 
> />
>           <attribute mode="OUT" name="errorType" optional="true" 
> type="String" />
> @@ -99,6 +95,7 @@ under the License.
>           location="org.ofbiz.solr.SolrProductSearch"
>           invoke="productsSearch" debug="true" validate="true">
>           <description>Run a query on Solr and return the 
> results</description>
> +        <attribute mode="IN" name="indexName" optional="false" 
> type="String"/>
>           <attribute mode="IN" optional="false" name="productCategoryId" 
> type="String"/>
>           <attribute mode="IN" optional="true" name="viewSize" type="String"/>
>           <attribute mode="IN" optional="true" name="viewIndex" 
> type="String"/>
> @@ -115,6 +112,7 @@ under the License.
>           location="org.ofbiz.solr.SolrProductSearch"
>           invoke="keywordSearch" debug="true" validate="true">
>           <description>Run a query on Solr and return the 
> results</description>
> +        <attribute mode="IN" name="indexName" optional="false" 
> type="String"/>
>           <attribute mode="IN" optional="false" name="query" type="String"/>
>           <attribute mode="IN" optional="true" name="viewSize" type="String"/>
>           <attribute mode="IN" optional="true" name="viewIndex" 
> type="String"/>
> @@ -139,6 +137,7 @@ under the License.
>           location="org.ofbiz.solr.SolrProductSearch"
>           invoke="runSolrQuery" debug="true" validate="true">
>           <description>Run a query on Solr and return the 
> results</description>
> +        <attribute mode="IN" name="indexName" optional="false" 
> type="String"/>
>           <attribute mode="IN" optional="false" name="query" type="String"/>
>           <attribute mode="IN" optional="true" name="viewSize" 
> type="Integer"/>
>           <attribute mode="IN" optional="true" name="viewIndex" 
> type="Integer"/>
> @@ -158,6 +157,7 @@ under the License.
>           location="org.ofbiz.solr.SolrProductSearch"
>           invoke="getAvailableCategories" debug="true" validate="true">
>           <description>Run a query on Solr and return the 
> results</description>
> +        <attribute mode="IN" name="indexName" optional="false" 
> type="String"/>
>           <attribute mode="IN" optional="true" name="productCategoryId" 
> type="String"/>
>           <attribute mode="IN" optional="true" name="productId" 
> type="String"/>
>           <attribute mode="IN" optional="true" name="catalogId" 
> type="String"/>
> @@ -173,6 +173,7 @@ under the License.
>           location="org.ofbiz.solr.SolrProductSearch"
>           invoke="getSideDeepCategories" debug="true" validate="true">
>           <description>Run a query on Solr and return the 
> results</description>
> +        <attribute mode="IN" name="indexName" optional="false" 
> type="String"/>
>           <attribute mode="IN" optional="true" name="productCategoryId" 
> type="String"/>
>           <attribute mode="IN" optional="true" name="catalogId" 
> type="String"/>
>           <attribute name="numFound" type="Long" mode="OUT" optional="false"/>
>
> Modified: 
> ofbiz/trunk/specialpurpose/solr/src/org/ofbiz/solr/SolrProductSearch.java
> URL: 
> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/solr/src/org/ofbiz/solr/SolrProductSearch.java?rev=1730320&r1=1730319&r2=1730320&view=diff
> ==============================================================================
> --- ofbiz/trunk/specialpurpose/solr/src/org/ofbiz/solr/SolrProductSearch.java 
> (original)
> +++ ofbiz/trunk/specialpurpose/solr/src/org/ofbiz/solr/SolrProductSearch.java 
> Sun Feb 14 11:59:59 2016
> @@ -62,7 +62,6 @@ public abstract class SolrProductSearch
>   
>       public static final String module = SolrProductSearch.class.getName();
>       
> -
>       /**
>        * Adds product to solr, with product denoted by productId field in 
> instance attribute
>        * - intended for use with ECAs/SECAs.
> @@ -73,6 +72,7 @@ public abstract class SolrProductSearch
>           Delegator delegator = dctx.getDelegator();
>           GenericValue productInstance = (GenericValue) 
> context.get("instance");
>           String productId = (String) productInstance.get("productId");
> +        String solrIndexName = (String) context.get("indexName");
>           
>           if (SolrUtil.isSolrEcaEnabled()) {
>               // Debug.logVerbose("Solr: addToSolr: Running indexing for 
> productId '" + productId + "'", module);
> @@ -80,6 +80,7 @@ public abstract class SolrProductSearch
>                   GenericValue product = delegator.findOne("Product", 
> UtilMisc.toMap("productId", productId), false);
>                   Map<String, Object> dispatchContext = 
> ProductUtil.getProductContent(product, dctx, context);
>                   dispatchContext.put("treatConnectErrorNonFatal", 
> SolrUtil.isEcaTreatConnectErrorNonFatal());
> +                dispatchContext.put("indexName", solrIndexName);
>                   Map<String, Object> runResult = 
> dispatcher.runSync("addToSolrIndex", dispatchContext);
>                   String runMsg = ServiceUtil.getErrorMessage(runResult);
>                   if (UtilValidate.isEmpty(runMsg)) {
> @@ -114,13 +115,14 @@ public abstract class SolrProductSearch
>           HttpSolrClient client = null;
>           Map<String, Object> result;
>           String productId = (String) context.get("productId");
> +        String solrIndexName = (String) context.get("indexName");
>           // connectErrorNonFatal is a necessary option because in some cases 
> it may be considered normal that solr server is unavailable;
>           // don't want to return error and abort transactions in these cases.
>           Boolean treatConnectErrorNonFatal = (Boolean) 
> context.get("treatConnectErrorNonFatal");
>           try {
>               Debug.logInfo("Solr: Generating and indexing document for 
> productId '" + productId + "'", module);
>               
> -            client = new HttpSolrClient(SolrUtil.solrUrl);
> +            client = SolrUtil.getInstance().getHttpSolrClient(solrIndexName);
>               //Debug.log(server.ping().toString());
>   
>               // Construct Documents
> @@ -185,6 +187,7 @@ public abstract class SolrProductSearch
>        * This is faster than reflushing the index each time.
>        */
>       public static Map<String, Object> addListToSolrIndex(DispatchContext 
> dctx, Map<String, Object> context) throws GenericEntityException {
> +        String solrIndexName = (String) context.get("indexName");
>           HttpSolrClient client = null;
>           Map<String, Object> result;
>           Boolean treatConnectErrorNonFatal = (Boolean) 
> context.get("treatConnectErrorNonFatal");
> @@ -204,7 +207,7 @@ public abstract class SolrProductSearch
>                   docs.add(doc1);
>               }
>               // push Documents to server
> -            client = new HttpSolrClient(SolrUtil.solrUrl);
> +            client = SolrUtil.getInstance().getHttpSolrClient(solrIndexName);
>               client.add(docs);
>               client.commit();
>               
> @@ -258,9 +261,10 @@ public abstract class SolrProductSearch
>       public static Map<String, Object> runSolrQuery(DispatchContext dctx, 
> Map<String, Object> context) {
>           // get Connection
>           HttpSolrClient client = null;
> +        String solrIndexName = (String) context.get("indexName");
>           Map<String, Object> result;
>           try {
> -            client = new HttpSolrClient(SolrUtil.solrUrl);
> +            client = SolrUtil.getInstance().getHttpSolrClient(solrIndexName);
>               // create Query Object
>               SolrQuery solrQuery = new SolrQuery();
>               solrQuery.setQuery((String) context.get("query"));
> @@ -363,6 +367,7 @@ public abstract class SolrProductSearch
>       public static Map<String, Object> productsSearch(DispatchContext dctx, 
> Map<String, Object> context) {
>           Map<String, Object> result;
>           LocalDispatcher dispatcher = dctx.getDispatcher();
> +        String solrIndexName = (String) context.get("indexName");
>   
>           try {
>               Map<String, Object> dispatchMap = new HashMap<String, Object>();
> @@ -381,6 +386,7 @@ public abstract class SolrProductSearch
>               dispatchMap.put("facet", false);
>               dispatchMap.put("spellcheck", true);
>               dispatchMap.put("highlight", true);
> +            dispatchMap.put("indexName", solrIndexName);
>               Map<String, Object> searchResult = 
> dispatcher.runSync("runSolrQuery", dispatchMap);
>               QueryResponse queryResult = (QueryResponse) 
> searchResult.get("queryResult");
>               result = ServiceUtil.returnSuccess();
> @@ -403,6 +409,7 @@ public abstract class SolrProductSearch
>       public static Map<String, Object> keywordSearch(DispatchContext dctx, 
> Map<String, Object> context) {
>           Map<String, Object> result;
>           LocalDispatcher dispatcher = dctx.getDispatcher();
> +        String solrIndexName = (String) context.get("indexName");
>   
>           try {
>               if (context.get("query") == null || 
> context.get("query").equals(""))
> @@ -418,6 +425,8 @@ public abstract class SolrProductSearch
>               if (context.get("queryFilter") != null)
>                   dispatchMap.put("queryFilter", context.get("queryFilter"));
>               dispatchMap.put("spellcheck", true);
> +            dispatchMap.put("indexName", solrIndexName);
> +
>               Map<String, Object> searchResult = 
> dispatcher.runSync("runSolrQuery", dispatchMap);
>               QueryResponse queryResult = (QueryResponse) 
> searchResult.get("queryResult");
>   
> @@ -479,6 +488,7 @@ public abstract class SolrProductSearch
>        */
>       public static Map<String, Object> 
> getAvailableCategories(DispatchContext dctx, Map<String, Object> context) {
>           Map<String, Object> result;
> +        String solrIndexName = (String) context.get("indexName");
>           try {
>               boolean displayProducts = false;
>               if (UtilValidate.isNotEmpty(context.get("displayProducts")))
> @@ -494,10 +504,9 @@ public abstract class SolrProductSearch
>               if (UtilValidate.isNotEmpty(context.get("catalogId")))
>                   catalogId = (String) context.get("catalogId");
>               
> -            //String productCategoryId = (String) 
> context.get("productCategoryId") != null ? 
> CategoryUtil.getCategoryNameWithTrail((String) 
> context.get("productCategoryId"), dctx): null;
>               String productCategoryId = (String) 
> context.get("productCategoryId") != null ? 
> CategoryUtil.getCategoryNameWithTrail((String) 
> context.get("productCategoryId"),dctx) : null;
> -            Debug.logInfo("productCategoryId "+productCategoryId, module);
> -            Map<String, Object> query = 
> SolrUtil.categoriesAvailable(catalogId, productCategoryId, (String) 
> context.get("productId"), displayProducts, viewIndex, viewSize);
> +            Debug.logInfo("productCategoryId " + productCategoryId, module);
> +            Map<String, Object> query = 
> SolrUtil.categoriesAvailable(catalogId, productCategoryId, (String) 
> context.get("productId"), displayProducts, viewIndex, viewSize, 
> solrIndexName);
>   
>               QueryResponse cat = (QueryResponse) query.get("rows");
>               result = ServiceUtil.returnSuccess();
> @@ -508,7 +517,7 @@ public abstract class SolrProductSearch
>                   FacetField field = (FacetField) catIterator.next();
>                   List<Count> catL = (List<Count>) field.getValues();
>                   if (catL != null) {
> -                    // log.info("FacetFields = "+catL);
> +                    // Debug.logInfo("FacetFields = " + catL, module);
>                       for (Iterator<Count> catIter = catL.iterator(); 
> catIter.hasNext();) {
>                           FacetField.Count f = (FacetField.Count) 
> catIter.next();
>                           if (f.getCount() > 0) {
> @@ -517,7 +526,7 @@ public abstract class SolrProductSearch
>                       }
>                       result.put("categories", categories);
>                       result.put("numFound", cat.getResults().getNumFound());
> -                    // log.info("The returned map is this:"+result);
> +                    // Debug.logInfo("The returned map is this:" + result, 
> module);
>                   }
>               }
>           } catch (Exception e) {
> @@ -533,6 +542,7 @@ public abstract class SolrProductSearch
>        */
>       public static Map<String, Object> getSideDeepCategories(DispatchContext 
> dctx, Map<String, Object> context) {
>           Map<String, Object> result;
> +        String solrIndexName = (String) context.get("indexName");
>           try {
>               String catalogId = null;
>               if (UtilValidate.isNotEmpty(context.get("catalogId")))
> @@ -556,7 +566,7 @@ public abstract class SolrProductSearch
>                   int level = Integer.parseInt(categoryPathArray[0]);
>                   String facetQuery = 
> CategoryUtil.getFacetFilterForCategory(categoryPath, dctx);
>                   //Debug.logInfo("categoryPath: "+categoryPath + " 
> facetQuery: "+facetQuery,module);
> -                Map<String, Object> query = 
> SolrUtil.categoriesAvailable(catalogId, categoryPath, null, facetQuery,false, 
> 0, 0);
> +                Map<String, Object> query = 
> SolrUtil.categoriesAvailable(catalogId, categoryPath, null, facetQuery, 
> false, 0, 0, solrIndexName);
>                   QueryResponse cat = (QueryResponse) query.get("rows");
>                   List<Map<String, Object>> categories = new 
> ArrayList<Map<String, Object>>();
>                   
> @@ -612,12 +622,13 @@ public abstract class SolrProductSearch
>           GenericDelegator delegator = (GenericDelegator) dctx.getDelegator();
>           LocalDispatcher dispatcher = dctx.getDispatcher();
>           GenericValue userLogin = (GenericValue) context.get("userLogin");
> -        Locale locale = new Locale("de_DE");
> +        Locale locale = (Locale) context.get("locale");
> +        String solrIndexName = (String) context.get("indexName");
>           
>           Boolean treatConnectErrorNonFatal = (Boolean) 
> context.get("treatConnectErrorNonFatal");
>           
>           try {
> -            client = new HttpSolrClient(SolrUtil.solrUrl);
> +            client = SolrUtil.getInstance().getHttpSolrClient(solrIndexName);
>   
>               // now lets fetch all products
>               List<Map<String, Object>> solrDocs = new ArrayList<Map<String, 
> Object>>();
> @@ -642,7 +653,7 @@ public abstract class SolrProductSearch
>   
>               // THis adds all products to the Index (instantly)
>               Map<String, Object> runResult = 
> dispatcher.runSync("addListToSolrIndex", UtilMisc.toMap("fieldList", 
> solrDocs, "userLogin", userLogin,
> -                    "locale", locale, "treatConnectErrorNonFatal", 
> treatConnectErrorNonFatal));
> +                    "locale", locale, "indexName", solrIndexName, 
> "treatConnectErrorNonFatal", treatConnectErrorNonFatal));
>               
>               String runMsg = ServiceUtil.getErrorMessage(runResult);
>               if (UtilValidate.isEmpty(runMsg)) {
>
> Modified: ofbiz/trunk/specialpurpose/solr/src/org/ofbiz/solr/SolrUtil.java
> URL: 
> http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/solr/src/org/ofbiz/solr/SolrUtil.java?rev=1730320&r1=1730319&r2=1730320&view=diff
> ==============================================================================
> --- ofbiz/trunk/specialpurpose/solr/src/org/ofbiz/solr/SolrUtil.java 
> (original)
> +++ ofbiz/trunk/specialpurpose/solr/src/org/ofbiz/solr/SolrUtil.java Sun Feb 
> 14 11:59:59 2016
> @@ -18,12 +18,26 @@
>    
> *******************************************************************************/
>   package org.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 javax.net.ssl.SSLContext;
> +
> +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.conn.ssl.NoopHostnameVerifier;
> +import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
> +import org.apache.http.ssl.SSLContexts;
> +import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
> +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;
> @@ -33,6 +47,7 @@ import org.ofbiz.base.component.Componen
>   import org.ofbiz.base.component.ComponentConfig.WebappInfo;
>   import org.ofbiz.base.component.ComponentException;
>   import org.ofbiz.base.util.Debug;
> +import org.ofbiz.base.util.FileUtil;
>   import org.ofbiz.base.util.UtilGenerics;
>   import org.ofbiz.base.util.UtilProperties;
>   import org.ofbiz.base.util.UtilValidate;
> @@ -41,7 +56,7 @@ import org.ofbiz.entity.GenericEntityExc
>   /**
>    * Solr utility class.
>    */
> -public abstract class SolrUtil {
> +public final class SolrUtil {
>       
>       public static final String module = SolrUtil.class.getName();
>       private static String[] solrProdAttribute = { "productId", 
> "internalName", "manu", "size", "smallImage", "mediumImage", "largeImage", 
> "listPrice", "defaultPrice", "inStock", "isVirtual" };
> @@ -49,7 +64,27 @@ public abstract class SolrUtil {
>       public static final String solrConfigName = "solrconfig.properties";
>       public static final String solrUrl = makeSolrWebappUrl();
>       
> -    public static String makeSolrWebappUrl() {
> +    protected static final String socketTimeoutString = 
> UtilProperties.getPropertyValue(solrConfigName, "solr.client.socket.timeout");
> +
> +    protected static final String connectionTimeoutString = 
> UtilProperties.getPropertyValue(solrConfigName, 
> "solr.client.connection.timeout");
> +
> +    protected static final String clientUsername = 
> UtilProperties.getPropertyValue(solrConfigName, "solr.client.username");
> +
> +    protected static final String clientPassword = 
> UtilProperties.getPropertyValue(solrConfigName, "solr.client.password");
> +
> +    protected static final Integer socketTimeout = getSocketTimeout();
> +
> +    protected static final Integer connectionTimeout = 
> getConnectionTimeout();
> +
> +    protected static final String trustSelfSignedCertString = 
> UtilProperties.getPropertyValue(solrConfigName, 
> "solr.client.trust.selfsigned.cert", "false");
> +
> +    protected static final boolean trustSelfSignedCert = 
> getTrustSelfSignedCert();
> +
> +    protected SolrUtil() {
> +        // empty constructor
> +    }
> +
> +     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");
> @@ -58,14 +93,42 @@ public abstract class SolrUtil {
>           String solrPort;
>           if (UtilValidate.isNotEmpty(solrWebappPortOverride)) {
>               solrPort = solrWebappPortOverride;
> -        }
> -        else {
> +        } 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");
> @@ -181,18 +244,18 @@ public abstract class SolrUtil {
>           return doc1;
>       }
>       
> -    public static Map<String, Object> categoriesAvailable(String catalogId, 
> String categoryId, String productId, boolean displayproducts, int viewIndex, 
> int viewSize) {
> -        return 
> categoriesAvailable(catalogId,categoryId,productId,null,displayproducts,viewIndex,viewSize);
> +    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) {
> +    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 = new HttpSolrClient(solrUrl);
> +            client = getInstance().getHttpSolrClient(solrIndexName);
>               // create Query Object
>               String query = "inStock[1 TO *]";
>               if (categoryId != null)
> @@ -235,4 +298,68 @@ public abstract class SolrUtil {
>           return result;
>       }
>   
> +    private CloseableHttpClient getAllowAllHttpClient() {
> +        try {
> +            // Trust own CA and all self-signed certs
> +            SSLContext sslContext = SSLContexts.custom()
> +                    
> .loadTrustMaterial(FileUtil.getFile("component://base/config/ofbizssl.jks"), 
> "changeit".toCharArray(),
> +                            new TrustSelfSignedStrategy())
> +                    .build();
> +            // No host name verifier
> +            SSLConnectionSocketFactory sslsf = new 
> SSLConnectionSocketFactory(
> +                    sslContext,
> +                    NoopHostnameVerifier.INSTANCE);
> +            CloseableHttpClient httpClient = HttpClients.custom()
> +                    .setSSLSocketFactory(sslsf)
> +                    .build();
> +            return httpClient;
> +        } catch (Exception e) {
> +            return HttpClients.createDefault();
> +        }
> +    }
> +
> +    public static SolrUtil getInstance() {
> +        return new SolrUtil();
> +    }
> +
> +    public HttpSolrClient getHttpSolrClient(String solrIndexName) throws 
> ClientProtocolException, IOException {
> +        HttpClientContext httpContext = HttpClientContext.create();
> +
> +        CloseableHttpClient httpClient = null;
> +        if (trustSelfSignedCert) {
> +             httpClient = 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);
> +    }
> +
>   }
>
>
>
>



Reply via email to