<%-- CDDL HEADER START The contents of this file are subject to the terms of the Common Development and Distribution License, Version 1.0 only (the "License"). You may not use this file except in compliance with the License. You can obtain a copy of the license at license/ESCIDOC.LICENSE or http://www.escidoc.org/license. See the License for the specific language governing permissions and limitations under the License. When distributing Covered Code, include this CDDL HEADER in each file and include the License file at license/ESCIDOC.LICENSE. If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner] CDDL HEADER END Copyright 2006-2012 Fachinformationszentrum Karlsruhe Gesellschaft für wissenschaftlich-technische Information mbH and Max-Planck- Gesellschaft zur Förderung der Wissenschaft e.V. All rights reserved. Use is subject to license terms. --%> <%@page import="de.mpg.escidoc.services.cone.web.Login"%> <% request.setCharacterEncoding("UTF-8"); this.request = request; response.setCharacterEncoding("UTF-8"); %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ page import="java.util.Map" %> <%@ page import="java.util.HashMap" %> <%@ page import="java.util.List" %> <%@ page import="java.util.Enumeration" %> <%@ page import="java.util.Arrays" %> <%@ page import="java.util.ArrayList" %> <%@ page import="de.mpg.escidoc.services.cone.QuerierFactory" %> <%@ page import="de.mpg.escidoc.services.cone.Querier" %> <%@ page import="de.mpg.escidoc.services.cone.ModelList.Model" %> <%@ page import="de.mpg.escidoc.services.cone.ModelList" %> <%@ page import="de.mpg.escidoc.services.cone.ModelList.Predicate" %> <%@ page import="de.mpg.escidoc.services.cone.util.LocalizedString" %> <%@ page import="de.mpg.escidoc.services.cone.util.TreeFragment" %> <%@ page import="de.mpg.escidoc.services.cone.util.LocalizedTripleObject" %> <%@ page import="de.mpg.escidoc.services.cone.ModelList.Predicate" %> <%@ page import="java.io.PrintWriter" %> <%@ page import="java.io.StringWriter" %> <%@ page import="java.util.Set" %> <%@ page import="java.util.HashSet" %> <%@ page import="de.mpg.escidoc.services.cone.web.util.HtmlUtils" %> <%@ page import="java.nio.charset.Charset" %> <%@ page import="de.mpg.escidoc.services.aa.AuthenticationVO" %> <%@ page import="org.apache.log4j.Logger"%> <%! static Logger logger = Logger.getLogger("CoNE edit.jsp"); List errors; List messages; boolean warning; HttpServletRequest request = null; Querier querier = null; String sessionAttributePrefix = "coneSubSession_"; private String displayPredicates(Model model, TreeFragment results, String uri, List predicates, String prefix, String path, boolean loggedIn) { StringWriter out = new StringWriter(); for (Predicate predicate : predicates) { //Display name of predicate and mandatory status out.append("\n"); out.append(""); if (predicate.isMandatory()) { out.append("\n*"); } out.append(predicate.getName()+": "); out.append(""); out.append("\n"); //If this predicate has the same identifier as the models primary identifier, display the primary identifier as value (or a message if no identifier is available yet for new entries) if (model != null && predicate.getId().equals(model.getIdentifier()) && prefix.isEmpty()) { List resList = results.get(predicate.getId()); if (results.get(predicate.getId()) != null && !resList.isEmpty()) { for (LocalizedTripleObject object : resList) { out.append(object.toString()); if (object instanceof TreeFragment) { request.getSession().setAttribute(sessionAttributePrefix + prefix + predicate.getId().replaceAll("[/:.]", "_"), ((TreeFragment) object).getSubject()); } else if (object instanceof LocalizedString) { request.getSession().setAttribute(sessionAttributePrefix + prefix + predicate.getId().replaceAll("[/:.]", "_"), ((LocalizedString) object).getValue()); } else { request.getSession().setAttribute(sessionAttributePrefix + prefix + predicate.getId().replaceAll("[/:.]", "_"), object.toString()); } } } else { out.append("Will be the same value as Cone-ID"); } } //Otherwise (predicates that are not equal to the model's primary identifier) else { //If a value for this predicate already exists if (results != null && results.get(predicate.getId()) != null && results.get(predicate.getId()).size() > 0) { int counter = 0; boolean multiValues = results.get(predicate.getId()).size() > 1; for (LocalizedTripleObject object : results.get(predicate.getId())) { out.append("\n"); //Value for predicate exists and predicate is modifyable if (predicate.isModify()) { StringBuffer value = new StringBuffer(); if (predicate.getDefaultValue() != null && predicate.getEvent() == ModelList.Event.ONLOAD && predicate.isOverwrite()) { value.append(HtmlUtils.escapeHtml(predicate.getDefault(request))); } else { if (object instanceof TreeFragment) { value.append(HtmlUtils.escapeHtml(((TreeFragment) object).getSubject())); } else if (object instanceof LocalizedString) { value.append(HtmlUtils.escapeHtml(((LocalizedString) object).getValue())); } else { value.append(HtmlUtils.escapeHtml(object.toString())); } } String name = prefix + predicate.getId().replaceAll("[/:.]", "_"); String onChangeSnippet = (" onchange=\"checkField(this, '" + model.getName() + "', '" + path + predicate.getId() + "', '" + prefix + predicate.getId().replaceAll("[/:.]", "_") + "', " + (multiValues ? counter + "" : "null") + ", false, " + predicate.isShouldBeUnique() + ")\""); String nameSnippet = (" name=\"" + name + "\""); String cssSnippet = predicate.isResource() ? (" " + prefix + predicate.getId().replaceAll("[/:.]", "_")) : ""; if (predicate.isGenerateObject()) { out.append("\n"); } else if(predicate.getType()!=null && predicate.getType() == ModelList.Type.XML) { out.append("\n"); out.append("\n"); out.append(""); } else { out.append("\n"); } if (predicate.isResource()) { out.append("\n"); } if(predicate.getSuggestUrl()!= null && !predicate.getSuggestUrl().trim().isEmpty()) { out.append("\n"); } if (predicate.isLocalized()) { out.append(""); out.append(""); } if (predicate.isMultiple()) { out.append("0) + ")\"/>"); } else { if (predicate.isLocalized()) { out.append("0) + ")\"/>" ); } } if (results.get(predicate.getId()).size() > 1 || !((object.getLanguage() == null || "".equals(object.getLanguage())) && object instanceof LocalizedString && "".equals(((LocalizedString) object).getValue()))) { out.append("0) + ");\"/>"); } if (predicate.getPredicates() == null || predicate.getPredicates().size() == 0 || predicate.isResource()) { out.append(""); } // out.append(""); } //Value for predicate exists and it is not modifyable else { if (predicate.getDefaultValue() != null && predicate.getEvent() == ModelList.Event.ONLOAD && predicate.isOverwrite()) { String defaultValue = predicate.getDefault(request); out.append(predicate.getDefault(request)); request.getSession().setAttribute(sessionAttributePrefix + prefix + predicate.getId().replaceAll("[/:.]", "_"), defaultValue); } else { out.append(object.toString()); if (object instanceof TreeFragment) { request.getSession().setAttribute(sessionAttributePrefix + prefix + predicate.getId().replaceAll("[/:.]", "_"), ((TreeFragment) object).getSubject()); } else if (object instanceof LocalizedString) { request.getSession().setAttribute(sessionAttributePrefix + prefix + predicate.getId().replaceAll("[/:.]", "_"), ((LocalizedString) object).getValue()); } else { request.getSession().setAttribute(sessionAttributePrefix + prefix + predicate.getId().replaceAll("[/:.]", "_"), object.toString()); } } } //Predicate has child predicates if (predicate.getPredicates() != null && predicate.getPredicates().size() > 0) { out.append("
"); out.append("\n"); out.append(displayPredicates(model, (object instanceof TreeFragment ? (TreeFragment) object : null), uri, predicate.getPredicates(), prefix + predicate.getId().replaceAll("[/:.]", "_") + "_" + counter + "|", path + predicate.getId() + "/", Login.getLoggedIn(request))); out.append(""); } out.append("
"); counter++; } } //A value for this predicate does not exist yet, it is modifyable else if (predicate.isModify() && !(predicate.getDefaultValue() != null && predicate.getEvent() == Event.ONSAVE)) { if (predicate.getPredicates() == null || predicate.getPredicates().size() == 0) { out.append("\n"); String name = prefix + predicate.getId().replaceAll("[/:.]", "_"); String nameSnippet = " name=\"" + name + "\""; String onChangeSnippet = " onchange=\"checkField(this, '" + model.getName() + "', '" + path + predicate.getId() + "', '" + prefix + predicate.getId().replaceAll("[/:.]", "_") + "', null, false, " + predicate.isShouldBeUnique() + ");\""; String cssSnippet = predicate.isResource() ? (" " + prefix + predicate.getId().replaceAll("[/:.]", "_")) : ""; if (predicate.isGenerateObject()) { out.append(""); } else if(predicate.getType()!=null && predicate.getType() == ModelList.Type.XML) { out.append("\n"); out.append("\n"); out.append(""); } else { out.append("\n"); } if (predicate.isResource()) { out.append("\n"); } if(predicate.getSuggestUrl()!= null && !predicate.getSuggestUrl().trim().isEmpty()) { out.append("\n"); } if (predicate.isLocalized()) { out.append(""); out.append("\n"); } // if (predicate.getPredicates() != null && predicate.getPredicates().size() > 0) // { // // out.append(displayPredicates(model, null, uri, predicate.getPredicates(), prefix + predicate.getId().replaceAll("[/:.]", "_") + ":0:")); // } if (predicate.isMultiple()) { out.append("0) + ")\"/>"); } else { if (predicate.isLocalized()) { out.append("\n0) + ")\"/>"); } } out.append(""); // out.append(""); out.append(""); } else if (predicate.isMultiple()) { out.append("\n"); out.append("\n0) + ")\"/>"); out.append(""); } else if (predicate.isLocalized()) { out.append("\n"); out.append("\n0) + ")\"/>"); out.append(""); } } //A value for this predicate does not exist yet and is automatically generated on load of this page else if (predicate.getDefaultValue() != null && predicate.getEvent() == ModelList.Event.ONLOAD) { String defaultValue = predicate.getDefault(request); out.append(predicate.getDefault(request)); request.getSession().setAttribute(sessionAttributePrefix + prefix + predicate.getId().replaceAll("[/:.]", "_"), defaultValue); } //A value for this predicate does not exist yet and is automatically generated on save of this page else if (predicate.getDefaultValue() != null && predicate.getEvent() == Event.ONSAVE) { //remove old session attributes which are not modifiable if(!predicate.isModify()) { request.getSession().removeAttribute(prefix + predicate.getId().replaceAll("[/:.]", "_")); } out.append("Will be generated automatically"); } else { out.append("---"); } } out.append("\n
"); out.append("\n
"); } return out.toString(); } private void mapFormValues(Model model, List predicates, HttpServletRequest request, Enumeration paramNames, TreeFragment results, String prefix) { for (Predicate predicate : predicates) { String paramName = prefix + predicate.getId().replaceAll("[/:.]", "_"); //System.out.println("-----------------------------------------------------------------------------------------"); //System.out.println("Param Name: " + paramName); //System.out.println("-----------------------------------------------------------------------------------------"); String[] paramValues = request.getParameterValues(paramName); //System.out.println("Values:" + paramValues); if (!predicate.isModify() && predicate.getDefaultValue() != null && request.getSession().getAttribute(sessionAttributePrefix + paramName) != null) { paramValues = new String[]{(String) request.getSession().getAttribute(sessionAttributePrefix + paramName)}; } else if (model.getIdentifier() != null && model.getIdentifier().equals(predicate.getId()) && predicate.isMandatory() && request.getSession().getAttribute(sessionAttributePrefix + paramName) != null) { paramValues = new String[]{(String) request.getSession().getAttribute(sessionAttributePrefix + paramName)}; } String[] langValues = request.getParameterValues(paramName + "_lang"); List objects = new ArrayList(); if (paramValues != null) { for (int i = 0; i < paramValues.length; i++) { String paramValue = paramValues[i]; //System.out.println("workoing on paramValue:" + paramValue); if (predicate.getDefaultValue() != null && predicate.isOverwrite() && predicate.getEvent() == Event.ONSAVE) { paramValue = predicate.getDefault(request); } String langValue = null; if (langValues != null && langValues.length == paramValues.length) { langValue = langValues[i]; } if (!"".equals(paramValue)) { if (predicate.getPredicates() != null && predicate.getPredicates().size() > 0) { TreeFragment fragment = new TreeFragment(paramValue, langValue); objects.add(fragment); mapFormValues(model, predicate.getPredicates(), request, paramNames, fragment, paramName + "_" + i + "|"); } else if (predicate.isResource()) { TreeFragment fragment = new TreeFragment(paramValue, langValue); objects.add(fragment); } else { objects.add(new LocalizedString(paramValue, langValue)); } } else if (predicate.isGenerateObject()) { try { String generatedObject = querier.createUniqueIdentifier(null); //System.out.println("Generating new identifier") if (predicate.getPredicates() != null && predicate.getPredicates().size() > 0) { TreeFragment fragment = new TreeFragment(generatedObject, langValue); objects.add(fragment); mapFormValues(model, predicate.getPredicates(), request, paramNames, fragment, paramName + "_" + i + "|"); } else { objects.add(new LocalizedString(paramValue, langValue)); } } catch (Exception e) { throw new RuntimeException(e); } } else { objects.add(new LocalizedString(paramValue, langValue)); } } } else if (predicate.getDefaultValue() != null && predicate.getEvent() == Event.ONSAVE) { if (predicate.getPredicates() != null && predicate.getPredicates().size() > 0) { TreeFragment fragment = new TreeFragment(predicate.getDefault(request), null); objects.add(fragment); } else { objects.add(new LocalizedString(predicate.getDefault(request), null)); } } if (!predicate.isMultiple() && objects.size() > 1) { if (predicate.isLocalized()) { Set languages = new HashSet(); for (LocalizedTripleObject tripleObject : objects) { if (languages.contains(tripleObject.getLanguage())) { errors.add("\"" + predicate.getName() + "\" must not have multiple values of the same language."); break; } else { languages.add(tripleObject.getLanguage()); } } } else { errors.add("\"" + predicate.getName() + "\" must not have multiple values."); } } if ((model.getIdentifier() == null || !model.getIdentifier().equals(predicate.getId())) && predicate.isMandatory()) { if (objects.size() == 0) { errors.add("\"" + predicate.getName() + "\" is mandatory."); } else { boolean empty = true; for (LocalizedTripleObject object : objects) { if (object.hasValue()) { empty = false; break; } } if (empty) { errors.add("\"" + predicate.getName() + "\" is mandatory."); } } } results.put(predicate.getId(), objects); } } %> <% errors = new ArrayList(); messages = new ArrayList(); warning = false; String uri = request.getParameter("uri"); String modelName = request.getParameter("model"); AuthenticationVO user = (AuthenticationVO) request.getSession().getAttribute("user"); Model model = null; TreeFragment results = new TreeFragment(); Enumeration paramNames = request.getParameterNames(); boolean loggedIn = Login.getLoggedIn(request); querier = QuerierFactory.newQuerier(loggedIn); if (modelName != null && !"".equals(modelName)) { model = ModelList.getInstance().getModelByAlias(modelName); } if ("true".equals(request.getParameter("form"))) { if (!model.isGenerateIdentifier() && request.getParameter("cone_identifier") != null) { results.setSubject(request.getParameter("cone_identifier")); } mapFormValues(model, model.getPredicates(), request, paramNames, results, ""); } //First call edit.jsp (just GET request, no form submission) else { //remove old session attributes for(Enumeration e = request.getSession().getAttributeNames(); e.hasMoreElements(); ) { String attrName = (String)e.nextElement(); if(attrName.startsWith(sessionAttributePrefix)) { request.getSession().removeAttribute(attrName); } } } boolean form = ("true".equals(request.getParameter("form"))); if (request.getParameter("workflow") != null) { errors = new ArrayList(); messages = new ArrayList(); results = (TreeFragment) session.getAttribute("currentObject"); if ("change".equals(request.getParameter("workflow"))) { results = querier.details(modelName, uri, "*"); } else if ("overwrite".equals(request.getParameter("workflow"))) { logger.info("Overwrite existing CoNE entry " + uri + " by user " + user.getUsername() +" (" + user.getUserId() + ")"); querier.delete(modelName, uri); querier.create(modelName, uri, results); if (request.getSession().getAttribute("latestSearch") != null) { response.sendRedirect(request.getSession().getAttribute("latestSearch").toString()); return; } messages.add("Entry saved."); logger.info("CoNE entry " + uri + " overwritten successfully by user " + user.getUsername() +" (" + user.getUserId() + ")"); } else if ("update-overwrite".equals(request.getParameter("workflow"))) { logger.info("Merge existing CoNE entry " + uri + " by user " + user.getUsername() +" (" + user.getUserId() + ")"); TreeFragment existingObject = querier.details(modelName, uri, "*"); existingObject.merge(results, true); results = existingObject; querier.delete(modelName, uri); querier.create(modelName, uri, results); if (request.getSession().getAttribute("latestSearch") != null) { response.sendRedirect(request.getSession().getAttribute("latestSearch").toString()); return; } messages.add("Entry saved."); logger.info("CoNE entry " + uri + " merged successfully by user " + user.getUsername() +" (" + user.getUserId() + ")"); } } else if ((request.getParameter("delete") != null || request.getParameter("save") != null) && ((request.getSession().getAttribute("edit_open_vocabulary") == null) && (model != null && (Boolean)model.isOpen()) //|| !((Boolean)request.getSession().getAttribute("edit_open_vocabulary")).booleanValue()) )) { errors.add("Not authorized for this action."); } else if ((request.getParameter("delete") != null || request.getParameter("save") != null) && ((request.getSession().getAttribute("edit_closed_vocabulary") == null) && (model != null && !(Boolean)model.isOpen()))) { errors.add("Not authorized for this action."); } else if (request.getParameter("delete") != null) { logger.info("Deleting existing CoNE entry " + uri + " by user " + user.getUsername() +" (" + user.getUserId() + ")"); querier.delete(modelName, uri); logger.info("CoNE entry " + uri + " deleted successfully by user " + user.getUsername() +" (" + user.getUserId() + ")"); uri = null; messages.add("Entry deleted successfully."); /* if (request.getSession().getAttribute("latestSearch") != null) { response.sendRedirect(request.getSession().getAttribute("latestSearch").toString()); return; } */ } else if (request.getParameter("save") != null) { if (errors.size() == 0) { if (uri == null) { String identifierValue; if (model.isGenerateIdentifier()) { identifierValue = querier.createUniqueIdentifier(modelName); uri = model.getSubjectPrefix() + identifierValue; } else { identifierValue = request.getParameter("cone_identifier"); //Check if identifier is null or not ASCII compatible if (identifierValue != null && !"".equals(identifierValue) && Charset.forName("US-ASCII").newEncoder().canEncode(identifierValue)) { identifierValue = identifierValue.trim(); uri = model.getSubjectPrefix() + identifierValue; TreeFragment result = querier.details(modelName, uri, "*"); if (result.exists()) { warning = true; session.setAttribute("currentObject", results); errors.add("This resource already exists."); } } else { errors.add("No primary key is provided or the key is invalid. Please do not use special characters or umlauts."); } } if (model.getIdentifier() != null) { List idList = new ArrayList(); idList.add(new LocalizedString(model.getIdentifierPrefix() + identifierValue)); results.put(model.getIdentifier(), idList); } logger.info("Creating new CoNE entry " + uri + " by user " + user.getUsername() +" (" + user.getUserId() + ")"); } else { if (!uri.startsWith(model.getSubjectPrefix())) { errors.add("Identifier does not start with expected prefix '" + model.getSubjectPrefix() + "'"); } logger.info("Modifying existing CoNE entry " + uri + " by user " + user.getUsername() +" (" + user.getUserId() + ")"); // else // { // String identifierName = model.getIdentifier(); // String identifierValue = uri.substring(model.getIdentifierPrefix().length()); // List objects = new ArrayList(); // objects.add(new LocalizedString(identifierValue)); // results.put(identifierName, objects); // } } if (errors.size() == 0 && !warning) { querier.delete(modelName, uri); querier.create(modelName, uri, results); messages.add("Entry saved."); logger.info("CoNE entry " + uri + " saved successfully by user " + user.getUsername() +" (" + user.getUserId() + ")"); response.sendRedirect("view.jsp?model=" + modelName + "&uri=" + uri); return; /* if (request.getSession().getAttribute("latestSearch") != null) { response.sendRedirect(request.getSession().getAttribute("latestSearch").toString()); return; } */ } } } //Edit existing entity else if (uri != null && !"".equals(uri) && modelName != null && !"".equals(modelName)) { //First call of edit existing entity (just GET request, no form submission) if (!form) { results = querier.details(modelName, uri, "*"); } errors = new ArrayList(); messages = new ArrayList(); } %> <%@page import="de.mpg.escidoc.services.cone.ModelList.Event"%>
<% if (uri != null) { %> <% } %>

