/** * For Editing : adds an attribute from a metadata ([add] link). FIXME: Modify and use within Ajax * controls * * @param dbms * @param id * @param ref * @param name * @param currVersion * @return * @throws Exception */ public synchronized boolean addAttribute( Dbms dbms, String id, String ref, String name, String currVersion) throws Exception { Element md = xmlSerializer.select(dbms, "Metadata", id); // --- check if the metadata has been deleted if (md == null) return false; String schema = dataManager.getMetadataSchema(dbms, id); EditLib editLib = dataManager.getEditLib(); editLib.expandElements(schema, md); editLib.enumerateTree(md); // --- get element to add Element el = editLib.findElement(md, ref); if (el == null) Log.error(Geonet.DATA_MANAGER, MSG_ELEMENT_NOT_FOUND_AT_REF + ref); // throw new IllegalStateException("Element not found at ref = " + ref); // --- remove editing info added by previous call editLib.removeEditingInfo(md); if (el != null) { el.setAttribute(new Attribute(name, "")); } editLib.contractElements(md); String parentUuid = null; md = dataManager.updateFixedInfo( schema, id, null, md, parentUuid, DataManager.UpdateDatestamp.no, dbms); String changeDate = null; xmlSerializer.update(dbms, id, md, changeDate, false, context); // Notifies the metadata change to metatada notifier service dataManager.notifyMetadataChange(dbms, md, id); // --- update search criteria boolean workspace = false; dataManager.indexInThreadPoolIfPossible(dbms, id, workspace); return true; }
/** * 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; }