From 2ee15c2618c28dae867b0b3964cb3053cea97f10 Mon Sep 17 00:00:00 2001 From: ryounes Date: Mon, 11 Jul 2011 16:09:09 +0000 Subject: [PATCH] NIHVIVO-707 Work on core:webpage custom form; committing test version for debugging --- .../forms/addAuthorsToInformationResource.jsp | 2 - productMods/edit/forms/addEditWebpageForm.jsp | 280 ++++++++++++++++++ .../forms/manageWebpagesForIndividual.jsp | 218 ++------------ 3 files changed, 302 insertions(+), 198 deletions(-) create mode 100644 productMods/edit/forms/addEditWebpageForm.jsp diff --git a/productMods/edit/forms/addAuthorsToInformationResource.jsp b/productMods/edit/forms/addAuthorsToInformationResource.jsp index d970d117..5ec56713 100644 --- a/productMods/edit/forms/addAuthorsToInformationResource.jsp +++ b/productMods/edit/forms/addAuthorsToInformationResource.jsp @@ -302,8 +302,6 @@ SPARQL queries for existing values. --%> <% String rankPredicateUri = vivoCore + "authorRank"; - // RY We should use whatever is used on the individual profile page to list - // this property in rank order... DataPropertyComparator comp = new DataPropertyComparator(rankPredicateUri); Collections.sort(authorships, comp); diff --git a/productMods/edit/forms/addEditWebpageForm.jsp b/productMods/edit/forms/addEditWebpageForm.jsp new file mode 100644 index 00000000..3fd6fb7d --- /dev/null +++ b/productMods/edit/forms/addEditWebpageForm.jsp @@ -0,0 +1,280 @@ +<%-- $This file is distributed under the terms of the license in /doc/license.txt$ --%> + +<%-- Custom form for adding or editing a webpage associated with an individual. The primary page, +manageWebpagesForIndividual.jsp, forwards to this page if: (a) we are adding a new page, or +(b) an edit link in the Manage Webpages view has been clicked. + +Object properties: +core:webpage (range: core:URLLink) +core:webpageOf (domain: core:URLLink) (inverse of core:webpage) + +Class: +core:URLLink - the link to be added to the individual + +Data properties of core:URLLink: +core:linkURI +core:linkAnchorText +core:rank + +--%> + +<%@ page import="java.util.List" %> +<%@ page import="java.util.ArrayList" %> +<%@ page import="java.util.Arrays" %> + +<%@ page import="com.hp.hpl.jena.rdf.model.Literal" %> +<%@ page import="com.hp.hpl.jena.rdf.model.Model" %> +<%@ page import="com.hp.hpl.jena.vocabulary.XSD" %> +<%@ page import="com.hp.hpl.jena.query.ResultSet" %> +<%@ page import="com.hp.hpl.jena.rdf.model.RDFNode" %> +<%@ page import="com.hp.hpl.jena.query.QuerySolution" %> +<%@ page import="com.hp.hpl.jena.query.Dataset" %> + +<%@ page import="edu.cornell.mannlib.vitro.webapp.beans.Individual" %> +<%@ page import="edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.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.web.MiscWebUtils"%> +<%@ page import="edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Css" %> +<%@ page import="edu.cornell.mannlib.vitro.webapp.dao.jena.QueryUtils" %> + +<%@ 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.addEditWebpageForm.jsp"); + + public static String RANK_QUERY = + "PREFIX core: \n" + + "SELECT DISTINCT ?rank WHERE { \n" + + " ?subject core:webpage ?link . \n" + + " ?link core:rank ?rank .\n" + + "} ORDER BY DESC(?rank) \n" + + "LIMIT 1"; + +%> + +<% + VitroRequest vreq = new VitroRequest(request); + WebappDaoFactory wdf = vreq.getWebappDaoFactory(); + vreq.setAttribute("defaultNamespace", wdf.getDefaultNamespace()); + + String subjectUri = (String) request.getAttribute("subjectUri"); + String propertyUri = (String) request.getAttribute("predicateUri"); + String objectUri = (String) request.getAttribute("objectUri"); + + String stringDatatypeUriJson = MiscWebUtils.escape(XSD.xstring.toString()); + String uriDatatypeUriJson = MiscWebUtils.escape(XSD.anyURI.toString()); +%> + + + + + + + + + + + + +<%-- 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 --%> + + SELECT ?urlExisting + WHERE { ?link <${linkUrl}> ?urlExisting } + +<%-- 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) --%> + + ?link <${linkUrl}> ?url . + + + + SELECT ?anchorExisting + WHERE { ?link <${linkAnchor}> ?anchorExisting } + + + ?link <${linkAnchor}> ?anchor . + + + + SELECT ?rankExisting + WHERE { ?link <${rank}> ?rankExisting } + + + ?link <${rank}> ?rank . + + +<%-- When not retrieving a literal via a datatype property, put the SPARQL statement into + the SparqlForExistingUris --%> + + + ?subject <${webpageProperty}> ?link . + ?link <${inverseProperty}> ?subject . + + ?link a <${linkClass}> ; + <${linkUrl}> ?url ; + <${linkAnchor}> ?anchor ; + + + + + + + { + "formUrl" : "${formUrl}", + "editKey" : "${editKey}", + "urlPatternToReturnTo" : "${returnPathAfterSubmit}", + + "subject" : ["subject", "${subjectUriJson}" ], + "predicate" : ["predicate", "${predicateUriJson}" ], + "object" : ["link", "${objectUriJson}", "URI" ], + + "n3required" : [ "${n3ForEdit}" ], + "n3optional" : [ "${rankAssertion}"], + "newResources" : { "link" : "${defaultNamespace}" }, + "urisInScope" : { }, + "literalsInScope" : { }, + "urisOnForm" : [ ], + "literalsOnForm" : [ "url", "anchor", "rank" ], + "filesOnForm" : [ ], + "sparqlForLiterals" : { }, + "sparqlForUris" : { }, + "sparqlForExistingLiterals" : { + "url" : "${urlQuery}", + "anchor" : "${anchorQuery}", + "rank" : "${rankQuery}" + }, + "sparqlForExistingUris" : { }, + "fields" : { + "url" : { + "newResource" : "false", + "validators" : [ "nonempty", "datatype:${uriDatatypeUriJson}" , "httpUrl" ], + "optionsType" : "UNDEFINED", + "literalOptions" : [ ], + "predicateUri" : "", + "objectClassUri" : "", + "rangeDatatypeUri" : "${uriDatatypeUriJson}", + "rangeLang" : "", + "assertions" : [ "${urlAssertion}" ] + }, + "anchor" : { + "newResource" : "false", + "validators" : [ "nonempty", "datatype:${stringDatatypeUriJson}" ], + "optionsType" : "UNDEFINED", + "literalOptions" : [ ], + "predicateUri" : "", + "objectClassUri" : "", + "rangeDatatypeUri" : "${stringDatatypeUriJson}", + "rangeLang" : "", + "assertions" : [ "${anchorAssertion}" ] + }, + "rank" : { + "newResource" : "false", + "validators" : [ ], + "optionsType" : "UNDEFINED", + "literalOptions" : [ ], + "predicateUri" : "", + "objectClassUri" : "", + "rangeDatatypeUri" : "${stringDatatypeUriJson}", + "rangeLang" : "", + "assertions" : [ "${rankAssertion}" ] + } + } + } + +<% + 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"); + if( objectUri != null ){ + editConfig.prepareForObjPropUpdate(model); + } else { + editConfig.prepareForNonUpdate(model); + } + + List customCss = new ArrayList(Arrays.asList(Css.JQUERY_UI.path(), + Css.CUSTOM_FORM.path() + )); + request.setAttribute("customCss", customCss); + + String subjectName = ((Individual)request.getAttribute("subject")).getName(); + + // Get largest existing rank value, increment by 1, for hidden rank field value + int maxRank = 0; // default value + if (objectUri == null) { // adding new webpage + log.debug("getting max existing rank for subject"); + String queryStr = QueryUtils.subUriForQueryVar(RANK_QUERY, "subject", subjectUri); + log.debug("Query string is: " + queryStr); + try { + ResultSet results = QueryUtils.getQueryResults(queryStr, vreq); + if (results != null && results.hasNext()) { // there is at most one result + log.debug("found a rank"); + QuerySolution soln = results.next(); + RDFNode node = soln.get("rank"); + if (node != null && node.isLiteral()) { + log.debug("node value =" + node.asLiteral().getLexicalForm()); + int rank = node.asLiteral().getInt(); // what if it's not an int? - what gets returned? + if (rank > maxRank) { + log.debug("setting maxRank to " + rank); + maxRank = rank; + } + } + } + } catch (Exception e) { + log.error(e, e); + } + } + maxRank++; +%> + + + + + + + <%-- May need to do this in Java above --%> + + + + + + + + + + + + + +

