From fcbcd67fb45b14bbdee47135b42c9d35ed5b002e Mon Sep 17 00:00:00 2001 From: jeb228 Date: Fri, 14 Jan 2011 22:18:30 +0000 Subject: [PATCH 01/19] NIH VIVO Release 1.2 maintenance branch From f8eae4cd46aa1705d79036df88a86275fae69bdf Mon Sep 17 00:00:00 2001 From: bdc34 Date: Fri, 14 Jan 2011 23:23:19 +0000 Subject: [PATCH 02/19] changing type of vclassgroup objects passed to template NIHVIVO-1674 --- .../freemarker/HomePageController.java | 6 +-- .../pageDataGetter/BrowseDataGetter.java | 41 ++++++++----------- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/HomePageController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/HomePageController.java index b07d37345..88b85f2d6 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/HomePageController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/HomePageController.java @@ -28,9 +28,9 @@ public class HomePageController extends FreemarkerHttpServlet { protected ResponseValues processRequest(VitroRequest vreq) { Map body = new HashMap(); - VClassGroupCache vcgc = VClassGroupCache.getVClassGroupCache( getServletContext() ); - List vClassGroups = vcgc.getGroups(vreq.getPortalId()); - body.put("vClassGroups", vClassGroups); +// VClassGroupCache vcgc = VClassGroupCache.getVClassGroupCache( getServletContext() ); +// List vClassGroups = vcgc.getGroups(vreq.getPortalId()); +// body.put("vClassGroups", vClassGroups); PageDataGetter dataGetter = PageController.getPageDataGetterMap(getServletContext()) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/BrowseDataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/BrowseDataGetter.java index 5a1c72427..23a49f874 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/BrowseDataGetter.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/pageDataGetter/BrowseDataGetter.java @@ -5,6 +5,7 @@ package edu.cornell.mannlib.vitro.webapp.utils.pageDataGetter; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -63,7 +64,7 @@ public class BrowseDataGetter implements PageDataGetter { private Map doClassAlphaDisplay( Map params, VitroRequest request, ServletContext context) throws Exception { Map body = new HashMap(); - body.putAll(getCommonValues(context)); + body.putAll(getCommonValues(context, request)); body.putAll(getClassAlphaValues(params,request,context)); return body; } @@ -86,15 +87,23 @@ public class BrowseDataGetter implements PageDataGetter { return map; } - private Map getCommonValues( ServletContext context){ - //doesn't do anything yet - Map values = new HashMap(); + private Map getCommonValues( ServletContext context, VitroRequest vreq){ + Map values = new HashMap(); + + VClassGroupCache vcgc = VClassGroupCache.getVClassGroupCache(context); + List cgList = vcgc.getGroups(vreq.getPortalId()); + LinkedList cgtmList = new LinkedList(); + for( VClassGroup classGroup : cgList){ + cgtmList.add( new VClassGroupTemplateModel( classGroup )); + } + values.put("vClassGroups",cgtmList); + return values; } protected Map doAllClassGroupsDisplay( Map params, Map page, VitroRequest request, ServletContext context) { Map body = new HashMap(); - body.putAll(getCommonValues(context)); + body.putAll(getCommonValues(context,request)); body.putAll(getAllClassGroupData(request, params, page, context)); return body; @@ -105,23 +114,7 @@ public class BrowseDataGetter implements PageDataGetter { * @param params2 */ protected Map getAllClassGroupData(VitroRequest request, Map params, Map page, ServletContext context){ - Map map = new HashMap(); - - if( !page.containsKey("vClassGroups")){ - VClassGroupCache vcgc = VClassGroupCache.getVClassGroupCache( context ); - List vClassGroups = vcgc.getGroups(request.getPortalId()); - map.put("vClassGroups", vClassGroups); - } -// VitroRequest vreq = new VitroRequest(request); -// -// VClassGroupCache vcgc = VClassGroupCache.getVClassGroupCache(context); -// List cgList = vcgc.getGroups(vreq.getPortalId()); -// -// LinkedList cgtmList = new LinkedList(); -// for( VClassGroup classGroup : cgList){ -// cgtmList.add( new VClassGroupTemplateModel( classGroup )); -// } -// map.put("vclassGroupList",cgtmList); + Map map = new HashMap(); return map; } @@ -129,7 +122,7 @@ public class BrowseDataGetter implements PageDataGetter { VitroRequest request, ServletContext context) { Map body = new HashMap(); - body.putAll(getCommonValues(context)); + body.putAll(getCommonValues(context,request)); body.putAll(getClassData(request,params,context)); return body; @@ -159,7 +152,7 @@ public class BrowseDataGetter implements PageDataGetter { protected Map doClassGroupDisplay(Map params, VitroRequest request, ServletContext context) { Map body = new HashMap(); - body.putAll(getCommonValues(context)); + body.putAll(getCommonValues(context,request)); body.putAll( getClassGroupData(request,params, context)); return body; From dd82ea3927f0e25c6ad81e6bfc730dd3e32c7059 Mon Sep 17 00:00:00 2001 From: bjl23 Date: Sat, 15 Jan 2011 00:55:05 +0000 Subject: [PATCH 03/19] merging WebappDaoFactorySDB improvement back from the trunk --- .../mannlib/vitro/webapp/dao/jena/WebappDaoFactorySDB.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/WebappDaoFactorySDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/WebappDaoFactorySDB.java index ee77d69aa..348dd1235 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/WebappDaoFactorySDB.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/WebappDaoFactorySDB.java @@ -20,8 +20,6 @@ import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyStatementDao; import edu.cornell.mannlib.vitro.webapp.dao.VClassDao; public class WebappDaoFactorySDB extends WebappDaoFactoryJena { - - private DatasetWrapperFactory dwf; /** * For use when any database connection associated with the Dataset @@ -32,7 +30,6 @@ public class WebappDaoFactorySDB extends WebappDaoFactoryJena { public WebappDaoFactorySDB(OntModelSelector ontModelSelector, Dataset dataset) { super(ontModelSelector); this.dwf = new StaticDatasetFactory(dataset); - super.dwf = new StaticDatasetFactory(dataset); } /** @@ -48,7 +45,6 @@ public class WebappDaoFactorySDB extends WebappDaoFactoryJena { String[] preferredLanguages) { super(ontModelSelector, defaultNamespace, nonuserNamespaces, preferredLanguages); this.dwf = new StaticDatasetFactory(dataset); - super.dwf = new StaticDatasetFactory(dataset); } /** @@ -65,7 +61,6 @@ public class WebappDaoFactorySDB extends WebappDaoFactoryJena { String[] preferredLanguages) { super(ontModelSelector, defaultNamespace, nonuserNamespaces, preferredLanguages); this.dwf = new ReconnectingDatasetFactory(bds, storeDesc); - super.dwf = new ReconnectingDatasetFactory(bds, storeDesc); } @Override From eb7a3933e4889dd99c0ff09613726fb74f0f19e2 Mon Sep 17 00:00:00 2001 From: rjy7 Date: Sat, 15 Jan 2011 04:55:38 +0000 Subject: [PATCH 04/19] Merge r7033, r7037 from trunk --- .../CollatedObjectPropertyTemplateModel.java | 4 ++-- .../individual/DataPropertyTemplateModel.java | 21 +++++++++++-------- .../individual/GroupedPropertyList.java | 5 +++-- .../ObjectPropertyTemplateModel.java | 2 +- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java index 03b4cdd9a..60fbd3e60 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java @@ -45,8 +45,8 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM String invalidConfigMessage = checkConfiguration(); if ( ! invalidConfigMessage.isEmpty() ) { - throw new InvalidConfigurationException("Invalid configuration for property " + - op.getURI() + ":" + invalidConfigMessage); + throw new InvalidConfigurationException("Invalid configuration for collated property " + + op.getURI() + ":" + invalidConfigMessage + ". Creating uncollated display instead."); } /* Get the data */ diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java index 629c14f48..71277ac36 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java @@ -33,15 +33,7 @@ public class DataPropertyTemplateModel extends PropertyTemplateModel { super(dp, subject, policyHelper); setName(dp.getPublicName()); - - // Determine whether a new statement can be added - if (policyHelper != null) { - RequestedAction action = new AddDataPropStmt(subjectUri, propertyUri,RequestActionConstants.SOME_LITERAL, null, null); - if (policyHelper.isAuthorizedAction(action)) { - addAccess = true; - } - } - + // Get the data property statements via a sparql query DataPropertyStatementDao dpDao = vreq.getWebappDaoFactory().getDataPropertyStatementDao(); List values = dpDao.getDataPropertyValuesForIndividualByProperty(subject, dp); @@ -49,6 +41,17 @@ public class DataPropertyTemplateModel extends PropertyTemplateModel { for (Literal value : values) { statements.add(new DataPropertyStatementTemplateModel(subjectUri, propertyUri, value, policyHelper)); } + + // Determine whether a new statement can be added + if (policyHelper != null) { + // If the display limit has already been reached, we can't add a new statement + if ( dp.getDisplayLimit() > statements.size() ) { + RequestedAction action = new AddDataPropStmt(subjectUri, propertyUri,RequestActionConstants.SOME_LITERAL, null, null); + if (policyHelper.isAuthorizedAction(action)) { + addAccess = true; + } + } + } } /* Access methods for templates */ diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java index 626a6e2be..27148b10c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/GroupedPropertyList.java @@ -99,8 +99,8 @@ public class GroupedPropertyList extends BaseTemplateModel { // Build the template data model from the groupList groups = new ArrayList(propertyGroupList.size()); - for (PropertyGroup pg : propertyGroupList) { - groups.add(new PropertyGroupTemplateModel(vreq, pg, subject, policyHelper)); + for (PropertyGroup propertyGroup: propertyGroupList) { + groups.add(new PropertyGroupTemplateModel(vreq, propertyGroup, subject, policyHelper)); } } @@ -425,5 +425,6 @@ public class GroupedPropertyList extends BaseTemplateModel { } return null; } + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java index aef940eee..750e93d11 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java @@ -141,7 +141,7 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel try { return new CollatedObjectPropertyTemplateModel(op, subject, vreq, policyHelper); } catch (InvalidConfigurationException e) { - log.error(e); + log.warn(e); return new UncollatedObjectPropertyTemplateModel(op, subject, vreq, policyHelper); } } else { From 99e1668862ab4379eeb857c041a54f9d689c93c0 Mon Sep 17 00:00:00 2001 From: sjm222 Date: Sat, 15 Jan 2011 15:38:48 +0000 Subject: [PATCH 05/19] improving logging in the update code; refactored some class names; added an additional sparql construct to delete data --- .../webapp/ontology/update/ABoxUpdater.java | 21 +++--- ...ogyChangeLogger.java => ChangeLogger.java} | 2 +- ...ogyChangeRecord.java => ChangeRecord.java} | 2 +- .../ontology/update/DateTimeMigration.java | 8 +-- ...Updater.java => KnowledgeBaseUpdater.java} | 69 +++++++++++-------- .../ontology/update/OntologyChangeParser.java | 4 +- ...ngeLogger.java => SimpleChangeLogger.java} | 7 +- ...ngeRecord.java => SimpleChangeRecord.java} | 6 +- .../webapp/ontology/update/TBoxUpdater.java | 38 +++++----- ...pdateSettings.java => UpdateSettings.java} | 2 +- .../servlet/setup/UpdateKnowledgeBase.java | 8 +-- 11 files changed, 92 insertions(+), 75 deletions(-) rename webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/{OntologyChangeLogger.java => ChangeLogger.java} (90%) rename webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/{OntologyChangeRecord.java => ChangeRecord.java} (89%) rename webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/{OntologyUpdater.java => KnowledgeBaseUpdater.java} (88%) rename webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/{SimpleOntologyChangeLogger.java => SimpleChangeLogger.java} (88%) rename webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/{SimpleOntologyChangeRecord.java => SimpleChangeRecord.java} (92%) rename webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/{OntologyUpdateSettings.java => UpdateSettings.java} (99%) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ABoxUpdater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ABoxUpdater.java index cfa65cb13..91b3c17d0 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ABoxUpdater.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ABoxUpdater.java @@ -7,7 +7,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import com.hp.hpl.jena.ontology.DatatypeProperty; import com.hp.hpl.jena.ontology.OntClass; import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.ontology.OntModelSpec; @@ -38,8 +37,8 @@ public class ABoxUpdater { private OntModel newTboxModel; private OntModel aboxModel; private OntModel newTBoxAnnotationsModel; - private OntologyChangeLogger logger; - private OntologyChangeRecord record; + private ChangeLogger logger; + private ChangeRecord record; private OntClass OWL_THING = (ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM)).createClass(OWL.Thing.getURI()); /** @@ -59,8 +58,8 @@ public class ABoxUpdater { OntModel newTboxModel, OntModel aboxModel, OntModel newAnnotationsModel, - OntologyChangeLogger logger, - OntologyChangeRecord record) { + ChangeLogger logger, + ChangeRecord record) { this.oldTboxModel = oldTboxModel; this.newTboxModel = newTboxModel; @@ -177,10 +176,12 @@ public class ABoxUpdater { //log summary of changes if (renameCount > 0) { - logger.log("Changed " + renameCount + " subject reference" + ((renameCount > 1) ? "s" : "") + " to the " + oldClass.getURI() + " class to be " + newClass.getURI()); + //logger.log("Changed " + renameCount + " subject reference" + ((renameCount > 1) ? "s" : "") + " to the " + oldClass.getURI() + " class to be " + newClass.getURI()); + logger.log(renameCount + " subject reference" + ((renameCount > 1) ? "s" : "") + " to the " + oldClass.getURI() + " class " + ((renameCount > 1) ? "were" : "was") +" changed to " + newClass.getURI()); } if (removeCount > 0) { - logger.log("Removed " + removeCount + " remaining subject reference" + ((removeCount > 1) ? "s" : "") + " to the " + oldClass.getURI() + " class"); + //logger.log("Removed " + removeCount + " remaining subject reference" + ((removeCount > 1) ? "s" : "") + " to the " + oldClass.getURI() + " class"); + logger.log(removeCount + " remaining subject reference" + ((removeCount > 1) ? "s" : "") + " to the " + oldClass.getURI() + " class " + ((removeCount > 1) ? "were" : "was") + "removed." ); } // Change class references in the objects of rdf:type statements @@ -193,14 +194,12 @@ public class ABoxUpdater { Statement newStatement = ResourceFactory.createStatement(oldStatement.getSubject(), oldStatement.getPredicate(), newClass); retractions.add(oldStatement); additions.add(newStatement); - //TODO - worried about logging changes before the changes have actually been made - // in the model - //logChanges(oldStatement, newStatement); } //log summary of changes if (renameCount > 0) { - logger.log("Changed " + renameCount + " object reference" + ((renameCount > 1) ? "s" : "") + " to the " + oldClass.getURI() + " class to be " + newClass.getURI()); + logger.log(renameCount + " object reference" + ((renameCount > 1) ? "s" : "") + " to the " + oldClass.getURI() + " class " + ((renameCount > 1) ? "were" : "was") + " changed to " + newClass.getURI()); + //logger.log("Changed " + renameCount + " object reference" + ((renameCount > 1) ? "s" : "") + " to the " + oldClass.getURI() + " class to be " + newClass.getURI()); } aboxModel.remove(retractions); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyChangeLogger.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ChangeLogger.java similarity index 90% rename from webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyChangeLogger.java rename to webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ChangeLogger.java index 50ceb79f8..5b5cca500 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyChangeLogger.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ChangeLogger.java @@ -4,7 +4,7 @@ package edu.cornell.mannlib.vitro.webapp.ontology.update; import java.io.IOException; -public interface OntologyChangeLogger { +public interface ChangeLogger { public void log(String logMessage) throws IOException; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyChangeRecord.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ChangeRecord.java similarity index 89% rename from webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyChangeRecord.java rename to webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ChangeRecord.java index d25deb563..8845e1f43 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyChangeRecord.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ChangeRecord.java @@ -4,7 +4,7 @@ package edu.cornell.mannlib.vitro.webapp.ontology.update; import com.hp.hpl.jena.rdf.model.Model; -public interface OntologyChangeRecord { +public interface ChangeRecord { public void recordAdditions(Model incrementalAdditions); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/DateTimeMigration.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/DateTimeMigration.java index ea99c186b..ed8afb27e 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/DateTimeMigration.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/DateTimeMigration.java @@ -35,8 +35,8 @@ import com.hp.hpl.jena.shared.Lock; public class DateTimeMigration { private OntModel aboxModel; - private OntologyChangeLogger logger; - private OntologyChangeRecord record; + private ChangeLogger logger; + private ChangeRecord record; private static final String dateTimeURI = "http://vivoweb.org/ontology/core#dateTime"; private static final String dateTimePrecisionURI = "http://vivoweb.org/ontology/core#dateTimePrecision"; @@ -68,7 +68,7 @@ public class DateTimeMigration { * @param record - for writing to the additions model * and the retractions model. */ - public DateTimeMigration(OntModel aboxModel,OntologyChangeLogger logger, OntologyChangeRecord record) { + public DateTimeMigration(OntModel aboxModel,ChangeLogger logger, ChangeRecord record) { this.aboxModel = aboxModel; this.logger = logger; @@ -216,7 +216,7 @@ public class DateTimeMigration { if (additions.size() > 0) { logger.log(additions.size() + " date/time literal" + ((additions.size() > 1) ? "s" : "") + ((additions.size() > 1) ? " were " : " was ") + - "updated to the 1.2 representation."); + "updated to the xsd:dateTime representation."); } } finally { aboxModel.leaveCriticalSection(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java similarity index 88% rename from webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdater.java rename to webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java index dc4c05a27..f98cc4354 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdater.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java @@ -34,18 +34,18 @@ import edu.cornell.mannlib.vitro.webapp.utils.jena.JenaIngestUtils; * @author bjl23 * */ -public class OntologyUpdater { +public class KnowledgeBaseUpdater { //private final Log log = LogFactory.getLog(OntologyUpdater.class); - private OntologyUpdateSettings settings; - private OntologyChangeLogger logger; - private OntologyChangeRecord record; + private UpdateSettings settings; + private ChangeLogger logger; + private ChangeRecord record; - public OntologyUpdater(OntologyUpdateSettings settings) { + public KnowledgeBaseUpdater(UpdateSettings settings) { this.settings = settings; this.logger = null; - this.record = new SimpleOntologyChangeRecord(settings.getAddedDataFile(), settings.getRemovedDataFile()); + this.record = new SimpleChangeRecord(settings.getAddedDataFile(), settings.getRemovedDataFile()); } public boolean update() throws IOException { @@ -56,7 +56,7 @@ public class OntologyUpdater { if (updateRequired) { if (this.logger == null) { - this.logger = new SimpleOntologyChangeLogger(settings.getLogFile(), settings.getErrorLogFile()); + this.logger = new SimpleChangeLogger(settings.getLogFile(), settings.getErrorLogFile()); } try { @@ -101,7 +101,7 @@ public class OntologyUpdater { private void performSparqlConstructAdditions(String sparqlConstructDir, OntModel aboxModel) throws IOException { - Model anonModel = performSparqlConstructs(sparqlConstructDir, aboxModel); + Model anonModel = performSparqlConstructs(sparqlConstructDir, aboxModel, true); if (anonModel == null) { return; @@ -110,24 +110,28 @@ public class OntologyUpdater { aboxModel.enterCriticalSection(Lock.WRITE); try { JenaIngestUtils jiu = new JenaIngestUtils(); - Model additions = jiu.renameBNodes(anonModel, settings.getDefaultNamespace() + "n", - aboxModel); + Model additions = jiu.renameBNodes(anonModel, settings.getDefaultNamespace() + "n", aboxModel); Model actualAdditions = ModelFactory.createDefaultModel(); StmtIterator stmtIt = additions.listStatements(); + while (stmtIt.hasNext()) { Statement stmt = stmtIt.nextStatement(); if (!aboxModel.contains(stmt)) { actualAdditions.add(stmt); } } + aboxModel.add(actualAdditions); + record.recordAdditions(actualAdditions); + /* if (actualAdditions.size() > 0) { logger.log("Constructed " + actualAdditions.size() + " new " + "statement" + ((actualAdditions.size() > 1) ? "s" : "") + - " using SPARQL CONSTRUCT queries."); + " using SPARQL construct queries."); } - record.recordAdditions(actualAdditions); + */ + } finally { aboxModel.leaveCriticalSection(); } @@ -136,7 +140,7 @@ public class OntologyUpdater { private void performSparqlConstructRetractions(String sparqlConstructDir, OntModel aboxModel) throws IOException { - Model retractions = performSparqlConstructs(sparqlConstructDir, aboxModel); + Model retractions = performSparqlConstructs(sparqlConstructDir, aboxModel, false); if (retractions == null) { return; @@ -153,12 +157,13 @@ public class OntologyUpdater { } } aboxModel.remove(actualRetractions); - if (actualRetractions.size() > 0) { - logger.log("Removed " + actualRetractions.size() + " statement" - + ((actualRetractions.size() > 1) ? "s" : "") + - " using SPARQL CONSTRUCT queries."); - } record.recordRetractions(actualRetractions); + /* + if (actualRetractions.size() > 0) { + logger.log("Removed " + actualRetractions.size() + " statement" + ((actualRetractions.size() > 1) ? "s" : "") + " using SPARQL CONSTRUCT queries."); + } + */ + } finally { aboxModel.leaveCriticalSection(); } @@ -174,7 +179,7 @@ public class OntologyUpdater { * @param aboxModel */ private Model performSparqlConstructs(String sparqlConstructDir, - OntModel aboxModel) throws IOException { + OntModel aboxModel, boolean add) throws IOException { Model anonModel = ModelFactory.createDefaultModel(); File sparqlConstructDirectory = new File(sparqlConstructDir); @@ -186,6 +191,7 @@ public class OntologyUpdater { " SPARQL CONSTRUCTS."); return null; } + File[] sparqlFiles = sparqlConstructDirectory.listFiles(); for (int i = 0; i < sparqlFiles.length; i ++) { File sparqlFile = sparqlFiles[i]; @@ -198,13 +204,21 @@ public class OntologyUpdater { fileContents.append(ln).append('\n'); } try { - Query q = QueryFactory.create(fileContents.toString(), - Syntax.syntaxARQ); + Query q = QueryFactory.create(fileContents.toString(), Syntax.syntaxARQ); aboxModel.enterCriticalSection(Lock.WRITE); try { - QueryExecution qe = QueryExecutionFactory.create(q, - aboxModel); + QueryExecution qe = QueryExecutionFactory.create(q, aboxModel); + long numBefore = anonModel.size(); qe.execConstruct(anonModel); + long numAfter = anonModel.size(); + long num = numAfter - numBefore; + + if (num > 0) { + logger.log((add ? "Added " : "Removed ") + num + + " statement" + ((num > 1) ? "s" : "") + + " using the SPARQL construct query from file " + sparqlFiles[i].getName()); + } + } finally { aboxModel.leaveCriticalSection(); } @@ -214,9 +228,8 @@ public class OntologyUpdater { "query at " + sparqlFile + ". Error message is: " + e.getMessage()); } } catch (FileNotFoundException fnfe) { - logger.logError(this.getClass().getName() + - ".performSparqlConstructs() could not find " + - " SPARQL CONSTRUCT file " + sparqlFile + ". Skipping."); + logger.log("WARNING: performSparqlConstructs() could not find " + + " SPARQL CONSTRUCT file " + sparqlFile + ". Skipping."); } } @@ -252,8 +265,8 @@ public class OntologyUpdater { settings.getNewTBoxAnnotationsModel(), settings.getOntModelSelector().getABoxModel(), logger, record); - tboxUpdater.updateVitroPropertyDefaultValues(); - tboxUpdater.updateVitroAnnotationsModel(); + tboxUpdater.updateDefaultAnnotationValues(); + tboxUpdater.updateAnnotationModel(); } /** diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyChangeParser.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyChangeParser.java index 8ac37b82f..640f0491a 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyChangeParser.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyChangeParser.java @@ -23,9 +23,9 @@ import edu.cornell.mannlib.vitro.webapp.ontology.update.AtomicOntologyChange.Ato public class OntologyChangeParser { - private OntologyChangeLogger logger; + private ChangeLogger logger; - public OntologyChangeParser(OntologyChangeLogger logger) { + public OntologyChangeParser(ChangeLogger logger) { this.logger = logger; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleOntologyChangeLogger.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeLogger.java similarity index 88% rename from webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleOntologyChangeLogger.java rename to webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeLogger.java index 9ca0e22ef..6009b1c8b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleOntologyChangeLogger.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeLogger.java @@ -8,14 +8,14 @@ import java.io.FileWriter; import java.io.IOException; import java.io.Writer; -public class SimpleOntologyChangeLogger implements OntologyChangeLogger { +public class SimpleChangeLogger implements ChangeLogger { private Writer logWriter; private Writer errorWriter; private boolean errorsWritten = false; - public SimpleOntologyChangeLogger( String logPath, + public SimpleChangeLogger( String logPath, String errorPath ) { File logFile = new File(logPath); File errorFile = new File(errorPath); @@ -36,7 +36,8 @@ public class SimpleOntologyChangeLogger implements OntologyChangeLogger { className = className.substring(className.lastIndexOf('.') + 1 ); String methodName = ((StackTraceElement)elements[1]).getMethodName(); - logWriter.write(className + "." + methodName + ": " + logMessage + "\n\n"); + logWriter.write(className + ": " + logMessage + "\n\n"); + //logWriter.write(className + "." + methodName + ": " + logMessage + "\n\n"); logWriter.flush(); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleOntologyChangeRecord.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeRecord.java similarity index 92% rename from webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleOntologyChangeRecord.java rename to webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeRecord.java index c24821ed6..d0ca316e0 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleOntologyChangeRecord.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeRecord.java @@ -14,10 +14,10 @@ import org.apache.commons.logging.LogFactory; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; -public class SimpleOntologyChangeRecord implements OntologyChangeRecord { +public class SimpleChangeRecord implements ChangeRecord { private final static Log log = - LogFactory.getLog(SimpleOntologyChangeRecord.class); + LogFactory.getLog(SimpleChangeRecord.class); private final static String RDF_SYNTAX = "N3"; @@ -26,7 +26,7 @@ public class SimpleOntologyChangeRecord implements OntologyChangeRecord { private File additionsFile; private File retractionsFile; - public SimpleOntologyChangeRecord( + public SimpleChangeRecord( String additionsFile, String retractionsFile) { this.additionsFile = new File(additionsFile); try { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/TBoxUpdater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/TBoxUpdater.java index 8c4a9c314..b0fa03710 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/TBoxUpdater.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/TBoxUpdater.java @@ -5,7 +5,6 @@ package edu.cornell.mannlib.vitro.webapp.ontology.update; import java.io.IOException; import java.util.List; -import com.hp.hpl.jena.ontology.DatatypeProperty; import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.ontology.OntModelSpec; import com.hp.hpl.jena.rdf.model.Literal; @@ -32,8 +31,8 @@ public class TBoxUpdater { private OntModel oldTboxAnnotationsModel; private OntModel newTboxAnnotationsModel; private OntModel siteModel; - private OntologyChangeLogger logger; - private OntologyChangeRecord record; + private ChangeLogger logger; + private ChangeRecord record; private boolean detailLogs = false; private static final String classGroupURI = "http://vitro.mannlib.cornell.edu/ns/vitro/0.7#ClassGroup"; @@ -57,8 +56,8 @@ public class TBoxUpdater { public TBoxUpdater(OntModel oldTboxAnnotationsModel, OntModel newTboxAnnotationsModel, OntModel siteModel, - OntologyChangeLogger logger, - OntologyChangeRecord record) { + ChangeLogger logger, + ChangeRecord record) { this.oldTboxAnnotationsModel = oldTboxAnnotationsModel; this.newTboxAnnotationsModel = newTboxAnnotationsModel; @@ -92,7 +91,7 @@ public class TBoxUpdater { * Note: as specified, this method for now assumes that no new vitro annotation * properties have been introduced. This should be updated for future versions. */ - public void updateVitroPropertyDefaultValues() throws IOException { + public void updateDefaultAnnotationValues() throws IOException { siteModel.enterCriticalSection(Lock.WRITE); @@ -296,9 +295,9 @@ public class TBoxUpdater { // log the additions - summary if (newAnnotationSettingsToAdd.size() > 0) { boolean plural = (newAnnotationSettingsToAdd.size() > 1); - logger.log("Added " + newAnnotationSettingsToAdd.size() + " new annotation property setting" + (plural ? "s" : "") + " to the knowledge base. This includes " + + logger.log("Added " + newAnnotationSettingsToAdd.size() + " new annotation property setting" + (plural ? "s" : "") + " to the knowledge base. This includes only " + "existing annotation properties applied to existing classes where they weren't applied before, or existing " + - "properties applied to new classes. No new annotation properties have been introduced."); + "properties applied to new classes."); } } finally { @@ -319,7 +318,7 @@ public class TBoxUpdater { * knowledge base. * */ -public void updateVitroAnnotationsModel() throws IOException { +public void updateAnnotationModel() throws IOException { // for each ClassGroup in the old vitro annotations model: if it is not in // the new vitro annotations model and the site has no classes asserted to @@ -335,22 +334,20 @@ public void updateVitroAnnotationsModel() throws IOException { StmtIterator iter = oldTboxAnnotationsModel.listStatements((Resource) null, RDF.type, classGroupClass); - int count = 0; while (iter.hasNext()) { Statement stmt = iter.next(); - + if (!newTboxAnnotationsModel.contains(stmt) && !usesGroup(siteModel, stmt.getSubject())) { - count++; retractions.add(siteModel.listStatements(stmt.getSubject(),(Property) null,(RDFNode)null)); + logger.log("Removed the " + stmt.getSubject().getURI() + " ClassGroup from the annotations model."); } } if (retractions.size() > 0) { siteModel.remove(retractions); record.recordRetractions(retractions); - - logger.log("Removed " + count + " Class Group" + (count > 1 ? "s" : "") + " from the annotations model."); - } + } + } finally { siteModel.leaveCriticalSection(); } @@ -364,12 +361,19 @@ public void updateVitroAnnotationsModel() throws IOException { public boolean usesGroup(Model model, Resource theClassGroup) throws IOException { + //logger.log("called for " + theClassGroup.getLocalName() ); + model.enterCriticalSection(Lock.READ); try { - return (model.contains((Resource) null, inClassGroupProp, theClassGroup) ? true : false); + StmtIterator iter = model.listStatements((Resource) null, inClassGroupProp, theClassGroup); + while (iter.hasNext()) { + logger.log("statement: " + ABoxUpdater.stmtString(iter.next())); + } + + return (model.contains((Resource) null, inClassGroupProp, theClassGroup) ? true : false); } finally { - model.leaveCriticalSection(); + model.leaveCriticalSection(); } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdateSettings.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/UpdateSettings.java similarity index 99% rename from webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdateSettings.java rename to webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/UpdateSettings.java index fc666ae65..027ae1133 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/OntologyUpdateSettings.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/UpdateSettings.java @@ -6,7 +6,7 @@ import com.hp.hpl.jena.ontology.OntModel; import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector; -public class OntologyUpdateSettings { +public class UpdateSettings { private String dataDir; private String sparqlConstructAdditionsDir; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdateKnowledgeBase.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdateKnowledgeBase.java index bf4cf2873..09e8d80b6 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdateKnowledgeBase.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/UpdateKnowledgeBase.java @@ -27,8 +27,8 @@ import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import edu.cornell.mannlib.vitro.webapp.dao.jena.JenaBaseDao; import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector; import edu.cornell.mannlib.vitro.webapp.dao.jena.SimpleOntModelSelector; -import edu.cornell.mannlib.vitro.webapp.ontology.update.OntologyUpdateSettings; -import edu.cornell.mannlib.vitro.webapp.ontology.update.OntologyUpdater; +import edu.cornell.mannlib.vitro.webapp.ontology.update.UpdateSettings; +import edu.cornell.mannlib.vitro.webapp.ontology.update.KnowledgeBaseUpdater; import edu.cornell.mannlib.vitro.webapp.search.lucene.LuceneSetup; /** @@ -71,7 +71,7 @@ public class UpdateKnowledgeBase implements ServletContextListener { (OntModel) sce.getServletContext().getAttribute( JenaBaseDao.ASSERTIONS_ONT_MODEL_ATTRIBUTE_NAME)); - OntologyUpdateSettings settings = new OntologyUpdateSettings(); + UpdateSettings settings = new UpdateSettings(); settings.setAskQueryFile(ctx.getRealPath(ASK_QUERY_FILE)); settings.setDataDir(ctx.getRealPath(DATA_DIR)); settings.setSparqlConstructAdditionsDir(ctx.getRealPath(SPARQL_CONSTRUCT_ADDITIONS_DIR)); @@ -99,7 +99,7 @@ public class UpdateKnowledgeBase implements ServletContextListener { try { - OntologyUpdater ontologyUpdater = new OntologyUpdater(settings); + KnowledgeBaseUpdater ontologyUpdater = new KnowledgeBaseUpdater(settings); try { if (ontologyUpdater.updateRequired()) { From e11df64aee7f1834501d2cb0f0bbb53a857f0b8e Mon Sep 17 00:00:00 2001 From: sjm222 Date: Sun, 16 Jan 2011 00:59:25 +0000 Subject: [PATCH 06/19] improvements to logging --- .../webapp/ontology/update/ABoxUpdater.java | 3 ++- .../webapp/ontology/update/ChangeLogger.java | 2 ++ .../ontology/update/KnowledgeBaseUpdater.java | 14 +++++++--- .../ontology/update/SimpleChangeLogger.java | 27 ++++++++++++++----- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ABoxUpdater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ABoxUpdater.java index 91b3c17d0..750888ddf 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ABoxUpdater.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ABoxUpdater.java @@ -370,7 +370,8 @@ public class ABoxUpdater { } if (count > 0) { - logger.log("Removed " + count + " subject reference" + ((count > 1) ? "s" : "") + " to the " + deletedClass.getURI() + " class"); + //logger.log("Removed " + count + " subject reference" + ((count > 1) ? "s" : "") + " to the " + deletedClass.getURI() + " class"); + logger.log(count + " subject reference" + ((count > 1) ? "s" : "") + " to the " + deletedClass.getURI() + " class " + ((count > 1) ? "were" : "was") + " removed."); } } finally { aboxModel.leaveCriticalSection(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ChangeLogger.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ChangeLogger.java index 5b5cca500..d72c7a36e 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ChangeLogger.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/ChangeLogger.java @@ -8,6 +8,8 @@ public interface ChangeLogger { public void log(String logMessage) throws IOException; + public void logWithDate(String logMessage) throws IOException; + public void logError(String errorMessage) throws IOException; public void closeLogs() throws IOException; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java index f98cc4354..eddef1318 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java @@ -9,7 +9,9 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Date; import java.util.Iterator; import java.util.List; @@ -59,6 +61,10 @@ public class KnowledgeBaseUpdater { this.logger = new SimpleChangeLogger(settings.getLogFile(), settings.getErrorLogFile()); } + + long startTime = System.currentTimeMillis(); + System.out.println("Migrating the knowledge base"); + try { performUpdate(); } catch (Exception e) { @@ -75,6 +81,9 @@ public class KnowledgeBaseUpdater { record.writeChanges(); logger.closeLogs(); + long endTime = System.currentTimeMillis(); + System.out.println("Finished knowledge base migration in " + (endTime - startTime)/1000 + " seconds"); + } return updateRequired; @@ -312,13 +321,12 @@ public class KnowledgeBaseUpdater { try { Model m = settings.getOntModelSelector().getApplicationMetadataModel(); - File successAssertionsFile = - new File(settings.getSuccessAssertionsFile()); + File successAssertionsFile = new File(settings.getSuccessAssertionsFile()); InputStream inStream = new FileInputStream(successAssertionsFile); m.enterCriticalSection(Lock.WRITE); try { m.read(inStream, null, settings.getSuccessRDFFormat()); - logger.log("Successfully finished processing ontology changes."); + logger.logWithDate("Successfully finished processing ontology changes."); } finally { m.leaveCriticalSection(); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeLogger.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeLogger.java index 6009b1c8b..cc297acd7 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeLogger.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeLogger.java @@ -7,6 +7,8 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; +import java.text.SimpleDateFormat; +import java.util.Date; public class SimpleChangeLogger implements ChangeLogger { @@ -27,18 +29,31 @@ public class SimpleChangeLogger implements ChangeLogger { "files for writing", ioe); } } - + public void log(String logMessage) throws IOException { + Exception e = new Exception(); + StackTraceElement[] elements = e.getStackTrace(); + String className = ((StackTraceElement)elements[1]).getClassName(); + className = className.substring(className.lastIndexOf('.') + 1 ); + //String methodName = ((StackTraceElement)elements[1]).getMethodName(); + //logWriter.write(className + "." + methodName + ": " + logMessage + "\n\n"); + + Date now = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); + logWriter.write(formatter.format(now) + " " + className + ": " + logMessage + "\n\n"); + logWriter.flush(); + } + + public void logWithDate(String logMessage) throws IOException { Exception e = new Exception(); StackTraceElement[] elements = e.getStackTrace(); String className = ((StackTraceElement)elements[1]).getClassName(); className = className.substring(className.lastIndexOf('.') + 1 ); - String methodName = ((StackTraceElement)elements[1]).getMethodName(); - - logWriter.write(className + ": " + logMessage + "\n\n"); - //logWriter.write(className + "." + methodName + ": " + logMessage + "\n\n"); - logWriter.flush(); + Date now = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss"); + logWriter.write(formatter.format(now) + " " + className + ": " + logMessage + "\n\n"); + logWriter.flush(); } public void logError(String errorMessage) throws IOException { From 86ba0ea192f8db233850229cc78ce2077fea3100 Mon Sep 17 00:00:00 2001 From: rjy7 Date: Sun, 16 Jan 2011 04:55:23 +0000 Subject: [PATCH 07/19] NIHVIVO-1722 Fix rdf url for individual in non-default namespace --- .../freemarker/IndividualController.java | 79 +++++++++++++------ .../controller/freemarker/UrlBuilder.java | 23 ++++-- .../vitro/webapp/dao/ApplicationDao.java | 2 + .../webapp/dao/jena/ApplicationDaoJena.java | 5 ++ .../individual/IndividualTemplateModel.java | 32 ++++++-- .../ObjectPropertyTemplateModel.java | 2 +- 6 files changed, 107 insertions(+), 36 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java index 77ffc1a20..34caa8c37 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java @@ -92,7 +92,7 @@ public class IndividualController extends FreemarkerHttpServlet { String url = vreq.getRequestURI().substring(vreq.getContextPath().length()); // Check to see if the request is for a non-information resource, redirect if it is. - String redirectURL = checkForRedirect ( url, vreq.getHeader("accept") ); + String redirectURL = checkForRedirect ( url, vreq ); if( redirectURL != null ){ return new RedirectResponseValues(redirectURL); } @@ -108,7 +108,7 @@ public class IndividualController extends FreemarkerHttpServlet { return doNotFound(vreq); } - ContentType rdfFormat = checkForLinkedDataRequest(url,vreq.getHeader("accept")); + ContentType rdfFormat = checkForLinkedDataRequest(url, vreq); if( rdfFormat != null ){ return doRdf(vreq, individual, rdfFormat); } @@ -387,10 +387,10 @@ public class IndividualController extends FreemarkerHttpServlet { //Redirect if the request is for http://hostname/individual/localname // if accept is nothing or text/html redirect to ??? // if accept is some RDF thing redirect to the URL for RDF - private String checkForRedirect(String url, String acceptHeader) { + private String checkForRedirect(String url, VitroRequest vreq) { Matcher m = URI_PATTERN.matcher(url); if( m.matches() && m.groupCount() == 1 ){ - ContentType c = checkForLinkedDataRequest(url, acceptHeader); + ContentType c = checkForLinkedDataRequest(url, vreq); if( c != null ){ String redirectUrl = "/individual/" + m.group(1) + "/" + m.group(1) ; if( RDFXML_MIMETYPE.equals( c.getMediaType()) ){ @@ -413,13 +413,37 @@ public class IndividualController extends FreemarkerHttpServlet { private static Pattern TTL_REQUEST = Pattern.compile("^/individual/([^/]*)/\\1.ttl$"); private static Pattern HTML_REQUEST = Pattern.compile("^/display/([^/]*)$"); + private static Pattern RDF_PARAM = Pattern.compile("rdf"); + private static Pattern N3_PARAM = Pattern.compile("n3"); + private static Pattern TTL_PARAM = Pattern.compile("ttl"); + /** * @return null if this is not a linked data request, returns content type if it is a * linked data request. */ - protected ContentType checkForLinkedDataRequest(String url, String acceptHeader) { + protected ContentType checkForLinkedDataRequest(String url, VitroRequest vreq ) { try { - //check the accept header + ContentType contentType = null; + Matcher m; + // Check for url param specifying format + String formatParam = (String) vreq.getParameter("format"); + if (formatParam != null) { + m = RDF_PARAM.matcher(formatParam); + if ( m.matches() ) { + return new ContentType(RDFXML_MIMETYPE); + } + m = N3_PARAM.matcher(formatParam); + if( m.matches() ) { + return new ContentType(N3_MIMETYPE); + } + m = TTL_PARAM.matcher(formatParam); + if( m.matches() ) { + return new ContentType(TTL_MIMETYPE); + } + } + + //check the accept header + String acceptHeader = vreq.getHeader("accept"); if (acceptHeader != null) { List actualContentTypes = new ArrayList(); actualContentTypes.add(new ContentType( XHTML_MIMETYPE )); @@ -428,14 +452,13 @@ public class IndividualController extends FreemarkerHttpServlet { actualContentTypes.add(new ContentType( RDFXML_MIMETYPE )); actualContentTypes.add(new ContentType( N3_MIMETYPE )); actualContentTypes.add(new ContentType( TTL_MIMETYPE )); - - - ContentType best = ContentType.getBestContentType(acceptHeader,actualContentTypes); - if (best!=null && ( - RDFXML_MIMETYPE.equals(best.getMediaType()) || - N3_MIMETYPE.equals(best.getMediaType()) || - TTL_MIMETYPE.equals(best.getMediaType()) )) - return best; + + contentType = ContentType.getBestContentType(acceptHeader,actualContentTypes); + if (contentType!=null && ( + RDFXML_MIMETYPE.equals(contentType.getMediaType()) || + N3_MIMETYPE.equals(contentType.getMediaType()) || + TTL_MIMETYPE.equals(contentType.getMediaType()) )) + return contentType; } /* @@ -444,22 +467,30 @@ public class IndividualController extends FreemarkerHttpServlet { http://vivo.cornell.edu/individual/n23/n23.n3 http://vivo.cornell.edu/individual/n23/n23.ttl */ - - Matcher m = RDF_REQUEST.matcher(url); - if( m.matches() ) - return new ContentType(RDFXML_MIMETYPE); - m = N3_REQUEST.matcher(url); - if( m.matches() ) - return new ContentType(N3_MIMETYPE); - m = TTL_REQUEST.matcher(url); - if( m.matches() ) - return new ContentType(TTL_MIMETYPE); + m = RDF_REQUEST.matcher(url); + if( m.matches() ) { + return new ContentType(RDFXML_MIMETYPE); + } + m = N3_REQUEST.matcher(url); + if( m.matches() ) { + return new ContentType(N3_MIMETYPE); + } + m = TTL_REQUEST.matcher(url); + if( m.matches() ) { + return new ContentType(TTL_MIMETYPE); + } + } catch (Throwable th) { log.error("problem while checking accept header " , th); } return null; } + + private ContentType getContentTypeFromString(String string) { + + return null; + } @SuppressWarnings("unused") private boolean checkForSunset(VitroRequest vreq, Individual entity) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilder.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilder.java index ff1657046..30ceef439 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilder.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/UrlBuilder.java @@ -234,12 +234,24 @@ public class UrlBuilder { } public static String getPath(String path, ParamMap params) { - String glue = "?"; - for (String key : params.keySet()) { - path += glue + key + "=" + urlEncode(params.get(key)); + return addParams(path, params, "?"); + } + + private static String addParams(String url, ParamMap params, String glue) { + for (String key: params.keySet()) { + url += glue + key + "=" + urlEncode(params.get(key)); glue = "&"; } - return path; + return url; + } + + public static String addParams(String url, ParamMap params) { + String glue = url.contains("?") ? "&" : "?"; + return addParams(url, params, glue); + } + + public static String addParams(String url, String...params) { + return addParams(url, new ParamMap(params)); } public static String getPath(Route route, ParamMap params) { @@ -267,8 +279,7 @@ public class UrlBuilder { if (defaultNamespace.equals(namespace)) { profileUrl = getUrl(Route.INDIVIDUAL.path() + "/" + localName); } else { - List externallyLinkedNamespaces = wadf.getApplicationDao().getExternallyLinkedNamespaces(); - if (externallyLinkedNamespaces.contains(namespace)) { + if (wadf.getApplicationDao().isExternallyLinkedNamespace(namespace)) { log.debug("Found externally linked namespace " + namespace); profileUrl = namespace + "/" + localName; } else { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ApplicationDao.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ApplicationDao.java index 6ccd29b4f..729865d2e 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ApplicationDao.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/ApplicationDao.java @@ -12,4 +12,6 @@ public interface ApplicationDao { public List getExternallyLinkedNamespaces(); + public boolean isExternallyLinkedNamespace(String namespace); + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ApplicationDaoJena.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ApplicationDaoJena.java index 1b89dbc96..418240732 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ApplicationDaoJena.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ApplicationDaoJena.java @@ -80,6 +80,11 @@ public class ApplicationDaoJena extends JenaBaseDao implements ApplicationDao { return externallyLinkedNamespaces; } + public boolean isExternallyLinkedNamespace(String namespace) { + List namespaces = getExternallyLinkedNamespaces(); + return namespaces.contains(namespace); + } + private class ExternalNamespacesChangeListener extends StatementListener { @Override diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/IndividualTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/IndividualTemplateModel.java index df3be635d..99282f914 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/IndividualTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/IndividualTemplateModel.java @@ -2,15 +2,15 @@ package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual; -import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.openrdf.model.URI; +import org.openrdf.model.impl.URIImpl; import edu.cornell.mannlib.vedit.beans.LoginStatusBean; import edu.cornell.mannlib.vitro.webapp.beans.Individual; -import edu.cornell.mannlib.vitro.webapp.beans.Link; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder; import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Route; @@ -86,10 +86,32 @@ public class IndividualTemplateModel extends BaseTemplateModel { return uri.startsWith(defaultNamespace) ? uri + "/" + getLocalName() + ".rdf" : null; } - // RY Used for the rdf link on the individual page. Is it correct that this is not the same - // as getLinkedDataUrl()? + // Used to create a link to a display of the individual's rdf. public String getRdfUrl() { - return getProfileUrl() + "/" + getLocalName() + ".rdf"; + + String individualUri = getUri(); + String profileUrl = getProfileUrl(); + + URI uri = new URIImpl(individualUri); + String namespace = uri.getNamespace(); + + // Individuals in the default namespace + // e.g., http://vivo.cornell.edu/individual/n2345/n2345.rdf + // where default namespace = http://vivo.cornell.edu/individual/ + String defaultNamespace = vreq.getWebappDaoFactory().getDefaultNamespace(); + if (defaultNamespace.equals(namespace)) { + return profileUrl + "/" + getLocalName() + ".rdf"; + } + + // An RDF url is not defined for an externally linked namespace. The data does not reside + // in the current system, and the external system may not accept a request for rdf. + if (vreq.getWebappDaoFactory().getApplicationDao().isExternallyLinkedNamespace(namespace)) { + return null; + } + + // http://some.other.namespace/n2345?format=application/rdf+xml + return UrlBuilder.addParams(profileUrl, "format", "rdf"); + } public String getEditUrl() { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java index 750e93d11..8147cc6c0 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java @@ -141,7 +141,7 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel try { return new CollatedObjectPropertyTemplateModel(op, subject, vreq, policyHelper); } catch (InvalidConfigurationException e) { - log.warn(e); + log.warn(e.getMessage()); return new UncollatedObjectPropertyTemplateModel(op, subject, vreq, policyHelper); } } else { From a3a5f361d59b85ac5c0f1367dde24f1110d9024f Mon Sep 17 00:00:00 2001 From: rjy7 Date: Sun, 16 Jan 2011 14:23:38 +0000 Subject: [PATCH 08/19] NIHVIVO-1722, NIHVIVO-1380 Some refactoring of code that creates a link to an individual's rdf --- .../freemarker/IndividualController.java | 40 ++++--------------- .../individual/IndividualTemplateModel.java | 28 +++++++------ 2 files changed, 23 insertions(+), 45 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java index 34caa8c37..e3b8d6f85 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualController.java @@ -184,7 +184,7 @@ public class IndividualController extends FreemarkerHttpServlet { private String getRdfLinkTag(IndividualTemplateModel itm) { String linkTag = null; - String linkedDataUrl = itm.getLinkedDataUrl(); + String linkedDataUrl = itm.getRdfUrl(false); if (linkedDataUrl != null) { linkTag = " "; @@ -200,10 +200,7 @@ public class IndividualController extends FreemarkerHttpServlet { individual.setKeywords(iwDao.getKeywordsForIndividualByMode(individual.getURI(),"visible")); individual.sortForDisplay(); - //setup highlighter for search terms - //checkForSearch(vreq, individual); - - return new IndividualTemplateModel(individual, vreq, LoginStatusBean.getBean(vreq)); + return new IndividualTemplateModel(individual, vreq); } // Determine whether the individual has a custom display template based on its class membership. @@ -413,9 +410,9 @@ public class IndividualController extends FreemarkerHttpServlet { private static Pattern TTL_REQUEST = Pattern.compile("^/individual/([^/]*)/\\1.ttl$"); private static Pattern HTML_REQUEST = Pattern.compile("^/display/([^/]*)$"); - private static Pattern RDF_PARAM = Pattern.compile("rdf"); - private static Pattern N3_PARAM = Pattern.compile("n3"); - private static Pattern TTL_PARAM = Pattern.compile("ttl"); + public static final Pattern RDFXML_FORMAT = Pattern.compile("rdfxml"); + public static final Pattern N3_FORMAT = Pattern.compile("n3"); + public static final Pattern TTL_FORMAT = Pattern.compile("ttl"); /** * @return null if this is not a linked data request, returns content type if it is a @@ -428,15 +425,15 @@ public class IndividualController extends FreemarkerHttpServlet { // Check for url param specifying format String formatParam = (String) vreq.getParameter("format"); if (formatParam != null) { - m = RDF_PARAM.matcher(formatParam); + m = RDFXML_FORMAT.matcher(formatParam); if ( m.matches() ) { return new ContentType(RDFXML_MIMETYPE); } - m = N3_PARAM.matcher(formatParam); + m = N3_FORMAT.matcher(formatParam); if( m.matches() ) { return new ContentType(N3_MIMETYPE); } - m = TTL_PARAM.matcher(formatParam); + m = TTL_FORMAT.matcher(formatParam); if( m.matches() ) { return new ContentType(TTL_MIMETYPE); } @@ -571,27 +568,6 @@ public class IndividualController extends FreemarkerHttpServlet { return newModel; } - - - private void checkForSearch(HttpServletRequest req, Individual ent) { - if (req.getSession().getAttribute("LastQuery") != null) { - VitroQueryWrapper qWrap = (VitroQueryWrapper) req.getSession() - .getAttribute("LastQuery"); - if (qWrap.getRequestCount() > 0 && qWrap.getQuery() != null) { - VitroQuery query = qWrap.getQuery(); - - //set query text so we can get it in JSP - req.setAttribute("querytext", query.getTerms()); - - //setup highlighting for output - StringProcessorTag.putStringProcessorInRequest(req, qWrap.getHighlighter()); - - qWrap.setRequestCount(qWrap.getRequestCount() - 1); - } else { - req.getSession().removeAttribute("LastQuery"); - } - } - } private Pattern badrequest= Pattern.compile(".*([&\\?=]|\\.\\.).*"); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/IndividualTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/IndividualTemplateModel.java index 99282f914..a9ae7cdb1 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/IndividualTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/IndividualTemplateModel.java @@ -2,7 +2,8 @@ package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual; -import java.util.List; +import java.util.HashMap; +import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -31,10 +32,10 @@ public class IndividualTemplateModel extends BaseTemplateModel { protected LoginStatusBean loginStatusBean = null; private EditingPolicyHelper policyHelper = null; - public IndividualTemplateModel(Individual individual, VitroRequest vreq, LoginStatusBean loginStatusBean) { + public IndividualTemplateModel(Individual individual, VitroRequest vreq) { this.individual = individual; this.vreq = vreq; - this.loginStatusBean = loginStatusBean; + this.loginStatusBean = LoginStatusBean.getBean(vreq); // Needed for getting portal-sensitive urls. Remove if multi-portal support is removed. this.urlBuilder = new UrlBuilder(vreq.getPortal()); @@ -80,14 +81,12 @@ public class IndividualTemplateModel extends BaseTemplateModel { return thumbUrl == null ? null : getUrl(thumbUrl); } - public String getLinkedDataUrl() { - String defaultNamespace = vreq.getWebappDaoFactory().getDefaultNamespace(); - String uri = getUri(); - return uri.startsWith(defaultNamespace) ? uri + "/" + getLocalName() + ".rdf" : null; + public String getRdfUrl() { + return getRdfUrl(true); } - // Used to create a link to a display of the individual's rdf. - public String getRdfUrl() { + // Used to create a link to generate the individual's rdf. + public String getRdfUrl(boolean checkExternalNamespaces) { String individualUri = getUri(); String profileUrl = getProfileUrl(); @@ -97,7 +96,7 @@ public class IndividualTemplateModel extends BaseTemplateModel { // Individuals in the default namespace // e.g., http://vivo.cornell.edu/individual/n2345/n2345.rdf - // where default namespace = http://vivo.cornell.edu/individual/ + // where default namespace = http://vivo.cornell.edu/individual/ String defaultNamespace = vreq.getWebappDaoFactory().getDefaultNamespace(); if (defaultNamespace.equals(namespace)) { return profileUrl + "/" + getLocalName() + ".rdf"; @@ -105,12 +104,15 @@ public class IndividualTemplateModel extends BaseTemplateModel { // An RDF url is not defined for an externally linked namespace. The data does not reside // in the current system, and the external system may not accept a request for rdf. - if (vreq.getWebappDaoFactory().getApplicationDao().isExternallyLinkedNamespace(namespace)) { + if (checkExternalNamespaces && vreq.getWebappDaoFactory() + .getApplicationDao() + .isExternallyLinkedNamespace(namespace)) { return null; } - // http://some.other.namespace/n2345?format=application/rdf+xml - return UrlBuilder.addParams(profileUrl, "format", "rdf"); + // http://some.other.namespace/n2345?format=rdfxml + // ** RY Not sure it is correct to return this for the element + return UrlBuilder.addParams(profileUrl, "format", "rdfxml"); } From 9f62fdfe2b2087af8d921182fc16baa5663d81a8 Mon Sep 17 00:00:00 2001 From: sjm222 Date: Sun, 16 Jan 2011 17:10:52 +0000 Subject: [PATCH 09/19] migration logging improvements --- .../vitro/webapp/ontology/update/KnowledgeBaseUpdater.java | 5 ++--- .../vitro/webapp/ontology/update/SimpleChangeLogger.java | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java index eddef1318..7f7a22987 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/KnowledgeBaseUpdater.java @@ -81,9 +81,8 @@ public class KnowledgeBaseUpdater { record.writeChanges(); logger.closeLogs(); - long endTime = System.currentTimeMillis(); - System.out.println("Finished knowledge base migration in " + (endTime - startTime)/1000 + " seconds"); - + long elapsedSecs = (System.currentTimeMillis() - startTime)/1000; + System.out.println("Finished knowledge base migration in " + elapsedSecs + " second" + (elapsedSecs != 1 ? "s" : "")); } return updateRequired; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeLogger.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeLogger.java index cc297acd7..72028523f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeLogger.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/ontology/update/SimpleChangeLogger.java @@ -51,7 +51,7 @@ public class SimpleChangeLogger implements ChangeLogger { String className = ((StackTraceElement)elements[1]).getClassName(); className = className.substring(className.lastIndexOf('.') + 1 ); Date now = new Date(); - SimpleDateFormat formatter = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss"); + SimpleDateFormat formatter = new SimpleDateFormat("MMM dd, yyyy hh:mm a z"); logWriter.write(formatter.format(now) + " " + className + ": " + logMessage + "\n\n"); logWriter.flush(); } From 58027d5d95544e27bfa91fa47c4e1b4f36a3c87a Mon Sep 17 00:00:00 2001 From: nac26 Date: Sun, 16 Jan 2011 19:29:52 +0000 Subject: [PATCH 10/19] Merged r7051 from the trunk --- webapp/web/js/login/loginUtils.js | 2 +- .../freemarker/widgets/widget-login.ftl | 21 +++++++++---------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/webapp/web/js/login/loginUtils.js b/webapp/web/js/login/loginUtils.js index 1c46d8d7b..9fa54dee2 100644 --- a/webapp/web/js/login/loginUtils.js +++ b/webapp/web/js/login/loginUtils.js @@ -3,7 +3,7 @@ $(document).ready(function(){ // login form is hidden by default; use JavaScript to reveal - $("#loginFormAndLinks").show(); + $("#login").removeClass('hidden'); // focus on email or newpassword field $('.focus').focus(); diff --git a/webapp/web/templates/freemarker/widgets/widget-login.ftl b/webapp/web/templates/freemarker/widgets/widget-login.ftl index 3941f3a39..5e6ee2c13 100644 --- a/webapp/web/templates/freemarker/widgets/widget-login.ftl +++ b/webapp/web/templates/freemarker/widgets/widget-login.ftl @@ -13,16 +13,15 @@ <#macro loginForm> + -
+