<% if (uri != null) { %> Edit <%= modelName %> <% } else { %> New <%= modelName %> <% } %>

 
<% if (messages.size() > 0) { %>
    <% for (String message : messages) { %>
  • <%= message %>
  • <% } %>
<% } %> <% if (request.getParameter("save") != null && errors.size() > 0) { %>
    <% for (String error : errors) { %>
  • Error: <%= error %>
  • <% } %>
<% } %>  
<% if (uri != null) { %>
  <%= modelName %>:<%= uri %>
<% } %> <% if (warning) { %>

What do you want to do?

Replace the existing object with mine.
Update the existing object with mine (overwrite matching predicates).
Update the existing object with mine (add matching predicates where possible).
Switch to the existing object.


<% } else { %>

Data

*Cone-ID: <% if (uri == null) { if (model.isGenerateIdentifier()) { out.append(""); } else { out.append(""); out.append(""); String subject = ""; if (results.getSubject() != null) { subject = results.getSubject(); } out.append(""); out.append(""); // out.append(""); } } else { out.append(""); } %> <% if (model != null) { %> <%= displayPredicates(model, results, uri, model.getPredicates(), "", "", Login.getLoggedIn(request)) %> <% } %>
* mandatory field
<% } %>
<% if (uri != null) { %> <% } %>