瀏覽代碼

fix #474 : evalue value without groovy

Kaoru FUZITA 9 年之前
父節點
當前提交
35ff9c83de

+ 5 - 9
src/main/java/org/codelibs/fess/ds/impl/AbstractDataStoreImpl.java

@@ -30,6 +30,7 @@ import org.codelibs.fess.helper.CrawlingInfoHelper;
 import org.codelibs.fess.helper.SystemHelper;
 import org.codelibs.fess.mylasta.direction.FessConfig;
 import org.codelibs.fess.util.ComponentUtil;
+import org.codelibs.fess.util.GroovyUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -114,16 +115,11 @@ public abstract class AbstractDataStoreImpl implements DataStore {
             return StringUtil.EMPTY;
         }
 
-        try {
-            final Object value = new GroovyShell(new Binding(paramMap)).evaluate(template);
-            if (value == null) {
-                return null;
-            }
-            return value;
-        } catch (final Exception e) {
-            logger.warn("Invalid value format: " + template + " => " + paramMap, e);
-            return null;
+        if (paramMap.containsKey(template)) {
+            return paramMap.get(template);
         }
+
+        return GroovyUtil.evaluate(template, paramMap);
     }
 
     protected long getReadInterval(final Map<String, String> paramMap) {

+ 53 - 0
src/main/java/org/codelibs/fess/util/GroovyUtil.java

@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012-2016 CodeLibs Project and the Others.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ */
+package org.codelibs.fess.util;
+
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import groovy.lang.Binding;
+import groovy.lang.GroovyClassLoader;
+import groovy.lang.GroovyShell;
+
+public final class GroovyUtil {
+    private static final Logger logger = LoggerFactory.getLogger(GroovyUtil.class);
+
+    private GroovyUtil() {
+        // nothing
+    }
+
+    public static <T> Object evaluate(final String template, final Map<String, T> paramMap) {
+        final GroovyShell groovyShell = new GroovyShell(new Binding(paramMap));
+        try {
+            return groovyShell.evaluate(template);
+        } catch (final Exception e) {
+            logger.warn("Failed to evalue groovy script: " + template + " => " + paramMap, e);
+            return null;
+        } finally {
+            final GroovyClassLoader loader = groovyShell.getClassLoader();
+            //            StreamUtil.of(loader.getLoadedClasses()).forEach(c -> {
+            //                try {
+            //                    GroovySystem.getMetaClassRegistry().removeMetaClass(c);
+            //                } catch (Throwable t) {
+            //                    logger.warn("Failed to delete " + c, t);
+            //                }
+            //            });
+            loader.clearCache();
+        }
+    }
+}