Author: shijh
Date: Tue Apr 19 10:59:33 2016 New Revision: 1739896 URL: http://svn.apache.org/viewvc?rev=1739896&view=rev Log: Backport changes on OFBIZ-6715 Solr rebuild problem to release 15.12. Added: ofbiz/branches/release15.12/specialpurpose/solr/README ofbiz/branches/release15.12/specialpurpose/solr/config/SolrUiLabels.xml (with props) ofbiz/branches/release15.12/specialpurpose/solr/lib/runtime/httpmime-4.4.1.jar (with props) ofbiz/branches/release15.12/specialpurpose/solr/widget/ ofbiz/branches/release15.12/specialpurpose/solr/widget/CommonScreens.xml (with props) ofbiz/branches/release15.12/specialpurpose/solr/widget/SolrMenus.xml (with props) ofbiz/branches/release15.12/specialpurpose/solr/widget/SolrScreens.xml (with props) ofbiz/branches/release15.12/specialpurpose/solr/widget/forms/ ofbiz/branches/release15.12/specialpurpose/solr/widget/forms/SolrForms.xml (with props) Removed: ofbiz/branches/release15.12/specialpurpose/solr/webapp/solr/WEB-INF/lib/httpmime-4.4.1.jar Modified: ofbiz/branches/release15.12/specialpurpose/solr/config/solrconfig.properties ofbiz/branches/release15.12/specialpurpose/solr/entitydef/eecas.xml ofbiz/branches/release15.12/specialpurpose/solr/home/solrdefault/conf/schema.xml ofbiz/branches/release15.12/specialpurpose/solr/home/solrdefault/conf/solrconfig.xml ofbiz/branches/release15.12/specialpurpose/solr/servicedef/solrservices.xml ofbiz/branches/release15.12/specialpurpose/solr/src/org/ofbiz/solr/SolrProductSearch.java ofbiz/branches/release15.12/specialpurpose/solr/src/org/ofbiz/solr/SolrUtil.java ofbiz/branches/release15.12/specialpurpose/solr/webapp/solr/WEB-INF/controller.xml ofbiz/branches/release15.12/specialpurpose/solr/webapp/solr/WEB-INF/web.xml Added: ofbiz/branches/release15.12/specialpurpose/solr/README URL: http://svn.apache.org/viewvc/ofbiz/branches/release15.12/specialpurpose/solr/README?rev=1739896&view=auto ============================================================================== --- ofbiz/branches/release15.12/specialpurpose/solr/README (added) +++ ofbiz/branches/release15.12/specialpurpose/solr/README Tue Apr 19 10:59:33 2016 @@ -0,0 +1,26 @@ +<#-- +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. +--> + +This OFBiz component leverages Apache Solr indexing capabilities. +For more information about this component visit the product page in the OFBiz WIKI, +which can be found at https://cwiki.apache.org/confluence/display/OFBIZ/Search+Integration + +JIRA issues related to this component can be found at https://issues.apache.org/jira/browse/OFBIZ/component/12327633 + +Committed revisions can be viewed at http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/solr/ \ No newline at end of file Added: ofbiz/branches/release15.12/specialpurpose/solr/config/SolrUiLabels.xml URL: http://svn.apache.org/viewvc/ofbiz/branches/release15.12/specialpurpose/solr/config/SolrUiLabels.xml?rev=1739896&view=auto ============================================================================== --- ofbiz/branches/release15.12/specialpurpose/solr/config/SolrUiLabels.xml (added) +++ ofbiz/branches/release15.12/specialpurpose/solr/config/SolrUiLabels.xml Tue Apr 19 10:59:33 2016 @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +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. +--> +<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/ofbiz-properties.xsd"> + + <property key="SolrApplication"> + <value xml:lang="en">Apache Solr Integration</value> + </property> + + <property key="SolrCompanyName"> + <value xml:lang="en">OFBIz - Solr Integration</value> + </property> + +</resource> \ No newline at end of file Propchange: ofbiz/branches/release15.12/specialpurpose/solr/config/SolrUiLabels.xml ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: ofbiz/branches/release15.12/specialpurpose/solr/config/solrconfig.properties URL: http://svn.apache.org/viewvc/ofbiz/branches/release15.12/specialpurpose/solr/config/solrconfig.properties?rev=1739896&r1=1739895&r2=1739896&view=diff ============================================================================== --- ofbiz/branches/release15.12/specialpurpose/solr/config/solrconfig.properties (original) +++ ofbiz/branches/release15.12/specialpurpose/solr/config/solrconfig.properties Tue Apr 19 10:59:33 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/branches/release15.12/specialpurpose/solr/entitydef/eecas.xml URL: http://svn.apache.org/viewvc/ofbiz/branches/release15.12/specialpurpose/solr/entitydef/eecas.xml?rev=1739896&r1=1739895&r2=1739896&view=diff ============================================================================== --- ofbiz/branches/release15.12/specialpurpose/solr/entitydef/eecas.xml (original) +++ ofbiz/branches/release15.12/specialpurpose/solr/entitydef/eecas.xml Tue Apr 19 10:59:33 2016 @@ -29,7 +29,7 @@ xsi:noNamespaceSchemaLocation="http://of See documentation for issues regarding implementation and context-specific issues (such as data loading/install). --> - + <!-- <eca entity="Product" operation="create-store" event="return"> <action service="addToSolr" mode="sync" value-attr="instance"/> </eca> @@ -48,7 +48,7 @@ xsi:noNamespaceSchemaLocation="http://of <condition operator="equals" field-name="productPriceTypeId" value="DEFAULT_PRICE"/> <action service="addToSolr" mode="sync" value-attr="instance"/> </eca> - + --> <!-- (Insert any needed additional ECAs here) --> </entity-eca> \ No newline at end of file Modified: ofbiz/branches/release15.12/specialpurpose/solr/home/solrdefault/conf/schema.xml URL: http://svn.apache.org/viewvc/ofbiz/branches/release15.12/specialpurpose/solr/home/solrdefault/conf/schema.xml?rev=1739896&r1=1739895&r2=1739896&view=diff ============================================================================== --- ofbiz/branches/release15.12/specialpurpose/solr/home/solrdefault/conf/schema.xml (original) +++ ofbiz/branches/release15.12/specialpurpose/solr/home/solrdefault/conf/schema.xml Tue Apr 19 10:59:33 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,33 +293,20 @@ 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. - copyField also supports a maxChars to copy setting. --> - + Another way to map multiple source fields to the same + destination field is to use the dynamic field syntax. + copyField also supports a maxChars to copy setting. --> + <!-- <copyField source="*_t" dest="text" maxChars="3000"/> --> <!-- copy name to alphaNameSort, a field designed for sorting by name --> @@ -330,8 +333,8 @@ <!-- sortMissingLast and sortMissingFirst attributes are optional attributes are currently supported on types that are sorted internally as strings and on numeric types. - This includes "string","boolean", and, as of 3.5 (and 4.x), - int, float, long, date, double, including the "Trie" variants. + This includes "string","boolean", and, as of 3.5 (and 4.x), + int, float, long, date, double, including the "Trie" variants. - If sortMissingLast="true", then a sort on this field will cause documents without the field to come after documents with the field, regardless of the requested sort order (asc or desc). @@ -451,9 +454,9 @@ <!-- A general text field that has reasonable, generic cross-language defaults: it tokenizes with StandardTokenizer, - removes stop words from case-insensitive "stopwords.txt" - (empty by default), and down cases. At query time only, it - also applies synonyms. --> + removes stop words from case-insensitive "stopwords.txt" + (empty by default), and down cases. At query time only, it + also applies synonyms. --> <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> @@ -489,11 +492,11 @@ words="lang/stopwords_en.txt" /> <filter class="solr.LowerCaseFilterFactory"/> - <filter class="solr.EnglishPossessiveFilterFactory"/> + <filter class="solr.EnglishPossessiveFilterFactory"/> <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> - <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory: + <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory: <filter class="solr.EnglishMinimalStemFilterFactory"/> - --> + --> <filter class="solr.PorterStemFilterFactory"/> </analyzer> <analyzer type="query"> @@ -504,23 +507,23 @@ words="lang/stopwords_en.txt" /> <filter class="solr.LowerCaseFilterFactory"/> - <filter class="solr.EnglishPossessiveFilterFactory"/> + <filter class="solr.EnglishPossessiveFilterFactory"/> <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> - <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory: + <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory: <filter class="solr.EnglishMinimalStemFilterFactory"/> - --> + --> <filter class="solr.PorterStemFilterFactory"/> </analyzer> </fieldType> <!-- A text field with defaults appropriate for English, plus - aggressive word-splitting and autophrase features enabled. - This field is just like text_en, except it adds - WordDelimiterFilter to enable splitting and matching of - words on case-change, alpha numeric boundaries, and - non-alphanumeric chars. This means certain compound word - cases will work, for example query "wi fi" will match - document "WiFi" or "wi-fi". + aggressive word-splitting and autophrase features enabled. + This field is just like text_en, except it adds + WordDelimiterFilter to enable splitting and matching of + words on case-change, alpha numeric boundaries, and + non-alphanumeric chars. This means certain compound word + cases will work, for example query "wi fi" will match + document "WiFi" or "wi-fi". --> <fieldType name="text_en_splitting" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> <analyzer type="index"> @@ -571,7 +574,7 @@ </fieldType> <!-- Just like text_general except it reverses the characters of - each token, to enable more efficient leading wildcard queries. --> + each token, to enable more efficient leading wildcard queries. --> <fieldType name="text_general_rev" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory"/> @@ -646,10 +649,10 @@ a token of "foo|1.4" would be indexed as "foo" with a payload of 1.4f Attributes of the DelimitedPayloadTokenFilterFactory : "delimiter" - a one character delimiter. Default is | (pipe) - "encoder" - how to encode the following value into a playload - float -> org.apache.lucene.analysis.payloads.FloatEncoder, - integer -> o.a.l.a.p.IntegerEncoder - identity -> o.a.l.a.p.IdentityEncoder + "encoder" - how to encode the following value into a playload + float -> org.apache.lucene.analysis.payloads.FloatEncoder, + integer -> o.a.l.a.p.IntegerEncoder + identity -> o.a.l.a.p.IdentityEncoder Fully Qualified class name implementing PayloadEncoder, Encoder must have a no arg constructor. --> <filter class="solr.DelimitedPayloadTokenFilterFactory" encoder="float"/> @@ -670,10 +673,10 @@ --> <fieldType name="descendent_path" class="solr.TextField"> <analyzer type="index"> - <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" /> + <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" /> </analyzer> <analyzer type="query"> - <tokenizer class="solr.KeywordTokenizerFactory" /> + <tokenizer class="solr.KeywordTokenizerFactory" /> </analyzer> </fieldType> <!-- @@ -682,10 +685,10 @@ --> <fieldType name="ancestor_path" class="solr.TextField"> <analyzer type="index"> - <tokenizer class="solr.KeywordTokenizerFactory" /> + <tokenizer class="solr.KeywordTokenizerFactory" /> </analyzer> <analyzer type="query"> - <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" /> + <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" /> </analyzer> </fieldType> Modified: ofbiz/branches/release15.12/specialpurpose/solr/home/solrdefault/conf/solrconfig.xml URL: http://svn.apache.org/viewvc/ofbiz/branches/release15.12/specialpurpose/solr/home/solrdefault/conf/solrconfig.xml?rev=1739896&r1=1739895&r2=1739896&view=diff ============================================================================== --- ofbiz/branches/release15.12/specialpurpose/solr/home/solrdefault/conf/solrconfig.xml (original) +++ ofbiz/branches/release15.12/specialpurpose/solr/home/solrdefault/conf/solrconfig.xml Tue Apr 19 10:59:33 2016 @@ -1209,7 +1209,7 @@ <!-- maximum threshold of documents a query term can appear to be considered for correction --> <float name="maxQueryFrequency">0.01</float> <!-- uncomment this to require suggestions to occur in 1% of the documents - <float name="thresholdTokenFrequency">.01</float> + <float name="thresholdTokenFrequency">.01</float> --> </lst> Added: ofbiz/branches/release15.12/specialpurpose/solr/lib/runtime/httpmime-4.4.1.jar URL: http://svn.apache.org/viewvc/ofbiz/branches/release15.12/specialpurpose/solr/lib/runtime/httpmime-4.4.1.jar?rev=1739896&view=auto ============================================================================== Binary file - no diff available. Propchange: ofbiz/branches/release15.12/specialpurpose/solr/lib/runtime/httpmime-4.4.1.jar ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Modified: ofbiz/branches/release15.12/specialpurpose/solr/servicedef/solrservices.xml URL: http://svn.apache.org/viewvc/ofbiz/branches/release15.12/specialpurpose/solr/servicedef/solrservices.xml?rev=1739896&r1=1739895&r2=1739896&view=diff ============================================================================== --- ofbiz/branches/release15.12/specialpurpose/solr/servicedef/solrservices.xml (original) +++ ofbiz/branches/release15.12/specialpurpose/solr/servicedef/solrservices.xml Tue Apr 19 10:59:33 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" default-value="solrdefault"/> <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/branches/release15.12/specialpurpose/solr/src/org/ofbiz/solr/SolrProductSearch.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release15.12/specialpurpose/solr/src/org/ofbiz/solr/SolrProductSearch.java?rev=1739896&r1=1739895&r2=1739896&view=diff ============================================================================== --- ofbiz/branches/release15.12/specialpurpose/solr/src/org/ofbiz/solr/SolrProductSearch.java (original) +++ ofbiz/branches/release15.12/specialpurpose/solr/src/org/ofbiz/solr/SolrProductSearch.java Tue Apr 19 10:59:33 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/branches/release15.12/specialpurpose/solr/src/org/ofbiz/solr/SolrUtil.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release15.12/specialpurpose/solr/src/org/ofbiz/solr/SolrUtil.java?rev=1739896&r1=1739895&r2=1739896&view=diff ============================================================================== --- ofbiz/branches/release15.12/specialpurpose/solr/src/org/ofbiz/solr/SolrUtil.java (original) +++ ofbiz/branches/release15.12/specialpurpose/solr/src/org/ofbiz/solr/SolrUtil.java Tue Apr 19 10:59:33 2016 @@ -18,12 +18,20 @@ *******************************************************************************/ 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 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; @@ -34,6 +42,7 @@ import org.ofbiz.base.component.Componen import org.ofbiz.base.component.ComponentException; import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.UtilGenerics; +import org.ofbiz.base.util.UtilHttp; import org.ofbiz.base.util.UtilProperties; import org.ofbiz.base.util.UtilValidate; import org.ofbiz.entity.GenericEntityException; @@ -41,7 +50,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,6 +58,22 @@ public abstract class SolrUtil { public static final String solrConfigName = "solrconfig.properties"; public static final String solrUrl = 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(); + public static String makeSolrWebappUrl() { final String solrWebappProtocol = UtilProperties.getPropertyValue(solrConfigName, "solr.webapp.protocol"); final String solrWebappDomainName = UtilProperties.getPropertyValue(solrConfigName, "solr.webapp.domainName"); @@ -58,14 +83,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 +234,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 = getHttpSolrClient(solrIndexName); // create Query Object String query = "inStock[1 TO *]"; if (categoryId != null) @@ -235,4 +288,48 @@ public abstract class SolrUtil { 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); + } + } Modified: ofbiz/branches/release15.12/specialpurpose/solr/webapp/solr/WEB-INF/controller.xml URL: http://svn.apache.org/viewvc/ofbiz/branches/release15.12/specialpurpose/solr/webapp/solr/WEB-INF/controller.xml?rev=1739896&r1=1739895&r2=1739896&view=diff ============================================================================== --- ofbiz/branches/release15.12/specialpurpose/solr/webapp/solr/WEB-INF/controller.xml (original) +++ ofbiz/branches/release15.12/specialpurpose/solr/webapp/solr/WEB-INF/controller.xml Tue Apr 19 10:59:33 2016 @@ -40,9 +40,15 @@ </request-map> <request-map uri="main"> <security https="true" auth="false"/> - <event type="java" path="org.ofbiz.solr.control.OFBizSolrLoginWorker" invoke="extensionCheckLogin"/> - <response name="success" type="none"/> - <response name="error" type="view" value="login"/> + <response name="success" type="view" value="main"/> </request-map> - + <request-map uri="newquery"> + <security https="true" auth="false"/> + <response name="success" type="view" value="newquery"/> + </request-map> + + <!-- view-maps --> + <view-map name="main" type="screen" page="component://solr/widget/SolrScreens.xml#Main"/> + <view-map name="newquery" type="screen" page="component://solr/widget/SolrScreens.xml#NewQuery"/> + </site-conf> \ No newline at end of file Modified: ofbiz/branches/release15.12/specialpurpose/solr/webapp/solr/WEB-INF/web.xml URL: http://svn.apache.org/viewvc/ofbiz/branches/release15.12/specialpurpose/solr/webapp/solr/WEB-INF/web.xml?rev=1739896&r1=1739895&r2=1739896&view=diff ============================================================================== --- ofbiz/branches/release15.12/specialpurpose/solr/webapp/solr/WEB-INF/web.xml (original) +++ ofbiz/branches/release15.12/specialpurpose/solr/webapp/solr/WEB-INF/web.xml Tue Apr 19 10:59:33 2016 @@ -33,7 +33,7 @@ </context-param> <context-param> <param-name>mainDecoratorLocation</param-name> - <param-value>component://content/widget/CommonScreens.xml</param-value> + <param-value>component://solr/widget/CommonScreens.xml</param-value> <!-- The location of the main-decorator screen to use for this webapp; referred to as a context variable in screen def XML files. --> </context-param> <context-param> Added: ofbiz/branches/release15.12/specialpurpose/solr/widget/CommonScreens.xml URL: http://svn.apache.org/viewvc/ofbiz/branches/release15.12/specialpurpose/solr/widget/CommonScreens.xml?rev=1739896&view=auto ============================================================================== --- ofbiz/branches/release15.12/specialpurpose/solr/widget/CommonScreens.xml (added) +++ ofbiz/branches/release15.12/specialpurpose/solr/widget/CommonScreens.xml Tue Apr 19 10:59:33 2016 @@ -0,0 +1,60 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +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. +--> +<screens xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-screen.xsd"> + + <screen name="main-decorator"> + <section> + <actions> + <set field="activeApp" value="solr" global="true"/> + <property-map resource="SolrUiLabels" map-name="uiLabelMap" global="true"/> + <property-map resource="CommonUiLabels" map-name="uiLabelMap" global="true"/> + <set field="layoutSettings.companyName" from-field="uiLabelMap.SolrCompanyName" global="true"/> + <set field="layoutSettings.companySubtitle" from-field="uiLabelMap.SolrCompanySubtitle" global="true"/> + + <set field="applicationMenuName" value="SolrAppBar" global="true"/> + <set field="applicationMenuLocation" value="component://solr/widget/SolrMenus.xml" global="true"/> + <set field="applicationTitle" value="${uiLabelMap.SolrApplication}" global="true"/> + </actions> + <widgets> + <include-screen name="ApplicationDecorator" location="component://commonext/widget/CommonScreens.xml"/> + </widgets> + </section> + </screen> + + <screen name="SolrCommonDecorator"> + <section> + <widgets> + <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}"> + <decorator-section name="body"> + <section> + <widgets> + <decorator-section-include name="body"/> + </widgets> + <fail-widgets> + <label style="h3">${uiLabelMap.SolrViewPermissionError}</label> + </fail-widgets> + </section> + </decorator-section> + </decorator-screen> + </widgets> + </section> + </screen> +</screens> \ No newline at end of file Propchange: ofbiz/branches/release15.12/specialpurpose/solr/widget/CommonScreens.xml ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/branches/release15.12/specialpurpose/solr/widget/SolrMenus.xml URL: http://svn.apache.org/viewvc/ofbiz/branches/release15.12/specialpurpose/solr/widget/SolrMenus.xml?rev=1739896&view=auto ============================================================================== --- ofbiz/branches/release15.12/specialpurpose/solr/widget/SolrMenus.xml (added) +++ ofbiz/branches/release15.12/specialpurpose/solr/widget/SolrMenus.xml Tue Apr 19 10:59:33 2016 @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +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. +--> +<menus xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-menu.xsd"> + + <menu name="SolrAppBar" title="${uiLabelMap.SolrApplication}" extends="CommonAppBarMenu" extends-resource="component://common/widget/CommonMenus.xml"> + <menu-item name="admin" title="${uiLabelMap.SolrAdmin}"> + <link target="/solr" url-mode="plain" target-window="_blank"/> + </menu-item> + <menu-item name="main" title="${uiLabelMap.CommonMain}"> + <link target="main"/> + </menu-item> + <menu-item name="query" title="${uiLabelMap.CommonQuery}"> + <link target="newquery"/> + </menu-item> + </menu> + +</menus> \ No newline at end of file Propchange: ofbiz/branches/release15.12/specialpurpose/solr/widget/SolrMenus.xml ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/branches/release15.12/specialpurpose/solr/widget/SolrScreens.xml URL: http://svn.apache.org/viewvc/ofbiz/branches/release15.12/specialpurpose/solr/widget/SolrScreens.xml?rev=1739896&view=auto ============================================================================== --- ofbiz/branches/release15.12/specialpurpose/solr/widget/SolrScreens.xml (added) +++ ofbiz/branches/release15.12/specialpurpose/solr/widget/SolrScreens.xml Tue Apr 19 10:59:33 2016 @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- +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. +--> +<screens xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-screen.xsd"> + + <screen name="Main"> + <section> + <widgets> + <decorator-screen name="SolrCommonDecorator" location="${parameters.mainDecoratorLocation}"> + <decorator-section name="body"> + </decorator-section> + </decorator-screen> + </widgets> + </section> + </screen> + + <screen name="NewQuery"> + <section> + <widgets> + <decorator-screen name="SolrCommonDecorator" location="${parameters.mainDecoratorLocation}"> + <decorator-section name="body"> + <include-form location="component://solr/widget/forms/SolrForms.xml" name="NewQuery"/> + </decorator-section> + </decorator-screen> + </widgets> + </section> + </screen> +</screens> \ No newline at end of file Propchange: ofbiz/branches/release15.12/specialpurpose/solr/widget/SolrScreens.xml ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: ofbiz/branches/release15.12/specialpurpose/solr/widget/forms/SolrForms.xml URL: http://svn.apache.org/viewvc/ofbiz/branches/release15.12/specialpurpose/solr/widget/forms/SolrForms.xml?rev=1739896&view=auto ============================================================================== --- ofbiz/branches/release15.12/specialpurpose/solr/widget/forms/SolrForms.xml (added) +++ ofbiz/branches/release15.12/specialpurpose/solr/widget/forms/SolrForms.xml Tue Apr 19 10:59:33 2016 @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> + <!-- + 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. +--> + +<forms xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-form.xsd"> + + <form name="NewQuery" type="single" target="query"> + <field name="query" title="${uiLabelMap.QueryString}"><textarea cols="120" rows="5"/></field> + <field name="search" title="${uiLabelMap.CommonFind}" widget-style="smallSubmit"> + <submit button-type="button"/> + </field> + </form> +</forms> \ No newline at end of file Propchange: ofbiz/branches/release15.12/specialpurpose/solr/widget/forms/SolrForms.xml ------------------------------------------------------------------------------ svn:mime-type = text/plain |
Free forum by Nabble | Edit this page |