From fdeee35bb4b615a348111ab03cda83268b160384 Mon Sep 17 00:00:00 2001 From: j2blake Date: Mon, 10 Mar 2014 17:42:05 -0400 Subject: [PATCH] VIVO-692 Restrict LOD by Publish level, not by Display level Create a new annotation for properties and classes, HiddenFromPublishBelowRoleLevelAnnot. Provide the means to initialize these annotations, edit them, and display them in the verbose property display. Create a Permission and some requested actions so the policies can decide which statements must be filtered out, based on the user's role. Add unit tests and improve acceptance tests --- webapp/config/log4j.properties | 1 - .../rdf/auth/everytime/permission_config.n3 | 6 + webapp/rdf/tbox/filegraph/vitro-0.7.owl | 3 + .../permissions/DisplayByRolePermission.java | 1 - .../auth/permissions/PermissionRegistry.java | 20 + .../permissions/PublishByRolePermission.java | 133 +++++ .../webapp/auth/policy/ServletPolicyList.java | 2 - .../bean/PropertyRestrictionListener.java | 26 +- .../bean/PropertyRestrictionPolicyHelper.java | 83 ++- .../AbstractDataPropertyStatementAction.java | 4 + ...AbstractObjectPropertyStatementAction.java | 26 +- .../publish/PublishDataProperty.java | 24 + .../publish/PublishDataPropertyStatement.java | 26 + .../publish/PublishObjectProperty.java | 24 + .../PublishObjectPropertyStatement.java | 28 + .../vitro/webapp/beans/BaseResourceBean.java | 198 +++---- .../vitro/webapp/beans/ObjectProperty.java | 1 + .../vitro/webapp/beans/ResourceBean.java | 6 + .../edit/DatapropEditController.java | 11 +- .../edit/DatapropRetryController.java | 1 + .../controller/edit/EntityEditController.java | 10 +- .../edit/EntityRetryController.java | 1 + .../edit/PropertyEditController.java | 15 +- .../edit/PropertyRetryController.java | 1 + .../controller/edit/VclassEditController.java | 13 +- .../edit/VclassRetryController.java | 1 + .../edit/utils/RoleLevelOptionsSetup.java | 33 +- .../individual/IndividualRdfAssembler.java | 34 +- .../vitro/webapp/dao/VitroVocabulary.java | 6 +- .../dao/filtering/DataPropertyFiltering.java | 15 + .../dao/filtering/IndividualFiltering.java | 15 + .../filtering/ObjectPropertyFiltering.java | 15 + .../webapp/dao/jena/DataPropertyDaoJena.java | 28 + .../vitro/webapp/dao/jena/JenaBaseDaoCon.java | 1 + .../vitro/webapp/dao/jena/JenaModelUtils.java | 4 +- .../dao/jena/ObjectPropertyDaoJena.java | 32 +- .../vitro/webapp/dao/jena/VClassDaoJena.java | 13 + .../vitro/webapp/dao/jena/VClassJena.java | 37 +- .../individual/PropertyTemplateModel.java | 8 +- .../vitro/testing/AbstractTestClass.java | 21 + .../PropertyRestrictionPolicyHelperTest.java | 167 ++++-- .../IndividualRdfAssemblerTest.filteredRdf.n3 | 154 ++++++ .../IndividualRdfAssemblerTest.java | 503 ++++++++++++++++++ .../IndividualRdfAssemblerTest.rawRdf.n3 | 163 ++++++ ...ndividualRdfAssemblerTest.unfilteredRdf.n3 | 171 ++++++ .../dao/jena/DataPropertyDaoJenaTest.java | 1 + .../dao/jena/ObjectPropertyDaoJenaTest.java | 1 + .../vitro/webapp/dao/jena/VClassDaoTest.java | 1 + .../vitro/webapp/dao/jena/VClassJenaTest.java | 22 + .../PropertyRestrictionPolicyHelperStub.java | 27 +- .../vitro/webapp/beans/IndividualStub.java | 34 +- .../edit/specific/dataprop_retry.jsp | 18 +- .../edit/specific/property_retry.jsp | 18 +- .../templates/edit/specific/vclass_retry.jsp | 18 +- .../freemarker/lib/lib-properties.ftl | 3 +- 55 files changed, 1977 insertions(+), 251 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PublishByRolePermission.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/publish/PublishDataProperty.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/publish/PublishDataPropertyStatement.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/publish/PublishObjectProperty.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/publish/PublishObjectPropertyStatement.java create mode 100644 webapp/test/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualRdfAssemblerTest.filteredRdf.n3 create mode 100644 webapp/test/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualRdfAssemblerTest.java create mode 100644 webapp/test/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualRdfAssemblerTest.rawRdf.n3 create mode 100644 webapp/test/edu/cornell/mannlib/vitro/webapp/controller/individual/IndividualRdfAssemblerTest.unfilteredRdf.n3 diff --git a/webapp/config/log4j.properties b/webapp/config/log4j.properties index b5cf2bf83..fbb00c755 100644 --- a/webapp/config/log4j.properties +++ b/webapp/config/log4j.properties @@ -35,7 +35,6 @@ log4j.rootLogger=INFO, AllAppender # These classes are too chatty to display INFO messages. log4j.logger.edu.cornell.mannlib.vitro.webapp.startup.StartupStatus=WARN -log4j.logger.edu.cornell.mannlib.vitro.webapp.controller.freemarker.BrowseController=WARN log4j.logger.edu.cornell.mannlib.vitro.webapp.dao.jena.pellet.PelletListener=WARN log4j.logger.edu.cornell.mannlib.vitro.webapp.dao.jena.RDBGraphGenerator=WARN log4j.logger.edu.cornell.mannlib.vitro.webapp.servlet.setup.UpdateKnowledgeBase=DEBUG diff --git a/webapp/rdf/auth/everytime/permission_config.n3 b/webapp/rdf/auth/everytime/permission_config.n3 index 3af62fb71..dfb33c3c7 100644 --- a/webapp/rdf/auth/everytime/permission_config.n3 +++ b/webapp/rdf/auth/everytime/permission_config.n3 @@ -5,6 +5,7 @@ @prefix simplePermission: . @prefix displayByRole: . @prefix editByRole: . +@prefix publishByRole: . auth:ADMIN a auth:PermissionSet ; @@ -65,6 +66,7 @@ auth:ADMIN # role-based permissions for ADMIN auth:hasPermission displayByRole:Admin ; auth:hasPermission editByRole:Admin ; + auth:hasPermission publishByRole:Admin ; . auth:CURATOR @@ -104,6 +106,7 @@ auth:CURATOR # role-based permissions for CURATOR auth:hasPermission displayByRole:Curator ; auth:hasPermission editByRole:Curator ; + auth:hasPermission publishByRole:Curator ; . auth:EDITOR @@ -134,6 +137,7 @@ auth:EDITOR # role-based permissions for EDITOR auth:hasPermission displayByRole:Editor ; auth:hasPermission editByRole:Editor ; + auth:hasPermission publishByRole:Editor ; . auth:SELF_EDITOR @@ -158,6 +162,7 @@ auth:SELF_EDITOR # For role-based display and editing, SelfEditor is like Public. # SelfEditor uses its special permissions to edit/display its own values. auth:hasPermission displayByRole:Public ; + auth:hasPermission publishByRole:Public ; . auth:PUBLIC @@ -171,4 +176,5 @@ auth:PUBLIC # role-based permissions for PUBLIC auth:hasPermission displayByRole:Public ; + auth:hasPermission publishByRole:Public ; . diff --git a/webapp/rdf/tbox/filegraph/vitro-0.7.owl b/webapp/rdf/tbox/filegraph/vitro-0.7.owl index a265a3508..6e9b89da6 100644 --- a/webapp/rdf/tbox/filegraph/vitro-0.7.owl +++ b/webapp/rdf/tbox/filegraph/vitro-0.7.owl @@ -109,6 +109,9 @@ xmlns:vitro="&vitro;" + + + diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/DisplayByRolePermission.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/DisplayByRolePermission.java index 74ff5c584..3486de761 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/DisplayByRolePermission.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/DisplayByRolePermission.java @@ -15,7 +15,6 @@ import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.display.DisplayObje import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction; import edu.cornell.mannlib.vitro.webapp.beans.BaseResourceBean.RoleLevel; import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement; -import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement; import edu.cornell.mannlib.vitro.webapp.beans.Property; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionRegistry.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionRegistry.java index 775ace11b..ae9af0073 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionRegistry.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PermissionRegistry.java @@ -134,6 +134,7 @@ public class PermissionRegistry { permissions.addAll(SimplePermission.getAllInstances()); permissions.addAll(createDisplayByRolePermissions(ctx)); permissions.addAll(createEditByRolePermissions(ctx)); + permissions.addAll(createPublishByRolePermissions(ctx)); PermissionRegistry.createRegistry(ctx, permissions); @@ -185,5 +186,24 @@ public class PermissionRegistry { public void contextDestroyed(ServletContextEvent sce) { sce.getServletContext().removeAttribute(ATTRIBUTE_NAME); } + + /** + * There is no PublishByRolePermission for self-editors. They get the + * same rights as PUBLIC. Other permissions give them their self-editing + * privileges. + */ + private Collection createPublishByRolePermissions( + ServletContext ctx) { + List list = new ArrayList(); + list.add(new PublishByRolePermission("Admin", RoleLevel.DB_ADMIN, + ctx)); + list.add(new PublishByRolePermission("Curator", RoleLevel.CURATOR, + ctx)); + list.add(new PublishByRolePermission("Editor", RoleLevel.EDITOR, + ctx)); + list.add(new PublishByRolePermission("Public", RoleLevel.PUBLIC, + ctx)); + return list; + } } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PublishByRolePermission.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PublishByRolePermission.java new file mode 100644 index 000000000..c70be7735 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/PublishByRolePermission.java @@ -0,0 +1,133 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.auth.permissions; + +import javax.servlet.ServletContext; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import edu.cornell.mannlib.vitro.webapp.auth.policy.bean.PropertyRestrictionPolicyHelper; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.publish.PublishDataProperty; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.publish.PublishDataPropertyStatement; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.publish.PublishObjectProperty; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.publish.PublishObjectPropertyStatement; +import edu.cornell.mannlib.vitro.webapp.beans.BaseResourceBean.RoleLevel; +import edu.cornell.mannlib.vitro.webapp.beans.Property; + +/** + * Is the user authorized to publish properties that are marked as restricted to + * a certain "Role Level"? + */ +public class PublishByRolePermission extends Permission { + private static final Log log = LogFactory + .getLog(PublishByRolePermission.class); + + public static final String NAMESPACE = "java:" + + PublishByRolePermission.class.getName() + "#"; + + private final String roleName; + private final RoleLevel roleLevel; + private final ServletContext ctx; + + public PublishByRolePermission(String roleName, RoleLevel roleLevel, + ServletContext ctx) { + super(NAMESPACE + roleName); + + if (roleName == null) { + throw new NullPointerException("role may not be null."); + } + if (roleLevel == null) { + throw new NullPointerException("roleLevel may not be null."); + } + if (ctx == null) { + throw new NullPointerException("context may not be null."); + } + + this.roleName = roleName; + this.roleLevel = roleLevel; + this.ctx = ctx; + } + + @Override + public boolean isAuthorized(RequestedAction whatToAuth) { + boolean result; + + if (whatToAuth instanceof PublishDataProperty) { + result = isAuthorized((PublishDataProperty) whatToAuth); + } else if (whatToAuth instanceof PublishObjectProperty) { + result = isAuthorized((PublishObjectProperty) whatToAuth); + } else if (whatToAuth instanceof PublishDataPropertyStatement) { + result = isAuthorized((PublishDataPropertyStatement) whatToAuth); + } else if (whatToAuth instanceof PublishObjectPropertyStatement) { + result = isAuthorized((PublishObjectPropertyStatement) whatToAuth); + } else { + result = false; + } + + if (result) { + log.debug(this + " authorizes " + whatToAuth); + } else { + log.debug(this + " does not authorize " + whatToAuth); + } + + return result; + } + + /** + * The user may publish this data property if they are allowed to publish + * its predicate. + */ + private boolean isAuthorized(PublishDataProperty action) { + String predicateUri = action.getDataProperty().getURI(); + return canPublishPredicate(new Property(predicateUri)); + } + + /** + * The user may publish this object property if they are allowed to publish + * its predicate. + */ + private boolean isAuthorized(PublishObjectProperty action) { + return canPublishPredicate(action.getObjectProperty()); + } + + /** + * The user may publish this data property if they are allowed to publish + * its subject and its predicate. + */ + private boolean isAuthorized(PublishDataPropertyStatement action) { + String subjectUri = action.getSubjectUri(); + String predicateUri = action.getPredicateUri(); + return canPublishResource(subjectUri) + && canPublishPredicate(new Property(predicateUri)); + } + + /** + * The user may publish this data property if they are allowed to publish + * its subject, its predicate, and its object. + */ + private boolean isAuthorized(PublishObjectPropertyStatement action) { + String subjectUri = action.getSubjectUri(); + Property predicate = action.getPredicate(); + String objectUri = action.getObjectUri(); + return canPublishResource(subjectUri) && canPublishPredicate(predicate) + && canPublishResource(objectUri); + } + + private boolean canPublishResource(String resourceUri) { + return PropertyRestrictionPolicyHelper.getBean(ctx).canPublishResource( + resourceUri, this.roleLevel); + } + + private boolean canPublishPredicate(Property predicate) { + return PropertyRestrictionPolicyHelper.getBean(ctx) + .canPublishPredicate(predicate, this.roleLevel); + } + + @Override + public String toString() { + return "PublishByRolePermission['" + roleName + "']"; + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/ServletPolicyList.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/ServletPolicyList.java index 20b3816dc..47ebbe932 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/ServletPolicyList.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/ServletPolicyList.java @@ -48,7 +48,6 @@ public class ServletPolicyList { PolicyList policies = getPolicyList(sc); if (!policies.contains(policy)) { policies.add(policy); - log.info("Added policy: " + policy.getClass().getSimpleName()); log.debug("Added policy: " + policy.toString()); } else { log.warn("Ignored attempt to add redundant policy."); @@ -67,7 +66,6 @@ public class ServletPolicyList { PolicyList policies = getPolicyList(sc); if (!policies.contains(policy)) { policies.add(0, policy); - log.info("Added policy at front: " + policy.getClass().getSimpleName()); log.debug("Added policy at front: " + policy.toString()); } else { log.warn("Ignored attempt to add redundant policy."); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/bean/PropertyRestrictionListener.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/bean/PropertyRestrictionListener.java index 90f9b630a..e61d798db 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/bean/PropertyRestrictionListener.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/bean/PropertyRestrictionListener.java @@ -37,8 +37,9 @@ public class PropertyRestrictionListener implements ChangeListener { @Override public void doDeleted(Object oldObj, EditProcessObject epo) { Property p = (Property) oldObj; - if (eitherRoleChanged(p.getHiddenFromDisplayBelowRoleLevel(), - p.getProhibitedFromUpdateBelowRoleLevel(), null, null)) { + if (anyRoleChanged(p.getHiddenFromDisplayBelowRoleLevel(), + p.getProhibitedFromUpdateBelowRoleLevel(), + p.getHiddenFromPublishBelowRoleLevel(), null, null, null)) { log.debug("rebuilding the PropertyRestrictionPolicyHelper after deletion"); createAndSetBean(); } @@ -50,9 +51,10 @@ public class PropertyRestrictionListener implements ChangeListener { @Override public void doInserted(Object newObj, EditProcessObject epo) { Property p = (Property) newObj; - if (eitherRoleChanged(null, null, + if (anyRoleChanged(null, null, null, p.getHiddenFromDisplayBelowRoleLevel(), - p.getProhibitedFromUpdateBelowRoleLevel())) { + p.getProhibitedFromUpdateBelowRoleLevel(), + p.getHiddenFromPublishBelowRoleLevel())) { log.debug("rebuilding the PropertyRestrictionPolicyHelper after insertion"); createAndSetBean(); } @@ -65,20 +67,24 @@ public class PropertyRestrictionListener implements ChangeListener { public void doUpdated(Object oldObj, Object newObj, EditProcessObject epo) { Property oldP = (Property) oldObj; Property newP = (Property) newObj; - if (eitherRoleChanged(oldP.getHiddenFromDisplayBelowRoleLevel(), + if (anyRoleChanged(oldP.getHiddenFromDisplayBelowRoleLevel(), oldP.getProhibitedFromUpdateBelowRoleLevel(), + oldP.getHiddenFromPublishBelowRoleLevel(), newP.getHiddenFromDisplayBelowRoleLevel(), - newP.getProhibitedFromUpdateBelowRoleLevel())) { + newP.getProhibitedFromUpdateBelowRoleLevel(), + newP.getHiddenFromPublishBelowRoleLevel())) { log.debug("rebuilding the PropertyRestrictionPolicyHelper after update"); createAndSetBean(); } } - private boolean eitherRoleChanged(RoleLevel oldDisplayRole, - RoleLevel oldUpdateRole, RoleLevel newDisplayRole, - RoleLevel newUpdateRole) { + private boolean anyRoleChanged(RoleLevel oldDisplayRole, + RoleLevel oldUpdateRole, RoleLevel oldPublishRole, + RoleLevel newDisplayRole, RoleLevel newUpdateRole, + RoleLevel newPublishRole) { return (!isTheSame(oldDisplayRole, newDisplayRole)) - || (!isTheSame(oldUpdateRole, newUpdateRole)); + || (!isTheSame(oldUpdateRole, newUpdateRole)) + || (!isTheSame(oldPublishRole, newPublishRole)); } private boolean isTheSame(RoleLevel oldRole, RoleLevel newRole) { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/bean/PropertyRestrictionPolicyHelper.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/bean/PropertyRestrictionPolicyHelper.java index e5163efd2..5b4f9ee12 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/bean/PropertyRestrictionPolicyHelper.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/bean/PropertyRestrictionPolicyHelper.java @@ -19,12 +19,6 @@ import org.apache.commons.logging.LogFactory; import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.ontology.OntModelSpec; -import com.hp.hpl.jena.query.Query; -import com.hp.hpl.jena.query.QueryExecution; -import com.hp.hpl.jena.query.QueryExecutionFactory; -import com.hp.hpl.jena.query.QueryFactory; -import com.hp.hpl.jena.query.QuerySolution; -import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.RDFNode; @@ -46,10 +40,10 @@ import edu.cornell.mannlib.vitro.webapp.utils.ApplicationConfigurationOntologyUt /** * Assists the role-based policies in determining whether a property or resource - * may be displayed or modified. + * may be displayed, modified, or published in linked open data. * * There is a bean in the context that holds the current threshold role levels - * for displaying and modifying restricted properties. + * for displaying, modifying, or publishing restricted properties. * * Create this bean after the Jena model is in place in the context. * @@ -119,6 +113,8 @@ public class PropertyRestrictionPolicyHelper { new HashMap>, RoleLevel>(); Map>, RoleLevel> modifyThresholdMap = new HashMap>, RoleLevel>(); + Map>, RoleLevel> publishThresholdMap = + new HashMap>, RoleLevel>(); OntModel union = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, ModelFactory.createUnion(displayModel, model)); @@ -126,15 +122,14 @@ public class PropertyRestrictionPolicyHelper { populateThresholdMap(union, displayThresholdMap, VitroVocabulary.HIDDEN_FROM_DISPLAY_BELOW_ROLE_LEVEL_ANNOT); - populateThresholdMap( - union, - modifyThresholdMap, + populateThresholdMap(union, modifyThresholdMap, VitroVocabulary.PROHIBITED_FROM_UPDATE_BELOW_ROLE_LEVEL_ANNOT); - + populateThresholdMap(union, publishThresholdMap, + VitroVocabulary.HIDDEN_FROM_PUBLISH_BELOW_ROLE_LEVEL_ANNOT); PropertyRestrictionPolicyHelper bean = new PropertyRestrictionPolicyHelper( PROHIBITED_NAMESPACES, PERMITTED_EXCEPTIONS, - displayThresholdMap, modifyThresholdMap, displayModel); + displayThresholdMap, modifyThresholdMap, publishThresholdMap); return bean; } @@ -209,6 +204,9 @@ public class PropertyRestrictionPolicyHelper { } else if (VitroVocabulary.HIDDEN_FROM_DISPLAY_BELOW_ROLE_LEVEL_ANNOT .equals(propertyUri)) { role = faux.getHiddenFromDisplayBelowRoleLevel(); + } else if (VitroVocabulary.HIDDEN_FROM_PUBLISH_BELOW_ROLE_LEVEL_ANNOT + .equals(propertyUri)) { + role = faux.getHiddenFromPublishBelowRoleLevel(); } if (role != null) { log.debug("Putting D:" + faux.getDomainVClassURI() + " P:" + faux.getURI() + " R:" + faux.getRangeVClassURI() + " ==> L:" + role); @@ -251,6 +249,12 @@ public class PropertyRestrictionPolicyHelper { */ private final Map>, RoleLevel> modifyThresholdMap; + /** + * These URIs can be published only if the user's role is at least as high as + * the threshold role. + */ + private final Map>, RoleLevel> publishThresholdMap; + /** * Store unmodifiable versions of the inputs. @@ -263,19 +267,23 @@ public class PropertyRestrictionPolicyHelper { Collection modifyExceptionsAllowedUris, Map>, RoleLevel> displayThresholdMap, Map>, RoleLevel> modifyThresholdMap, - Model displayModel) { + Map>, RoleLevel> publishThresholdMap) { this.modifyProhibitedNamespaces = unmodifiable(modifyProhibitedNamespaces); this.modifyExceptionsAllowedUris = unmodifiable(modifyExceptionsAllowedUris); this.displayThresholdMap = displayThresholdMap; this.modifyThresholdMap = modifyThresholdMap; -// this.displayThresholdMap = unmodifiable(displayThresholdMap); -// this.modifyThresholdMap = unmodifiable(modifyThresholdMap); + this.publishThresholdMap = publishThresholdMap; + // TODO: why are these no longer unmodifiable? Brian changed during the + // TODO: ISF integration. + // this.displayThresholdMap = unmodifiable(displayThresholdMap); + // this.modifyThresholdMap = unmodifiable(modifyThresholdMap); if (log.isDebugEnabled()) { log.debug("prohibited: " + this.modifyProhibitedNamespaces); log.debug("exceptions: " + this.modifyExceptionsAllowedUris); log.debug("display thresholds: " + this.displayThresholdMap); log.debug("modify thresholds: " + this.modifyThresholdMap); + log.debug("publish thresholds: " + this.publishThresholdMap); } } @@ -341,6 +349,22 @@ public class PropertyRestrictionPolicyHelper { return true; } + /** + * Any resource can be published. + * + * (Someday we may want to implement publish restrictions based on VClass.) + */ + @SuppressWarnings("unused") + public boolean canPublishResource(String resourceUri, RoleLevel userRole) { + if (resourceUri == null) { + log.debug("can't publish resource: resourceUri was null"); + return false; + } + + log.debug("can publish resource '" + resourceUri + "'"); + return true; + } + /** * If display of a predicate is restricted, the user's role must be at least * as high as the restriction level. @@ -408,6 +432,33 @@ public class PropertyRestrictionPolicyHelper { return false; } + /** + * If publishing of a predicate is restricted, the user's role must be at least + * as high as the restriction level. + */ + public boolean canPublishPredicate(Property predicate, RoleLevel userRole) { + if (predicate == null) { + log.debug("can't publish predicate: predicate was null"); + return false; + } + + RoleLevel publishThreshold = getThreshold(predicate, publishThresholdMap); + + if (isAuthorized(userRole, publishThreshold)) { + log.debug("can publish predicate: '" + predicate.getURI() + "', domain=" + + predicate.getDomainVClassURI() + ", range=" + + predicate.getRangeVClassURI() + ", userRole=" + + userRole + ", thresholdRole=" + publishThreshold); + return true; + } + + log.debug("can't publish predicate: '" + predicate.getURI() + "', domain=" + + predicate.getDomainVClassURI() + ", range=" + + predicate.getRangeVClassURI() + ", userRole=" + + userRole + ", thresholdRole=" + publishThreshold); + return false; + } + private boolean isAuthorized(RoleLevel userRole, RoleLevel thresholdRole) { if (userRole == null) { return false; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/propstmt/AbstractDataPropertyStatementAction.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/propstmt/AbstractDataPropertyStatementAction.java index 8e49ec193..98fec8b2a 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/propstmt/AbstractDataPropertyStatementAction.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/propstmt/AbstractDataPropertyStatementAction.java @@ -59,6 +59,10 @@ public abstract class AbstractDataPropertyStatementAction extends public String[] getResourceUris() { return new String[] {subjectUri}; } + + public String dataValue() { + return dataValue; + } @Override public String toString() { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/propstmt/AbstractObjectPropertyStatementAction.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/propstmt/AbstractObjectPropertyStatementAction.java index 700b0bf24..2bc7e3c7c 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/propstmt/AbstractObjectPropertyStatementAction.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/propstmt/AbstractObjectPropertyStatementAction.java @@ -4,6 +4,7 @@ package edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt; import com.hp.hpl.jena.ontology.OntModel; +import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement; import edu.cornell.mannlib.vitro.webapp.beans.Property; @@ -17,23 +18,31 @@ public abstract class AbstractObjectPropertyStatementAction extends private final Property predicate; private final String objectUri; - public AbstractObjectPropertyStatementAction(OntModel ontModel, String subjectUri, - Property predicate, String objectUri) { + public AbstractObjectPropertyStatementAction(OntModel ontModel, + String subjectUri, Property predicate, String objectUri) { super(ontModel); this.subjectUri = subjectUri; this.predicate = predicate; this.objectUri = objectUri; } - public AbstractObjectPropertyStatementAction(OntModel ontModel, ObjectPropertyStatement ops) { + public AbstractObjectPropertyStatementAction(OntModel ontModel, + ObjectPropertyStatement ops) { super(ontModel); this.subjectUri = (ops.getSubject() == null) ? ops.getSubjectURI() : ops.getSubject().getURI(); - this.predicate = (ops.getProperty()); + this.predicate = (ops.getProperty() == null) ? createProperty(ops + .getPropertyURI()) : ops.getProperty(); this.objectUri = (ops.getObject() == null) ? ops.getObjectURI() : ops .getObject().getURI(); } + private ObjectProperty createProperty(String propertyURI) { + ObjectProperty op = new ObjectProperty(); + op.setURI(propertyURI); + return op; + } + public String getSubjectUri() { return subjectUri; } @@ -41,11 +50,12 @@ public abstract class AbstractObjectPropertyStatementAction extends public String getObjectUri() { return objectUri; } - + + @Override public Property getPredicate() { - return predicate; + return predicate; } - + @Override public String getPredicateUri() { return predicate.getURI(); @@ -53,7 +63,7 @@ public abstract class AbstractObjectPropertyStatementAction extends @Override public String[] getResourceUris() { - return new String[] {subjectUri, objectUri}; + return new String[] { subjectUri, objectUri }; } @Override diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/publish/PublishDataProperty.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/publish/PublishDataProperty.java new file mode 100644 index 000000000..1b6ef3f20 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/publish/PublishDataProperty.java @@ -0,0 +1,24 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.auth.requestedAction.publish; + +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction; +import edu.cornell.mannlib.vitro.webapp.beans.DataProperty; + +/** Should we allow the user to publish this DataProperty in Linked Open Data? */ +public class PublishDataProperty extends RequestedAction { + private final DataProperty dataProperty; + + public PublishDataProperty(DataProperty dataProperty) { + this.dataProperty = dataProperty; + } + + public DataProperty getDataProperty() { + return dataProperty; + } + + @Override + public String toString() { + return "PublishDataProperty[" + dataProperty + "]"; + } +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/publish/PublishDataPropertyStatement.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/publish/PublishDataPropertyStatement.java new file mode 100644 index 000000000..e69a3b618 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/publish/PublishDataPropertyStatement.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.auth.requestedAction.publish; + +import com.hp.hpl.jena.ontology.OntModel; + +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AbstractDataPropertyStatementAction; +import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement; + +/** + * Should we publish this DataPropertyStatement in a Linked Open Data request + * from the current user? + */ +public class PublishDataPropertyStatement extends + AbstractDataPropertyStatementAction { + public PublishDataPropertyStatement(OntModel ontModel, String subjectUri, + String predicateUri, String dataValue) { + super(ontModel, subjectUri, predicateUri, dataValue); + } + + public PublishDataPropertyStatement(OntModel ontModel, + DataPropertyStatement dps) { + super(ontModel, dps); + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/publish/PublishObjectProperty.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/publish/PublishObjectProperty.java new file mode 100644 index 000000000..19358278a --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/publish/PublishObjectProperty.java @@ -0,0 +1,24 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.auth.requestedAction.publish; + +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction; +import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; + +/** Should we allow the user to publish this ObjectProperty in Linked Open Data? */ +public class PublishObjectProperty extends RequestedAction { + private final ObjectProperty objectProperty; + + public PublishObjectProperty(ObjectProperty objectProperty) { + this.objectProperty = objectProperty; + } + + public ObjectProperty getObjectProperty() { + return objectProperty; + } + + @Override + public String toString() { + return "PublishObjectProperty[" + objectProperty.getLocalName() + "]"; + } +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/publish/PublishObjectPropertyStatement.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/publish/PublishObjectPropertyStatement.java new file mode 100644 index 000000000..62b8a3113 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/requestedAction/publish/PublishObjectPropertyStatement.java @@ -0,0 +1,28 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.auth.requestedAction.publish; + +import com.hp.hpl.jena.ontology.OntModel; + +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AbstractObjectPropertyStatementAction; +import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement; +import edu.cornell.mannlib.vitro.webapp.beans.Property; + +/** + * Should we publish this ObjectPropertyStatement in a Linked Open Data request + * from the current user? + */ + +public class PublishObjectPropertyStatement extends + AbstractObjectPropertyStatementAction { + public PublishObjectPropertyStatement(OntModel ontModel, String subjectUri, + Property keywordPred, String objectUri) { + super(ontModel, subjectUri, keywordPred, objectUri); + } + + public PublishObjectPropertyStatement(OntModel ontModel, + ObjectPropertyStatement ops) { + super(ontModel, ops); + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/BaseResourceBean.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/BaseResourceBean.java index 58d51f031..02771a834 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/BaseResourceBean.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/BaseResourceBean.java @@ -25,63 +25,80 @@ public class BaseResourceBean implements ResourceBean { protected String localNameWithPrefix = null; protected String pickListName = null; - // these will be phased in and used in the filters Brian C. has been setting up, - // with hiddenFromDisplay to control the level at which any class, individual, object property, or data property is displayed - // and prohibitedFromEditing to control when a control for editing is made available protected RoleLevel hiddenFromDisplayBelowRoleLevel = null; - //protected RoleLevel prohibitedFromCreateBelowRoleLevel = null; protected RoleLevel prohibitedFromUpdateBelowRoleLevel = null; - //protected RoleLevel prohibitedFromDeleteBelowRoleLevel = null; + protected RoleLevel hiddenFromPublishBelowRoleLevel = null; - public enum RoleLevel { PUBLIC("http://vitro.mannlib.cornell.edu/ns/vitro/role#public","public","public"), - SELF("http://vitro.mannlib.cornell.edu/ns/vitro/role#selfEditor","self-authenticated","self"), - EDITOR("http://vitro.mannlib.cornell.edu/ns/vitro/role#editor","editor, curator, site administrator","editor"), - CURATOR("http://vitro.mannlib.cornell.edu/ns/vitro/role#curator","curator, site administrator","curator"), - DB_ADMIN("http://vitro.mannlib.cornell.edu/ns/vitro/role#dbAdmin","site administrator","siteAdmin"), - NOBODY("http://vitro.mannlib.cornell.edu/ns/vitro/role#nobody","root user","root"); - - private final String uri; - private final String label; - private final String shorthand; - - RoleLevel(String uriStr,String labelStr, String shortStr) { - this.uri = uriStr; - this.label = labelStr; - this.shorthand = shortStr; - } - - public String getURI() { - return uri; - } - - public String getLabel() { - return label; - } + public enum RoleLevel { + PUBLIC("http://vitro.mannlib.cornell.edu/ns/vitro/role#public", + "all users, including public", "all users who can log in", + "public"), + + SELF("http://vitro.mannlib.cornell.edu/ns/vitro/role#selfEditor", + "self-editor and above", "self-editor and above", "self"), + + EDITOR("http://vitro.mannlib.cornell.edu/ns/vitro/role#editor", + "editor and above", "editor and above", "editor"), + + CURATOR("http://vitro.mannlib.cornell.edu/ns/vitro/role#curator", + "curator and above", "curator and above", "curator"), + + DB_ADMIN("http://vitro.mannlib.cornell.edu/ns/vitro/role#dbAdmin", + "site admin and root user", "site admin and root user", + "siteAdmin"), + + NOBODY("http://vitro.mannlib.cornell.edu/ns/vitro/role#nobody", + "root user", "root user", "root"); + + private final String uri; + private final String displayLabel; + private final String updateLabel; + private final String shorthand; + + private RoleLevel(String uri, String displayLabel, String updateLabel, + String shorthand) { + this.uri = uri; + this.displayLabel = displayLabel; + this.updateLabel = updateLabel; + this.shorthand = shorthand; + } + + public String getURI() { + return uri; + } + + public String getDisplayLabel() { + return displayLabel; + } + + public String getUpdateLabel() { + return updateLabel; + } + + public String getShorthand() { + return shorthand; + } + + public static RoleLevel getRoleByUri(String uri2) { + if (uri2 == null) + return RoleLevel.values()[0]; + + for (RoleLevel role : RoleLevel.values()) { + if (role.uri.equals(uri2)) + return role; + } + return RoleLevel.values()[0]; + } - public String getShorthand() { - return shorthand; - } - - public static RoleLevel getRoleByUri(String uri2) { - if( uri2 == null ) - return RoleLevel.values()[0]; - - for( RoleLevel role : RoleLevel.values() ){ - if( role.uri.equals( uri2 ) ) - return role; - } - return RoleLevel.values()[0]; - } - public static RoleLevel getRoleFromLoginStatus(HttpServletRequest req) { UserAccount u = LoginStatusBean.getCurrentUser(req); if (u == null) { return PUBLIC; } - + Set roles = u.getPermissionSetUris(); if (roles.contains(PermissionSets.URI_DBA)) { - return DB_ADMIN; + return DB_ADMIN; } else if (roles.contains(PermissionSets.URI_CURATOR)) { return CURATOR; } else if (roles.contains(PermissionSets.URI_EDITOR)) { @@ -93,16 +110,19 @@ public class BaseResourceBean implements ResourceBean { return SELF; } } - } + } - public boolean isAnonymous() { + @Override + public boolean isAnonymous() { return (this.URI==null || VitroVocabulary.PSEUDO_BNODE_NS.equals(this.getNamespace())); } - public String getURI() { + @Override + public String getURI() { return URI; } - public void setURI(String URI) { + @Override + public void setURI(String URI) { if( this.localName != null || this.namespace != null) buildLocalAndNS(URI); else @@ -122,29 +142,34 @@ public class BaseResourceBean implements ResourceBean { } } - public String getNamespace() { + @Override + public String getNamespace() { if( namespace == null && this.URI != null) buildLocalAndNS(this.URI); return namespace; } - public void setNamespace(String namespace) { + @Override + public void setNamespace(String namespace) { this.namespace = namespace; if (namespace != null && localName != null ) { this.URI = namespace + localName; } } - public String getLabel() { + @Override + public String getLabel() { return getLocalName(); } - public String getLocalName() { + @Override + public String getLocalName() { if( localName == null && this.URI != null) buildLocalAndNS(this.URI); return localName; } - public void setLocalName(String localName) { + @Override + public void setLocalName(String localName) { this.localName = localName; if (namespace != null && localName != null) { this.URI = namespace + localName; @@ -160,7 +185,8 @@ public class BaseResourceBean implements ResourceBean { this.localNameWithPrefix = prefixedLocalName; } - public String getPickListName() { + @Override + public String getPickListName() { return pickListName==null ? getLocalName()==null ? (URI==null ? "(no name)" : URI ): getLocalName() : pickListName; } @@ -168,57 +194,51 @@ public class BaseResourceBean implements ResourceBean { this.pickListName = pickListName; } - public RoleLevel getHiddenFromDisplayBelowRoleLevel() { + @Override + public RoleLevel getHiddenFromDisplayBelowRoleLevel() { return hiddenFromDisplayBelowRoleLevel; } - public void setHiddenFromDisplayBelowRoleLevel(RoleLevel eR) { + @Override + public void setHiddenFromDisplayBelowRoleLevel(RoleLevel eR) { hiddenFromDisplayBelowRoleLevel = eR; } - public void setHiddenFromDisplayBelowRoleLevelUsingRoleUri(String roleUri) { + @Override + public void setHiddenFromDisplayBelowRoleLevelUsingRoleUri(String roleUri) { hiddenFromDisplayBelowRoleLevel = BaseResourceBean.RoleLevel.getRoleByUri(roleUri); } - /* - public RoleLevel getProhibitedFromCreateBelowRoleLevel() { - return prohibitedFromCreateBelowRoleLevel; - } - - public void setProhibitedFromCreateBelowRoleLevel(RoleLevel eR) { - prohibitedFromCreateBelowRoleLevel = eR; - } - - public void setProhibitedFromCreateBelowRoleLevelUsingRoleUri(String roleUri) { - prohibitedFromCreateBelowRoleLevel = BaseResourceBean.RoleLevel.getRoleByUri(roleUri); - } - */ - - public RoleLevel getProhibitedFromUpdateBelowRoleLevel() { + @Override + public RoleLevel getProhibitedFromUpdateBelowRoleLevel() { return prohibitedFromUpdateBelowRoleLevel; } - public void setProhibitedFromUpdateBelowRoleLevel(RoleLevel eR) { + @Override + public void setProhibitedFromUpdateBelowRoleLevel(RoleLevel eR) { prohibitedFromUpdateBelowRoleLevel = eR; } - public void setProhibitedFromUpdateBelowRoleLevelUsingRoleUri(String roleUri) { + @Override + public void setProhibitedFromUpdateBelowRoleLevelUsingRoleUri(String roleUri) { prohibitedFromUpdateBelowRoleLevel = BaseResourceBean.RoleLevel.getRoleByUri(roleUri); } - /* - public RoleLevel getProhibitedFromDeleteBelowRoleLevel() { - return prohibitedFromDeleteBelowRoleLevel; - } - - public void setProhibitedFromDeleteBelowRoleLevel(RoleLevel eR) { - prohibitedFromDeleteBelowRoleLevel = eR; - } - - public void setProhibitedFromDeleteBelowRoleLevelUsingRoleUri(String roleUri) { - prohibitedFromDeleteBelowRoleLevel = BaseResourceBean.RoleLevel.getRoleByUri(roleUri); - } - */ + @Override + public RoleLevel getHiddenFromPublishBelowRoleLevel() { + return hiddenFromPublishBelowRoleLevel; + } + + @Override + public void setHiddenFromPublishBelowRoleLevel(RoleLevel eR) { + hiddenFromPublishBelowRoleLevel = eR; + } + + @Override + public void setHiddenFromPublishBelowRoleLevelUsingRoleUri(String roleUri) { + hiddenFromPublishBelowRoleLevel = BaseResourceBean.RoleLevel.getRoleByUri(roleUri); + } + @Override public boolean equals(Object obj) { if(obj == null ) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/ObjectProperty.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/ObjectProperty.java index 7d1d908fb..26a84c601 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/ObjectProperty.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/ObjectProperty.java @@ -633,6 +633,7 @@ public class ObjectProperty extends Property implements Comparable 0) { @@ -116,12 +118,16 @@ public class EntityEditController extends BaseEditController { } results.add(classStr); - results.add(ent.getHiddenFromDisplayBelowRoleLevel() == null ? "unspecified" : ent.getHiddenFromDisplayBelowRoleLevel().getLabel()); - results.add(ent.getProhibitedFromUpdateBelowRoleLevel() == null ? "unspecified" : ent.getProhibitedFromUpdateBelowRoleLevel().getLabel()); + results.add(ent.getHiddenFromDisplayBelowRoleLevel() == null ? "unspecified" + : ent.getHiddenFromDisplayBelowRoleLevel().getDisplayLabel()); + results.add(ent.getProhibitedFromUpdateBelowRoleLevel() == null ? "unspecified" + : ent.getProhibitedFromUpdateBelowRoleLevel().getUpdateLabel()); String rModTime = (ent.getModTime()==null) ? "" : publicDateFormat.format(ent.getModTime()); results.add(rModTime); results.add( (ent.getURI() == null) ? "[anonymous individual]" : ent.getURI() ); + results.add(ent.getHiddenFromPublishBelowRoleLevel() == null ? "unspecified" + : ent.getHiddenFromPublishBelowRoleLevel().getDisplayLabel()); request.setAttribute("results",results); request.setAttribute("columncount", colCount); request.setAttribute("suppressquery","true"); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/EntityRetryController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/EntityRetryController.java index 3aade392a..b257515f4 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/EntityRetryController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/EntityRetryController.java @@ -170,6 +170,7 @@ public class EntityRetryController extends BaseEditController { hash.put("HiddenFromDisplayBelowRoleLevelUsingRoleUri",RoleLevelOptionsSetup.getDisplayOptionsList(individualForEditing)); hash.put("ProhibitedFromUpdateBelowRoleLevelUsingRoleUri",RoleLevelOptionsSetup.getUpdateOptionsList(individualForEditing)); + hash.put("HiddenFromPublishBelowRoleLevelUsingRoleUri",RoleLevelOptionsSetup.getPublishOptionsList(individualForEditing)); FormObject foo = new FormObject(); foo.setOptionLists(hash); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PropertyEditController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PropertyEditController.java index b6d5dcd46..f57dee2c8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PropertyEditController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PropertyEditController.java @@ -6,7 +6,6 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import javax.servlet.RequestDispatcher; @@ -21,17 +20,14 @@ import edu.cornell.mannlib.vedit.beans.FormObject; import edu.cornell.mannlib.vedit.controller.BaseEditController; import edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission; import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty; -import edu.cornell.mannlib.vitro.webapp.beans.DataProperty; import edu.cornell.mannlib.vitro.webapp.beans.Ontology; import edu.cornell.mannlib.vitro.webapp.beans.PropertyGroup; import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.controller.Controllers; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; -import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDao; import edu.cornell.mannlib.vitro.webapp.dao.PropertyGroupDao; import edu.cornell.mannlib.vitro.webapp.dao.VClassDao; -import edu.cornell.mannlib.vitro.webapp.dao.DataPropertyDao; public class PropertyEditController extends BaseEditController { @@ -43,7 +39,7 @@ public class PropertyEditController extends BaseEditController { return; } - final int NUM_COLS=24; + final int NUM_COLS=25; VitroRequest vreq = new VitroRequest(request); @@ -81,6 +77,7 @@ public class PropertyEditController extends BaseEditController { results.add("offer create new"); // column 22 results.add("sort direction"); // column 23 results.add("URI"); // column 24 + results.add("publish level"); // column 25 results.add(p.getPickListName()); // column 1 @@ -169,8 +166,10 @@ public class PropertyEditController extends BaseEditController { String descriptionStr = (p.getDescription() == null) ? "" : p.getDescription(); results.add(descriptionStr); // column 15 - results.add(p.getHiddenFromDisplayBelowRoleLevel() == null ? "(unspecified)" : p.getHiddenFromDisplayBelowRoleLevel().getLabel()); // column 16 - results.add(p.getProhibitedFromUpdateBelowRoleLevel() == null ? "(unspecified)" : p.getProhibitedFromUpdateBelowRoleLevel().getLabel()); // column 17 + results.add(p.getHiddenFromDisplayBelowRoleLevel() == null ? "(unspecified)" + : p.getHiddenFromDisplayBelowRoleLevel().getDisplayLabel()); // column 16 + results.add(p.getProhibitedFromUpdateBelowRoleLevel() == null ? "(unspecified)" + : p.getProhibitedFromUpdateBelowRoleLevel().getUpdateLabel()); // column 17 results.add("property: "+p.getDomainDisplayTier() + ", inverse: "+p.getRangeDisplayTier()); // column 18 @@ -183,6 +182,8 @@ public class PropertyEditController extends BaseEditController { results.add(p.getDomainEntitySortDirection() == null ? "ascending" : p.getDomainEntitySortDirection()); // column 23 results.add(p.getURI()); // column 24 + results.add(p.getHiddenFromPublishBelowRoleLevel() == null ? "(unspecified)" + : p.getHiddenFromPublishBelowRoleLevel().getDisplayLabel()); // column 25 request.setAttribute("results",results); request.setAttribute("columncount",NUM_COLS); request.setAttribute("suppressquery","true"); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PropertyRetryController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PropertyRetryController.java index 580a8c861..1d2647c4f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PropertyRetryController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/PropertyRetryController.java @@ -151,6 +151,7 @@ public class PropertyRetryController extends BaseEditController { optionMap.put("HiddenFromDisplayBelowRoleLevelUsingRoleUri",RoleLevelOptionsSetup.getDisplayOptionsList(propertyForEditing)); optionMap.put("ProhibitedFromUpdateBelowRoleLevelUsingRoleUri",RoleLevelOptionsSetup.getUpdateOptionsList(propertyForEditing)); + optionMap.put("HiddenFromPublishBelowRoleLevelUsingRoleUri",RoleLevelOptionsSetup.getPublishOptionsList(propertyForEditing)); List groupOptList = FormUtils.makeOptionListFromBeans(request.getUnfilteredWebappDaoFactory().getPropertyGroupDao().getPublicGroups(true),"URI","Name", ((propertyForEditing.getGroupURI()==null) ? "" : propertyForEditing.getGroupURI()), null, (propertyForEditing.getGroupURI()!=null)); HashMap hashMap = new HashMap(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/VclassEditController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/VclassEditController.java index 69960f546..61cb59362 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/VclassEditController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/VclassEditController.java @@ -33,7 +33,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.Ontology; public class VclassEditController extends BaseEditController { private static final Log log = LogFactory.getLog(VclassEditController.class.getName()); - private static final int NUM_COLS = 13; + private static final int NUM_COLS = 14; public void doPost (HttpServletRequest req, HttpServletResponse response) { if (!isAuthorizedToDisplayPage(req, response, SimplePermission.EDIT_ONTOLOGY.ACTIONS)) { @@ -70,6 +70,7 @@ public class VclassEditController extends BaseEditController { results.add("display rank"); // 11 results.add("custom entry form"); // 12 results.add("URI"); // 13 + results.add("publish level"); // 14 String ontologyName = null; if (vcl.getNamespace() != null) { @@ -107,8 +108,13 @@ public class VclassEditController extends BaseEditController { commSb = new StringBuffer("no comments yet"); } - String hiddenFromDisplay = (vcl.getHiddenFromDisplayBelowRoleLevel() == null ? "(unspecified)" : vcl.getHiddenFromDisplayBelowRoleLevel().getLabel()); - String ProhibitedFromUpdate = (vcl.getProhibitedFromUpdateBelowRoleLevel() == null ? "(unspecified)" : vcl.getProhibitedFromUpdateBelowRoleLevel().getLabel()); + String hiddenFromDisplay = (vcl.getHiddenFromDisplayBelowRoleLevel() == null ? "(unspecified)" + : vcl.getHiddenFromDisplayBelowRoleLevel().getDisplayLabel()); + String ProhibitedFromUpdate = (vcl + .getProhibitedFromUpdateBelowRoleLevel() == null ? "(unspecified)" + : vcl.getProhibitedFromUpdateBelowRoleLevel().getUpdateLabel()); + String hiddenFromPublish = (vcl.getHiddenFromPublishBelowRoleLevel() == null ? "(unspecified)" + : vcl.getHiddenFromPublishBelowRoleLevel().getDisplayLabel()); String customEntryForm = (vcl.getCustomEntryForm() == null ? "(unspecified)" : vcl.getCustomEntryForm()); @@ -130,6 +136,7 @@ public class VclassEditController extends BaseEditController { results.add(String.valueOf(vcl.getDisplayRank())); // 11 results.add(customEntryForm); // 12 results.add(uri); // 13 + results.add(hiddenFromPublish); // 14 request.setAttribute("results", results); request.setAttribute("columncount", NUM_COLS); request.setAttribute("suppressquery", "true"); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/VclassRetryController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/VclassRetryController.java index 3b811f200..46d970ec5 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/VclassRetryController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/VclassRetryController.java @@ -147,6 +147,7 @@ public class VclassRetryController extends BaseEditController { optionMap.put("HiddenFromDisplayBelowRoleLevelUsingRoleUri",RoleLevelOptionsSetup.getDisplayOptionsList(vclassForEditing)); optionMap.put("ProhibitedFromUpdateBelowRoleLevelUsingRoleUri",RoleLevelOptionsSetup.getUpdateOptionsList(vclassForEditing)); + optionMap.put("HiddenFromPublishBelowRoleLevelUsingRoleUri",RoleLevelOptionsSetup.getPublishOptionsList(vclassForEditing)); FormObject foo = new FormObject(); foo.setErrorMap(epo.getErrMsgMap()); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/utils/RoleLevelOptionsSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/utils/RoleLevelOptionsSetup.java index 89f8f0854..29aa7bd75 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/utils/RoleLevelOptionsSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/edit/utils/RoleLevelOptionsSetup.java @@ -23,7 +23,7 @@ public class RoleLevelOptionsSetup { boolean someLevelSet=false; Option publicOption = null; for (BaseResourceBean.RoleLevel level : roles) { - Option option = new Option (level.getURI(),level.getLabel(),false); + Option option = new Option (level.getURI(),level.getDisplayLabel(),false); if (level==BaseResourceBean.RoleLevel.PUBLIC) { publicOption = option; } @@ -50,7 +50,7 @@ public class RoleLevelOptionsSetup { boolean someLevelSet=false; Option publicOption = null; for (BaseResourceBean.RoleLevel level : roles) { - Option option = new Option (level.getURI(),level.getLabel(),false); + Option option = new Option (level.getURI(),level.getUpdateLabel(),false); if (level==BaseResourceBean.RoleLevel.PUBLIC) { publicOption = option; } @@ -68,4 +68,33 @@ public class RoleLevelOptionsSetup { } return prohibitedFromUpdateList; } + + public static List