# HG changeset patch # User Sascha L. Teichmann # Date 1313075304 0 # Node ID c586b6220f3509bfc54ee5adeda86d015a472539 # Parent 3f3988bb628466e13a4d081b4698d6127d0cfac6 Datacage: Added a development mode for recommendations flys-artifacts/trunk@2490 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 3f3988bb6284 -r c586b6220f35 flys-artifacts/ChangeLog --- a/flys-artifacts/ChangeLog Thu Aug 11 13:03:41 2011 +0000 +++ b/flys-artifacts/ChangeLog Thu Aug 11 15:08:24 2011 +0000 @@ -1,3 +1,13 @@ +2011-08-11 Sascha L. Teichmann + + * src/main/java/de/intevation/flys/artifacts/datacage/Recommendations.java: + Added a development mode for recommendations. Enabled with + stetting system property 'flys.datacage.recommendations.development' to true. + When set the XML template are re-read if the timestamps of the + files have changed so you do not have to restart the server again and again. + + * doc/conf/meta-data-user.xml: Sort collections by creation time in descending order. + 2011-08-11 Felix Wolfsteller Rather picky cosmetics only. diff -r 3f3988bb6284 -r c586b6220f35 flys-artifacts/doc/conf/meta-data-user.xml --- a/flys-artifacts/doc/conf/meta-data-user.xml Thu Aug 11 13:03:41 2011 +0000 +++ b/flys-artifacts/doc/conf/meta-data-user.xml Thu Aug 11 15:08:24 2011 +0000 @@ -14,10 +14,11 @@ SELECT id AS collection_id FROM collections WHERE user_id = ${user_id} - SELECT a.id AS a_id, a.state AS a_state, a.gid as a_gid FROM + SELECT a.id AS a_id, a.state AS a_state, a.gid AS a_gid, a.creation AS a_creation FROM collection_items ci JOIN artifacts a ON ci.artifact_id = a.id WHERE collection_id = ${collection_id} AND a.state = ${current-state-id} AND a.gid <> CAST(${artifact-id} AS uuid) AND EXISTS (SELECT id FROM artifact_data WHERE artifact_id = a.id AND k = 'river' AND v = ${river}) + ORDER BY a.creation DESC --- TODO: We only need the 'master' artifacts! --- @@ -31,7 +32,7 @@ FROM facets WHERE out_id = ${out_id} ORDER BY num ASC, name DESC - + diff -r 3f3988bb6284 -r c586b6220f35 flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/Recommendations.java --- 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() {