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.
This commit is contained in:
Jim Blake 2014-10-31 12:59:44 -04:00
parent f4b3728822
commit 0bf6abb197
5 changed files with 75 additions and 37 deletions

View file

@ -15,7 +15,6 @@ import com.hp.hpl.jena.rdf.model.Model;
import edu.cornell.mannlib.vedit.beans.EditProcessObject; import edu.cornell.mannlib.vedit.beans.EditProcessObject;
import edu.cornell.mannlib.vedit.listener.ChangeListener; import edu.cornell.mannlib.vedit.listener.ChangeListener;
import edu.cornell.mannlib.vitro.webapp.beans.BaseResourceBean.RoleLevel; 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; import edu.cornell.mannlib.vitro.webapp.modelaccess.ModelAccess;
/** /**
@ -38,13 +37,17 @@ public class PropertyRestrictionListener implements ChangeListener {
*/ */
@Override @Override
public void doDeleted(Object oldObj, EditProcessObject epo) { public void doDeleted(Object oldObj, EditProcessObject epo) {
Property p = (Property) oldObj; if (oldObj instanceof RoleRestrictedProperty) {
RoleRestrictedProperty p = (RoleRestrictedProperty) oldObj;
if (anyRoleChanged(p.getHiddenFromDisplayBelowRoleLevel(), if (anyRoleChanged(p.getHiddenFromDisplayBelowRoleLevel(),
p.getProhibitedFromUpdateBelowRoleLevel(), p.getProhibitedFromUpdateBelowRoleLevel(),
p.getHiddenFromPublishBelowRoleLevel(), null, null, null)) { p.getHiddenFromPublishBelowRoleLevel(), null, null, null)) {
log.debug("rebuilding the PropertyRestrictionPolicyHelper after deletion"); log.debug("rebuilding the PropertyRestrictionPolicyHelper after deletion");
createAndSetBean(); createAndSetBean();
} }
} else {
log.warn("Not an instance of RoleRestrictedProperty: " + oldObj);
}
} }
/** /**
@ -52,7 +55,8 @@ public class PropertyRestrictionListener implements ChangeListener {
*/ */
@Override @Override
public void doInserted(Object newObj, EditProcessObject epo) { public void doInserted(Object newObj, EditProcessObject epo) {
Property p = (Property) newObj; if (newObj instanceof RoleRestrictedProperty) {
RoleRestrictedProperty p = (RoleRestrictedProperty) newObj;
if (anyRoleChanged(null, null, null, if (anyRoleChanged(null, null, null,
p.getHiddenFromDisplayBelowRoleLevel(), p.getHiddenFromDisplayBelowRoleLevel(),
p.getProhibitedFromUpdateBelowRoleLevel(), p.getProhibitedFromUpdateBelowRoleLevel(),
@ -60,6 +64,9 @@ public class PropertyRestrictionListener implements ChangeListener {
log.debug("rebuilding the PropertyRestrictionPolicyHelper after insertion"); log.debug("rebuilding the PropertyRestrictionPolicyHelper after insertion");
createAndSetBean(); createAndSetBean();
} }
} else {
log.warn("Not an instance of RoleRestrictedProperty: " + newObj);
}
} }
/** /**
@ -67,8 +74,10 @@ public class PropertyRestrictionListener implements ChangeListener {
*/ */
@Override @Override
public void doUpdated(Object oldObj, Object newObj, EditProcessObject epo) { public void doUpdated(Object oldObj, Object newObj, EditProcessObject epo) {
Property oldP = (Property) oldObj; if (oldObj instanceof RoleRestrictedProperty
Property newP = (Property) newObj; && newObj instanceof RoleRestrictedProperty) {
RoleRestrictedProperty oldP = (RoleRestrictedProperty) oldObj;
RoleRestrictedProperty newP = (RoleRestrictedProperty) newObj;
if (anyRoleChanged(oldP.getHiddenFromDisplayBelowRoleLevel(), if (anyRoleChanged(oldP.getHiddenFromDisplayBelowRoleLevel(),
oldP.getProhibitedFromUpdateBelowRoleLevel(), oldP.getProhibitedFromUpdateBelowRoleLevel(),
oldP.getHiddenFromPublishBelowRoleLevel(), oldP.getHiddenFromPublishBelowRoleLevel(),
@ -78,6 +87,10 @@ public class PropertyRestrictionListener implements ChangeListener {
log.debug("rebuilding the PropertyRestrictionPolicyHelper after update"); log.debug("rebuilding the PropertyRestrictionPolicyHelper after update");
createAndSetBean(); createAndSetBean();
} }
} else {
log.warn("Not instances of RoleRestrictedProperty: " + oldObj
+ ", " + newObj);
}
} }
private boolean anyRoleChanged(RoleLevel oldDisplayRole, private boolean anyRoleChanged(RoleLevel oldDisplayRole,

View file

@ -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();
}

View file

@ -25,9 +25,9 @@ public class BaseResourceBean implements ResourceBean {
protected String localNameWithPrefix = null; protected String localNameWithPrefix = null;
protected String pickListName = null; protected String pickListName = null;
protected RoleLevel hiddenFromDisplayBelowRoleLevel = null; protected RoleLevel hiddenFromDisplayBelowRoleLevel = RoleLevel.PUBLIC;
protected RoleLevel prohibitedFromUpdateBelowRoleLevel = null; protected RoleLevel prohibitedFromUpdateBelowRoleLevel = RoleLevel.PUBLIC;
protected RoleLevel hiddenFromPublishBelowRoleLevel = null; protected RoleLevel hiddenFromPublishBelowRoleLevel = RoleLevel.PUBLIC;
public enum RoleLevel { public enum RoleLevel {
PUBLIC("http://vitro.mannlib.cornell.edu/ns/vitro/role#public", PUBLIC("http://vitro.mannlib.cornell.edu/ns/vitro/role#public",
@ -79,6 +79,10 @@ public class BaseResourceBean implements ResourceBean {
return shorthand; return shorthand;
} }
public static RoleLevel notNull(RoleLevel level) {
return (level == null) ? RoleLevel.values()[0] : level;
}
public static RoleLevel getRoleByUri(String uri2) { public static RoleLevel getRoleByUri(String uri2) {
if (uri2 == null) if (uri2 == null)
return RoleLevel.values()[0]; return RoleLevel.values()[0];
@ -208,13 +212,13 @@ public class BaseResourceBean implements ResourceBean {
} }
@Override @Override
public void setHiddenFromDisplayBelowRoleLevel(RoleLevel eR) { public void setHiddenFromDisplayBelowRoleLevel(RoleLevel level) {
hiddenFromDisplayBelowRoleLevel = eR; hiddenFromDisplayBelowRoleLevel = RoleLevel.notNull(level);
} }
@Override @Override
public void setHiddenFromDisplayBelowRoleLevelUsingRoleUri(String roleUri) { public void setHiddenFromDisplayBelowRoleLevelUsingRoleUri(String roleUri) {
hiddenFromDisplayBelowRoleLevel = BaseResourceBean.RoleLevel.getRoleByUri(roleUri); hiddenFromDisplayBelowRoleLevel = RoleLevel.getRoleByUri(roleUri);
} }
@Override @Override
@ -223,13 +227,13 @@ public class BaseResourceBean implements ResourceBean {
} }
@Override @Override
public void setProhibitedFromUpdateBelowRoleLevel(RoleLevel eR) { public void setProhibitedFromUpdateBelowRoleLevel(RoleLevel level) {
prohibitedFromUpdateBelowRoleLevel = eR; prohibitedFromUpdateBelowRoleLevel = RoleLevel.notNull(level);
} }
@Override @Override
public void setProhibitedFromUpdateBelowRoleLevelUsingRoleUri(String roleUri) { public void setProhibitedFromUpdateBelowRoleLevelUsingRoleUri(String roleUri) {
prohibitedFromUpdateBelowRoleLevel = BaseResourceBean.RoleLevel.getRoleByUri(roleUri); prohibitedFromUpdateBelowRoleLevel = RoleLevel.getRoleByUri(roleUri);
} }
@Override @Override
@ -238,8 +242,8 @@ public class BaseResourceBean implements ResourceBean {
} }
@Override @Override
public void setHiddenFromPublishBelowRoleLevel(RoleLevel eR) { public void setHiddenFromPublishBelowRoleLevel(RoleLevel level) {
hiddenFromPublishBelowRoleLevel = eR; hiddenFromPublishBelowRoleLevel = RoleLevel.notNull(level);
} }
@Override @Override

View file

@ -6,13 +6,15 @@ import java.text.Collator;
import java.util.List; import java.util.List;
import java.util.LinkedList; import java.util.LinkedList;
import edu.cornell.mannlib.vitro.webapp.auth.policy.bean.RoleRestrictedProperty;
/** /**
* class representing a property that relates an entity (object) * class representing a property that relates an entity (object)
* to a data literal * to a data literal
* @author bjl23 * @author bjl23
* *
*/ */
public class DataProperty extends Property implements Comparable<DataProperty>, ResourceBean { public class DataProperty extends Property implements Comparable<DataProperty>, ResourceBean, RoleRestrictedProperty {
private String name = null; private String name = null;
private String publicName = null; private String publicName = null;

View file

@ -17,11 +17,13 @@ import org.joda.time.DateTime;
import com.hp.hpl.jena.datatypes.xsd.XSDDatatype; import com.hp.hpl.jena.datatypes.xsd.XSDDatatype;
import edu.cornell.mannlib.vitro.webapp.auth.policy.bean.RoleRestrictedProperty;
/** /**
* a class representing an object property * a class representing an object property
* *
*/ */
public class ObjectProperty extends Property implements Comparable<ObjectProperty>, ResourceBean, Cloneable public class ObjectProperty extends Property implements Comparable<ObjectProperty>, ResourceBean, Cloneable, RoleRestrictedProperty
{ {
private static final Log log = LogFactory.getLog(ObjectProperty.class.getName()); private static final Log log = LogFactory.getLog(ObjectProperty.class.getName());