From 573a5e6cc6e163735d42aae93e87273a9b376af3 Mon Sep 17 00:00:00 2001 From: Jim Blake Date: Thu, 2 Oct 2014 16:22:02 -0400 Subject: [PATCH] Add a developer setting that will suppress automated search index updates. --- .../searchindex/SearchIndexerSetup.java | 13 +- .../vitro/webapp/utils/developer/Key.java | 7 ++ .../DeveloperDisabledModelChangeListener.java | 116 ++++++++++++++++++ webapp/web/js/developer/developerPanel.js | 1 + .../page/partials/developerPanel.ftl | 36 +++--- 5 files changed, 151 insertions(+), 22 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/utils/developer/listeners/DeveloperDisabledModelChangeListener.java diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/searchindex/SearchIndexerSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/searchindex/SearchIndexerSetup.java index f55acad33..bb42e07c4 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/searchindex/SearchIndexerSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/searchindex/SearchIndexerSetup.java @@ -42,6 +42,8 @@ import edu.cornell.mannlib.vitro.webapp.search.indexing.AdditionalUriFinders; import edu.cornell.mannlib.vitro.webapp.search.indexing.IndexBuilder; import edu.cornell.mannlib.vitro.webapp.search.indexing.SearchReindexingListener; import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; +import edu.cornell.mannlib.vitro.webapp.utils.developer.Key; +import edu.cornell.mannlib.vitro.webapp.utils.developer.listeners.DeveloperDisabledModelChangeListener; /** * TODO @@ -129,11 +131,12 @@ public class SearchIndexerSetup implements ServletContextListener { // webapp. context.setAttribute(IndexBuilder.class.getName(), builder); - // set up listeners so search index builder is notified of changes - // to model - ServletContext ctx = sce.getServletContext(); - SearchReindexingListener srl = new SearchReindexingListener(builder); - ModelContext.registerListenerForChanges(ctx, srl); + // Create listener to notify index builder of changes to model + // (can be disabled by developer setting.) + ModelContext.registerListenerForChanges(context, + new DeveloperDisabledModelChangeListener( + new SearchReindexingListener(builder), + Key.SEARCH_INDEX_SUPPRESS_MODEL_CHANGE_LISTENER)); ss.info(this, "Setup of search indexer completed."); } catch (Throwable e) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/developer/Key.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/developer/Key.java index 529ac07c1..9dafcb266 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/developer/Key.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/developer/Key.java @@ -110,6 +110,12 @@ public enum Key { SEARCH_INDEX_DOCUMENT_RESTRICTION( "developer.searchIndex.documentRestriction", false), + /** + * If set, don't pass model change events to the search indexer. + */ + SEARCH_INDEX_SUPPRESS_MODEL_CHANGE_LISTENER( + "developer.searchIndex.suppressModelChangeListener", true), + /** * Tell the SearchEngineLogger to log all index deletions. */ @@ -185,6 +191,7 @@ public enum Key { private final String propertyName; private final boolean bool; + // TODO create a private enum for KeyType to clarify these constructors. private Key(String propertyName, boolean bool) { this.propertyName = propertyName; this.bool = bool; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/developer/listeners/DeveloperDisabledModelChangeListener.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/developer/listeners/DeveloperDisabledModelChangeListener.java new file mode 100644 index 000000000..280666a8c --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/developer/listeners/DeveloperDisabledModelChangeListener.java @@ -0,0 +1,116 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.utils.developer.listeners; + +import java.util.List; + +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.ModelChangedListener; +import com.hp.hpl.jena.rdf.model.Statement; +import com.hp.hpl.jena.rdf.model.StmtIterator; + +import edu.cornell.mannlib.vitro.webapp.utils.developer.DeveloperSettings; +import edu.cornell.mannlib.vitro.webapp.utils.developer.Key; + +/** + * If a particular developer flag is NOT set to true, this is transparent. + * + * Set the flag and this becomes opaque, passing no events through. + */ +public class DeveloperDisabledModelChangeListener implements + ModelChangedListener { + private final ModelChangedListener inner; + private final Key disablingKey; + + public DeveloperDisabledModelChangeListener(ModelChangedListener inner, + Key disablingKey) { + this.inner = inner; + this.disablingKey = disablingKey; + } + + private boolean isEnabled() { + return !DeveloperSettings.getInstance().getBoolean(disablingKey); + } + + // ---------------------------------------------------------------------- + // Delegated methods. + // ---------------------------------------------------------------------- + + @Override + public void addedStatement(Statement s) { + if (isEnabled()) { + inner.addedStatement(s); + } + } + + @Override + public void addedStatements(Statement[] statements) { + if (isEnabled()) { + inner.addedStatements(statements); + } + } + + @Override + public void addedStatements(List statements) { + if (isEnabled()) { + inner.addedStatements(statements); + } + } + + @Override + public void addedStatements(StmtIterator statements) { + if (isEnabled()) { + inner.addedStatements(statements); + } + } + + @Override + public void addedStatements(Model m) { + if (isEnabled()) { + inner.addedStatements(m); + } + } + + @Override + public void removedStatement(Statement s) { + if (isEnabled()) { + inner.removedStatement(s); + } + } + + @Override + public void removedStatements(Statement[] statements) { + if (isEnabled()) { + inner.removedStatements(statements); + } + } + + @Override + public void removedStatements(List statements) { + if (isEnabled()) { + inner.removedStatements(statements); + } + } + + @Override + public void removedStatements(StmtIterator statements) { + if (isEnabled()) { + inner.removedStatements(statements); + } + } + + @Override + public void removedStatements(Model m) { + if (isEnabled()) { + inner.removedStatements(m); + } + } + + @Override + public void notifyEvent(Model m, Object event) { + if (isEnabled()) { + inner.notifyEvent(m, event); + } + } + +} diff --git a/webapp/web/js/developer/developerPanel.js b/webapp/web/js/developer/developerPanel.js index 3bfa0721f..1c09a9cda 100644 --- a/webapp/web/js/developer/developerPanel.js +++ b/webapp/web/js/developer/developerPanel.js @@ -54,6 +54,7 @@ function DeveloperPanel(developerAjaxUrl) { document.getElementById("developer_i18n_logStringRequests").disabled = !developerEnabled; document.getElementById("developer_loggingRDFService_enable").disabled = !developerEnabled; document.getElementById("developer_searchIndex_enable").disabled = !developerEnabled; + document.getElementById("developer_searchIndex_suppressModelChangeListener").disabled = !developerEnabled; document.getElementById("developer_searchDeletions_enable").disabled = !developerEnabled; document.getElementById("developer_searchEngine_enable").disabled = !developerEnabled; document.getElementById("developer_authorization_logDecisions_enable").disabled = !developerEnabled; diff --git a/webapp/web/templates/freemarker/page/partials/developerPanel.ftl b/webapp/web/templates/freemarker/page/partials/developerPanel.ftl index a474a57b6..ecce6cbb9 100644 --- a/webapp/web/templates/freemarker/page/partials/developerPanel.ftl +++ b/webapp/web/templates/freemarker/page/partials/developerPanel.ftl @@ -96,17 +96,16 @@
- Indexing - <@showCheckbox "developer_searchIndex_enable", "Log indexing." /> + Searching + <@showCheckbox "developer_searchEngine_enable", "Log searches" />
- <@showCheckbox "developer_searchIndex_showDocuments", - "Show document contents" /> - <@showTextbox "developer_searchIndex_uriOrNameRestriction", - "Restrict by URI or name" /> - <@showTextbox "developer_searchIndex_documentRestriction", - "Restrict by document contents" /> + <@showCheckbox "developer_searchEngine_addStackTrace", "Show stack trace" /> + <@showCheckbox "developer_searchEngine_addResults", "Show search results" /> + <@showTextbox "developer_searchEngine_queryRestriction", + "Restrict by query string" /> + <@showTextbox "developer_searchEngine_stackRestriction", + "Restrict by calling stack" />
- <@showCheckbox "developer_searchDeletions_enable", "Log deletions." />
@@ -118,16 +117,19 @@
- Searching - <@showCheckbox "developer_searchEngine_enable", "Log searches" /> + Indexing + <@showCheckbox "developer_searchIndex_enable", "Log indexing." />
- <@showCheckbox "developer_searchEngine_addStackTrace", "Show stack trace" /> - <@showCheckbox "developer_searchEngine_addResults", "Show search results" /> - <@showTextbox "developer_searchEngine_queryRestriction", - "Restrict by query string" /> - <@showTextbox "developer_searchEngine_stackRestriction", - "Restrict by calling stack" /> + <@showCheckbox "developer_searchIndex_showDocuments", + "Show document contents" /> + <@showTextbox "developer_searchIndex_uriOrNameRestriction", + "Restrict by URI or name" /> + <@showTextbox "developer_searchIndex_documentRestriction", + "Restrict by document contents" />
+ <@showCheckbox "developer_searchDeletions_enable", "Log deletions." /> + <@showCheckbox "developer_searchIndex_suppressModelChangeListener", + "Suppress the automatic indexing of changed triples." />