NIHVIVO-3542 Use a boolean flag to indicate whether the page is editable, instead of the presence or absence of an EditingPolicyHelper.

This commit is contained in:
j2blake 2012-02-17 17:56:41 +00:00
parent 1b2ac02770
commit b731c17f6a
13 changed files with 62 additions and 117 deletions

View file

@ -37,13 +37,8 @@ import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.FieldVTwo;
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.SelectListGeneratorVTwo;
import edu.cornell.mannlib.vitro.webapp.web.beanswrappers.ReadOnlyBeansWrapper;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.BaseTemplateModel;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual.DataPropertyStatementTemplateModel;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual.EditingPolicyHelper;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual.ObjectPropertyStatementTemplateModel;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual.ObjectPropertyTemplateModel;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual.PropertyStatementTemplateModel;
import freemarker.ext.beans.BeansWrapper;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
@ -455,7 +450,7 @@ public class EditConfigurationTemplateModel extends BaseTemplateModel {
predicateUri,
objectKey,
statementDisplay,
null, null, vreq);
false, null, vreq);
ReadOnlyBeansWrapper wrapper = new ReadOnlyBeansWrapper();
return wrapper.wrap(osm);
}
@ -466,8 +461,7 @@ public class EditConfigurationTemplateModel extends BaseTemplateModel {
ObjectProperty op = EditConfigurationUtils.getObjectProperty(vreq);
List<ObjectProperty> propList = new ArrayList<ObjectProperty>();
propList.add(op);
EditingPolicyHelper policyHelper = new EditingPolicyHelper(vreq);
ObjectPropertyTemplateModel otm = ObjectPropertyTemplateModel.getObjectPropertyTemplateModel(op, subject, vreq, policyHelper,propList);
ObjectPropertyTemplateModel otm = ObjectPropertyTemplateModel.getObjectPropertyTemplateModel(op, subject, vreq, true, propList);
ReadOnlyBeansWrapper wrapper = new ReadOnlyBeansWrapper();
return wrapper.wrap(otm);
}

View file