${title} <%= subjectName %>

+ +
" > + + +

If left blank, the URL will be used when displaying a link to this webpage.

+ + + +

+ + + diff --git a/productMods/edit/forms/manageWebpagesForIndividual.jsp b/productMods/edit/forms/manageWebpagesForIndividual.jsp index 6923d3a5..b67eaec0 100644 --- a/productMods/edit/forms/manageWebpagesForIndividual.jsp +++ b/productMods/edit/forms/manageWebpagesForIndividual.jsp @@ -1,18 +1,10 @@ <%-- $This file is distributed under the terms of the license in /doc/license.txt$ --%> -<%-- Custom form for managing webpages associated with an individual +<%-- Landing page for managing web pages associated with an individual. From here, we do one of three things: -Object properties: -core:webpage (range: core:URLLink) -core:webpageOf (domain: core:URLLink) (inverse of core:webpage) - -Class: -core:URLLink - the link to be added to the individual - -Data properties of core:URLLink: -core:linkURI -core:linkAnchorText -core:rank +1. If arriving here by clicking add link on profile, go directly to add form. +2. If arriving here by edit link on the profile page, stay here for web page management (can add, edit, or delete). +3. If arriving here after an add/edit form submission, stay here for additional web page management. --%> @@ -42,201 +34,35 @@ core:rank <%@ 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.addWebpageToIndividual.jsp"); + public static Log log = LogFactory.getLog("edu.cornell.mannlib.vitro.webapp.jsp.edit.forms.manageWebpagesForIndividual.jsp"); %> + <% + + String objectUri = (String) request.getAttribute("objectUri"); + + String view = request.getParameter("view"); + + if ( "form".equals(view) || // the url specifies form view + ( view == null && objectUri == null ) ) { // add form always starts with form + + %> <% + + } // else stay here for manage view + VitroRequest vreq = new VitroRequest(request); WebappDaoFactory wdf = vreq.getWebappDaoFactory(); vreq.setAttribute("defaultNamespace", wdf.getDefaultNamespace()); - String propertyUri = (String) request.getAttribute("predicateUri"); - String objectUri = (String) request.getAttribute("objectUri"); - - String stringDatatypeUriJson = MiscWebUtils.escape(XSD.xstring.toString()); - String uriDatatypeUriJson = MiscWebUtils.escape(XSD.anyURI.toString()); -%> - - - - - - - - - - - - -<%-- 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 --%> - - SELECT ?urlExisting - WHERE { ?link <${linkUrl}> ?urlExisting } - -<%-- 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) --%> - - ?link <${linkUrl}> ?url . - - - - SELECT ?anchorExisting - WHERE { ?link <${linkAnchor}> ?anchorExisting } - - - ?link <${linkAnchor}> ?anchor . - - - - SELECT ?rankExisting - WHERE { ?link <${rank}> ?rankExisting } - - - ?link <${rank}> ?rank . - - -<%-- When not retrieving a literal via a datatype property, put the SPARQL statement into - the SparqlForExistingUris --%> - - - ?subject <${webpageProperty}> ?link . - ?link <${inverseProperty}> ?subject . - - ?link a <${linkClass}> ; - <${linkUrl}> ?url ; - <${linkAnchor}> ?anchor ; - <${rank}> ?rank . - - - - - - - { - "formUrl" : "${formUrl}", - "editKey" : "${editKey}", - "urlPatternToReturnTo" : "${returnPathAfterSubmit}", - - "subject" : ["subject", "${subjectUriJson}" ], - "predicate" : ["predicate", "${predicateUriJson}" ], - "object" : ["link", "${objectUriJson}", "URI" ], - - "n3required" : [ "${n3ForEdit}" ], - "n3optional" : [ ], - "newResources" : { "link" : "${defaultNamespace}" }, - "urisInScope" : { }, - "literalsInScope" : { }, - "urisOnForm" : [ ], - "literalsOnForm" : [ "url", "anchor", "rank" ], - "filesOnForm" : [ ], - "sparqlForLiterals" : { }, - "sparqlForUris" : { }, - "sparqlForExistingLiterals" : { - "url" : "${urlQuery}", - "anchor" : "${anchorQuery}", - "rank" : "${rankQuery}" - }, - "sparqlForExistingUris" : { }, - "fields" : { - "url" : { - "newResource" : "false", - "validators" : [ "nonempty", "datatype:${uriDatatypeUriJson}" , "httpUrl" ], - "optionsType" : "UNDEFINED", - "literalOptions" : [ ], - "predicateUri" : "", - "objectClassUri" : "", - "rangeDatatypeUri" : "${uriDatatypeUriJson}", - "rangeLang" : "", - "assertions" : [ "${urlAssertion}" ] - }, - "anchor" : { - "newResource" : "false", - "validators" : [ "nonempty", "datatype:${stringDatatypeUriJson}" ], - "optionsType" : "UNDEFINED", - "literalOptions" : [ ], - "predicateUri" : "", - "objectClassUri" : "", - "rangeDatatypeUri" : "${stringDatatypeUriJson}", - "rangeLang" : "", - "assertions" : [ "${anchorAssertion}" ] - }, - "rank" : { - "newResource" : "false", - "validators" : [ ], - "optionsType" : "UNDEFINED", - "literalOptions" : [ ], - "predicateUri" : "", - "objectClassUri" : "", - "rangeDatatypeUri" : "${stringDatatypeUriJson}", - "rangeLang" : "", - "assertions" : [ "${rankAssertion}" ] - } - } - } - -<% - 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"); - if( objectUri != null ){ - editConfig.prepareForObjPropUpdate(model); - }else{ - editConfig.prepareForNonUpdate(model); - } - - /* get some data to make the form more useful */ String subjectName = ((Individual)request.getAttribute("subject")).getName(); - String submitLabel=""; - String title=" webpage for " + subjectName; - if (objectUri != null) { - title = "Edit" + title; - submitLabel = "Save changes"; - } else { - title = "Create" + title; - submitLabel = "Create link"; - } - - List customJs = new ArrayList(Arrays.asList(JavaScript.JQUERY_UI.path(), - JavaScript.CUSTOM_FORM_UTILS.path(), - "/js/browserUtils.js", - "/edit/forms/js/manageWebpagesForIndividual.js" - )); - request.setAttribute("customJs", customJs); - - List customCss = new ArrayList(Arrays.asList(Css.JQUERY_UI.path(), - Css.CUSTOM_FORM.path() - )); - request.setAttribute("customCss", customCss); - %> - - -

<%= title %>

-
" > - - -

If left blank, the URL will be used when displaying a link to this webpage.

- -

- +

<%= subjectName %>

+ +

Manage Web Pages

+