diff --git a/webapp/config/web.xml b/webapp/config/web.xml index a2e1a07b0..3bd4a1aaa 100644 --- a/webapp/config/web.xml +++ b/webapp/config/web.xml @@ -135,6 +135,11 @@ edu.cornell.mannlib.vitro.webapp.auth.policy.setup.SelfEditingPolicySetup --> + + + + edu.cornell.mannlib.vitro.webapp.auth.policy.setup.InformationResourceEditingPolicySetup + --> diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/setup/InformationResourceEditingPolicySetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/setup/InformationResourceEditingPolicySetup.java new file mode 100644 index 000000000..a857d9bdd --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/policy/setup/InformationResourceEditingPolicySetup.java @@ -0,0 +1,96 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.auth.policy.setup; + +import java.util.EnumSet; +import java.util.HashSet; +import java.util.Set; + +import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.hp.hpl.jena.ontology.OntModel; +import com.hp.hpl.jena.rdf.model.ResIterator; +import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.ResourceFactory; + +import edu.cornell.mannlib.vitro.webapp.auth.policy.AdministrativeUriRestrictor; +import edu.cornell.mannlib.vitro.webapp.auth.policy.InformationResourceEditingPolicy; +import edu.cornell.mannlib.vitro.webapp.auth.policy.ServletPolicyList; +import edu.cornell.mannlib.vitro.webapp.beans.BaseResourceBean; +import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; + +/** + * Set up the InformationResourceEditingPolicy. This is tied to the SelfEditor + * identifier, but has enough of its own logic to merit its own policy class. + */ +public class InformationResourceEditingPolicySetup implements + ServletContextListener { + private static final Log log = LogFactory + .getLog(InformationResourceEditingPolicySetup.class); + + @Override + public void contextInitialized(ServletContextEvent sce) { + try { + log.debug("Setting up InformationResourceEditingPolicy"); + + OntModel model = (OntModel) sce.getServletContext().getAttribute( + "jenaOntModel"); + replacePolicy(sce.getServletContext(), model); + + log.debug("InformationResourceEditingPolicy has been setup. "); + } catch (Exception e) { + log.error("could not run SelfEditingPolicySetup: " + e); + e.printStackTrace(); + } + } + + public static InformationResourceEditingPolicy makePolicyFromModel( + OntModel model) { + InformationResourceEditingPolicy policy = null; + if (model == null) + policy = new InformationResourceEditingPolicy(null, + new AdministrativeUriRestrictor(null, null, null, null)); + else { + Set prohibitedProps = new HashSet(); + + // need to iterate through one level higher than SELF (the lowest + // level where restrictions make sense) plus all higher levels + for (BaseResourceBean.RoleLevel e : EnumSet.range( + BaseResourceBean.RoleLevel.EDITOR, + BaseResourceBean.RoleLevel.NOBODY)) { + ResIterator it = model + .listSubjectsWithProperty( + model.createProperty(VitroVocabulary.PROHIBITED_FROM_UPDATE_BELOW_ROLE_LEVEL_ANNOT), + ResourceFactory.createResource(e.getURI())); + while (it.hasNext()) { + Resource resource = it.nextResource(); + if (resource != null && resource.getURI() != null) { + log.debug("adding '" + + resource.getURI() + + "' to properties prohibited from information resource editing (" + + e.getLabel() + ")"); + prohibitedProps.add(resource.getURI()); + } + } + } + policy = new InformationResourceEditingPolicy(model, + new AdministrativeUriRestrictor(prohibitedProps, null, null, null)); + } + return policy; + } + + public static void replacePolicy(ServletContext sc, OntModel model) { + ServletPolicyList.replacePolicy(sc, makePolicyFromModel(model)); + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + // Nothing to do. + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/listener/impl/EditProhibitionListener.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/listener/impl/EditProhibitionListener.java index 89b15e537..37c4eecfe 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/listener/impl/EditProhibitionListener.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/listener/impl/EditProhibitionListener.java @@ -14,6 +14,7 @@ import edu.cornell.mannlib.vedit.listener.ChangeListener; import edu.cornell.mannlib.vitro.webapp.auth.policy.setup.CuratorEditingPolicySetup; import edu.cornell.mannlib.vitro.webapp.auth.policy.setup.DbAdminEditingPolicySetup; import edu.cornell.mannlib.vitro.webapp.auth.policy.setup.EditorEditingPolicySetup; +import edu.cornell.mannlib.vitro.webapp.auth.policy.setup.InformationResourceEditingPolicySetup; import edu.cornell.mannlib.vitro.webapp.auth.policy.setup.SelfEditingPolicySetup; import edu.cornell.mannlib.vitro.webapp.beans.BaseResourceBean; import edu.cornell.mannlib.vitro.webapp.beans.Property; @@ -35,6 +36,7 @@ public class EditProhibitionListener implements ChangeListener { // do you want to do something more selective, such as seeing whether only certain policies are affected? // But, some (lower) will be affected if higher levels change (or will they if the object has been deleted?) SelfEditingPolicySetup.replaceSelfEditing(context,model); + InformationResourceEditingPolicySetup.replacePolicy(context,model); EditorEditingPolicySetup.replaceEditorEditing(context,model); CuratorEditingPolicySetup.replaceCuratorEditing(context,model); DbAdminEditingPolicySetup.replaceDbAdminEditing(context,model); @@ -63,24 +65,29 @@ public class EditProhibitionListener implements ChangeListener { if (newRoleLevel.compareTo(BaseResourceBean.RoleLevel.SELF)==0) { log.debug("replacing self editing editing policies after insertion of \"self\" update level"); SelfEditingPolicySetup.replaceSelfEditing(context,model); + InformationResourceEditingPolicySetup.replacePolicy(context,model); } else if (newRoleLevel.compareTo(BaseResourceBean.RoleLevel.EDITOR)==0) { log.debug("replacing editor and lower editing policies after insertion of new \"editor\" update level"); SelfEditingPolicySetup.replaceSelfEditing(context,model); + InformationResourceEditingPolicySetup.replacePolicy(context,model); EditorEditingPolicySetup.replaceEditorEditing(context,model); } else if (newRoleLevel.compareTo(BaseResourceBean.RoleLevel.CURATOR)==0) { log.debug("replacing curator and lower editing policies after insertion of new \"curator\" update level"); SelfEditingPolicySetup.replaceSelfEditing(context,model); + InformationResourceEditingPolicySetup.replacePolicy(context,model); EditorEditingPolicySetup.replaceEditorEditing(context,model); CuratorEditingPolicySetup.replaceCuratorEditing(context,model); } else if (newRoleLevel.compareTo(BaseResourceBean.RoleLevel.DB_ADMIN)==0) { log.debug("replacing db_admin and lower editing policies after insertion of new \"db_admin\" update level"); SelfEditingPolicySetup.replaceSelfEditing(context,model); + InformationResourceEditingPolicySetup.replacePolicy(context,model); EditorEditingPolicySetup.replaceEditorEditing(context,model); CuratorEditingPolicySetup.replaceCuratorEditing(context,model); DbAdminEditingPolicySetup.replaceDbAdminEditing(context,model); } else if (newRoleLevel.compareTo(BaseResourceBean.RoleLevel.NOBODY)==0) { log.debug("replacing db_admin and lower editing policies after insertion of new \"nobody\" update level"); SelfEditingPolicySetup.replaceSelfEditing(context,model); + InformationResourceEditingPolicySetup.replacePolicy(context,model); EditorEditingPolicySetup.replaceEditorEditing(context,model); CuratorEditingPolicySetup.replaceCuratorEditing(context,model); DbAdminEditingPolicySetup.replaceDbAdminEditing(context,model); @@ -99,6 +106,7 @@ public class EditProhibitionListener implements ChangeListener { if (newRoleLevel.compareTo(oldRoleLevel)!=0) { log.debug("replacing all editing policies after update when new level different from old"); SelfEditingPolicySetup.replaceSelfEditing(context,model); + InformationResourceEditingPolicySetup.replacePolicy(context,model); EditorEditingPolicySetup.replaceEditorEditing(context,model); CuratorEditingPolicySetup.replaceCuratorEditing(context,model); DbAdminEditingPolicySetup.replaceDbAdminEditing(context,model); @@ -108,6 +116,7 @@ public class EditProhibitionListener implements ChangeListener { } else { log.debug("replacing all editing policies after update when a role level introduced"); SelfEditingPolicySetup.replaceSelfEditing(context,model); + InformationResourceEditingPolicySetup.replacePolicy(context,model); EditorEditingPolicySetup.replaceEditorEditing(context,model); CuratorEditingPolicySetup.replaceCuratorEditing(context,model); DbAdminEditingPolicySetup.replaceDbAdminEditing(context,model); @@ -115,6 +124,7 @@ public class EditProhibitionListener implements ChangeListener { } else if (oldRoleLevel != null) { // with fixed selections, not likely to happen log.debug("replacing all editing policies after update when old role level removed"); SelfEditingPolicySetup.replaceSelfEditing(context,model); + InformationResourceEditingPolicySetup.replacePolicy(context,model); EditorEditingPolicySetup.replaceEditorEditing(context,model); CuratorEditingPolicySetup.replaceCuratorEditing(context,model); DbAdminEditingPolicySetup.replaceDbAdminEditing(context,model);