Remove PropertyEditLink custom jsptag and associated files
This commit is contained in:
parent
6b26d43d00
commit
5021069574
4 changed files with 0 additions and 848 deletions
|
@ -1,48 +0,0 @@
|
|||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<!-- $This file is distributed under the terms of the license in /doc/license.txt$ -->
|
||||
<taglib
|
||||
xmlns="http://java.sun.com/xml/ns/j2ee"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
|
||||
version="2.0">
|
||||
|
||||
<display-name>Property Edit Link taglib</display-name>
|
||||
<tlib-version>1.0</tlib-version>
|
||||
|
||||
<short-name>Vitro Property Edit Link generator</short-name>
|
||||
<!--
|
||||
This library has tags that make A elements for editing
|
||||
ObjectPropertyStatement and DataPropertyStatements.
|
||||
-->
|
||||
|
||||
<tag>
|
||||
<name>editLinks</name>
|
||||
<display-name>Edit Links for Property</display-name>
|
||||
<description>
|
||||
Create the A elements for a specified Property.
|
||||
</description>
|
||||
<tag-class>edu.cornell.mannlib.vitro.webapp.web.jsptags.PropertyEditLinks</tag-class>
|
||||
<body-content>empty</body-content>
|
||||
<attribute>
|
||||
<name>item</name>
|
||||
<required>true</required>
|
||||
<rtexprvalue>true</rtexprvalue>
|
||||
</attribute>
|
||||
<attribute>
|
||||
<name>var</name>
|
||||
<required>false</required>
|
||||
<rtexprvalue>false</rtexprvalue>
|
||||
</attribute>
|
||||
<attribute>
|
||||
<name>icons</name>
|
||||
<required>false</required>
|
||||
<rtexprvalue>true</rtexprvalue>
|
||||
</attribute>
|
||||
<attribute>
|
||||
<name>data</name>
|
||||
<required>false</required>
|
||||
<rtexprvalue>true</rtexprvalue>
|
||||
</attribute>
|
||||
</tag>
|
||||
|
||||
</taglib>
|
|
@ -1456,11 +1456,6 @@
|
|||
<taglib-location>/WEB-INF/tlds/vitroForm.tld</taglib-location>
|
||||
</taglib>
|
||||
|
||||
<taglib>
|
||||
<taglib-uri>http://vitro.mannlib.cornell.edu/vitro/tags/PropertyEditLink</taglib-uri>
|
||||
<taglib-location>/WEB-INF/tlds/PropertyEditLink.tld</taglib-location>
|
||||
</taglib>
|
||||
|
||||
<taglib>
|
||||
<taglib-uri>http://mannlib.cornell.edu/vitro/ListSparqlTag/0.1/</taglib-uri>
|
||||
<taglib-location>/WEB-INF/tlds/ListSparqlTag.tld</taglib-location>
|
||||
|
|
|
@ -1,713 +0,0 @@
|
|||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||
|
||||
package edu.cornell.mannlib.vitro.webapp.web.jsptags;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.jsp.JspException;
|
||||
import javax.servlet.jsp.JspWriter;
|
||||
import javax.servlet.jsp.tagext.TagSupport;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import com.hp.hpl.jena.rdf.model.Model;
|
||||
import com.hp.hpl.jena.rdf.model.RDFNode;
|
||||
import com.hp.hpl.jena.rdf.model.StmtIterator;
|
||||
|
||||
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.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.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.RequestActionConstants;
|
||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.ifaces.RequestedAction;
|
||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AddDataPropStmt;
|
||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.AddObjectPropStmt;
|
||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.DropDataPropStmt;
|
||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.DropObjectPropStmt;
|
||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.EditDataPropStmt;
|
||||
import edu.cornell.mannlib.vitro.webapp.auth.requestedAction.propstmt.EditObjPropStmt;
|
||||
import edu.cornell.mannlib.vitro.webapp.beans.DataProperty;
|
||||
import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatement;
|
||||
import edu.cornell.mannlib.vitro.webapp.beans.DataPropertyStatementImpl;
|
||||
import edu.cornell.mannlib.vitro.webapp.beans.Individual;
|
||||
import edu.cornell.mannlib.vitro.webapp.beans.ObjectProperty;
|
||||
import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatement;
|
||||
import edu.cornell.mannlib.vitro.webapp.beans.ObjectPropertyStatementImpl;
|
||||
import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest;
|
||||
import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
|
||||
import edu.cornell.mannlib.vitro.webapp.edit.n3editing.RdfLiteralHash;
|
||||
import edu.cornell.mannlib.vitro.webapp.filestorage.model.ImageInfo;
|
||||
import edu.cornell.mannlib.vitro.webapp.utils.FrontEndEditingUtils;
|
||||
import edu.cornell.mannlib.vitro.webapp.utils.StringUtils;
|
||||
|
||||
/**
|
||||
* JSP tag to generate the HTML of links for edit, delete or
|
||||
* add of a Property.
|
||||
*
|
||||
* Maybe we should have a mode where it just sets a var to a
|
||||
* map with "href" = "edit/editDatapropDispatch.jsp?subjectUri=..." and "type" = "delete"
|
||||
*
|
||||
* @author bdc34
|
||||
*
|
||||
*/
|
||||
public class PropertyEditLinks extends TagSupport{
|
||||
Object item;
|
||||
String var;
|
||||
String icons;
|
||||
String data;
|
||||
|
||||
private static final Log log = LogFactory.getLog(PropertyEditLinks.class.getName());
|
||||
|
||||
public static final String ICON_DIR = "/images/edit_icons/";
|
||||
|
||||
public Object getItem() { return item; }
|
||||
public void setItem(Object item) { this.item = item; }
|
||||
|
||||
public String getVar(){ return var; }
|
||||
public void setVar(String var){ this.var = var; }
|
||||
|
||||
public void setIcons(String ic){ icons = ic; }
|
||||
public String getIcons(){ return icons; }
|
||||
|
||||
public void setData(String data){ this.data = data; }
|
||||
public String getData(){ return data; }
|
||||
|
||||
@Override
|
||||
public int doStartTag() throws JspException {
|
||||
if( item == null ) {
|
||||
log.error("item passed to <edLnk> tag is null");
|
||||
return SKIP_BODY;
|
||||
}
|
||||
|
||||
PolicyIface policy = RequestPolicyList.getPolicies((HttpServletRequest)pageContext.getRequest());
|
||||
|
||||
IdentifierBundle ids = RequestIdentifiers.getIdBundleForRequest(pageContext.getRequest());
|
||||
|
||||
Individual entity = (Individual)pageContext.getRequest().getAttribute("entity");
|
||||
LinkStruct[] links = null;
|
||||
|
||||
//get context prefix needs to end with a slash like "/vivo/" or "/"
|
||||
String contextPath = ((HttpServletRequest)pageContext.getRequest()).getContextPath();
|
||||
if( ! contextPath.endsWith("/") )
|
||||
contextPath = contextPath + "/";
|
||||
if( ! contextPath.startsWith("/") )
|
||||
contextPath = "/" + contextPath;
|
||||
|
||||
if( item instanceof ObjectPropertyStatement ){
|
||||
ObjectPropertyStatement ops = (ObjectPropertyStatement)item;
|
||||
ops = getObjectPropertyStatementForCustomLinks(ops);
|
||||
links = doObjPropStmt( ops, policyToAccess(ids, policy, ops), contextPath );
|
||||
|
||||
} else if( item instanceof DataPropertyStatement ){
|
||||
DataPropertyStatement prop = (DataPropertyStatement)item;
|
||||
links = doDataPropStmt( prop, policyToAccess(ids, policy, prop), contextPath );
|
||||
|
||||
} else if (entity == null) {
|
||||
log.error("unable to find an Individual in request using var name 'entity'");
|
||||
return SKIP_BODY;
|
||||
|
||||
} else if( item instanceof ObjectProperty ){
|
||||
ObjectProperty prop = (ObjectProperty)item;
|
||||
links = doObjProp( prop, entity, policyToAccess(ids, policy, entity.getURI(), prop), contextPath );
|
||||
|
||||
} else if( item instanceof DataProperty ){
|
||||
DataProperty prop = (DataProperty)item; // a DataProperty populated for this subject individual
|
||||
links = doDataProp( prop, entity, policyToAccess(ids, policy, entity.getURI(), prop),contextPath );
|
||||
|
||||
// Vitro namespace property
|
||||
} else if (item instanceof String) {
|
||||
String predicateUri = (String) item;
|
||||
String subjectUri = entity.getURI();
|
||||
if (FrontEndEditingUtils.isVitroNsDataProp(predicateUri)) {
|
||||
if (data == null) { // link to add a new value
|
||||
links = doVitroNsDataProp( subjectUri, predicateUri, policyToAccess(ids, policy, subjectUri, predicateUri), contextPath );
|
||||
} else { // links to edit or delete an existing value
|
||||
DataPropertyStatement dps = new DataPropertyStatementImpl(subjectUri, predicateUri, data);
|
||||
links = doVitroNsDataPropStmt( dps, entity, policyToAccess(ids, policy, dps), contextPath );
|
||||
}
|
||||
} else if (FrontEndEditingUtils.isVitroNsObjProp(predicateUri)) {
|
||||
if (data == null) { // link to add a new value
|
||||
links = doObjProp( subjectUri, predicateUri, policyToAccess(ids, policy, subjectUri, predicateUri), contextPath );
|
||||
} else { // links to edit or delete an existing value
|
||||
ObjectPropertyStatement prop = new ObjectPropertyStatementImpl(subjectUri, predicateUri, data);
|
||||
links = doObjPropStmt( prop, policyToAccess(ids, policy, prop), contextPath );
|
||||
}
|
||||
} else if (VitroVocabulary.IND_MAIN_IMAGE.equals(predicateUri)) {
|
||||
|
||||
links = doImageLinks(entity, ids, policy, contextPath);
|
||||
} else {
|
||||
log.error("PropertyEditLinks cannot make links for an object of type " + predicateUri);
|
||||
return SKIP_BODY;
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
log.error("PropertyEditLinks cannot make links for an object of type "+item.getClass().getName());
|
||||
return SKIP_BODY;
|
||||
}
|
||||
|
||||
if( getVar() != null ){
|
||||
pageContext.getRequest().setAttribute(getVar(), links);
|
||||
} else {
|
||||
try{
|
||||
JspWriter out = pageContext.getOut();
|
||||
if( links != null){
|
||||
for( LinkStruct ln : links ){
|
||||
if( ln != null ){
|
||||
out.print( ln.makeElement() + '\n' );
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch(IOException ioe){
|
||||
log.error( ioe );
|
||||
}
|
||||
}
|
||||
|
||||
return SKIP_BODY;
|
||||
}
|
||||
|
||||
private ObjectPropertyStatement getObjectPropertyStatementForCustomLinks(ObjectPropertyStatement ops) {
|
||||
// rjy7 Another ugly hack to support collation of authorships by publication subclasses
|
||||
// (NIHVIVO-1158). To display authorships this way, we've replaced the person-to-authorship
|
||||
// statements with authorship-to-publication statements. Now we have to hack the edit links
|
||||
// to edit the authorInAuthorship property statement rather than the linkedInformationResource
|
||||
// statement.
|
||||
String propertyUri = ops.getPropertyURI();
|
||||
if (propertyUri.equals("http://vivoweb.org/ontology/core#linkedInformationResource")) {
|
||||
String objectUri = ops.getSubjectURI();
|
||||
String predicateUri = "http://vivoweb.org/ontology/core#authorInAuthorship";
|
||||
String subjectUri = ((Individual)pageContext.getRequest().getAttribute("entity")).getURI();
|
||||
ops = new ObjectPropertyStatementImpl(subjectUri, predicateUri, objectUri);
|
||||
}
|
||||
return ops;
|
||||
}
|
||||
|
||||
protected LinkStruct[] doDataProp(DataProperty dprop, Individual entity, EditLinkAccess[] allowedAccessTypeArray, String contextPath) {
|
||||
if( allowedAccessTypeArray == null || dprop == null || allowedAccessTypeArray.length == 0 ) {
|
||||
log.debug("null or empty access type array in doDataProp for dprop "+dprop.getPublicName()+"; most likely just a property prohibited from editing");
|
||||
return empty_array;
|
||||
}
|
||||
LinkStruct[] links = new LinkStruct[1];
|
||||
|
||||
if (dprop.getDataPropertyStatements()!= null && dprop.getDisplayLimit()==1 && dprop.getDataPropertyStatements().size()>=1) {
|
||||
log.debug("not showing an \"add\" link for data property because it has a display limit of 1 (a hack until expose a choice to make the dataproperty functional)");
|
||||
} else {
|
||||
if( contains( allowedAccessTypeArray, EditLinkAccess.ADDNEW ) ){
|
||||
log.debug("data property "+dprop.getPublicName()+" gets an \"add\" link");
|
||||
String url = makeRelativeHref(contextPath + "edit/editDatapropStmtRequestDispatch.jsp",
|
||||
"subjectUri", entity.getURI(),
|
||||
"predicateUri", dprop.getURI());
|
||||
LinkStruct ls = new LinkStruct();
|
||||
ls.setHref( url );
|
||||
ls.setType("add");
|
||||
ls.setMouseoverText("add a new entry");
|
||||
links[0] = ls;
|
||||
} else {
|
||||
log.debug("no add link generated for property "+dprop.getPublicName());
|
||||
}
|
||||
}
|
||||
return links;
|
||||
}
|
||||
|
||||
protected LinkStruct[] doVitroNsDataProp(String subjectUri, String propertyUri, EditLinkAccess[] allowedAccessTypeArray, String contextPath) {
|
||||
if( allowedAccessTypeArray == null || subjectUri == null || allowedAccessTypeArray.length == 0 ) {
|
||||
log.debug("null or empty access type array in doDataProp for vitro namespace property " + propertyUri + "; most likely just a property prohibited from editing");
|
||||
return empty_array;
|
||||
}
|
||||
LinkStruct[] links = new LinkStruct[1];
|
||||
|
||||
Model model = (Model)pageContext.getServletContext().getAttribute("jenaOntModel");
|
||||
StmtIterator stmts = model.listStatements(model.createResource(subjectUri),
|
||||
model.getProperty(propertyUri),
|
||||
(RDFNode) null);
|
||||
|
||||
if (stmts.hasNext()) {
|
||||
log.debug("not showing an \"add\" link for vitro namespace property " + propertyUri + " because it has a limit of 1");
|
||||
} else {
|
||||
if( contains( allowedAccessTypeArray, EditLinkAccess.ADDNEW ) ){
|
||||
log.debug("vitro namespace property "+propertyUri+" gets an \"add\" link");
|
||||
LinkStruct ls = null;
|
||||
String url = makeRelativeHref(contextPath +"edit/editDatapropStmtRequestDispatch.jsp",
|
||||
"subjectUri", subjectUri,
|
||||
"predicateUri", propertyUri,
|
||||
"vitroNsProp", "true");
|
||||
ls = new LinkStruct();
|
||||
ls.setHref( url );
|
||||
ls.setType("add");
|
||||
ls.setMouseoverText("add a new entry");
|
||||
links[0] = ls;
|
||||
} else {
|
||||
log.debug("no add link generated for vitro namespace property "+propertyUri);
|
||||
}
|
||||
}
|
||||
return links;
|
||||
}
|
||||
|
||||
protected LinkStruct[] doObjProp(ObjectProperty oprop, Individual entity, EditLinkAccess[] allowedAccessTypeArray, String contextPath) {
|
||||
if( allowedAccessTypeArray == null || oprop == null || allowedAccessTypeArray.length == 0 ) {
|
||||
log.debug("null or empty access type array in doObjProp for oprop "+oprop.getDomainPublic()+"; most likely just a property prohibited from editing");
|
||||
return empty_array;
|
||||
}
|
||||
|
||||
return doObjProp(entity.getURI(), oprop.getURI(), allowedAccessTypeArray, contextPath);
|
||||
}
|
||||
|
||||
protected LinkStruct[] doObjProp(String subjectUri, String predicateUri, EditLinkAccess[] allowedAccessTypeArray, String contextPath) {
|
||||
if( allowedAccessTypeArray == null || subjectUri == null || allowedAccessTypeArray.length == 0 ) {
|
||||
log.debug("null or empty access type array in doObjProp for oprop "+ predicateUri +"; most likely just a property prohibited from editing");
|
||||
return empty_array;
|
||||
}
|
||||
LinkStruct[] links = new LinkStruct[1];
|
||||
|
||||
if( contains( allowedAccessTypeArray, EditLinkAccess.ADDNEW )){
|
||||
String url= makeRelativeHref(contextPath + "edit/editRequestDispatch.jsp",
|
||||
"subjectUri", subjectUri,
|
||||
"predicateUri", predicateUri);
|
||||
LinkStruct ls = new LinkStruct();
|
||||
ls.setHref( url );
|
||||
ls.setType("add");
|
||||
ls.setMouseoverText("add " + getObjPropMouseoverLabel(predicateUri));
|
||||
links[0]=ls;
|
||||
}
|
||||
return links;
|
||||
}
|
||||
|
||||
protected LinkStruct[] doDataPropStmt(DataPropertyStatement dpropStmt, EditLinkAccess[] allowedAccessTypeArray, String contextPath) {
|
||||
if( allowedAccessTypeArray == null || dpropStmt == null || allowedAccessTypeArray.length == 0 ) {
|
||||
log.debug("null or empty access type array in doDataPropStmt for "+dpropStmt.getDatapropURI());
|
||||
return empty_array;
|
||||
}
|
||||
LinkStruct[] links = new LinkStruct[2];
|
||||
int index=0;
|
||||
|
||||
String dpropHash = String.valueOf(RdfLiteralHash.makeRdfLiteralHash( dpropStmt ));
|
||||
|
||||
if( contains( allowedAccessTypeArray, EditLinkAccess.MODIFY ) ){
|
||||
log.debug("permission found to UPDATE data property statement "+dpropStmt.getDatapropURI()+" ("+dpropStmt.getData()+") so icon created");
|
||||
String url = ( contains( allowedAccessTypeArray, EditLinkAccess.DELETE ) )
|
||||
? makeRelativeHref(contextPath + "edit/editDatapropStmtRequestDispatch.jsp",
|
||||
"subjectUri", dpropStmt.getIndividualURI(),
|
||||
"predicateUri", dpropStmt.getDatapropURI(),
|
||||
"datapropKey", dpropHash)
|
||||
: makeRelativeHref(contextPath + "edit/editDatapropStmtRequestDispatch.jsp",
|
||||
"subjectUri", dpropStmt.getIndividualURI(),
|
||||
"predicateUri", dpropStmt.getDatapropURI(),
|
||||
"datapropKey", dpropHash,
|
||||
"deleteProhibited", "prohibited");
|
||||
LinkStruct ls = new LinkStruct();
|
||||
ls.setHref( url );
|
||||
ls.setType("edit");
|
||||
ls.setMouseoverText("edit this text");
|
||||
links[index] = ls; index++;
|
||||
|
||||
} else {
|
||||
log.debug("NO permission to UPDATE this data property statement ("+dpropStmt.getDatapropURI()+") found in policy");
|
||||
}
|
||||
if( contains( allowedAccessTypeArray, EditLinkAccess.DELETE ) ){
|
||||
log.debug("permission found to DELETE data property statement "+dpropStmt.getDatapropURI()+" so icon created");
|
||||
String url = makeRelativeHref(contextPath + "edit/editDatapropStmtRequestDispatch.jsp",
|
||||
"subjectUri", dpropStmt.getIndividualURI(),
|
||||
"predicateUri", dpropStmt.getDatapropURI(),
|
||||
"datapropKey", dpropHash,
|
||||
"cmd", "delete");
|
||||
LinkStruct ls = new LinkStruct();
|
||||
ls.setHref( url );
|
||||
ls.setType("delete");
|
||||
ls.setMouseoverText("delete this text");
|
||||
links[index] = ls; index++;
|
||||
|
||||
} else {
|
||||
log.debug("NO permission to DELETE this data property statement ("+dpropStmt.getDatapropURI()+") found in policy");
|
||||
}
|
||||
return links;
|
||||
}
|
||||
|
||||
protected LinkStruct[] doVitroNsDataPropStmt(DataPropertyStatement dpropStmt, Individual subject, EditLinkAccess[] allowedAccessTypeArray, String contextPath) {
|
||||
|
||||
if( allowedAccessTypeArray == null || dpropStmt == null || allowedAccessTypeArray.length == 0 ) {
|
||||
log.debug("Null or empty access type array for vitro namespace property " + dpropStmt.getDatapropURI());
|
||||
return empty_array;
|
||||
}
|
||||
|
||||
String subjectUri = subject.getURI();
|
||||
String predicateUri = dpropStmt.getDatapropURI();
|
||||
|
||||
LinkStruct[] links = new LinkStruct[2];
|
||||
|
||||
String value = dpropStmt.getData();
|
||||
Model model = (Model)pageContext.getServletContext().getAttribute("jenaOntModel");
|
||||
|
||||
String dpropHash = null;
|
||||
try{
|
||||
dpropHash = String.valueOf(RdfLiteralHash.makeVitroNsLiteralHash( subject, predicateUri, value, model ));
|
||||
}catch(IllegalArgumentException ex){
|
||||
log.debug("could not create hash for " + subject + " " + predicateUri + " " + value);
|
||||
return links;
|
||||
}
|
||||
|
||||
String dispatchUrl = contextPath + "edit/editDatapropStmtRequestDispatch.jsp";
|
||||
|
||||
int index = 0;
|
||||
|
||||
boolean deleteAllowed = ( contains( allowedAccessTypeArray, EditLinkAccess.DELETE ) &&
|
||||
!( predicateUri.equals(VitroVocabulary.LABEL)) || predicateUri.equals(VitroVocabulary.RDF_TYPE) );
|
||||
|
||||
if( contains( allowedAccessTypeArray, EditLinkAccess.MODIFY ) ){
|
||||
log.debug("permission found to UPDATE vitro namepsace property statement "+ predicateUri);
|
||||
LinkStruct ls = new LinkStruct();
|
||||
String url = deleteAllowed
|
||||
? makeRelativeHref(dispatchUrl,
|
||||
"subjectUri", subjectUri,
|
||||
"predicateUri", predicateUri,
|
||||
"datapropKey", dpropHash,
|
||||
"vitroNsProp", "true")
|
||||
: makeRelativeHref(dispatchUrl,
|
||||
"subjectUri", subjectUri,
|
||||
"predicateUri", predicateUri,
|
||||
"datapropKey", dpropHash,
|
||||
"vitroNsProp", "true",
|
||||
"deleteProhibited", "prohibited");
|
||||
|
||||
ls.setHref(url);
|
||||
ls.setType("edit");
|
||||
ls.setMouseoverText(predicateUri.equals("label") ? "edit name" : "edit this text");
|
||||
links[index] = ls;
|
||||
index++;
|
||||
}
|
||||
else {
|
||||
log.debug("NO permission found to UPDATE vitro namespace property " + predicateUri);
|
||||
}
|
||||
|
||||
// Name and type can be edited but not deleted
|
||||
if ( deleteAllowed ) {
|
||||
LinkStruct ls = new LinkStruct();
|
||||
log.debug("Permission found to DELETE vitro namespace property " + predicateUri);
|
||||
String url = makeRelativeHref(dispatchUrl,
|
||||
"subjectUri", subjectUri,
|
||||
"predicateUri", predicateUri,
|
||||
"datapropKey", dpropHash,
|
||||
"vitroNsProp", "true",
|
||||
"cmd", "delete");
|
||||
ls.setHref(url);
|
||||
ls.setType("delete");
|
||||
ls.setMouseoverText("delete this text");
|
||||
links[index] = ls;
|
||||
index++;
|
||||
}
|
||||
else {
|
||||
log.debug("NO permission found to DELETE vitro namespace property " + predicateUri);
|
||||
}
|
||||
|
||||
return links;
|
||||
}
|
||||
|
||||
protected LinkStruct[] doObjPropStmt(ObjectPropertyStatement opropStmt, EditLinkAccess[] allowedAccessTypeArray, String contextPath) {
|
||||
if( allowedAccessTypeArray == null || opropStmt == null || allowedAccessTypeArray.length == 0 ) {
|
||||
log.debug("null or empty access type array in doObjPropStmt for "+opropStmt.getPropertyURI());
|
||||
return empty_array;
|
||||
}
|
||||
|
||||
String subjectUri = opropStmt.getSubjectURI();
|
||||
String predicateUri = opropStmt.getPropertyURI();
|
||||
String objectUri = opropStmt.getObjectURI();
|
||||
|
||||
String mouseoverLabel = getObjPropMouseoverLabel(predicateUri);
|
||||
|
||||
LinkStruct[] links = new LinkStruct[2];
|
||||
int index=0;
|
||||
|
||||
if( contains( allowedAccessTypeArray, EditLinkAccess.MODIFY ) ){
|
||||
log.debug("permission found to UPDATE object property statement "+ predicateUri +" so icon created");
|
||||
String url = ( contains( allowedAccessTypeArray, EditLinkAccess.DELETE ) )
|
||||
? makeRelativeHref(contextPath + "edit/editRequestDispatch.jsp",
|
||||
"subjectUri", subjectUri,
|
||||
"predicateUri", predicateUri,
|
||||
"objectUri", objectUri)
|
||||
: makeRelativeHref(contextPath + "edit/editRequestDispatch.jsp",
|
||||
"subjectUri", subjectUri,
|
||||
"predicateUri", predicateUri,
|
||||
"objectUri", objectUri,
|
||||
"deleteProhibited", "prohibited");
|
||||
|
||||
LinkStruct ls = new LinkStruct();
|
||||
ls.setHref( url );
|
||||
ls.setType("edit");
|
||||
ls.setMouseoverText("change this " + mouseoverLabel);
|
||||
links[index] = ls; index++;
|
||||
|
||||
} else {
|
||||
log.debug("NO permission to UPDATE this object property statement (" + predicateUri + ") found in policy");
|
||||
}
|
||||
if( contains( allowedAccessTypeArray, EditLinkAccess.DELETE ) ){
|
||||
log.debug("permission found to DELETE object property statement "+ predicateUri + " so icon created");
|
||||
String url = makeRelativeHref(contextPath + "edit/editRequestDispatch.jsp",
|
||||
"subjectUri", subjectUri,
|
||||
"predicateUri", predicateUri,
|
||||
"objectUri", objectUri,
|
||||
"cmd", "delete");
|
||||
LinkStruct ls = new LinkStruct();
|
||||
ls.setHref( url );
|
||||
ls.setType("delete");
|
||||
ls.setMouseoverText("delete this " + mouseoverLabel);
|
||||
links[index] = ls; index++;
|
||||
|
||||
} else {
|
||||
log.debug("NO permission to DELETE this object property statement (" + predicateUri + ") found in policy");
|
||||
}
|
||||
return links;
|
||||
}
|
||||
|
||||
protected LinkStruct[] doImageLinks(Individual entity,
|
||||
IdentifierBundle ids, PolicyIface policy, String contextPath) {
|
||||
VitroRequest vreq = new VitroRequest((HttpServletRequest) pageContext
|
||||
.getRequest());
|
||||
ImageInfo imageInfo = ImageInfo.instanceFromEntityUri(vreq
|
||||
.getFullWebappDaoFactory(), entity);
|
||||
|
||||
String subjectUri = entity.getURI();
|
||||
String predicateUri = VitroVocabulary.IND_MAIN_IMAGE;
|
||||
|
||||
if (imageInfo == null) {
|
||||
EditLinkAccess[] accesses = policyToAccess(ids, policy, subjectUri,
|
||||
predicateUri);
|
||||
|
||||
if (contains(accesses, EditLinkAccess.ADDNEW)) {
|
||||
log.debug("permission to ADD main image to " + subjectUri);
|
||||
boolean isPerson = entity
|
||||
.isVClass("http://xmlns.com/foaf/0.1/Person");
|
||||
if (isPerson) {
|
||||
return new LinkStruct[] { getImageLink(subjectUri,
|
||||
contextPath, "edit", "upload an image", "add") };
|
||||
} else {
|
||||
return new LinkStruct[] { getImageLink(subjectUri,
|
||||
contextPath, "add", "upload an image", "add") };
|
||||
}
|
||||
} else {
|
||||
log.debug("NO permission to ADD main image to " + subjectUri);
|
||||
return empty_array;
|
||||
}
|
||||
} else {
|
||||
ObjectPropertyStatement prop = new ObjectPropertyStatementImpl(
|
||||
subjectUri, predicateUri, imageInfo.getMainImage().getUri());
|
||||
EditLinkAccess[] allowedAccessTypeArray = policyToAccess(ids,
|
||||
policy, prop);
|
||||
|
||||
List<LinkStruct> links = new ArrayList<LinkStruct>();
|
||||
if (contains(allowedAccessTypeArray, EditLinkAccess.MODIFY)) {
|
||||
log.debug("permission to MODIFY main image to " + subjectUri);
|
||||
links.add(getImageLink(subjectUri, contextPath, "edit",
|
||||
"replace this image", "edit"));
|
||||
} else {
|
||||
log.debug("NO permission to MODIFY main image to "
|
||||
+ subjectUri);
|
||||
}
|
||||
|
||||
if (contains(allowedAccessTypeArray, EditLinkAccess.DELETE)) {
|
||||
log.debug("permission to DELETE main image to " + subjectUri);
|
||||
links.add(getImageLink(subjectUri, contextPath, "delete",
|
||||
"delete this image", "delete"));
|
||||
} else {
|
||||
log.debug("NO permission to DELETE main image to "
|
||||
+ subjectUri);
|
||||
}
|
||||
return links.toArray(new LinkStruct[links.size()]);
|
||||
}
|
||||
}
|
||||
|
||||
/* ********************* utility methods ********************************* */
|
||||
protected static String makeRelativeHref( String baseUrl, String ... queries ) {
|
||||
String href = baseUrl;
|
||||
if( queries == null || queries.length % 2 != 0 )
|
||||
log.debug("makeRelativeHref() needs an even number of queries");
|
||||
|
||||
for( int i=0; i < queries.length; i=i+2){
|
||||
String separator = ( i==0 ? "?" : "&" );
|
||||
try {
|
||||
href = href + separator + URLEncoder.encode(queries[i], "UTF-8") + '=' + URLEncoder.encode(queries[i+1],"UTF-8");
|
||||
} catch (UnsupportedEncodingException e) { log.error( e ); }
|
||||
}
|
||||
return href;
|
||||
}
|
||||
|
||||
protected static boolean contains(EditLinkAccess[] allowedAccessTypeArray, EditLinkAccess accessType) {
|
||||
if( allowedAccessTypeArray == null || allowedAccessTypeArray.length == 0 || accessType == null )
|
||||
return false;
|
||||
|
||||
for( int i=0; i< allowedAccessTypeArray.length ; i ++ ){
|
||||
if( allowedAccessTypeArray[i] == accessType ) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static final EditLinkAccess[] NO_ACCESS = {};
|
||||
public static final EditLinkAccess[] ACCESS_TEMPLATE = {};
|
||||
|
||||
protected EditLinkAccess[] policyToAccess( IdentifierBundle ids, PolicyIface policy, String subjectUri, ObjectProperty item){
|
||||
EditLinkAccess[] allowedAccessTypeArray;
|
||||
|
||||
RequestedAction action = new AddObjectPropStmt(subjectUri, item.getURI(), RequestActionConstants.SOME_URI);
|
||||
PolicyDecision dec = policy.isAuthorized(ids, action);
|
||||
|
||||
if( dec != null && dec.getAuthorized() == Authorization.AUTHORIZED ){
|
||||
allowedAccessTypeArray = new EditLinkAccess[1];
|
||||
allowedAccessTypeArray[0] = EditLinkAccess.ADDNEW;
|
||||
}else
|
||||
allowedAccessTypeArray = NO_ACCESS;
|
||||
|
||||
return allowedAccessTypeArray;
|
||||
}
|
||||
|
||||
protected EditLinkAccess[] policyToAccess( IdentifierBundle ids, PolicyIface policy, ObjectPropertyStatement item){
|
||||
ArrayList<EditLinkAccess> list = new ArrayList<EditLinkAccess>(2);
|
||||
|
||||
RequestedAction action = new EditObjPropStmt( item );
|
||||
PolicyDecision dec = policy.isAuthorized(ids, action);
|
||||
if( dec != null && dec.getAuthorized() == Authorization.AUTHORIZED ){
|
||||
list.add( EditLinkAccess.MODIFY);
|
||||
}
|
||||
|
||||
action = new DropObjectPropStmt(item.getSubjectURI(), item.getPropertyURI(), item.getObjectURI());
|
||||
dec = policy.isAuthorized(ids, action);
|
||||
if( dec != null && dec.getAuthorized() == Authorization.AUTHORIZED ){
|
||||
list.add( EditLinkAccess.DELETE );
|
||||
}
|
||||
return list.toArray(ACCESS_TEMPLATE);
|
||||
}
|
||||
|
||||
protected EditLinkAccess[] policyToAccess( IdentifierBundle ids, PolicyIface policy, DataPropertyStatement item) {
|
||||
ArrayList<EditLinkAccess> list = new ArrayList<EditLinkAccess>(2);
|
||||
|
||||
RequestedAction action = new EditDataPropStmt( item );
|
||||
PolicyDecision dec = policy.isAuthorized(ids, action);
|
||||
if( dec != null && dec.getAuthorized() == Authorization.AUTHORIZED ){
|
||||
list.add( EditLinkAccess.MODIFY);
|
||||
}
|
||||
|
||||
action = new DropDataPropStmt( item );
|
||||
dec = policy.isAuthorized(ids, action);
|
||||
if( dec != null && dec.getAuthorized() == Authorization.AUTHORIZED ){
|
||||
list.add( EditLinkAccess.DELETE );
|
||||
}
|
||||
return list.toArray(ACCESS_TEMPLATE);
|
||||
}
|
||||
|
||||
protected EditLinkAccess[] policyToAccess( IdentifierBundle ids, PolicyIface policy, String subjectUri, DataProperty item) {
|
||||
|
||||
String propertyUri = item.getURI();
|
||||
return policyToAccess(ids, policy, subjectUri, propertyUri);
|
||||
}
|
||||
|
||||
protected EditLinkAccess[] policyToAccess( IdentifierBundle ids, PolicyIface policy, String subjectUri, String propertyUri) {
|
||||
|
||||
EditLinkAccess[] access;
|
||||
|
||||
RequestedAction action = new AddDataPropStmt(subjectUri, propertyUri, RequestActionConstants.SOME_LITERAL, null, null);
|
||||
PolicyDecision dec = policy.isAuthorized(ids, action);
|
||||
|
||||
if( dec != null && dec.getAuthorized() == Authorization.AUTHORIZED ){
|
||||
access = new EditLinkAccess[1];
|
||||
access[0] = EditLinkAccess.ADDNEW;
|
||||
}else
|
||||
access = NO_ACCESS;
|
||||
|
||||
return access;
|
||||
}
|
||||
|
||||
public enum EditLinkAccess{ MODIFY, DELETE, ADDNEW, INFO, ADMIN }
|
||||
|
||||
public class LinkStruct {
|
||||
String href;
|
||||
String type;
|
||||
String mouseoverText;
|
||||
|
||||
public void setHref(String href) {
|
||||
this.href = href;
|
||||
}
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
public void setMouseoverText(String s) {
|
||||
mouseoverText = s;
|
||||
}
|
||||
|
||||
public String makeElement(){
|
||||
String element =
|
||||
"<a class=\"image " + type + "\" href=\"" + href +
|
||||
"\" title=\"" + (mouseoverText==null ? type : mouseoverText) + "\">" ;
|
||||
|
||||
if( "true".equalsIgnoreCase(getIcons()) ){
|
||||
String contextPath=((HttpServletRequest)pageContext.getRequest()).getContextPath();
|
||||
String imagePath=null;
|
||||
if (contextPath==null) {
|
||||
imagePath = ICON_DIR + type + ".gif";
|
||||
log.debug("image path when context path null: \""+imagePath+"\".");
|
||||
} else if (contextPath.equals("")) {
|
||||
imagePath = ICON_DIR + type + ".gif";
|
||||
log.debug("image path when context path blank: \""+imagePath+"\".");
|
||||
} else {
|
||||
imagePath = contextPath + ICON_DIR + type + ".gif";
|
||||
log.debug("image path when non-zero context path (\""+contextPath+"\"): \""+imagePath+"\".");
|
||||
}
|
||||
element += "<img src=\"" + imagePath+ "\" alt=\"" + type + "\"/>";
|
||||
} else {
|
||||
element += type ;
|
||||
}
|
||||
return element + "</a>\n";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class ImageLinkStruct extends LinkStruct {
|
||||
String text;
|
||||
|
||||
public void setText(String text) {
|
||||
this.text = text;
|
||||
}
|
||||
|
||||
// Only a "delete" link gets the "thumbnail" class.
|
||||
// TODO Make this cleaner.
|
||||
public String makeElement() {
|
||||
String element = "<a class=\"image "
|
||||
+ ("delete".equals(type) ? "thumbnail delete" : type)
|
||||
+ "\" href=\"" + href + "\"";
|
||||
element += " title=\"" + mouseoverText + "\">";
|
||||
element += text;
|
||||
element += "</a>\n";
|
||||
return element;
|
||||
}
|
||||
}
|
||||
|
||||
private LinkStruct[] empty_array = {};
|
||||
|
||||
private LinkStruct getImageLink(String subjectUri, String contextPath,
|
||||
String action, String mouseOverText, String text) {
|
||||
ImageLinkStruct ls = new ImageLinkStruct();
|
||||
ls.setHref(makeRelativeHref(contextPath + "uploadImages", "entityUri",
|
||||
subjectUri, "action", action));
|
||||
ls.setType(action);
|
||||
ls.setMouseoverText(mouseOverText);
|
||||
ls.setText(text);
|
||||
return ls;
|
||||
}
|
||||
|
||||
private String getObjPropMouseoverLabel(String propertyUri) {
|
||||
String mouseoverText = "relationship"; // default
|
||||
|
||||
if (StringUtils.equalsOneOf(propertyUri, VitroVocabulary.ADDITIONAL_LINK, VitroVocabulary.PRIMARY_LINK)) {
|
||||
mouseoverText = "link";
|
||||
}
|
||||
|
||||
return mouseoverText;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||
|
||||
package edu.cornell.mannlib.vitro.webapp.web.jsptags;
|
||||
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
import edu.cornell.mannlib.vitro.webapp.web.jsptags.PropertyEditLinks.EditLinkAccess;
|
||||
|
||||
public class PropertyEditLinksTest {
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void testDoDataProp() {
|
||||
fail("Not yet implemented");
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void testDoObjProp() {
|
||||
fail("Not yet implemented");
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void testDoDataPropStmt() {
|
||||
fail("Not yet implemented");
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void testDoObjPropStmt() {
|
||||
fail("Not yet implemented");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMakeRelativeHrefStringStringArray() {
|
||||
Assert.assertEquals("base?bob=true", PropertyEditLinks.makeRelativeHref("base","bob","true"));
|
||||
Assert.assertEquals("base?bob=true+enough", PropertyEditLinks.makeRelativeHref("base","bob","true enough"));
|
||||
Assert.assertEquals("base?bob=where+did+you+go%3F",PropertyEditLinks.makeRelativeHref("base","bob","where did you go?"));
|
||||
|
||||
Assert.assertEquals("base?bob=true&hank=false",
|
||||
PropertyEditLinks.makeRelativeHref("base","bob","true","hank","false"));
|
||||
|
||||
Assert.assertEquals("base?bob=true&hank=he%27s+great+and+all&sue=%26%24%24%25%5E%40%40%40%09%40%24%5E%25+",PropertyEditLinks.makeRelativeHref("base","bob","true","hank","he's great and all", "sue","&$$%^@@@\t@$^% "));
|
||||
Assert.assertEquals("base/hats/gloves.jsp?bob=true",PropertyEditLinks.makeRelativeHref("base/hats/gloves.jsp","bob","true"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void unescapedUrl(){
|
||||
Assert.assertEquals(
|
||||
"edit/editRequestDispatch.jsp?subjectUri=http%3A%2F%2Fvivo.library.cornell.edu%2Fns%2F0.1%23CarusoBrian&predicateUri=http%3A%2F%2Fvivo.library.cornell.edu%2Fns%2F0.1%23isActivityAdvisorFor&defaultForm=true",
|
||||
PropertyEditLinks.makeRelativeHref(
|
||||
"edit/editRequestDispatch.jsp",
|
||||
"subjectUri" ,
|
||||
"http://vivo.library.cornell.edu/ns/0.1#CarusoBrian",
|
||||
"predicateUri" ,
|
||||
"http://vivo.library.cornell.edu/ns/0.1#isActivityAdvisorFor",
|
||||
"defaultForm" ,
|
||||
"true"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testContains() {
|
||||
EditLinkAccess[] access = {EditLinkAccess.ADDNEW , EditLinkAccess.MODIFY };
|
||||
Assert.assertTrue(PropertyEditLinks.contains(access, EditLinkAccess.ADDNEW));
|
||||
Assert.assertTrue(PropertyEditLinks.contains(access, EditLinkAccess.MODIFY));
|
||||
Assert.assertTrue( ! PropertyEditLinks.contains(access, EditLinkAccess.DELETE));
|
||||
Assert.assertTrue( ! PropertyEditLinks.contains(access, null));
|
||||
Assert.assertTrue( ! PropertyEditLinks.contains(null , EditLinkAccess.MODIFY));
|
||||
Assert.assertTrue( ! PropertyEditLinks.contains(null, null));
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue