NIHVIVO-144 Enable adding new primary or additional link from front end

This commit is contained in:
rjy7 2010-03-24 21:41:33 +00:00
parent 6a6a9de920
commit 7f3ba68290
8 changed files with 386 additions and 102 deletions

View file

@ -12,17 +12,21 @@ import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary;
public class FrontEndEditingUtils {
public static final List<String> VITRO_NS_PROPS_FOR_FRONT_END_EDITING = Arrays.asList(VitroVocabulary.BLURB,
public static final List<String> VITRO_NS_DATAPROPS = Arrays.asList(VitroVocabulary.BLURB,
VitroVocabulary.CITATION,
VitroVocabulary.DESCRIPTION,
VitroVocabulary.IMAGETHUMB,
VitroVocabulary.LABEL,
VitroVocabulary.LINK_ANCHOR,
VitroVocabulary.MONIKER,
VitroVocabulary.PRIMARY_LINK
//, RDF_TYPE, TIMEKEY
VitroVocabulary.MONIKER
// VitroVocabulary.RDF_TYPE,
// VitroVocabulary.TIMEKEY
);
public static final List<String> VITRO_NS_OBJECT_PROPS = Arrays.asList(VitroVocabulary.ADDITIONAL_LINK,
VitroVocabulary.PRIMARY_LINK
);
public static String getVitroNsPropDatatypeUri(String propName) {
//Resource datatype = propName == TIMEKEY ? XSD.dateTime : XSD.xstring;
//return datatype.getURI();

View file

@ -107,7 +107,6 @@ public class PropertyEditLinks extends TagSupport{
Individual entity = (Individual)pageContext.getRequest().getAttribute("entity");
LinkStruct[] links = null;
String themeDir = (String)pageContext.getAttribute("themeDir");
//get context prefix needs to end with a slash like "/vivo/" or "/"
String contextPath = ((HttpServletRequest)pageContext.getRequest()).getContextPath();
@ -118,27 +117,45 @@ public class PropertyEditLinks extends TagSupport{
if( item instanceof ObjectPropertyStatement ){
ObjectPropertyStatement prop = (ObjectPropertyStatement)item;
links = doObjPropStmt( prop, themeDir, policyToAccess(ids, policy, prop), contextPath );
links = doObjPropStmt( prop, policyToAccess(ids, policy, prop), contextPath );
} else if( item instanceof DataPropertyStatement ){
DataPropertyStatement prop = (DataPropertyStatement)item;
links = doDataPropStmt( prop, themeDir, policyToAccess(ids, policy, prop), contextPath );
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, themeDir, policyToAccess(ids, policy, entity.getURI(), prop), contextPath );
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, themeDir,policyToAccess(ids, policy, entity.getURI(), prop), contextPath ) ;
} else if (item instanceof String && isVitroNsProp((String) item)) {
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 (data != null) { // links to edit or delete an existing value
DataPropertyStatement dps = (DataPropertyStatement) new DataPropertyStatementImpl(subjectUri, (String)item, data);
links = doVitroNamespacePropStmt( dps, entity, themeDir, policyToAccess(ids, policy, dps), contextPath );
} else { // link to add a new value
links = doVitroNsProp( subjectUri, (String)item, themeDir, policyToAccess(ids, policy, subjectUri, (String)item), contextPath ) ;
if (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 = (DataPropertyStatement) new DataPropertyStatementImpl(subjectUri, predicateUri, data);
links = doVitroNsDataPropStmt( dps, entity, policyToAccess(ids, policy, dps), contextPath );
}
} else if (isVitroNsObjectProp(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
DataPropertyStatement dps = (DataPropertyStatement) new DataPropertyStatementImpl(subjectUri, predicateUri, data);
//links = doVitroNsObjPropStmt( dps, entity, policyToAccess(ids, policy, dps), 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;
@ -164,7 +181,7 @@ public class PropertyEditLinks extends TagSupport{
return SKIP_BODY;
}
protected LinkStruct[] doDataProp(DataProperty dprop, Individual entity, String themeDir, EditLinkAccess[] allowedAccessTypeArray, String contextPath) {
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;
@ -191,7 +208,7 @@ public class PropertyEditLinks extends TagSupport{
return links;
}
protected LinkStruct[] doVitroNsProp(String subjectUri, String propertyUri, String themeDir, EditLinkAccess[] allowedAccessTypeArray, String contextPath) {
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;
@ -229,18 +246,29 @@ public class PropertyEditLinks extends TagSupport{
return links;
}
protected LinkStruct[] doObjProp(ObjectProperty oprop, Individual entity, String themeDir, EditLinkAccess[] allowedAccessTypeArray, String contextPath) {
// Used for ontology object properties
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);
}
// Used for Vitro namespace object properties
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", entity.getURI(),
"predicateUri", oprop.getURI());
"subjectUri", subjectUri,
"predicateUri", predicateUri);
LinkStruct ls = new LinkStruct();
ls.setHref( url );
ls.setType("add");
@ -250,7 +278,7 @@ public class PropertyEditLinks extends TagSupport{
return links;
}
protected LinkStruct[] doDataPropStmt(DataPropertyStatement dpropStmt, String themeDir, EditLinkAccess[] allowedAccessTypeArray, String contextPath) {
protected LinkStruct[] doDataPropStmt(DataPropertyStatement dpropStmt, EditLinkAccess[] allowedAccessTypeArray, String contextPath) {
if( allowedAccessTypeArray == null || dpropStmt == null || allowedAccessTypeArray.length == 0 ) {
log.info("null or empty access type array in doDataPropStmt for "+dpropStmt.getDatapropURI());
return empty_array;
@ -300,56 +328,7 @@ public class PropertyEditLinks extends TagSupport{
return links;
}
protected LinkStruct[] doObjPropStmt(ObjectPropertyStatement opropStmt, String themeDir2, EditLinkAccess[] allowedAccessTypeArray, String contextPath) {
if( allowedAccessTypeArray == null || opropStmt == null || allowedAccessTypeArray.length == 0 ) {
log.info("null or empty access type array in doObjPropStmt for "+opropStmt.getPropertyURI());
return empty_array;
}
LinkStruct[] links = new LinkStruct[2];
int index=0;
if( contains( allowedAccessTypeArray, EditLinkAccess.MODIFY ) ){
log.debug("permission found to UPDATE object property statement "+opropStmt.getPropertyURI()+" so icon created");
String url = ( contains( allowedAccessTypeArray, EditLinkAccess.DELETE ) )
? makeRelativeHref(contextPath + "edit/editRequestDispatch.jsp",
"subjectUri", opropStmt.getSubjectURI(),
"predicateUri", opropStmt.getPropertyURI(),
"objectUri", opropStmt.getObjectURI())
: makeRelativeHref(contextPath + "edit/editRequestDispatch.jsp",
"subjectUri", opropStmt.getSubjectURI(),
"predicateUri", opropStmt.getPropertyURI(),
"objectUri", opropStmt.getObjectURI(),
"deleteProhibited", "prohibited");
LinkStruct ls = new LinkStruct();
ls.setHref( url );
ls.setType("edit");
ls.setMouseoverText("change this relationship");
links[index] = ls; index++;
} else {
log.debug("NO permission to UPDATE this object property statement ("+opropStmt.getPropertyURI()+") found in policy");
}
if( contains( allowedAccessTypeArray, EditLinkAccess.DELETE ) ){
log.debug("permission found to DELETE object property statement "+opropStmt.getPropertyURI()+" so icon created");
String url = makeRelativeHref(contextPath + "edit/editRequestDispatch.jsp",
"subjectUri", opropStmt.getSubjectURI(),
"predicateUri", opropStmt.getPropertyURI(),
"objectUri", opropStmt.getObjectURI(),
"cmd", "delete");
LinkStruct ls = new LinkStruct();
ls.setHref( url );
ls.setType("delete");
ls.setMouseoverText("delete this relationship");
links[index] = ls; index++;
} else {
log.debug("NO permission to DELETE this object property statement ("+opropStmt.getPropertyURI()+") found in policy");
}
return links;
}
protected LinkStruct[] doVitroNamespacePropStmt(DataPropertyStatement dpropStmt, Individual subject, String themeDir, EditLinkAccess[] allowedAccessTypeArray, String contextPath) {
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());
@ -432,6 +411,105 @@ public class PropertyEditLinks extends TagSupport{
return links;
}
protected LinkStruct[] doObjPropStmt(ObjectPropertyStatement opropStmt, EditLinkAccess[] allowedAccessTypeArray, String contextPath) {
if( allowedAccessTypeArray == null || opropStmt == null || allowedAccessTypeArray.length == 0 ) {
log.info("null or empty access type array in doObjPropStmt for "+opropStmt.getPropertyURI());
return empty_array;
}
LinkStruct[] links = new LinkStruct[2];
int index=0;
if( contains( allowedAccessTypeArray, EditLinkAccess.MODIFY ) ){
log.debug("permission found to UPDATE object property statement "+opropStmt.getPropertyURI()+" so icon created");
String url = ( contains( allowedAccessTypeArray, EditLinkAccess.DELETE ) )
? makeRelativeHref(contextPath + "edit/editRequestDispatch.jsp",
"subjectUri", opropStmt.getSubjectURI(),
"predicateUri", opropStmt.getPropertyURI(),
"objectUri", opropStmt.getObjectURI())
: makeRelativeHref(contextPath + "edit/editRequestDispatch.jsp",
"subjectUri", opropStmt.getSubjectURI(),
"predicateUri", opropStmt.getPropertyURI(),
"objectUri", opropStmt.getObjectURI(),
"deleteProhibited", "prohibited");
LinkStruct ls = new LinkStruct();
ls.setHref( url );
ls.setType("edit");
ls.setMouseoverText("change this relationship");
links[index] = ls; index++;
} else {
log.debug("NO permission to UPDATE this object property statement ("+opropStmt.getPropertyURI()+") found in policy");
}
if( contains( allowedAccessTypeArray, EditLinkAccess.DELETE ) ){
log.debug("permission found to DELETE object property statement "+opropStmt.getPropertyURI()+" so icon created");
String url = makeRelativeHref(contextPath + "edit/editRequestDispatch.jsp",
"subjectUri", opropStmt.getSubjectURI(),
"predicateUri", opropStmt.getPropertyURI(),
"objectUri", opropStmt.getObjectURI(),
"cmd", "delete");
LinkStruct ls = new LinkStruct();
ls.setHref( url );
ls.setType("delete");
ls.setMouseoverText("delete this relationship");
links[index] = ls; index++;
} else {
log.debug("NO permission to DELETE this object property statement ("+opropStmt.getPropertyURI()+") found in policy");
}
return links;
}
// protected LinkStruct[] doObjPropStmt(ObjectPropertyStatement opropStmt, EditLinkAccess[] allowedAccessTypeArray, String contextPath) {
// if( allowedAccessTypeArray == null || opropStmt == null || allowedAccessTypeArray.length == 0 ) {
// log.info("null or empty access type array in doObjPropStmt for "+opropStmt.getPropertyURI());
// return empty_array;
// }
// LinkStruct[] links = new LinkStruct[2];
// int index=0;
//
// if( contains( allowedAccessTypeArray, EditLinkAccess.MODIFY ) ){
// log.debug("permission found to UPDATE object property statement "+opropStmt.getPropertyURI()+" so icon created");
// String url = ( contains( allowedAccessTypeArray, EditLinkAccess.DELETE ) )
// ? makeRelativeHref(contextPath + "edit/editRequestDispatch.jsp",
// "subjectUri", opropStmt.getSubjectURI(),
// "predicateUri", opropStmt.getPropertyURI(),
// "objectUri", opropStmt.getObjectURI())
// : makeRelativeHref(contextPath + "edit/editRequestDispatch.jsp",
// "subjectUri", opropStmt.getSubjectURI(),
// "predicateUri", opropStmt.getPropertyURI(),
// "objectUri", opropStmt.getObjectURI(),
// "deleteProhibited", "prohibited");
//
// LinkStruct ls = new LinkStruct();
// ls.setHref( url );
// ls.setType("edit");
// ls.setMouseoverText("change this relationship");
// links[index] = ls; index++;
//
// } else {
// log.debug("NO permission to UPDATE this object property statement ("+opropStmt.getPropertyURI()+") found in policy");
// }
// if( contains( allowedAccessTypeArray, EditLinkAccess.DELETE ) ){
// log.debug("permission found to DELETE object property statement "+opropStmt.getPropertyURI()+" so icon created");
// String url = makeRelativeHref(contextPath + "edit/editRequestDispatch.jsp",
// "subjectUri", opropStmt.getSubjectURI(),
// "predicateUri", opropStmt.getPropertyURI(),
// "objectUri", opropStmt.getObjectURI(),
// "cmd", "delete");
// LinkStruct ls = new LinkStruct();
// ls.setHref( url );
// ls.setType("delete");
// ls.setMouseoverText("delete this relationship");
// links[index] = ls; index++;
//
// } else {
// log.debug("NO permission to DELETE this object property statement ("+opropStmt.getPropertyURI()+") found in policy");
// }
// return links;
// }
/* ********************* utility methods ********************************* */
protected static String makeRelativeHref( String baseUrl, String ... queries ) {
String href = baseUrl;
@ -599,8 +677,12 @@ public class PropertyEditLinks extends TagSupport{
}
private boolean isVitroNsProp(String predicateUri) {
return FrontEndEditingUtils.VITRO_NS_PROPS_FOR_FRONT_END_EDITING.contains(predicateUri);
private boolean isVitroNsDataProp(String predicateUri) {
return FrontEndEditingUtils.VITRO_NS_DATAPROPS.contains(predicateUri);
}
private boolean isVitroNsObjectProp(String predicateUri) {
return FrontEndEditingUtils.VITRO_NS_OBJECT_PROPS.contains(predicateUri);
}
}

View file

@ -36,7 +36,7 @@
************************************** */
final String DEFAULT_DATA_FORM = "defaultDatapropForm.jsp";
final String DEFAULT_VITRO_NS_FORM = "defaultVitroNsPropForm.jsp";
final String DEFAULT_VITRO_NS_FORM = "defaultVitroNsDataPropForm.jsp";
final String DEFAULT_ERROR_FORM = "error.jsp";
if (!VitroRequestPrep.isSelfEditing(request) && !LoginFormBean.loggedIn(request, LoginFormBean.NON_EDITOR)) {

View file

@ -236,6 +236,7 @@ public static Log log = LogFactory.getLog("edu.cornell.mannlib.vitro.webapp.jsp.
%>
<jsp:forward page="/edit/forms/${form}" />
<%!
private static synchronized void setEditReferer(String editKey, String refererUrl, HttpSession session) {

View file

@ -9,14 +9,25 @@
<%@ page import="edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory" %>
<%@ page import="edu.cornell.mannlib.vitro.webapp.beans.DataProperty" %>
<%@ page import="edu.cornell.mannlib.vitro.webapp.dao.DataPropertyDao" %>
<%@ page import="edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary"%>
<%@ page import="java.util.List" %>
<%@ page import="org.apache.commons.logging.Log" %>
<%@ page import="org.apache.commons.logging.LogFactory" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="v" uri="http://vitro.mannlib.cornell.edu/vitro/tags" %>
<%!
public static Log log = LogFactory.getLog("edu.cornell.mannlib.vitro.webapp.jsp.edit.forms.defaultLinkForm.jsp");
%>
<%
String predicateUri = (String)request.getAttribute("predicateUri");
%>
<c:set var="vitroUri" value="<%= VitroVocabulary.vitroURI %>" />
<c:set var="rdfUri" value="<%= VitroVocabulary.RDF %>" />
<%-- Enter here any class names to be used for constructing INDIVIDUALS_VIA_VCLASS pick lists
These are then referenced in the field's ObjectClassUri but not elsewhere.
NOTE that this class may not exist in the model, in which the only choice of type
@ -28,7 +39,7 @@ public static Log log = LogFactory.getLog("edu.cornell.mannlib.vitro.webapp.jsp.
Each of these must then be referenced in the sparqlForExistingLiterals section of the JSON block below
and in the literalsOnForm --%>
<v:jsonset var="urlExisting" >
PREFIX vitro: <http://vitro.mannlib.cornell.edu/ns/vitro/0.7#>
PREFIX vitro: <${vitroUri}> .
SELECT ?urlExisting
WHERE { ?link vitro:linkURL ?urlExisting }
</v:jsonset>
@ -36,17 +47,17 @@ public static Log log = LogFactory.getLog("edu.cornell.mannlib.vitro.webapp.jsp.
The actual assertion inserted in the model will be created via string substitution into the ? variables.
NOTE the pattern of punctuation (a period after the prefix URI and after the ?field) --%>
<v:jsonset var="urlAssertion" >
@prefix vitro: <http://vitro.mannlib.cornell.edu/ns/vitro/0.7#> .
@prefix vitro: <${vitroUri}> .
?link vitro:linkURL ?url .
</v:jsonset>
<v:jsonset var="anchorExisting" >
PREFIX vitro: <http://vitro.mannlib.cornell.edu/ns/vitro/0.7#>
PREFIX vitro: <${vitroUri}> .
SELECT ?anchorExisting
WHERE { ?link vitro:linkAnchor ?anchorExisting }
</v:jsonset>
<v:jsonset var="anchorAssertion" >
@prefix vitro: <http://vitro.mannlib.cornell.edu/ns/vitro/0.7#> .
@prefix vitro: <${vitroUri}> .
?link vitro:linkAnchor ?anchor .
</v:jsonset>
@ -54,11 +65,10 @@ public static Log log = LogFactory.getLog("edu.cornell.mannlib.vitro.webapp.jsp.
the SparqlForExistingUris --%>
<v:jsonset var="n3ForEdit">
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix vitro: <http://vitro.mannlib.cornell.edu/ns/vitro/0.7#> .
@prefix rdf: <${rdfUri}> .
@prefix vitro: <${vitroUri}> .
?subject vitro:additionalLink ?link .
?subject <${predicateUri}> ?link .
?link rdf:type vitro:Link .
@ -69,7 +79,7 @@ public static Log log = LogFactory.getLog("edu.cornell.mannlib.vitro.webapp.jsp.
</v:jsonset>
<v:jsonset var="n3Optional">
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdf: <${rdfUri}> .
?link rdf:type ?type .
</v:jsonset>
@ -126,6 +136,8 @@ public static Log log = LogFactory.getLog("edu.cornell.mannlib.vitro.webapp.jsp.
}
</c:set>
<%
log.debug(request.getAttribute("editjson"));
EditConfiguration editConfig = EditConfiguration.getConfigFromSession(session,request);
if( editConfig == null ){
editConfig = new EditConfiguration((String)request.getAttribute("editjson"));
@ -143,13 +155,14 @@ public static Log log = LogFactory.getLog("edu.cornell.mannlib.vitro.webapp.jsp.
/* get some data to make the form more useful */
Individual subject = (Individual)request.getAttribute("subject");
String submitLabel=""; // don't put local variables into the request
/* title is used by pre and post form fragments */
String submitLabel="";
String title="";
String linkType = predicateUri.equals(VitroVocabulary.PRIMARY_LINK) ? "primary" : "additional";
if (objectUri != null) {
request.setAttribute("title", "Edit link for " + subject.getName());
title = "Edit <em>" + linkType + " link</em> for " + subject.getName();
submitLabel = "Save changes";
} else {
request.setAttribute("title","Create a new link for " + subject.getName());
title = "Create a new <em>" + linkType + " link</em> for " + subject.getName();
submitLabel = "Create new link";
}
@ -157,11 +170,11 @@ public static Log log = LogFactory.getLog("edu.cornell.mannlib.vitro.webapp.jsp.
<jsp:include page="${preForm}"/>
<h2>${title}</h2>
<h2><%= title %></h2>
<form action="<c:url value="/edit/processRdfForm2.jsp"/>" >
<v:input type="text" label="URL" id="url" size="70"/>
<v:input type="text" label="label" id="anchor" size="60"/>
<v:input type="submit" id="submit" value="<%=submitLabel%>" cancel="${param.subjectUri}"/>
<v:input type="text" label="Link anchor text" id="anchor" size="60"/>
<p class="submit"><v:input type="submit" id="submit" value="<%=submitLabel%>" cancel="${param.subjectUri}"/></p>
</form>
<jsp:include page="${postForm}"/>

View file

@ -0,0 +1,176 @@
<%-- $This file is distributed under the terms of the license in /doc/license.txt$ --%>
<%@ page import="com.hp.hpl.jena.rdf.model.Literal" %>
<%@ page import="com.hp.hpl.jena.rdf.model.Model" %>
<%@ page import="edu.cornell.mannlib.vitro.webapp.beans.Individual" %>
<%@ page import="edu.cornell.mannlib.vitro.webapp.beans.VClass" %>
<%@ page import="edu.cornell.mannlib.vitro.webapp.edit.n3editing.EditConfiguration" %>
<%@ page import="edu.cornell.mannlib.vitro.webapp.controller.VitroRequest" %>
<%@ page import="edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory" %>
<%@ page import="edu.cornell.mannlib.vitro.webapp.beans.DataProperty" %>
<%@ page import="edu.cornell.mannlib.vitro.webapp.dao.DataPropertyDao" %>
<%@ page import="edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary" %>
<%@ page import="java.util.List" %>
<%@ page import="org.apache.commons.logging.Log" %>
<%@ page import="org.apache.commons.logging.LogFactory" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="v" uri="http://vitro.mannlib.cornell.edu/vitro/tags" %>
<%!
public static Log log = LogFactory.getLog("edu.cornell.mannlib.vitro.webapp.jsp.edit.forms.defaultLinkForm.jsp");
%>
<c:set var="vitroUri" value="<%= VitroVocabulary.vitroURI %>" />
<c:set var="rdfUri" value="<%= VitroVocabulary.RDF %>" />
<c:set var="rdfsUri" value="<%= VitroVocabulary.RDFS %>" />
<%-- Enter here any class names to be used for constructing INDIVIDUALS_VIA_VCLASS pick lists
These are then referenced in the field's ObjectClassUri but not elsewhere.
NOTE that this class may not exist in the model, in which the only choice of type
that will show up is "web page", which will insert no new statements and just create
links of type vitro:Link --%>
<%-- Then enter a SPARQL query for each field, by convention concatenating the field id with "Existing"
to convey that the expression is used to retrieve any existing value for the field in an existing individual.
Each of these must then be referenced in the sparqlForExistingLiterals section of the JSON block below
and in the literalsOnForm --%>
<v:jsonset var="urlExisting" >
SELECT ?urlExisting
WHERE { ?link <${predicateUri}> ?urlExisting }
</v:jsonset>
<%-- Pair the "existing" query with the skeleton of what will be asserted for a new statement involving this field.
The actual assertion inserted in the model will be created via string substitution into the ? variables.
NOTE the pattern of punctuation (a period after the prefix URI and after the ?field) --%>
<v:jsonset var="urlAssertion" >
?link <${predicateUri}> ?url .
</v:jsonset>
<v:jsonset var="anchorExisting" >
PREFIX vitro: <${vitroUri}>
SELECT ?anchorExisting
WHERE { ?link vitro:linkAnchor ?anchorExisting }
</v:jsonset>
<v:jsonset var="anchorAssertion" >
@prefix vitro: <${vitroUri}> .
?link vitro:linkAnchor ?anchor .
</v:jsonset>
<%-- When not retrieving a literal via a datatype property, put the SPARQL statement into
the SparqlForExistingUris --%>
<v:jsonset var="n3ForEdit">
@prefix rdf: <${rdfUri}> .
@prefix vitro: <${vitroUri}> .
?subject <${predicateUri}> ?link .
?link rdf:type vitro:Link .
?link
vitro:linkURL ?url ;
vitro:linkAnchor ?anchor .
</v:jsonset>
<v:jsonset var="n3Optional">
@prefix rdf: <${rdfUri}> .
?link rdf:type ?type .
</v:jsonset>
<c:set var="editjson" scope="request">
{
"formUrl" : "${formUrl}",
"editKey" : "${editKey}",
"urlPatternToReturnTo" : "/entity",
"subject" : ["subject", "${subjectUriJson}" ],
"predicate" : ["predicate", "${predicateUriJson}" ],
"object" : ["link", "${objectUriJson}", "URI" ],
"n3required" : [ "${n3ForEdit}" ],
"n3optional" : [ "${n3Optional}" ],
"newResources" : { },
"urisInScope" : { },
"literalsInScope" : { },
"urisOnForm" : [ ],
"literalsOnForm" : [ "url", "anchor" ],
"filesOnForm" : [ ],
"sparqlForLiterals" : { },
"sparqlForUris" : { },
"sparqlForExistingLiterals" : {
"url" : "${urlExisting}",
"anchor" : "${anchorExisting}"
},
"sparqlForExistingUris" : { },
"fields" : {
"url" : {
"newResource" : "false",
"validators" : [ "nonempty" ],
"optionsType" : "UNDEFINED",
"literalOptions" : [ ],
"predicateUri" : "",
"objectClassUri" : "",
"rangeDatatypeUri" : "",
"rangeLang" : "",
"assertions" : [ "${urlAssertion}" ]
},
"anchor" : {
"newResource" : "false",
"validators" : [ "nonempty" ],
"optionsType" : "UNDEFINED",
"literalOptions" : [ ],
"predicateUri" : "",
"objectClassUri" : "",
"rangeDatatypeUri" : "",
"rangeLang" : "",
"assertions" : [ "${anchorAssertion}" ]
}
}
}
</c:set>
<%
log.debug(request.getAttribute("editjson"));
EditConfiguration editConfig = EditConfiguration.getConfigFromSession(session,request);
if( editConfig == null ){
editConfig = new EditConfiguration((String)request.getAttribute("editjson"));
EditConfiguration.putConfigInSession(editConfig, session);
}
Model model = (Model)application.getAttribute("jenaOntModel");
String objectUri = (String)request.getAttribute("objectUri");
if( objectUri != null ){
editConfig.prepareForObjPropUpdate(model);
}else{
editConfig.prepareForNonUpdate(model);
}
/* get some data to make the form more useful */
Individual subject = (Individual)request.getAttribute("subject");
String submitLabel="";
String title = "";
if (objectUri != null) {
title = "Edit <em>url</em> for " + subject.getName();
submitLabel = "Save changes";
} else {
title = "Create a new <em>url</em> for " + subject.getName();
submitLabel = "Create new url";
}
%>
<jsp:include page="${preForm}"/>
<h2><%= title %></h2>
<form action="<c:url value="/edit/processRdfForm2.jsp"/>" >
<v:input type="text" label="URL" id="url" size="70"/>
<v:input type="text" label="Anchor text" id="anchor" size="60"/><br />
<v:input type="submit" id="submit" value="<%=submitLabel%>" cancel="${param.subjectUri}"/>
</form>
<jsp:include page="${postForm}"/>

View file

@ -149,11 +149,19 @@ RY Description not working - FIX
</div> <!-- end labelAndMoniker -->
<%-- Links --%>
<c:if test="${ showEdits || !empty entity.anchor || !empty entity.linksList }">
<div id="dprop-vitro-link" class="propsItem ${editingClass}">
<c:if test="${ showEdits || !empty entity.url || !empty entity.linksList }">
<div id="dprop-vitro-urls" class="propsItem ${editingClass}">
<c:if test="${showEdits}">
<h3 class="propertyName">links</h3>
<edLnk:editLinks item="<%= VitroVocabulary.LINK_ANCHOR %>" icons="false" />
<c:choose>
<c:when test="${empty entity.url}">
<c:set var="addUrlPredicate" value="<%= VitroVocabulary.PRIMARY_LINK %>" />
</c:when>
<c:otherwise>
<c:set var="addUrlPredicate" value="<%= VitroVocabulary.ADDITIONAL_LINK %>" />
</c:otherwise>
</c:choose>
<edLnk:editLinks item="${addUrlPredicate}" icons="false" />
</c:if>
<div class="datatypeProperties">
<div class="datatypePropertyValue">