package org.emile.cirilo.business; import java.io.StringReader; import java.net.URL; import java.util.Iterator; import java.util.List; import java.net.URLConnection; import org.apache.log4j.Logger; import org.emile.cirilo.Common; import org.emile.cirilo.ecm.repository.Repository; import org.jdom.Element; import org.jdom.input.DOMBuilder; import org.jdom.input.SAXBuilder; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; import org.jdom.xpath.XPath; public class ContextRefresher { private static Logger log = Logger.getLogger(ContextRefresher.class); public ContextRefresher() {}; public boolean refreshKML(String pid, String tit) { try { DOMBuilder db = new DOMBuilder(); org.jdom.Document doc = db.build (Repository.getDatastream(pid, "METADATA", new Integer(0))); XPath xpath = XPath.newInstance("/s:sparql/s:results/s:result[contains(s:model/@uri,'cm:TEI') or contains(s:model/@uri,'cm:LIDO')]"); xpath.addNamespace( Common.xmlns_sparql ); List nodes = (List) xpath.selectNodes( doc ); if (nodes.size() > 0) { Format format = Format.getRawFormat(); format.setEncoding("UTF-8"); XMLOutputter outputter = new XMLOutputter(format); byte[] url = Repository.getDatastream(pid, "KML_TEMPLATE" , ""); SAXBuilder builder = new SAXBuilder(); URLConnection con = new URL (new String(url)).openConnection(); con.setUseCaches(false); org.jdom.Document kml_template =builder.build(con.getInputStream()); XPath qPath = XPath.newInstance("//mm:metadata-mapping"); qPath.addNamespace(Common.xmlns_mm); Element Placemark_template = (Element) qPath.selectSingleNode( kml_template ); qPath = XPath.newInstance("//k:Folder"); qPath.addNamespace(Common.xmlns_kml); Element Folder = (Element) qPath.selectSingleNode( kml_template ); Folder.getChild("name", Common.xmlns_kml).setText(tit); for (Iterator iter = nodes.iterator(); iter.hasNext();) { try { Element e = (Element) iter.next(); String uri = e.getChild("pid", Common.xmlns_sparql ).getAttributeValue("uri").substring(Common.INFO_FEDORA.length()); String model = e.getChild("model", Common.xmlns_sparql ).getAttributeValue("uri").substring(Common.INFO_FEDORA.length()); String title = e.getChildText("title", Common.xmlns_sparql); org.jdom.Document data = null; XPath oPath = null; if (model.contains("cm:TEI")) { data= db.build (Repository.getDatastream(uri, "TEI_SOURCE")); oPath = XPath.newInstance("//t:placeName[contains(@xml:id,'GID.')]"); oPath.addNamespace( Common.xmlns_tei_p5 ); oPath.addNamespace( Common.xmlns_xml ); } if (model.contains("cm:LIDO")) { data= db.build (Repository.getDatastream(uri, "LIDO_SOURCE")); oPath = XPath.newInstance("//t:item[contains(@id,'GID.')]"); oPath.addNamespace(Common.xmlns_tei_p5); oPath.addNamespace(Common.xmlns_lido); oPath.addNamespace(Common.xmlns_xml ); } List placeNames = (List) oPath.selectNodes( data ); if (placeNames.size() > 0) { int i=0; for (Iterator jter = placeNames.iterator(); jter.hasNext();) { try { Element place = (Element) jter.next(); String p = outputter.outputString(Placemark_template); i++; MDMapper m = new MDMapper (uri, p); Element o = (Element) place.clone(); Element q = new Element("xmlContent"); q.addContent((Element)data.getRootElement().clone()); o.addContent(q); String s = m.transform(new org.jdom.Document(o)); org.jdom.Document Placemark = builder.build(new StringReader(s)); Element name = Placemark.getRootElement().getChild("name",Common.xmlns_kml); if (name == null) { name = new Element ("name", Common.xmlns_nkml); name.setText(title); Placemark.getRootElement().addContent(0,name); } else { name.setText(title); } Folder.addContent((Element)Placemark.getRootElement().clone()); } catch (Exception r) { log.error(r.getLocalizedMessage(),r); } } } } catch (Exception q) { log.error(q.getLocalizedMessage(),q); } } Placemark_template.getParent().removeContent(Placemark_template); Repository.modifyDatastreamByValue(pid, "KML", "text/xml",outputter.outputString(kml_template).replace("<k:", "<").replace("</k:", "</").replace("xmlns:k", "xmlns")); return true; } return false; } catch (Exception e) { log.error(e.getLocalizedMessage(),e); return false; } } }