<%-- $This file is distributed under the terms of the license in /doc/license.txt$ --%> <%-- Custom form for adding an educational attainment to an individual Classes: core:EducationalTraining - primary new individual being created foaf:Person - existing individual foaf:Organization - new or existing individual core:AcademicDegree - existing individual Data properties of EducationalTraining: core:majorField core:departmentOrSchool core:supplementalInformation Object properties (domain : range) core:educationalTraining (Person : EducationalTraining) - inverse of core:educationalTrainingOf core:educationalTrainingOf (EducationalTraining : Person) - inverse of core:educationalTraining core:degreeEarned (EducationalTraining : AcademicDegree) - inverse of core:degreeOutcomeOf core:degreeOutcomeOf (AcademicDegree : EducationalTraining) - inverse of core:degreeEarned core:organizationGrantingDegree (EducationalTraining : Organization) - no inverse Future version -------------- Classes: core:DateTimeValue core:DateTimeValuePrecision Object properties: core:dateTimeValue (EducationalTraining : DateTimeValue) core:dateTimePrecision (DateTimeValue : DateTimeValuePrecision) --%> <%@ 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="edu.cornell.mannlib.vitro.webapp.beans.Individual"%> <%@ page import="edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary"%> <%@ page import="edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary.Precision"%> <%@ page import="edu.cornell.mannlib.vitro.webapp.edit.n3editing.EditConfiguration"%> <%@ page import="edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory"%> <%@ page import="edu.cornell.mannlib.vitro.webapp.controller.VitroRequest"%> <%@ page import="edu.cornell.mannlib.vitro.webapp.web.MiscWebUtils"%> <%@ page import="org.apache.commons.logging.Log" %> <%@ page import="org.apache.commons.logging.LogFactory" %> <%@ page import="edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.JavaScript" %> <%@ page import="edu.cornell.mannlib.vitro.webapp.controller.freemarker.UrlBuilder.Css" %> <%@ page import="edu.cornell.mannlib.vitro.webapp.edit.n3editing.Field"%> <%@ page import="edu.cornell.mannlib.vitro.webapp.edit.elements.DateTimeWithPrecision"%> <%@ page import="edu.cornell.mannlib.vitro.webapp.utils.FrontEndEditingUtils"%> <%@ page import="edu.cornell.mannlib.vitro.webapp.utils.FrontEndEditingUtils.EditMode"%> <%@ 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.personHasEducationalBackground.jsp"); %> <% VitroRequest vreq = new VitroRequest(request); WebappDaoFactory wdf = vreq.getWebappDaoFactory(); vreq.setAttribute("defaultNamespace", ""); //empty string triggers default new URI behavior request.setAttribute("stringDatatypeUriJson", MiscWebUtils.escape(XSD.xstring.toString())); request.setAttribute("gYearDatatypeUriJson", MiscWebUtils.escape(XSD.gYear.toString())); /* There are 4 modes that this form can be in: 1. Add, there is a subject and a predicate but no position and nothing else. 2. normal edit where everything should already be filled out. There is a subject, a object and an individual on the other end of the object's core:trainingAtOrganization stmt. 3. Repair a bad role node. There is a subject, prediate and object but there is no individual on the other end of the object's core:trainingAtOrganization stmt. This should be similar to an add but the form should be expanded. 4. Really bad node. multiple core:trainingAtOrganization statements. */ EditMode mode = FrontEndEditingUtils.getEditMode(request, "http://vivoweb.org/ontology/core#trainingAtOrganization"); if( mode == EditMode.ADD ) { %> <% } else if(mode == EditMode.EDIT){ %> <% } else if(mode == EditMode.REPAIR){ %> <% } %> <%-- Define predicates used in n3 assertions and sparql queries --%> <%-- Assertions for adding a new educational training entry --%> ?org a ?orgType . ?org <${label}> ?orgLabel . ?edTraining <${degreeEarned}> ?degree . ?degree <${degreeOutcomeOf}> ?edTraining . ?edTraining <${majorFieldPred}> ?majorField . ?edTraining <${ToInterval}> ?intervalNode . ?intervalNode <${type}> <${intervalType}> . ?intervalNode <${intervalToStart}> ?startNode . ?startNode <${type}> <${dateTimeValueType}> . ?startNode <${dateTimeValue}> ?startField.value . ?startNode <${dateTimePrecision}> ?startField.precision . ?edTraining <${ToInterval}> ?intervalNode . ?intervalNode <${type}> <${intervalType}> . ?intervalNode <${intervalToEnd}> ?endNode . ?endNode <${type}> <${dateTimeValueType}> . ?endNode <${dateTimeValue}> ?endField.value . ?endNode <${dateTimePrecision}> ?endField.precision . ?edTraining <${deptPred}> ?dept . ?edTraining <${infoPred}> ?info . @prefix core: <${vivoCore}> . ?person core:educationalTraining ?edTraining . ?edTraining a core:EducationalTraining ; core:educationalTrainingOf ?person ; <${trainingAtOrg}> ?org . <%-- This property has no inverse --%> ?edTraining <${trainingAtOrg}> ?org . <%-- Queries for editing an existing educational training entry --%> SELECT ?existingOrg WHERE { ?edTraining <${trainingAtOrg}> ?existingOrg . } SELECT ?existingOrgLabel WHERE { ?edTraining <${trainingAtOrg}> ?existingOrg . ?existingOrg <${label}> ?existingOrgLabel . } <%-- Limit type to subclasses of foaf:Organization. Otherwise, sometimes owl:Thing or another type is returned and we don't get a match to the select element options. --%> PREFIX rdfs: <${rdfs}> SELECT ?existingOrgType WHERE { ?edTraining <${trainingAtOrg}> ?existingOrg . ?existingOrg a ?existingOrgType . ?existingOrgType rdfs:subClassOf <${orgClass}> . } SELECT ?existingDegree WHERE { ?edTraining <${degreeEarned}> ?existingDegree . } SELECT ?existingMajorField WHERE { ?edTraining <${majorFieldPred}> ?existingMajorField . } SELECT ?existingDept WHERE { ?edTraining <${deptPred}> ?existingDept . } SELECT ?existingInfo WHERE { ?edTraining <${infoPred}> ?existingInfo . } SELECT ?existingIntervalNode WHERE { ?edTraining <${ToInterval}> ?existingIntervalNode . ?existingIntervalNode <${type}> <${intervalType}> . } SELECT ?existingStartNode WHERE { ?edTraining <${ToInterval}> ?intervalNode . ?intervalNode <${type}> <${intervalType}> . ?intervalNode <${intervalToStart}> ?existingStartNode . ?existingStartNode <${type}> <${dateTimeValueType}> .} SELECT ?existingDateStart WHERE { ?edTraining <${ToInterval}> ?intervalNode . ?intervalNode <${type}> <${intervalType}> . ?intervalNode <${intervalToStart}> ?startNode . ?startNode <${type}> <${dateTimeValueType}> . ?startNode <${dateTimeValue}> ?existingDateStart . } SELECT ?existingStartPrecision WHERE { ?edTraining <${ToInterval}> ?intervalNode . ?intervalNode <${type}> <${intervalType}> . ?intervalNode <${intervalToStart}> ?startNode . ?startNode <${type}> <${dateTimeValueType}> . ?startNode <${dateTimePrecision}> ?existingStartPrecision . } SELECT ?existingEndNode WHERE { ?edTraining <${ToInterval}> ?intervalNode . ?intervalNode <${type}> <${intervalType}> . ?intervalNode <${intervalToEnd}> ?existingEndNode . ?existingEndNode <${type}> <${dateTimeValueType}> .} SELECT ?existingEndDate WHERE { ?edTraining <${ToInterval}> ?intervalNode . ?intervalNode <${type}> <${intervalType}> . ?intervalNode <${intervalToEnd}> ?endNode . ?endNode <${type}> <${dateTimeValueType}> . ?endNode <${dateTimeValue}> ?existingEndDate . } SELECT ?existingEndPrecision WHERE { ?edTraining <${ToInterval}> ?intervalNode . ?intervalNode <${type}> <${intervalType}> . ?intervalNode <${intervalToEnd}> ?endNode . ?endNode <${type}> <${dateTimeValueType}> . ?endNode <${dateTimePrecision}> ?existingEndPrecision . } ${orgClass} ${degreeClass} { "formUrl" : "${formUrl}", "editKey" : "${editKey}", "urlPatternToReturnTo" : "/entity", "subject" : ["person", "${subjectUriJson}" ], "predicate" : ["predicate", "${predicateUriJson}" ], "object" : ["edTraining", "${objectUriJson}", "URI" ], "n3required" : [ "${n3ForNewEdTraining}", "${orgLabelAssertion}", "${orgTypeAssertion}" ], "n3optional" : [ "${n3ForEdTrainingToOrg}", "${majorFieldAssertion}", "${degreeAssertion}", "${deptAssertion}", "${infoAssertion}" , "${n3ForStart}", "${n3ForEnd}"], "newResources" : { "edTraining" : "${defaultNamespace}", "org" : "${defaultNamespace}" , "intervalNode" : "${defaultNamespace}", "startNode" : "${defaultNamespace}", "endNode" : "${defaultNamespace}" }, "urisInScope" : { }, "literalsInScope": { }, "urisOnForm" : [ "org", "orgType", "degree" ], "literalsOnForm" : [ "orgLabel", "majorField", "dept", "info" ], "filesOnForm" : [ ], "sparqlForLiterals" : { }, "sparqlForUris" : { }, "sparqlForExistingLiterals" : { "orgLabel" : "${orgLabelQuery}", "majorField" : "${majorFieldQuery}", "dept" : "${deptQuery}", "info" : "${infoQuery}", "startField.value" : "${existingStartDateQuery}", "endField.value" : "${existingEndDateQuery}" }, "sparqlForExistingUris" : { "org" : "${orgQuery}", "orgType" : "${orgTypeQuery}", "degree" : "${degreeQuery}", "intervalNode" : "${existingIntervalNodeQuery}", "startNode" : "${existingStartNodeQuery}", "endNode" : "${existingEndNodeQuery}", "startField.precision": "${existingStartPrecisionQuery}", "endField.precision" : "${existingEndPrecisionQuery}" }, "fields" : { "degree" : { "newResource" : "false", "validators" : [ ], "optionsType" : "INDIVIDUALS_VIA_VCLASS", "literalOptions" : [ "Select one" ], "predicateUri" : "", "objectClassUri" : "${degreeClassUriJson}", "rangeDatatypeUri" : "", "rangeLang" : "", "assertions" : [ "${degreeAssertion}" ] }, "majorField" : { "newResource" : "false", "validators" : [ "datatype:${stringDatatypeUriJson}" ], "optionsType" : "UNDEFINED", "literalOptions" : [ ], "predicateUri" : "", "objectClassUri" : "", "rangeDatatypeUri" : "${stringDatatypeUriJson}", "rangeLang" : "", "assertions" : [ "${majorFieldAssertion}" ] }, "startField" : { "newResource" : "false", "validators" : [ ], "optionsType" : "UNDEFINED", "literalOptions" : [ ], "predicateUri" : "", "objectClassUri" : "", "rangeDatatypeUri" : "", "rangeLang" : "", "assertions" : [ "${n3ForStart}" ] }, "endField" : { "newResource" : "false", "validators" : [ ], "optionsType" : "UNDEFINED", "literalOptions" : [ ], "predicateUri" : "", "objectClassUri" : "", "rangeDatatypeUri" : "", "rangeLang" : "", "assertions" : [ "${n3ForEnd}" ] }, "org" : { "newResource" : "false", "validators" : [ ], "optionsType" : "INDIVIDUALS_VIA_VCLASS", "literalOptions" : [ "Select one" ], "predicateUri" : "", "objectClassUri" : "${orgClassUriJson}", "rangeDatatypeUri" : "", "rangeLang" : "", "assertions" : [ "${n3ForEdTrainingToOrg}" ] }, "orgLabel" : { "newResource" : "false", "validators" : [ "nonempty" ], "optionsType" : "UNDEFINED", "literalOptions" : [ ], "predicateUri" : "", "objectClassUri" : "", "rangeDatatypeUri" : "${stringDatatypeUriJson}", "rangeLang" : "", "assertions" : [ "${orgLabelAssertion}" ] }, "orgType" : { "newResource" : "false", "validators" : [ "nonempty" ], "optionsType" : "CHILD_VCLASSES", "literalOptions" : [ "Select one" ], "predicateUri" : "", "objectClassUri" : "${orgClassUriJson}", "rangeDatatypeUri" : "", "rangeLang" : "", "assertions" : [ "${orgTypeAssertion}" ] }, "dept" : { "newResource" : "false", "validators" : [ "datatype:${stringDatatypeUriJson}" ], "optionsType" : "UNDEFINED", "literalOptions" : [ ], "predicateUri" : "", "objectClassUri" : "", "rangeDatatypeUri" : "${stringDatatypeUriJson}", "rangeLang" : "", "assertions" : ["${deptAssertion}"] }, "info" : { "newResource" : "false", "validators" : [ "datatype:${stringDatatypeUriJson}" ], "optionsType" : "UNDEFINED", "literalOptions" : [ ], "predicateUri" : "", "objectClassUri" : "", "rangeDatatypeUri" : "${stringDatatypeUriJson}", "rangeLang" : "", "assertions" : ["${infoAssertion}"] } } } <% log.debug(request.getAttribute("editjson")); EditConfiguration editConfig = EditConfiguration.getConfigFromSession(session,request); if (editConfig == null) { editConfig = new EditConfiguration((String) request.getAttribute("editjson")); //setup date time edit elements Field startField = editConfig.getField("startField"); // arguments for DateTimeWithPrecision are (fieldName, minimumPrecision, [requiredLevel]) startField.setEditElement(new DateTimeWithPrecision(startField, VitroVocabulary.Precision.YEAR.uri(), VitroVocabulary.Precision.NONE.uri())); Field endField = editConfig.getField("endField"); endField.setEditElement(new DateTimeWithPrecision(endField, VitroVocabulary.Precision.YEAR.uri(), VitroVocabulary.Precision.NONE.uri())); EditConfiguration.putConfigInSession(editConfig,session); } Model model = (Model) application.getAttribute("jenaOntModel"); String objectUri = (String) request.getAttribute("objectUri"); if (objectUri != null) { // editing existing editConfig.prepareForObjPropUpdate(model); } else { // adding new editConfig.prepareForNonUpdate(model); } editConfig.setTemplate("personHasEducationalTraining.ftl"); editConfig.setSubmitToUrl("/edit/processRdfForm2.jsp"); String subjectName = ((Individual) request.getAttribute("subject")).getName(); List customJs = new ArrayList(Arrays.asList(JavaScript.JQUERY_UI.path(), JavaScript.CUSTOM_FORM_UTILS.path(), "/edit/forms/js/customFormWithAutocomplete.js" )); request.setAttribute("customJs", customJs); List customCss = new ArrayList(Arrays.asList(Css.JQUERY_UI.path(), Css.CUSTOM_FORM.path(), "/edit/forms/css/customFormWithAutocomplete.css" )); request.setAttribute("customCss", customCss); %> <%-- Configure add vs. edit --%> ${editMode == "repair" ? "" : "disabled" } <%-- This goes to an experimental FM based form: --%> <% if( mode == EditMode.ERROR ){ %>
This form is unable to handle the editing of this position because it is associated with multiple Position individuals.
<% }else{ %>

${titleVerb} education and training entry for <%= subjectName %>

" >

<%-- Store these values in hidden fields, because the displayed fields are disabled and don't submit. This ensures that when returning from a validation error, we retain the values. --%>

e.g., Postdoctoral training or Transferred

* required fields

<% } %>