NIHVIVO-1332 Modifications to controller, template models, and templates for editing controls

This commit is contained in:
rjy7 2011-01-11 17:03:52 +00:00
parent e13564c983
commit 3451bb4786
14 changed files with 103 additions and 98 deletions

View file

@ -115,8 +115,6 @@ public class IndividualController extends FreemarkerHttpServlet {
Map<String, Object> body = new HashMap<String, Object>();
body.put("editStatus", getEditingData(vreq));
body.put("title", individual.getName());
body.put("relatedSubject", getRelatedSubject(vreq));
@ -151,20 +149,6 @@ public class IndividualController extends FreemarkerHttpServlet {
EditSubmission.clearAllEditSubmissionsInSession(session);
}
private Map<String, Object> getEditingData(VitroRequest vreq) {
LoginStatusBean loginBean = LoginStatusBean.getBean(vreq);
Map<String, Object> editingData = new HashMap<String, Object>();
// RY This will be improved later. What is important is not whether the user is a self-editor,
// but whether he has editing privileges on this profile.
editingData.put("showEditingLinks", VitroRequestPrep.isSelfEditing(vreq) ||
loginBean.isLoggedInAtLeast(LoginStatusBean.NON_EDITOR));
editingData.put("showAdminPanel", loginBean.isLoggedInAtLeast(LoginStatusBean.EDITOR));
return editingData;
}
private Map<String, Object> getRelatedSubject(VitroRequest vreq) {
Map<String, Object> map = null;
@ -215,13 +199,14 @@ public class IndividualController extends FreemarkerHttpServlet {
//setup highlighter for search terms
//checkForSearch(vreq, individual);
return new IndividualTemplateModel(individual, vreq);
return new IndividualTemplateModel(individual, vreq, LoginStatusBean.getBean(vreq));
}
// Determine whether the individual has a custom display template based on its class membership.
// If not, return the default individual template.
private String getIndividualTemplate(Individual individual) {
@SuppressWarnings("unused")
String vclassName = "unknown";
String customTemplate = null;
@ -232,8 +217,8 @@ public class IndividualController extends FreemarkerHttpServlet {
customTemplate = clas.getCustomDisplayView();
if (customTemplate != null) {
if (customTemplate.length()>0) {
vclassName = clas.getName(); // reset entity vclassname to name of class where a custom view
log.debug("Found direct class ["+clas.getName()+"] with custom view "+customTemplate+"; resetting entity vclassName to this class");
vclassName = clas.getName(); // reset entity vclassname to name of class where a custom view; this call has side-effects
log.debug("Found direct class [" + clas.getName() + "] with custom view " + customTemplate + "; resetting entity vclassName to this class");
break;
} else {
customTemplate = null;
@ -247,7 +232,7 @@ public class IndividualController extends FreemarkerHttpServlet {
if (customTemplate != null) {
if (customTemplate.length()>0) {
// note that NOT changing entity vclassName here yet
log.debug("Found inferred class ["+clas.getName()+"] with custom view "+customTemplate);
log.debug("Found inferred class [" + clas.getName() + "] with custom view " + customTemplate);
break;
} else {
customTemplate = null;

View file

@ -38,10 +38,10 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM
private SortedMap<String, List<ObjectPropertyStatementTemplateModel>> subclasses;
CollatedObjectPropertyTemplateModel(ObjectProperty op, Individual subject,
VitroRequest vreq, EditingHelper editLinkHelper)
VitroRequest vreq, EditingHelper editingHelper)
throws InvalidConfigurationException {
super(op, subject, vreq, editLinkHelper);
super(op, subject, vreq, editingHelper);
String invalidConfigMessage = checkConfiguration();
if ( ! invalidConfigMessage.isEmpty() ) {
@ -62,7 +62,7 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM
/* Collate the data */
Map<String, List<ObjectPropertyStatementTemplateModel>> unsortedSubclasses =
collate(subjectUri, propertyUri, statementData, vreq, editLinkHelper);
collate(subjectUri, propertyUri, statementData, vreq, editingHelper);
/* Sort by subclass name */
Comparator<String> comparer = new Comparator<String>() {
@ -97,7 +97,7 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM
}
private Map<String, List<ObjectPropertyStatementTemplateModel>> collate(String subjectUri, String propertyUri,
List<Map<String, String>> statementData, VitroRequest vreq, EditingHelper editLinkHelper) {
List<Map<String, String>> statementData, VitroRequest vreq, EditingHelper editingHelper) {
Map<String, List<ObjectPropertyStatementTemplateModel>> subclassMap =
new HashMap<String, List<ObjectPropertyStatementTemplateModel>>();
@ -117,7 +117,7 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM
subclassMap.put(subclassName, currentList);
}
currentList.add(new ObjectPropertyStatementTemplateModel(subjectUri,
propertyUri, objectKey, map, editLinkHelper));
propertyUri, objectKey, map, editingHelper));
}
return subclassMap;
}

View file

@ -13,11 +13,11 @@ public class DataPropertyStatementTemplateModel extends BaseTemplateModel {
private static final Log log = LogFactory.getLog(DataPropertyStatementTemplateModel.class);
private DataPropertyStatement statement;
private EditingHelper editLinkHelper;
private EditingHelper editingHelper;
DataPropertyStatementTemplateModel(DataPropertyStatement statement, EditingHelper editLinkHelper) {
DataPropertyStatementTemplateModel(DataPropertyStatement statement, EditingHelper editingHelper) {
this.statement = statement;
this.editLinkHelper = editLinkHelper;
this.editingHelper = editingHelper;
}
/* Access methods for templates */

View file

@ -22,10 +22,10 @@ public class DataPropertyTemplateModel extends PropertyTemplateModel {
private static final String TYPE = "data";
private List<DataPropertyStatementTemplateModel> statements;
private EditingHelper editLinkHelper;
private EditingHelper editingHelper;
DataPropertyTemplateModel(DataProperty dp, Individual subject, VitroRequest vreq, EditingHelper editLinkHelper) {
super(dp, editLinkHelper);
DataPropertyTemplateModel(DataProperty dp, Individual subject, VitroRequest vreq, EditingHelper editingHelper) {
super(dp, editingHelper);
setName(dp.getPublicName());
@ -34,7 +34,7 @@ public class DataPropertyTemplateModel extends PropertyTemplateModel {
List<DataPropertyStatement> dpStatements = dpDao.getDataPropertyStatementsForIndividualByProperty(subject, dp);
statements = new ArrayList<DataPropertyStatementTemplateModel>(dpStatements.size());
for (DataPropertyStatement dps : dpStatements) {
statements.add(new DataPropertyStatementTemplateModel(dps, editLinkHelper));
statements.add(new DataPropertyStatementTemplateModel(dps, editingHelper));
}
}

View file

@ -45,19 +45,21 @@ public class GroupedPropertyList extends BaseTemplateModel {
private Individual subject;
private VitroRequest vreq;
private WebappDaoFactory wdf;
private LoginStatusBean loginStatusBean;
private List<PropertyGroupTemplateModel> groups;
GroupedPropertyList(Individual subject, VitroRequest vreq) {
GroupedPropertyList(Individual subject, VitroRequest vreq, LoginStatusBean loginStatusBean) {
this.subject = subject;
this.vreq = vreq;
this.wdf = vreq.getWebappDaoFactory();
this.loginStatusBean = loginStatusBean;
// Determine whether we're editing or not.
boolean userCanEditThisProfile = getEditingStatus();
EditingHelper editLinkHelper = null;
EditingHelper editingHelper = null;
if (userCanEditThisProfile) {
editLinkHelper = new EditingHelper(vreq, getServletContext());
editingHelper = new EditingHelper(vreq, getServletContext());
}
// Create the property list for the subject. The properties will be put into groups later.
@ -106,7 +108,7 @@ public class GroupedPropertyList extends BaseTemplateModel {
// Build the template data model from the groupList
groups = new ArrayList<PropertyGroupTemplateModel>(propertyGroupList.size());
for (PropertyGroup pg : propertyGroupList) {
groups.add(new PropertyGroupTemplateModel(vreq, pg, subject, editLinkHelper));
groups.add(new PropertyGroupTemplateModel(vreq, pg, subject, editingHelper));
}
}
@ -118,7 +120,7 @@ public class GroupedPropertyList extends BaseTemplateModel {
*/
private boolean getEditingStatus() {
boolean isSelfEditing = VitroRequestPrep.isSelfEditing(vreq);
boolean isCurator = LoginStatusBean.getBean(vreq).isLoggedInAtLeast(LoginStatusBean.CURATOR);
boolean isCurator = loginStatusBean.isLoggedInAtLeast(LoginStatusBean.CURATOR);
return isSelfEditing || isCurator;
}

View file

@ -10,6 +10,7 @@ import org.apache.commons.logging.LogFactory;
import org.openrdf.model.URI;
import org.openrdf.model.impl.URIImpl;
import edu.cornell.mannlib.vedit.beans.LoginStatusBean;
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
import edu.cornell.mannlib.vitro.webapp.beans.Link;
import edu.cornell.mannlib.vitro.webapp.beans.PropertyGroup;
@ -18,6 +19,7 @@ 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.controller.freemarker.UrlBuilder.Route;
import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory;
import edu.cornell.mannlib.vitro.webapp.filters.VitroRequestPrep;
import edu.cornell.mannlib.vitro.webapp.web.ViewFinder;
import edu.cornell.mannlib.vitro.webapp.web.ViewFinder.ClassView;
import edu.cornell.mannlib.vitro.webapp.web.templatemodels.BaseTemplateModel;
@ -32,6 +34,7 @@ public class IndividualTemplateModel extends BaseTemplateModel {
protected VitroRequest vreq;
protected UrlBuilder urlBuilder;
protected GroupedPropertyList propertyList = null;
protected LoginStatusBean loginStatusBean = null;
public IndividualTemplateModel(Individual individual, VitroRequest vreq) {
this.individual = individual;
@ -40,6 +43,14 @@ public class IndividualTemplateModel extends BaseTemplateModel {
this.urlBuilder = new UrlBuilder(vreq.getPortal());
}
public IndividualTemplateModel(Individual individual, VitroRequest vreq, LoginStatusBean loginStatusBean) {
this.individual = individual;
this.vreq = vreq;
this.loginStatusBean = loginStatusBean;
// Needed for getting portal-sensitive urls. Remove if multi-portal support is removed.
this.urlBuilder = new UrlBuilder(vreq.getPortal());
}
/* These methods perform some manipulation of the data returned by the Individual methods */
public String getProfileUrl() {
@ -129,11 +140,22 @@ public class IndividualTemplateModel extends BaseTemplateModel {
public GroupedPropertyList getPropertyList() {
if (propertyList == null) {
propertyList = new GroupedPropertyList(individual, vreq);
propertyList = new GroupedPropertyList(individual, vreq, loginStatusBean);
}
return propertyList;
}
public boolean getShowEditingLinks() {
// RY This will be improved later. What is important is not whether the user is a self-editor,
// but whether he has editing privileges on this profile.
return VitroRequestPrep.isSelfEditing(vreq) ||
loginStatusBean.isLoggedInAtLeast(LoginStatusBean.NON_EDITOR);
}
public boolean getShowAdminPanel() {
return loginStatusBean.isLoggedInAtLeast(LoginStatusBean.EDITOR);
}
/* These methods simply forward to the methods of the wrapped individual. It would be desirable to
* implement a scheme for proxying or delegation so that the methods don't need to be simply listed here.
* A Ruby-style method missing method would be ideal.

View file

@ -27,20 +27,20 @@ public class ObjectPropertyStatementTemplateModel extends BaseTemplateModel {
private String propertyUri;
private Map<String, String> data;
private EditingHelper editLinkHelper;
private EditingHelper editingHelper;
private String objectUri = null;
private ObjectPropertyStatement objectPropertyStatement = null;
ObjectPropertyStatementTemplateModel(String subjectUri, String propertyUri,
String objectKey, Map<String, String> data, EditingHelper editLinkHelper) {
String objectKey, Map<String, String> data, EditingHelper editingHelper) {
this.subjectUri = subjectUri;
this.propertyUri = propertyUri;
this.data = data;
this.editLinkHelper = editLinkHelper;
this.editingHelper = editingHelper;
// If the editLinkHelper is non-null, we are in edit mode, so create the necessary objects.
if (this.editLinkHelper != null) {
// If the editingHelper is non-null, we are in edit mode, so create the necessary objects.
if (this.editingHelper != null) {
objectUri = data.get(objectKey);
objectPropertyStatement = new ObjectPropertyStatementImpl(subjectUri, propertyUri, objectUri);
}
@ -57,7 +57,7 @@ public class ObjectPropertyStatementTemplateModel extends BaseTemplateModel {
public String getEditUrl() {
String editUrl = "";
RequestedAction action = new EditObjPropStmt(objectPropertyStatement);
PolicyDecision decision = editLinkHelper.getPolicy().isAuthorized(editLinkHelper.getIds(), action);
PolicyDecision decision = editingHelper.getPolicy().isAuthorized(editingHelper.getIds(), action);
if (decision != null && decision.getAuthorized() == Authorization.AUTHORIZED) {
ParamMap params = new ParamMap(
"subjectUri", subjectUri,

View file

@ -61,8 +61,8 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel
private PropertyListConfig config;
private String objectKey;
ObjectPropertyTemplateModel(ObjectProperty op, Individual subject, VitroRequest vreq, EditingHelper editLinkHelper) {
super(op, editLinkHelper);
ObjectPropertyTemplateModel(ObjectProperty op, Individual subject, VitroRequest vreq, EditingHelper editingHelper) {
super(op, editingHelper);
setName(op.getDomainPublic());
// Get the config for this object property
@ -107,16 +107,16 @@ public abstract class ObjectPropertyTemplateModel extends PropertyTemplateModel
}
protected static ObjectPropertyTemplateModel getObjectPropertyTemplateModel(ObjectProperty op,
Individual subject, VitroRequest vreq, EditingHelper editLinkHelper) {
Individual subject, VitroRequest vreq, EditingHelper editingHelper) {
if (op.getCollateBySubclass()) {
try {
return new CollatedObjectPropertyTemplateModel(op, subject, vreq, editLinkHelper);
return new CollatedObjectPropertyTemplateModel(op, subject, vreq, editingHelper);
} catch (InvalidConfigurationException e) {
log.error(e);
return new UncollatedObjectPropertyTemplateModel(op, subject, vreq, editLinkHelper);
return new UncollatedObjectPropertyTemplateModel(op, subject, vreq, editingHelper);
}
} else {
return new UncollatedObjectPropertyTemplateModel(op, subject, vreq, editLinkHelper);
return new UncollatedObjectPropertyTemplateModel(op, subject, vreq, editingHelper);
}
}

View file

@ -24,7 +24,7 @@ public class PropertyGroupTemplateModel extends BaseTemplateModel {
private String name;
private List<PropertyTemplateModel> properties;
PropertyGroupTemplateModel(VitroRequest vreq, PropertyGroup group, Individual subject, EditingHelper editLinkHelper) {
PropertyGroupTemplateModel(VitroRequest vreq, PropertyGroup group, Individual subject, EditingHelper editingHelper) {
this.name = group.getName();
List<Property> propertyList = group.getPropertyList();
@ -32,9 +32,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, editLinkHelper));
properties.add(ObjectPropertyTemplateModel.getObjectPropertyTemplateModel(op, subject, vreq, editingHelper));
} else {
properties.add(new DataPropertyTemplateModel((DataProperty)p, subject, vreq, editLinkHelper));
properties.add(new DataPropertyTemplateModel((DataProperty)p, subject, vreq, editingHelper));
}
}
}

View file

@ -18,15 +18,15 @@ public abstract class PropertyTemplateModel extends BaseTemplateModel {
private String name;
private String uri;
protected Property property; // needed to get the edit links
protected EditingHelper editLinkHelper;
protected EditingHelper editingHelper;
PropertyTemplateModel(Property property, EditingHelper editLinkHelper) {
PropertyTemplateModel(Property property, 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.property = property;
this.editLinkHelper = editLinkHelper;
this.editingHelper = editingHelper;
}
protected void setName(String name) {

View file

@ -22,8 +22,8 @@ public class UncollatedObjectPropertyTemplateModel extends ObjectPropertyTemplat
private List<ObjectPropertyStatementTemplateModel> statements;
UncollatedObjectPropertyTemplateModel(ObjectProperty op, Individual subject, VitroRequest vreq, EditingHelper editLinkHelper) {
super(op, subject, vreq, editLinkHelper);
UncollatedObjectPropertyTemplateModel(ObjectProperty op, Individual subject, VitroRequest vreq, EditingHelper editingHelper) {
super(op, subject, vreq, editingHelper);
/* Get the data */
WebappDaoFactory wdf = vreq.getWebappDaoFactory();
@ -41,7 +41,7 @@ public class UncollatedObjectPropertyTemplateModel extends ObjectPropertyTemplat
String objectKey = getObjectKey();
for (Map<String, String> map : statementData) {
statements.add(new ObjectPropertyStatementTemplateModel(subjectUri,
propertyUri, objectKey, map, editLinkHelper));
propertyUri, objectKey, map, editingHelper));
}
postprocessStatementList(statements);

View file

@ -1,21 +1,13 @@
<#-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
<#-- Template for individual profile page -->
<#-- Generic template for individual profile page -->
<#import "lib-list.ftl" as l>
<#import "lib-properties.ftl" as p>
<#assign core = "http://vivoweb.org/ontology/core#">
<#include "individual-setup.ftl">
<#assign editingClass>
<#if editStatus.showEditingLinks>editing<#else></#if>
</#assign>
<#if editStatus.showAdminPanel>
<#if individual.showAdminPanel>
<#include "individual-adminPanel.ftl">
</#if>
<#assign propertyGroups = individual.propertyList>
<section id="individual-intro" class="vcard" role="region">
<section id="share-contact" role="region">
<#-- Thumbnail -->
@ -48,6 +40,7 @@
<#assign overview = propertyGroups.getPropertyAndRemoveFromList("${core}overview")!>
<#if overview?has_content> <#-- true when the property is in the list, even if not populated (when editing) -->
<#list overview.statements as statement>
<@p.editingLinks statement showEditingLinks />
<p class="individual-overview">${statement.value}</p>
</#list>
</#if>
@ -87,8 +80,9 @@
</section>
</section>
<#assign nameForOtherGroup = "other"> <#-- used by both individual-propertyGroupMenu.ftl and individual-properties.ftl -->
<#-- Property group menu -->
<#assign nameForOtherGroup = "other">
<#include "individual-propertyGroupMenu.ftl">
<#-- Ontology properties -->

View file

@ -30,13 +30,13 @@
<ul class="property-list" role="list">
<#-- data property -->
<#if property.type == "data">
<@p.dataPropertyList property.statements />
<@p.dataPropertyList property.statements showEditingLinks />
<#-- object property -->
<#elseif property.collatedBySubclass> <#-- collated -->
<@p.collatedObjectPropertyList property />
<@p.collatedObjectPropertyList property showEditingLinks />
<#else> <#-- uncollated -->
<@p.objectPropertyList property.statements property.template />
<@p.objectPropertyList property.statements property.template showEditingLinks />
</#if>
</ul>
</article> <!-- end property -->

View file

@ -4,56 +4,58 @@
Macros for generating property lists
------------------------------------------------------------------------------>
<#macro dataPropertyList statements>
<#macro dataPropertyList statements showEditingLinks>
<#list statements as statement>
<@propertyListItem statement>${statement.value}</@propertyListItem>
<@propertyListItem statement showEditingLinks>${statement.value}</@propertyListItem>
</#list>
</#macro>
<#macro collatedObjectPropertyList property>
<#macro collatedObjectPropertyList property showEditingLinks>
<#assign subclasses = property.subclasses>
<#list subclasses?keys as subclass>
<li class="subclass">
<h3>${subclass?lower_case}</h3>
<ul class="subclass-property-list">
<@objectPropertyList subclasses[subclass] property.template />
<@objectPropertyList subclasses[subclass] property.template showEditingLinks />
</ul>
</li>
</#list>
</#macro>
<#macro simpleObjectPropertyList property>
<@objectPropertyList property.statements "propStatement-simple.ftl" />
<#macro simpleObjectPropertyList property showEditingLinks>
<@objectPropertyList property.statements "propStatement-simple.ftl" showEditingLinks />
</#macro>
<#macro objectPropertyList statements template>
<#macro objectPropertyList statements template showEditingLinks>
<#list statements as statement>
<@propertyListItem statement><#include "${template}"></@propertyListItem>
<@propertyListItem statement showEditingLinks><#include "${template}"></@propertyListItem>
</#list>
</#macro>
<#macro propertyListItem statement>
<#macro propertyListItem statement showEditingLinks>
<li role="listitem">
<@editLink statement />
<@deleteLink statement />
<@editingLinks statement showEditingLinks />
<#nested>
</li>
</#macro>
<#macro editingLinks statement showEditingLinks>
<#if showEditingLinks>
<@editLink statement />
<@deleteLink statement />
</#if>
</#macro>
<#macro editLink statement>
<#if editStatus.showEditingLinks>
<#local url = statement.editUrl>
<#if url?has_content>
<a href="${url}">edit</a>
</#if>
</#if>
</#macro>
<#macro deleteLink statement>
<#if editStatus.showEditingLinks>
<#local url = statement.deleteUrl>
<#if url?has_content>
<a href="${url}">delete</a>
</#if>
</#if>
</#macro>