From 0bf6abb197861adddbdf8dbcb8bdcfd973029126 Mon Sep 17 00:00:00 2001 From: Jim Blake Date: Fri, 31 Oct 2014 12:59:44 -0400 Subject: [PATCH] VIVO-774 clean up the handling of RoleLevel changes. Create an interface for the Listener to act on. If the changed object doesn't implement the interface, log a warning and do nothing, instead of throwing a ClassCastException. The level values should never be null. --- .../bean/PropertyRestrictionListener.java | 61 +++++++++++-------- .../policy/bean/RoleRestrictedProperty.java | 17 ++++++ .../vitro/webapp/beans/BaseResourceBean.java | 26 ++++---- .../vitro/webapp/beans/DataProperty.java | 4 +- .../vitro/webapp/beans/ObjectProperty.java | 4 +- 5 files changed, 75 insertions(+), 37 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/bean/RoleRestrictedProperty.java 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 abf488f6d..97b1f359a 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 @@ -15,7 +15,6 @@ import com.hp.hpl.jena.rdf.model.Model; import edu.cornell.mannlib.vedit.beans.EditProcessObject; import edu.cornell.mannlib.vedit.listener.ChangeListener; import edu.cornell.mannlib.vitro.webapp.beans.BaseResourceBean.RoleLevel; -import edu.cornell.mannlib.vitro.webapp.beans.Property; import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess; /** @@ -38,12 +37,16 @@ public class PropertyRestrictionListener implements ChangeListener { */ @Override public void doDeleted(Object oldObj, EditProcessObject epo) { - Property p = (Property) oldObj; - if (anyRoleChanged(p.getHiddenFromDisplayBelowRoleLevel(), - p.getProhibitedFromUpdateBelowRoleLevel(), - p.getHiddenFromPublishBelowRoleLevel(), null, null, null)) { - log.debug("rebuilding the PropertyRestrictionPolicyHelper after deletion"); - createAndSetBean(); + if (oldObj instanceof RoleRestrictedProperty) { + RoleRestrictedProperty p = (RoleRestrictedProperty) oldObj; + if (anyRoleChanged(p.getHiddenFromDisplayBelowRoleLevel(), + p.getProhibitedFromUpdateBelowRoleLevel(), + p.getHiddenFromPublishBelowRoleLevel(), null, null, null)) { + log.debug("rebuilding the PropertyRestrictionPolicyHelper after deletion"); + createAndSetBean(); + } + } else { + log.warn("Not an instance of RoleRestrictedProperty: " + oldObj); } } @@ -52,13 +55,17 @@ public class PropertyRestrictionListener implements ChangeListener { */ @Override public void doInserted(Object newObj, EditProcessObject epo) { - Property p = (Property) newObj; - if (anyRoleChanged(null, null, null, - p.getHiddenFromDisplayBelowRoleLevel(), - p.getProhibitedFromUpdateBelowRoleLevel(), - p.getHiddenFromPublishBelowRoleLevel())) { - log.debug("rebuilding the PropertyRestrictionPolicyHelper after insertion"); - createAndSetBean(); + if (newObj instanceof RoleRestrictedProperty) { + RoleRestrictedProperty p = (RoleRestrictedProperty) newObj; + if (anyRoleChanged(null, null, null, + p.getHiddenFromDisplayBelowRoleLevel(), + p.getProhibitedFromUpdateBelowRoleLevel(), + p.getHiddenFromPublishBelowRoleLevel())) { + log.debug("rebuilding the PropertyRestrictionPolicyHelper after insertion"); + createAndSetBean(); + } + } else { + log.warn("Not an instance of RoleRestrictedProperty: " + newObj); } } @@ -67,16 +74,22 @@ public class PropertyRestrictionListener implements ChangeListener { */ @Override public void doUpdated(Object oldObj, Object newObj, EditProcessObject epo) { - Property oldP = (Property) oldObj; - Property newP = (Property) newObj; - if (anyRoleChanged(oldP.getHiddenFromDisplayBelowRoleLevel(), - oldP.getProhibitedFromUpdateBelowRoleLevel(), - oldP.getHiddenFromPublishBelowRoleLevel(), - newP.getHiddenFromDisplayBelowRoleLevel(), - newP.getProhibitedFromUpdateBelowRoleLevel(), - newP.getHiddenFromPublishBelowRoleLevel())) { - log.debug("rebuilding the PropertyRestrictionPolicyHelper after update"); - createAndSetBean(); + if (oldObj instanceof RoleRestrictedProperty + && newObj instanceof RoleRestrictedProperty) { + RoleRestrictedProperty oldP = (RoleRestrictedProperty) oldObj; + RoleRestrictedProperty newP = (RoleRestrictedProperty) newObj; + if (anyRoleChanged(oldP.getHiddenFromDisplayBelowRoleLevel(), + oldP.getProhibitedFromUpdateBelowRoleLevel(), + oldP.getHiddenFromPublishBelowRoleLevel(), + newP.getHiddenFromDisplayBelowRoleLevel(), + newP.getProhibitedFromUpdateBelowRoleLevel(), + newP.getHiddenFromPublishBelowRoleLevel())) { + log.debug("rebuilding the PropertyRestrictionPolicyHelper after update"); + createAndSetBean(); + } + } else { + log.warn("Not instances of RoleRestrictedProperty: " + oldObj + + ", " + newObj); } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/bean/RoleRestrictedProperty.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/bean/RoleRestrictedProperty.java new file mode 100644 index 000000000..fb93bce16 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/bean/RoleRestrictedProperty.java @@ -0,0 +1,17 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.auth.policy.bean; + +import edu.cornell.mannlib.vitro.webapp.beans.BaseResourceBean.RoleLevel; + +/** + * A property or faux property whose usage can be restricted according to the + * user's role level. + */ +public interface RoleRestrictedProperty { + RoleLevel getHiddenFromDisplayBelowRoleLevel(); + + RoleLevel getProhibitedFromUpdateBelowRoleLevel(); + + RoleLevel getHiddenFromPublishBelowRoleLevel(); +} 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 d9d0158d2..d61836cb1 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/BaseResourceBean.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/BaseResourceBean.java @@ -25,9 +25,9 @@ public class BaseResourceBean implements ResourceBean { protected String localNameWithPrefix = null; protected String pickListName = null; - protected RoleLevel hiddenFromDisplayBelowRoleLevel = null; - protected RoleLevel prohibitedFromUpdateBelowRoleLevel = null; - protected RoleLevel hiddenFromPublishBelowRoleLevel = null; + protected RoleLevel hiddenFromDisplayBelowRoleLevel = RoleLevel.PUBLIC; + protected RoleLevel prohibitedFromUpdateBelowRoleLevel = RoleLevel.PUBLIC; + protected RoleLevel hiddenFromPublishBelowRoleLevel = RoleLevel.PUBLIC; public enum RoleLevel { PUBLIC("http://vitro.mannlib.cornell.edu/ns/vitro/role#public", @@ -78,6 +78,10 @@ public class BaseResourceBean implements ResourceBean { public String getShorthand() { return shorthand; } + + public static RoleLevel notNull(RoleLevel level) { + return (level == null) ? RoleLevel.values()[0] : level; + } public static RoleLevel getRoleByUri(String uri2) { if (uri2 == null) @@ -208,13 +212,13 @@ public class BaseResourceBean implements ResourceBean { } @Override - public void setHiddenFromDisplayBelowRoleLevel(RoleLevel eR) { - hiddenFromDisplayBelowRoleLevel = eR; + public void setHiddenFromDisplayBelowRoleLevel(RoleLevel level) { + hiddenFromDisplayBelowRoleLevel = RoleLevel.notNull(level); } @Override public void setHiddenFromDisplayBelowRoleLevelUsingRoleUri(String roleUri) { - hiddenFromDisplayBelowRoleLevel = BaseResourceBean.RoleLevel.getRoleByUri(roleUri); + hiddenFromDisplayBelowRoleLevel = RoleLevel.getRoleByUri(roleUri); } @Override @@ -223,13 +227,13 @@ public class BaseResourceBean implements ResourceBean { } @Override - public void setProhibitedFromUpdateBelowRoleLevel(RoleLevel eR) { - prohibitedFromUpdateBelowRoleLevel = eR; + public void setProhibitedFromUpdateBelowRoleLevel(RoleLevel level) { + prohibitedFromUpdateBelowRoleLevel = RoleLevel.notNull(level); } @Override public void setProhibitedFromUpdateBelowRoleLevelUsingRoleUri(String roleUri) { - prohibitedFromUpdateBelowRoleLevel = BaseResourceBean.RoleLevel.getRoleByUri(roleUri); + prohibitedFromUpdateBelowRoleLevel = RoleLevel.getRoleByUri(roleUri); } @Override @@ -238,8 +242,8 @@ public class BaseResourceBean implements ResourceBean { } @Override - public void setHiddenFromPublishBelowRoleLevel(RoleLevel eR) { - hiddenFromPublishBelowRoleLevel = eR; + public void setHiddenFromPublishBelowRoleLevel(RoleLevel level) { + hiddenFromPublishBelowRoleLevel = RoleLevel.notNull(level); } @Override diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/DataProperty.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/DataProperty.java index ea243fad2..191485226 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/DataProperty.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/DataProperty.java @@ -6,13 +6,15 @@ import java.text.Collator; import java.util.List; import java.util.LinkedList; +import edu.cornell.mannlib.vitro.webapp.auth.policy.bean.RoleRestrictedProperty; + /** * class representing a property that relates an entity (object) * to a data literal * @author bjl23 * */ -public class DataProperty extends Property implements Comparable, ResourceBean { +public class DataProperty extends Property implements Comparable, ResourceBean, RoleRestrictedProperty { private String name = null; private String publicName = 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 0f9005dae..d78d92057 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/ObjectProperty.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/ObjectProperty.java @@ -17,11 +17,13 @@ import org.joda.time.DateTime; import com.hp.hpl.jena.datatypes.xsd.XSDDatatype; +import edu.cornell.mannlib.vitro.webapp.auth.policy.bean.RoleRestrictedProperty; + /** * a class representing an object property * */ -public class ObjectProperty extends Property implements Comparable, ResourceBean, Cloneable +public class ObjectProperty extends Property implements Comparable, ResourceBean, Cloneable, RoleRestrictedProperty { private static final Log log = LogFactory.getLog(ObjectProperty.class.getName());