diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/Recommendations.java @ 1030:c586b6220f35

Datacage: Added a development mode for recommendations flys-artifacts/trunk@2490 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 11 Aug 2011 15:08:24 +0000
parents 3f3988bb6284
children 0a5eff5511b1
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/Recommendations.java	Thu Aug 11 13:03:41 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/Recommendations.java	Thu Aug 11 15:08:24 2011 +0000
@@ -40,6 +40,9 @@
 {
     private static Logger log = Logger.getLogger(Recommendations.class);
 
+    private static final boolean DEVELOPMENT_MODE =
+        Boolean.getBoolean("flys.datacage.recommendations.development");
+
     public static final String XPATH_SYSTEM_TEMPLATE =
         "/artifact-database/metadata/system/@template";
 
@@ -48,23 +51,76 @@
 
     private static Recommendations INSTANCE;
 
-    protected Builder systemBuilder;
-    protected Builder userBuilder;
+    public static class BuilderProvider
+    {
+        protected Builder builder;
+
+        public BuilderProvider() {
+        }
+
+        public BuilderProvider(Builder builder) {
+            this.builder = builder;
+        }
+
+        public Builder getBuilder() {
+            return builder;
+        }
+    } // class BuilderProvider
+
+    public static class FileBuilderProvider
+    extends             BuilderProvider
+    {
+        protected File file;
+        protected long lastModified;
+
+        public FileBuilderProvider() {
+        }
+
+        public FileBuilderProvider(File file) {
+            this.file    = file;
+            lastModified = Long.MIN_VALUE;
+        }
+
+        @Override
+        public synchronized Builder getBuilder() {
+            long modified = file.lastModified();
+            if (modified > lastModified) {
+                lastModified = modified;
+                try {
+                    Document template = loadTemplate(file);
+                    builder = new Builder(template);
+                }
+                catch (IOException ioe) {
+                    log.error(ioe);
+                }
+            }
+            return builder;
+        }
+
+        public BuilderProvider toStaticProvider() {
+            return new BuilderProvider(builder);
+        }
+    } // class BuilderProvider
+
+    protected BuilderProvider systemBuilderProvider;
+    protected BuilderProvider userBuilderProvider;
 
     public Recommendations() {
     }
 
-    public Recommendations(Builder systemBuilder, Builder userBuilder) {
-        this.systemBuilder = systemBuilder;
-        this.userBuilder   = userBuilder;
+    public Recommendations(
+        BuilderProvider systemBuilderProvider,
+        BuilderProvider userBuilderProvider) {
+        this.systemBuilderProvider = systemBuilderProvider;
+        this.userBuilderProvider   = userBuilderProvider;
     }
 
     public Builder getUserBuilder() {
-        return userBuilder;
+        return userBuilderProvider.getBuilder();
     }
 
     public Builder getSystemBuilder() {
-        return systemBuilder;
+        return systemBuilderProvider.getBuilder();
     }
 
     protected static void artifactToParameters(
@@ -126,11 +182,6 @@
         final Node                result,
         Session                   session
     ) {
-        if (systemBuilder == null || userBuilder == null) {
-            log.error("builder not configured properly.");
-            return;
-        }
-
         session.doWork(new Work() {
             @Override
             public void execute(Connection systemConnection)
@@ -154,7 +205,7 @@
                         connections.add(new Builder.NamedConnection(
                             Builder.CONNECTION_SYSTEM, systemConnection, true));
 
-                        userBuilder.build(connections, result, parameters);
+                        getUserBuilder().build(connections, result, parameters);
                     }
                     finally {
                         userConnection.close();
@@ -164,7 +215,7 @@
                     connections.add(new Builder.NamedConnection(
                         Builder.CONNECTION_SYSTEM, systemConnection, true));
 
-                    systemBuilder.build(connections, result, parameters);
+                    getSystemBuilder().build(connections, result, parameters);
                 }
             }
         });
@@ -218,17 +269,27 @@
             return null;
         }
 
-        try {
-            Document systemTemplate = loadTemplate(systemFile);
-            Document userTemplate   = loadTemplate(userFile);
-            return new Recommendations(
-                new Builder(systemTemplate),
-                new Builder(userTemplate));
-        }
-        catch (IOException ioe) {
-            log.error(ioe);
+        FileBuilderProvider ufbp = new FileBuilderProvider(userFile);
+        FileBuilderProvider sfbp = new FileBuilderProvider(systemFile);
+
+        if (ufbp.getBuilder() == null || sfbp.getBuilder() == null) {
+            log.error("failed loading builder");
             return null;
         }
+
+        BuilderProvider ubp;
+        BuilderProvider sbp;
+
+        if (DEVELOPMENT_MODE) {
+            ubp = ufbp;
+            sbp = sfbp;
+        }
+        else {
+            ubp = ufbp.toStaticProvider();
+            sbp = sfbp.toStaticProvider();
+        }
+
+        return new Recommendations(sbp, ubp);
     }
 
     protected static Recommendations createRecommendations() {

http://dive4elements.wald.intevation.org