Explorar o código

fix #430 : change queryParser to prototype scope

Shinsuke Sugaya %!s(int64=9) %!d(string=hai) anos
pai
achega
200d0453a8

+ 6 - 4
src/main/java/org/codelibs/fess/helper/QueryHelper.java

@@ -53,6 +53,7 @@ import org.codelibs.fess.entity.GeoInfo;
 import org.codelibs.fess.entity.QueryContext;
 import org.codelibs.fess.exception.InvalidQueryException;
 import org.codelibs.fess.mylasta.direction.FessConfig;
+import org.codelibs.fess.util.ComponentUtil;
 import org.codelibs.fess.util.StreamUtil;
 import org.dbflute.optional.OptionalThing;
 import org.elasticsearch.common.unit.Fuzziness;
@@ -92,9 +93,6 @@ public class QueryHelper implements Serializable {
     @Resource
     protected KeyMatchHelper keyMatchHelper;
 
-    @Resource
-    protected QueryParser queryParser;
-
     protected Set<String> apiResponseFieldSet;
 
     protected Set<String> highlightFieldSet = new HashSet<>();
@@ -243,7 +241,7 @@ public class QueryHelper implements Serializable {
 
     public void buildBaseQuery(final QueryContext queryContext, final Consumer<QueryContext> context) {
         try {
-            final Query query = queryParser.parse(queryContext.getQueryString());
+            final Query query = getQueryParser().parse(queryContext.getQueryString());
             final QueryBuilder queryBuilder = convertQuery(queryContext, query);
             if (queryBuilder != null) {
                 queryContext.setQueryBuilder(queryBuilder);
@@ -258,6 +256,10 @@ public class QueryHelper implements Serializable {
         }
     }
 
+    protected QueryParser getQueryParser() {
+        return ComponentUtil.getQueryParser();
+    }
+
     protected QueryBuilder convertQuery(final QueryContext context, final Query query) {
         if (query instanceof TermQuery) {
             return convertTermQuery(context, (TermQuery) query);

+ 7 - 0
src/main/java/org/codelibs/fess/util/ComponentUtil.java

@@ -15,6 +15,7 @@
  */
 package org.codelibs.fess.util;
 
+import org.apache.lucene.queryparser.classic.QueryParser;
 import org.codelibs.core.crypto.CachedCipher;
 import org.codelibs.core.misc.DynamicProperties;
 import org.codelibs.fess.api.WebApiManagerFactory;
@@ -57,6 +58,8 @@ import org.lastaflute.job.JobManager;
 import org.lastaflute.web.servlet.request.RequestManager;
 
 public final class ComponentUtil {
+    private static final String QUERY_PARSER = "queryParser";
+
     private static final String DOCUMENT_HELPER = "documentHelper";
 
     private static final String ACTIVITY_HELPER = "activityHelper";
@@ -298,6 +301,10 @@ public final class ComponentUtil {
         return SingletonLaContainer.getComponent(DOCUMENT_HELPER);
     }
 
+    public static QueryParser getQueryParser() {
+        return SingletonLaContainer.getComponent(QUERY_PARSER);
+    }
+
     public static <T> T getComponent(final Class<T> clazz) {
         return SingletonLaContainer.getComponent(clazz);
     }

+ 1 - 1
src/main/resources/app.xml

@@ -22,7 +22,7 @@
 	</component>
 	<component name="keyMatchHelper" class="org.codelibs.fess.helper.KeyMatchHelper">
 	</component>
-	<component name="queryParser" class="org.apache.lucene.queryparser.ext.ExtendableQueryParser">
+	<component name="queryParser" class="org.apache.lucene.queryparser.ext.ExtendableQueryParser" instance="prototype">
 		<arg>org.codelibs.fess.Constants.DEFAULT_FIELD</arg>
 		<arg>
 			<component class="org.apache.lucene.analysis.core.WhitespaceAnalyzer"></component>

+ 6 - 2
src/test/java/org/codelibs/fess/helper/QueryHelperTest.java

@@ -17,6 +17,7 @@ package org.codelibs.fess.helper;
 
 import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
 import org.apache.lucene.queryparser.classic.ParseException;
+import org.apache.lucene.queryparser.classic.QueryParser;
 import org.apache.lucene.queryparser.ext.ExtendableQueryParser;
 import org.codelibs.fess.Constants;
 import org.codelibs.fess.mylasta.direction.FessConfig;
@@ -30,12 +31,15 @@ public class QueryHelperTest extends UnitFessTestCase {
     @Override
     public void setUp() throws Exception {
         super.setUp();
-        queryHelper = new QueryHelper();
+        queryHelper = new QueryHelper() {
+            protected QueryParser getQueryParser() {
+                return new ExtendableQueryParser(Constants.DEFAULT_FIELD, new WhitespaceAnalyzer());
+            }
+        };
         final FessConfig fessConfig = ComponentUtil.getFessConfig();
         registerMockInstance(fessConfig);
         registerMockInstance(new SystemHelper());
         inject(queryHelper);
-        queryHelper.queryParser = new ExtendableQueryParser(Constants.DEFAULT_FIELD, new WhitespaceAnalyzer());
         queryHelper.init();
     }