diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/migration/FauxPropertiesUpdater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/migration/FauxPropertiesUpdater.java new file mode 100644 index 000000000..f057adcc1 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/migration/FauxPropertiesUpdater.java @@ -0,0 +1,112 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.migration; + +import static com.hp.hpl.jena.rdf.model.ResourceFactory.createPlainLiteral; +import static com.hp.hpl.jena.rdf.model.ResourceFactory.createProperty; +import static com.hp.hpl.jena.rdf.model.ResourceFactory.createResource; +import static edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary.vitroURI; + +import java.io.FileInputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextListener; + +import com.hp.hpl.jena.rdf.model.Literal; +import com.hp.hpl.jena.rdf.model.Property; +import com.hp.hpl.jena.rdf.model.Resource; + +import edu.cornell.mannlib.vitro.webapp.application.ApplicationUtils; +import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess; +import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelNames; +import edu.cornell.mannlib.vitro.webapp.startup.StartupStatus; +import edu.cornell.mannlib.vitro.webapp.utils.jena.criticalsection.LockableOntModel; +import edu.cornell.mannlib.vitro.webapp.utils.jena.criticalsection.LockedOntModel; + +/** + * PropertyConfig.n3 has moved to rdf/display/firsttime, so it is only pulled in + * if the display model is empty. + * + * Let's pull it in one time, anyway. + * + * Check askUpdated.sparql for an example of how we know that it is necessary. + * Also check success.n3 + * + * If a special triple is not found in the display model, read the file from + * firsttime. If we can't find the file, warn + */ +public class FauxPropertiesUpdater { + private static final String[] PATH_TO_PROPERTY_CONFIG = { "rdf", "display", + "firsttime", "PropertyConfig.n3" }; + + private static final Resource DISPLAY_MODEL = createResource(ModelNames.DISPLAY); + private static final Property UPDATED_DISPLAY_MODEL = createProperty(vitroURI + + "updatedDisplayModel"); + private static final Literal VERSION_1_8 = createPlainLiteral("1.8"); + + private final ServletContextListener parent; + private final StartupStatus ss; + private final LockableOntModel lockableDisplayModel; + + private Path propertyConfigPath; + + public FauxPropertiesUpdater(ServletContext ctx, + ServletContextListener parent) { + this.parent = parent; + this.ss = StartupStatus.getBean(ctx); + this.lockableDisplayModel = new LockableOntModel(ModelAccess.on(ctx) + .getOntModel(ModelNames.DISPLAY)); + } + + public void migrate() { + if (!isAlreadyUpdated()) { + if (locateFile()) { + if (loadFile()) { + writeSuccess(); + } + } + } + } + + private boolean isAlreadyUpdated() { + try (LockedOntModel m = lockableDisplayModel.read()) { + return m.contains(DISPLAY_MODEL, UPDATED_DISPLAY_MODEL, VERSION_1_8); + } + } + + private boolean locateFile() { + String homePath = ApplicationUtils.instance().getHomeDirectory() + .getPath().toString(); + propertyConfigPath = Paths.get(homePath, PATH_TO_PROPERTY_CONFIG); + if (Files.exists(propertyConfigPath)) { + return true; + } else { + ss.warning(parent, "Could not find attributes " + + "for faux properties at " + propertyConfigPath); + return false; + } + } + + private boolean loadFile() { + try (LockedOntModel m = lockableDisplayModel.write()) { + m.read(new FileInputStream(propertyConfigPath.toFile()), null, "N3"); + ss.info(parent, "Read " + propertyConfigPath + + " into display model: " + + "attributes for faux properties."); + return true; + } catch (Exception e) { + ss.warning(parent, + "Failed to read attributes for faux properties.", e); + return false; + } + } + + private void writeSuccess() { + try (LockedOntModel m = lockableDisplayModel.write()) { + m.add(DISPLAY_MODEL, UPDATED_DISPLAY_MODEL, VERSION_1_8); + } + } +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/migration/Release18Migrator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/migration/Release18Migrator.java new file mode 100644 index 000000000..7707fcaac --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/migration/Release18Migrator.java @@ -0,0 +1,26 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.migration; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +/** + * Handle the tasks that move an installation from 1.7 to 1.8. + */ +public class Release18Migrator implements ServletContextListener { + + @Override + public void contextInitialized(ServletContextEvent sce) { + ServletContext ctx = sce.getServletContext(); + + new FauxPropertiesUpdater(ctx, this).migrate(); + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + // Nothing to tear down. + } + +} diff --git a/webapp/web/WEB-INF/resources/startup_listeners.txt b/webapp/web/WEB-INF/resources/startup_listeners.txt index ffbeff7a8..0653ef5a5 100644 --- a/webapp/web/WEB-INF/resources/startup_listeners.txt +++ b/webapp/web/WEB-INF/resources/startup_listeners.txt @@ -38,6 +38,7 @@ edu.cornell.mannlib.vitro.webapp.application.ApplicationImpl$ReasonersSetup edu.cornell.mannlib.vitro.webapp.servlet.setup.SimpleReasonerSetup #edu.cornell.mannlib.vitro.webapp.servlet.setup.UpdateKnowledgeBase +edu.cornell.mannlib.vitro.webapp.migration.Release18Migrator # Must run after JenaDataSourceSetup edu.cornell.mannlib.vitro.webapp.servlet.setup.ThemeInfoSetup