diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualListController.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualListController.java index 0be050331..ab21eb747 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualListController.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/IndividualListController.java @@ -104,7 +104,7 @@ public class IndividualListController extends FreemarkerHttpServlet { title = classGroup.getPublicName(); body.put("subtitle", vclass.getName()); } - body.put("title", title); + body.put("title", title); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java index 888784069..cbcc7c008 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/DataPropertyTemplateModel.java @@ -13,7 +13,6 @@ import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement; import edu.cornell.mannlib.vitro.webapp.beans.Individual; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.dao.DataPropertyStatementDao; -import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; public class DataPropertyTemplateModel extends PropertyTemplateModel { @@ -22,10 +21,9 @@ public class DataPropertyTemplateModel extends PropertyTemplateModel { private static final String TYPE = "data"; private List statements; - private EditingHelper editingHelper; DataPropertyTemplateModel(DataProperty dp, Individual subject, VitroRequest vreq, EditingHelper editingHelper) { - super(dp, editingHelper); + super(dp, subject, editingHelper); setName(dp.getPublicName()); @@ -46,8 +44,8 @@ public class DataPropertyTemplateModel extends PropertyTemplateModel { @Override public String getAddUrl() { - // TODO Auto-generated method stub - return null; + String addUrl = ""; + return addUrl; } public List getStatements() { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/EditingHelper.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/EditingHelper.java index 5a4215984..1074664de 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/EditingHelper.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/EditingHelper.java @@ -12,7 +12,9 @@ import edu.cornell.mannlib.vitro.webapp.auth.identifier.ServletIdentifierBundleF import edu.cornell.mannlib.vitro.webapp.auth.policy.PolicyList; import edu.cornell.mannlib.vitro.webapp.auth.policy.RequestPolicyList; import edu.cornell.mannlib.vitro.webapp.auth.policy.ServletPolicyList; +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 EditingHelper { @@ -49,13 +51,8 @@ public class EditingHelper { log.error("No IdentifierBundle objects for request"); } } - - protected PolicyIface getPolicy() { - return policy; - } - - protected IdentifierBundle getIds() { - return ids; - } + protected PolicyDecision getPolicyDecision(RequestedAction action) { + return policy.isAuthorized(ids, action); + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyStatementTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyStatementTemplateModel.java index b26bd16b1..c03fbddfe 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyStatementTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyStatementTemplateModel.java @@ -29,38 +29,40 @@ public class ObjectPropertyStatementTemplateModel extends BaseTemplateModel { private static enum EditAccess { EDIT, DELETE; } - - private String subjectUri; // we'll use these to make the edit links - private String propertyUri; + private Map data; + // Used for editing + private String subjectUri = null; + private String propertyUri = null; private String objectUri = null; private List editAccessList; ObjectPropertyStatementTemplateModel(String subjectUri, String propertyUri, String objectKey, Map data, EditingHelper editingHelper) { - this.subjectUri = subjectUri; - this.propertyUri = propertyUri; + this.data = data; // If the editingHelper is non-null, we are in edit mode, so 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 (editingHelper != null) { + this.subjectUri = subjectUri; + this.propertyUri = propertyUri; objectUri = data.get(objectKey); - editAccessList = new ArrayList(); // limit size to number of elements in EditAccess + editAccessList = new ArrayList(); ObjectPropertyStatement objectPropertyStatement = new ObjectPropertyStatementImpl(subjectUri, propertyUri, objectUri); // Determine whether the statement can be edited RequestedAction action = new EditObjPropStmt(objectPropertyStatement); - PolicyDecision decision = editingHelper.getPolicy().isAuthorized(editingHelper.getIds(), action); + PolicyDecision decision = editingHelper.getPolicyDecision(action); if (decision != null && decision.getAuthorized() == Authorization.AUTHORIZED) { editAccessList.add(EditAccess.EDIT); } // Determine whether the statement can be deleted action = new DropObjectPropStmt(subjectUri, propertyUri, objectUri); - decision = editingHelper.getPolicy().isAuthorized(editingHelper.getIds(), action); + decision = editingHelper.getPolicyDecision(action); if (decision != null && decision.getAuthorized() == Authorization.AUTHORIZED) { editAccessList.add(EditAccess.DELETE); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java index 468edadaa..11597eb60 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/ObjectPropertyTemplateModel.java @@ -22,9 +22,16 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; +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.requestedAction.ifaces.RequestActionConstants; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction; +import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AddObjectPropStmt; 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.controller.freemarker.UrlBuilder; +import edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.ParamMap; import edu.cornell.mannlib.vitro.webapp.dao.ObjectPropertyDao; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import freemarker.cache.TemplateLoader; @@ -34,6 +41,7 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel private static final Log log = LogFactory.getLog(ObjectPropertyTemplateModel.class); private static final String TYPE = "object"; + private static final String EDIT_PATH = "edit/editRequestDispatch.jsp"; /* NB The default post-processor is not the same as the post-processor for the default view. The latter * actually defines its own post-processor, whereas the default post-processor is used for custom views @@ -60,9 +68,12 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel private PropertyListConfig config; private String objectKey; + + // Used for editing + private boolean addAccess = false; ObjectPropertyTemplateModel(ObjectProperty op, Individual subject, VitroRequest vreq, EditingHelper editingHelper) { - super(op, editingHelper); + super(op, subject, editingHelper); setName(op.getDomainPublic()); // Get the config for this object property @@ -73,6 +84,15 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel } objectKey = getQueryObjectVariableName(); + + // Determine whether a new statement can be added + if (editingHelper != null) { + RequestedAction action = new AddObjectPropStmt(subjectUri, propertyUri, RequestActionConstants.SOME_URI); + PolicyDecision decision = editingHelper.getPolicyDecision(action); + if( decision != null && decision.getAuthorized() == Authorization.AUTHORIZED ) { + addAccess = true; + } + } } protected String getQueryString() { @@ -331,8 +351,14 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel @Override public String getAddUrl() { - // TODO Auto-generated method stub - return null; + String addUrl = ""; + if (addAccess) { + ParamMap params = new ParamMap( + "subjectUri", subjectUri, + "predicateUri", propertyUri); + addUrl = UrlBuilder.getUrl(EDIT_PATH, params); + } + return addUrl; } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/PropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/PropertyTemplateModel.java index 9aaf95008..1f12e0e60 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/PropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/PropertyTemplateModel.java @@ -5,6 +5,7 @@ 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.beans.Individual; import edu.cornell.mannlib.vitro.webapp.beans.Property; import edu.cornell.mannlib.vitro.webapp.web.templatemodels.BaseTemplateModel; @@ -16,17 +17,24 @@ public abstract class PropertyTemplateModel extends BaseTemplateModel { private static final Log log = LogFactory.getLog(PropertyTemplateModel.class); private String name; - private String uri; - protected Property property; // needed to get the edit links - protected EditingHelper editingHelper; - PropertyTemplateModel(Property property, EditingHelper editingHelper) { + // For editing + protected String subjectUri = null; + protected String propertyUri = null; + protected Property property; // RY DO WE NEED THIS, or just the uri?? + protected boolean addAccess = false; + + PropertyTemplateModel(Property property, Individual subject, EditingHelper editingHelper) { // Do in subclass constructor. The label has not been set on the property, and getting the // label differs between object and data properties. // this.name = property.getLabel(); - this.uri = property.getURI(); + this.propertyUri = property.getURI(); this.property = property; - this.editingHelper = editingHelper; + + if (editingHelper != null) { + subjectUri = subject.getURI(); + propertyUri = property.getURI(); + } } protected void setName(String name) { @@ -42,7 +50,7 @@ public abstract class PropertyTemplateModel extends BaseTemplateModel { } public String getUri() { - return uri; + return propertyUri; } public abstract String getAddUrl(); diff --git a/webapp/web/templates/freemarker/body/individualList.ftl b/webapp/web/templates/freemarker/body/individualList.ftl index 5e9d7339f..cfd1db3c0 100644 --- a/webapp/web/templates/freemarker/body/individualList.ftl +++ b/webapp/web/templates/freemarker/body/individualList.ftl @@ -6,6 +6,7 @@
+

${title}

<#if subtitle??>

${subtitle}

diff --git a/webapp/web/templates/freemarker/body/partials/individual/individual-properties.ftl b/webapp/web/templates/freemarker/body/partials/individual/individual-properties.ftl index daeac0f10..6d709532f 100644 --- a/webapp/web/templates/freemarker/body/partials/individual/individual-properties.ftl +++ b/webapp/web/templates/freemarker/body/partials/individual/individual-properties.ftl @@ -24,7 +24,7 @@ <#list group.properties as property>
<#-- Property display name --> -

${property.name}

+

${property.name}

<@p.addLink property showEditingLinks /> <#-- List the statements for each property -->
    diff --git a/webapp/web/templates/freemarker/body/partials/individual/lib-properties.ftl b/webapp/web/templates/freemarker/body/partials/individual/lib-properties.ftl index 3e1b1f068..13fc16973 100644 --- a/webapp/web/templates/freemarker/body/partials/individual/lib-properties.ftl +++ b/webapp/web/templates/freemarker/body/partials/individual/lib-properties.ftl @@ -32,6 +32,15 @@ +<#macro addLink property showEditingLinks> + <#if showEditingLinks> + <#local url = property.addUrl> + <#if url?has_content> + add + + + + <#macro propertyListItem statement showEditingLinks>
  • <#nested>