@ -37,21 +37,17 @@ public abstract class BaseIndividualTemplateModel extends BaseTemplateModel {
protected final Individual individual;
protected final LoginStatusBean loginStatusBean;
protected final VitroRequest vreq;
private final boolean editing;
protected GroupedPropertyList propertyList;
private EditingPolicyHelper policyHelper;
public BaseIndividualTemplateModel(Individual individual, VitroRequest vreq) {
this.vreq = vreq;
this.individual = individual;
this.loginStatusBean = LoginStatusBean.getBean(vreq);
// Needed for getting portal-sensitive urls. Remove if multi-portal support is removed.
// If editing, create a helper object to check requested actions against policies
if (isEditable()) {
policyHelper = new EditingPolicyHelper(vreq);
}
this.editing = isEditable();
}
protected boolean isVClass(String vClassUri) {
@ -106,7 +102,7 @@ public abstract class BaseIndividualTemplateModel extends BaseTemplateModel {
public GroupedPropertyList getPropertyList() {
if (propertyList == null) {
propertyList = new GroupedPropertyList(individual, vreq, policyHelper);
propertyList = new GroupedPropertyList(individual, vreq, editing);
}
return propertyList;
}
@ -135,7 +131,7 @@ public abstract class BaseIndividualTemplateModel extends BaseTemplateModel {
* are handled like ordinary ObjectProperty instances.
*/
public NameStatementTemplateModel getNameStatement() {
return new NameStatementTemplateModel(getUri(), vreq, policyHelper);
return new NameStatementTemplateModel(getUri(), vreq, editing);
}
/* These methods simply forward to the methods of the wrapped individual. It would be desirable to

View file

@ -39,11 +39,11 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM
private final VClassDao vclassDao;
CollatedObjectPropertyTemplateModel(ObjectProperty op, Individual subject,
VitroRequest vreq, EditingPolicyHelper policyHelper,
VitroRequest vreq, boolean editing,
List<ObjectProperty> populatedObjectPropertyList)
throws InvalidConfigurationException {
super(op, subject, vreq, policyHelper);
super(op, subject, vreq, editing);
vclassDao = vreq.getWebappDaoFactory().getVClassDao();
@ -57,7 +57,7 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM
postprocess(statementData);
/* Collate the data */
subclasses = collate(subjectUri, propertyUri, statementData, policyHelper);
subclasses = collate(subjectUri, propertyUri, statementData, editing);
for (SubclassTemplateModel subclass : subclasses) {
List<ObjectPropertyStatementTemplateModel> list = subclass.getStatements();
@ -188,7 +188,7 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM
// Collate the statements by subclass.
private List<SubclassTemplateModel> collate(String subjectUri, String propertyUri,
List<Map<String, String>> statementData, EditingPolicyHelper policyHelper) {
List<Map<String, String>> statementData, boolean editing) {
String objectKey = getObjectKey();
@ -217,7 +217,7 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM
}
listForThisSubclass.add(new ObjectPropertyStatementTemplateModel(subjectUri,
propertyUri, objectKey, map, policyHelper, getTemplateName(), vreq));
propertyUri, objectKey, map, editing, getTemplateName(), vreq));
}

View file

@ -28,13 +28,13 @@ public class DataPropertyStatementTemplateModel extends PropertyStatementTemplat
//Extended to include vitro request to check for special parameters
public DataPropertyStatementTemplateModel(String subjectUri, String propertyUri,
Literal literal, EditingPolicyHelper policyHelper, VitroRequest vreq) {
Literal literal, boolean editing, VitroRequest vreq) {
super(subjectUri, propertyUri, vreq);
//attempt to strip any odd HTML
this.value = cleanTextForDisplay( literal.getLexicalForm() );
setEditUrls(literal, policyHelper, propertyUri);
setEditUrls(literal, editing, propertyUri);
}
/*
@ -51,9 +51,9 @@ public class DataPropertyStatementTemplateModel extends PropertyStatementTemplat
this.value = value;
}
protected void setEditUrls(Literal value, EditingPolicyHelper policyHelper, String propertyUri) {
protected void setEditUrls(Literal value, boolean editing, String propertyUri) {
if (policyHelper == null) {
if ( ! editing ) {
return;
}

View file

@ -34,9 +34,9 @@ public class DataPropertyTemplateModel extends PropertyTemplateModel {
private final List<DataPropertyStatementTemplateModel> statements;
DataPropertyTemplateModel(DataProperty dp, Individual subject, VitroRequest vreq,
EditingPolicyHelper policyHelper, List<DataProperty> populatedDataPropertyList) {
boolean editing, List<DataProperty> populatedDataPropertyList) {
super(dp, subject, policyHelper, vreq);
super(dp, subject, vreq);
setName(dp.getPublicName());
statements = new ArrayList<DataPropertyStatementTemplateModel>();
@ -47,21 +47,19 @@ public class DataPropertyTemplateModel extends PropertyTemplateModel {
DataPropertyStatementDao dpDao = vreq.getWebappDaoFactory().getDataPropertyStatementDao();
List<Literal> values = dpDao.getDataPropertyValuesForIndividualByProperty(subject, dp);
for (Literal value : values) {
statements.add(new DataPropertyStatementTemplateModel(subjectUri, propertyUri, value, policyHelper, vreq));
statements.add(new DataPropertyStatementTemplateModel(subjectUri, propertyUri, value, editing, vreq));
}
} else {
log.debug("Data property " + getUri() + " is unpopulated.");
}
setAddUrl(policyHelper, dp);
if ( editing ) {
setAddUrl(dp);
}
}
protected void setAddUrl(EditingPolicyHelper policyHelper, Property property) {
if (policyHelper == null) {
return;
}
protected void setAddUrl(Property property) {
DataProperty dp = (DataProperty) property;
// NIHVIVO-2790 vitro:moniker now included in the display, but don't allow new statements

View file

@ -1,36 +0,0 @@
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.auth.identifier.IdentifierBundle;
import edu.cornell.mannlib.vitro.webapp.auth.identifier.RequestIdentifiers;
import edu.cornell.mannlib.vitro.webapp.auth.policy.RequestPolicyList;
import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.Authorization;
import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.PolicyDecision;
import edu.cornell.mannlib.vitro.webapp.auth.policy.ifaces.PolicyIface;
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
public class EditingPolicyHelper {
private static final Log log = LogFactory.getLog(EditingPolicyHelper.class);
private final PolicyIface policy;
private final IdentifierBundle ids;
public EditingPolicyHelper(VitroRequest vreq) {
this.policy = RequestPolicyList.getPolicies(vreq);
this.ids = RequestIdentifiers.getIdBundleForRequest(vreq);
}
protected boolean isAuthorizedAction(RequestedAction action) {
PolicyDecision decision = getPolicyDecision(action);
return (decision != null && decision.getAuthorized() == Authorization.AUTHORIZED);
}
private PolicyDecision getPolicyDecision(RequestedAction action) {
return policy.isAuthorized(ids, action);
}
}

View file

@ -56,13 +56,11 @@ public class GroupedPropertyList extends BaseTemplateModel {
private List<PropertyGroupTemplateModel> groups;
GroupedPropertyList(Individual subject, VitroRequest vreq,
EditingPolicyHelper policyHelper) {
boolean editing) {
this.vreq = vreq;
this.subject = subject;
this.wdf = vreq.getWebappDaoFactory();
boolean editing = policyHelper != null;
// Create the property list for the subject. The properties will be put
// into groups later.
List<Property> propertyList = new ArrayList<Property>();
@ -107,7 +105,7 @@ public class GroupedPropertyList extends BaseTemplateModel {
propertyGroupList.size());
for (PropertyGroup propertyGroup : propertyGroupList) {
groups.add(new PropertyGroupTemplateModel(vreq, propertyGroup,
subject, policyHelper, populatedDataPropertyList,
subject, editing, populatedDataPropertyList,
populatedObjectPropertyList));
}

View file

@ -22,7 +22,7 @@ public class NameStatementTemplateModel extends
* This method handles the special case where we are creating a DataPropertyStatementTemplateModel outside the GroupedPropertyList.
* Specifically, it allows rdfs:label to be treated like a data property statement and thus have editing links.
*/
NameStatementTemplateModel(String subjectUri, VitroRequest vreq, EditingPolicyHelper policyHelper) {
NameStatementTemplateModel(String subjectUri, VitroRequest vreq, boolean editing) {
super(subjectUri, VitroVocabulary.LABEL, vreq);
WebappDaoFactory wdf = vreq.getWebappDaoFactory();
@ -35,7 +35,7 @@ public class NameStatementTemplateModel extends
if (literal != null) {
value = cleanTextForDisplay( literal.getLexicalForm() );
setEditUrls(literal, policyHelper, propertyUri);
setEditUrls(literal, editing, propertyUri);
} else {
// If the individual has no rdfs:label, use the local name. It will not be editable. (This replicates previous behavior;
// perhaps we would want to allow a label to be added. But such individuals do not usually have their profiles viewed or

View file

@ -31,7 +31,7 @@ public class ObjectPropertyStatementTemplateModel extends PropertyStatementTempl
private final String templateName;
private final String objectKey;
public ObjectPropertyStatementTemplateModel(String subjectUri, String propertyUri, String objectKey,
Map<String, String> data, EditingPolicyHelper policyHelper, String templateName, VitroRequest vreq) {
Map<String, String> data, boolean editing, String templateName, VitroRequest vreq) {
super(subjectUri, propertyUri, vreq);
this.data = data;
@ -39,20 +39,21 @@ public class ObjectPropertyStatementTemplateModel extends PropertyStatementTempl
this.templateName = templateName;
//to keep track of later
this.objectKey = objectKey;
setEditUrls(policyHelper);
if ( editing ) {
setEditUrls();
}
}
protected void setEditUrls(EditingPolicyHelper policyHelper) {
// If the policyHelper is non-null, we are in edit mode, so create the list of editing permissions.
protected void setEditUrls() {
// If we are in edit mode, create the list of editing permissions.
// We do this now rather than in getEditUrl() and getDeleteUrl(), because getEditUrl() also needs to know
// whether a delete is allowed.
if (policyHelper != null) {
ObjectPropertyStatement ops = new ObjectPropertyStatementImpl(subjectUri, propertyUri, objectUri);
ObjectPropertyStatement ops = new ObjectPropertyStatementImpl(subjectUri, propertyUri, objectUri);
// Do delete url first, since used in building edit url
setDeleteUrl();
setEditUrl(ops);
}
// Do delete url first, since used in building edit url
setDeleteUrl();
setEditUrl(ops);
}
protected void setDeleteUrl() {

View file

@ -90,15 +90,15 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel
private String objectKey;
ObjectPropertyTemplateModel(ObjectProperty op, Individual subject, VitroRequest vreq,
EditingPolicyHelper policyHelper)
boolean editing)
throws InvalidConfigurationException {
super(op, subject, policyHelper, vreq);
super(op, subject, vreq);
setName(op.getDomainPublic());
// Get the config for this object property
try {
config = new PropertyListConfig(op, policyHelper);
config = new PropertyListConfig(op, editing);
} catch (InvalidConfigurationException e) {
throw e;
} catch (Exception e) {
@ -107,14 +107,12 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel
objectKey = getQueryObjectVariableName();
setAddUrl(policyHelper, op);
if (editing) {
setAddUrl(op);
}
}
protected void setAddUrl(EditingPolicyHelper policyHelper, Property property) {
if (policyHelper == null) {
return;
}
protected void setAddUrl(Property property) {
// Determine whether a new statement can be added
RequestedAction action = new AddObjectPropStmt(subjectUri, propertyUri, RequestActionConstants.SOME_URI);
@ -207,19 +205,19 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel
}
public static ObjectPropertyTemplateModel getObjectPropertyTemplateModel(ObjectProperty op,
Individual subject, VitroRequest vreq, EditingPolicyHelper policyHelper,
Individual subject, VitroRequest vreq, boolean editing,
List<ObjectProperty> populatedObjectPropertyList) {
if (op.getCollateBySubclass()) {
try {
return new CollatedObjectPropertyTemplateModel(op, subject, vreq, policyHelper, populatedObjectPropertyList);
return new CollatedObjectPropertyTemplateModel(op, subject, vreq, editing, populatedObjectPropertyList);
} catch (InvalidConfigurationException e) {
log.warn(e.getMessage());
// If the collated config is invalid, instantiate an UncollatedObjectPropertyTemplateModel instead.
}
}
try {
return new UncollatedObjectPropertyTemplateModel(op, subject, vreq, policyHelper, populatedObjectPropertyList);
return new UncollatedObjectPropertyTemplateModel(op, subject, vreq, editing, populatedObjectPropertyList);
} catch (InvalidConfigurationException e) {
log.error(e.getMessage());
return null;
@ -363,7 +361,7 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel
private String templateName;
private ObjectPropertyDataPostProcessor postprocessor = null;
PropertyListConfig(ObjectProperty op, EditingPolicyHelper policyHelper)
PropertyListConfig(ObjectProperty op, boolean editing)
throws InvalidConfigurationException {
// Get the custom config filename
@ -383,7 +381,7 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel
configFilePath = getConfigFilePath(DEFAULT_CONFIG_FILE_NAME);
// Should we test for the existence of the default, and throw an error if it doesn't exist?
}
setValuesFromConfigFile(configFilePath, op, vreq.getWebappDaoFactory(), policyHelper);
setValuesFromConfigFile(configFilePath, op, vreq.getWebappDaoFactory(), editing);
} catch (Exception e) {
log.error("Error processing config file " + configFilePath + " for object property " + op.getURI(), e);
@ -403,7 +401,7 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel
" in " + configFilePath + ":\n" +
configError + " Using default config instead.");
configFilePath = getConfigFilePath(DEFAULT_CONFIG_FILE_NAME);
setValuesFromConfigFile(configFilePath, op, vreq.getWebappDaoFactory(), policyHelper);
setValuesFromConfigFile(configFilePath, op, vreq.getWebappDaoFactory(), editing);
}
}
@ -443,7 +441,7 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel
}
private void setValuesFromConfigFile(String configFilePath, ObjectProperty op, WebappDaoFactory wdf,
EditingPolicyHelper policyHelper) {
boolean editing) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db;
@ -454,7 +452,7 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel
String propertyUri = op.getURI();
// Required values
selectQuery = getSelectQuery(doc, propertyUri, policyHelper);
selectQuery = getSelectQuery(doc, propertyUri, editing);
templateName = getConfigValue(doc, NODE_NAME_TEMPLATE, propertyUri);
@ -482,19 +480,19 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel
}
}
private String getSelectQuery(Document doc, String propertyUri, EditingPolicyHelper policyHelper) {
private String getSelectQuery(Document doc, String propertyUri, boolean editing) {
Node selectQueryNode = doc.getElementsByTagName(NODE_NAME_QUERY_SELECT).item(0);
String value = null;
if (selectQueryNode != null) {
boolean collated = ObjectPropertyTemplateModel.this instanceof CollatedObjectPropertyTemplateModel;
/* If not editing the page (policyHelper == null), hide statements with missing linked individual or other
/* If not editing the page (editing == false), hide statements with missing linked individual or other
* critical information missing (e.g., anchor and url on a link); otherwise, show these statements.
* We might want to refine this based on whether the user can edit the statement in question, but that
* would require a completely different approach: include the statement in the query results, and then during the
* postprocessing phase, check the editing policy, and remove the statement if it's not editable. We would not
* preprocess the query, as here.
*/
boolean criticalDataRequired = policyHelper == null;
boolean criticalDataRequired = editing;
NodeList children = selectQueryNode.getChildNodes();
int childCount = children.getLength();
value = "";

View file

@ -3,7 +3,6 @@
package edu.cornell.mannlib.vitro.webapp.web.templatemodels.individual;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.commons.logging.Log;
@ -15,7 +14,6 @@ import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.beans.Property;
import edu.cornell.mannlib.vitro.webapp.beans.PropertyGroup;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.BaseTemplateModel;
public class PropertyGroupTemplateModel extends BaseTemplateModel {
@ -26,7 +24,7 @@ public class PropertyGroupTemplateModel extends BaseTemplateModel {
private final List<PropertyTemplateModel> properties;
PropertyGroupTemplateModel(VitroRequest vreq, PropertyGroup group,
Individual subject, EditingPolicyHelper policyHelper,
Individual subject, boolean editing,
List<DataProperty> populatedDataPropertyList, List<ObjectProperty> populatedObjectPropertyList) {
this.name = group.getName();
@ -36,9 +34,9 @@ public class PropertyGroupTemplateModel extends BaseTemplateModel {
for (Property p : propertyList) {
if (p instanceof ObjectProperty) {
ObjectProperty op = (ObjectProperty)p;
properties.add(ObjectPropertyTemplateModel.getObjectPropertyTemplateModel(op, subject, vreq, policyHelper, populatedObjectPropertyList));
properties.add(ObjectPropertyTemplateModel.getObjectPropertyTemplateModel(op, subject, vreq, editing, populatedObjectPropertyList));
} else {
properties.add(new DataPropertyTemplateModel((DataProperty)p, subject, vreq, policyHelper, populatedDataPropertyList));
properties.add(new DataPropertyTemplateModel((DataProperty)p, subject, vreq, editing, populatedDataPropertyList));
}
}
}

View file

@ -36,7 +36,7 @@ public abstract class PropertyTemplateModel extends BaseTemplateModel {
private String name;
PropertyTemplateModel(Property property, Individual subject, EditingPolicyHelper policyHelper, VitroRequest vreq) {
PropertyTemplateModel(Property property, Individual subject, VitroRequest vreq) {
this.vreq = vreq;
subjectUri = subject.getURI();
propertyUri = property.getURI();

View file

@ -12,8 +12,6 @@ import org.apache.commons.logging.LogFactory;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyStatementDao;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
public class UncollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateModel {
@ -22,11 +20,11 @@ public class UncollatedObjectPropertyTemplateModel extends ObjectPropertyTemplat
private final List<ObjectPropertyStatementTemplateModel> statements;
UncollatedObjectPropertyTemplateModel(ObjectProperty op, Individual subject,
VitroRequest vreq, EditingPolicyHelper policyHelper,
VitroRequest vreq, boolean editing,
List<ObjectProperty> populatedObjectPropertyList)
throws InvalidConfigurationException {
super(op, subject, vreq, policyHelper);
super(op, subject, vreq, editing);
statements = new ArrayList<ObjectPropertyStatementTemplateModel>();
if (populatedObjectPropertyList.contains(op)) {
@ -42,7 +40,7 @@ public class UncollatedObjectPropertyTemplateModel extends ObjectPropertyTemplat
String objectKey = getObjectKey();
for (Map<String, String> map : statementData) {
statements.add(new ObjectPropertyStatementTemplateModel(subjectUri,
propertyUri, objectKey, map, policyHelper, getTemplateName(), vreq));
propertyUri, objectKey, map, editing, getTemplateName(), vreq));
}
postprocessStatementList(statements);