public Element exec(Element params, ServiceContext context) throws Exception { UserSession session = context.getUserSession(); boolean witholdWithheldElements = Util.getParam(params, "hide_withheld", false); if (witholdWithheldElements) { XmlSerializer.getThreadLocal(true).setForceHideWithheld(witholdWithheldElements); } // ----------------------------------------------------------------------- // --- handle current tab Element elCurrTab = params.getChild(Params.CURRTAB); if (elCurrTab != null) session.setProperty(Geonet.Session.METADATA_SHOW, elCurrTab.getText()); // ----------------------------------------------------------------------- // --- check access GeonetContext gc = (GeonetContext) context.getHandlerContext(Geonet.CONTEXT_NAME); DataManager dm = gc.getDataManager(); String id = Utils.getIdentifierFromParameters(params, context); if (!skipPopularity) { // skipPopularity could be a URL param as well String skip = Util.getParam(params, "skipPopularity", "n"); skipPopularity = skip.equals("y"); } if (id == null) throw new MetadataNotFoundEx("Metadata not found."); Lib.resource.checkPrivilege(context, id, AccessManager.OPER_VIEW); // ----------------------------------------------------------------------- // --- get metadata Element elMd; boolean addEditing = false; if (!skipInfo) { boolean withValidationErrors = false, keepXlinkAttributes = false; elMd = dm.getMetadata(context, id, addEditing, withValidationErrors, keepXlinkAttributes); } else { elMd = dm.getMetadataNoInfo(context, id); } if (elMd == null) throw new MetadataNotFoundEx(id); if (addRefs) { // metadata.show for GeoNetwork needs geonet:element elMd = dm.enumerateTree(elMd); } // // setting schemaLocation // TODO currently it's only set for ISO metadata - this should all move // to // the updatefixedinfo.xsl for each schema // do not set schemaLocation if it is already there if (elMd.getAttribute("schemaLocation", Csw.NAMESPACE_XSI) == null) { Namespace gmdNs = elMd.getNamespace("gmd"); // document has ISO root element and ISO namespace if (gmdNs != null && gmdNs.getURI().equals("http://www.isotc211.org/2005/gmd")) { String schemaLocation; // if document has srv namespace then add srv schemaLocation if (elMd.getNamespace("srv") != null) { schemaLocation = " http://www.isotc211.org/2005/srv http://schemas.opengis.net/iso/19139/20060504/srv/srv.xsd"; } // otherwise add gmd schemaLocation // (but not both! as that is invalid, the schemas describe // partially the same schema types) else { schemaLocation = "http://www.isotc211.org/2005/gmd http://www.isotc211.org/2005/gmd/gmd.xsd"; } Attribute schemaLocationA = new Attribute("schemaLocation", schemaLocation, Csw.NAMESPACE_XSI); elMd.setAttribute(schemaLocationA); } } // --- increase metadata popularity if (!skipPopularity) dm.increasePopularity(context, id); return elMd; }
/** * TODO javadoc. * * @param dbms * @param id * @param changes * @param currVersion * @return * @throws Exception */ private Element applyChanges(Dbms dbms, String id, Hashtable changes, String currVersion) throws Exception { Lib.resource.checkEditPrivilege(context, id); Element md = xmlSerializer.select(dbms, "Metadata", id, context); // --- check if the metadata has been deleted if (md == null) { return null; } EditLib editLib = dataManager.getEditLib(); String schema = dataManager.getMetadataSchema(dbms, id); editLib.expandElements(schema, md); editLib.enumerateTree(md); // --- check if the metadata has been modified from last time if (currVersion != null && !editLib.getVersion(id).equals(currVersion)) { return null; } // --- update elements for (Enumeration e = changes.keys(); e.hasMoreElements(); ) { String ref = ((String) e.nextElement()).trim(); String val = ((String) changes.get(ref)).trim(); String attr = null; if (updatedLocalizedTextElement(md, ref, val, editLib)) { continue; } int at = ref.indexOf('_'); if (at != -1) { attr = ref.substring(at + 1); ref = ref.substring(0, at); } boolean xmlContent = false; if (ref.startsWith("X")) { ref = ref.substring(1); xmlContent = true; } Element el = editLib.findElement(md, ref); if (el == null) throw new IllegalStateException("Element not found at ref = " + ref); if (attr != null) { // The following work-around decodes any attribute name that has a COLON in it // The : is replaced by the word COLON in the xslt so that it can be processed // by the XML Serializer when an update is submitted - a better solution is // to modify the argument handler in Jeeves to store arguments with their name // as a value rather than as the element itself Integer indexColon = attr.indexOf("COLON"); if (indexColon != -1) { String prefix = attr.substring(0, indexColon); String localname = attr.substring(indexColon + 5); String namespace = editLib.getNamespace(prefix + ":" + localname, md, dataManager.getSchema(schema)); Namespace attrNS = Namespace.getNamespace(prefix, namespace); if (el.getAttribute(localname, attrNS) != null) { el.setAttribute(new Attribute(localname, val, attrNS)); } // End of work-around } else { if (el.getAttribute(attr) != null) el.setAttribute(new Attribute(attr, val)); } } else if (xmlContent) { if (Log.isDebugEnabled(Geonet.EDITOR)) Log.debug(Geonet.EDITOR, "replacing XML content"); el.removeContent(); val = addNamespaceToFragment(val); el.addContent(Xml.loadString(val, false)); } else { List content = el.getContent(); for (int i = 0; i < content.size(); i++) { if (content.get(i) instanceof Text) { el.removeContent((Text) content.get(i)); i--; } } el.addContent(val); } } // --- remove editing info added by previous call editLib.removeEditingInfo(md); editLib.contractElements(md); return md; }