package org.emile.cirilo.business;
import java.io.StringReader;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import java.io.InputStream;
import java.net.URLConnection;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamSource;
import org.apache.log4j.Logger;
import org.emile.cirilo.Common;
import org.emile.cirilo.ecm.repository.Repository;
import org.jdom.Document;
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.transform.JDOMResult;
import org.jdom.transform.JDOMSource;
import org.jdom.xpath.XPath;
public class AggregatorFactory {
private static Logger log = Logger.getLogger(AggregatorFactory.class);
public AggregatorFactory() {};
public boolean aggregateKML(String pid, String tit, Document kml, Transformer transformer) {
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') or contains(s:model/@uri,'cm:OAIRecord')]");
xpath.addNamespace( Common.xmlns_sparql );
List nodes = (List) xpath.selectNodes( doc );
if (nodes.size() > 0) {
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
Format format = Format.getRawFormat();
format.setEncoding("UTF-8");
XMLOutputter outputter = new XMLOutputter(format);
XPath qPath = XPath.newInstance("//k:Folder");
qPath.addNamespace(Common.xmlns_kml);
Element Folder = (Element) qPath.selectSingleNode( kml );
try {
Folder.getChild("name", Common.xmlns_kml).setText(tit);
} catch (Exception e) {
Element name = new Element("name", Common.xmlns_kml);
name.setText(tit);
Folder.addContent(name);
}
String oid = null;
for (Iterator iter = nodes.iterator(); iter.hasNext();)
{
Element el = (Element) iter.next();
String model = el.getChild("model", Common.xmlns_sparql).getAttributeValue("uri");
oid = el.getChild("pid", Common.xmlns_sparql).getAttributeValue("uri").substring(Common.INFO_FEDORA.length());
String dsid;
if (model.contains("cm:TEI")) dsid = "TEI_SOURCE";
else if (model.contains("cm:LIDO")) dsid = "LIDO_SOURCE";
else dsid = "EDM_STREAM";
Document data = db.build (Repository.getDatastream(oid, dsid));
transformer.setParameter("pid", oid);
transformer.setParameter("model", model);
JDOMSource in = new JDOMSource(data);
JDOMResult out = new JDOMResult();
transformer.transform(in, out);
try {
List children = out.getDocument().getRootElement().getChildren();
for (Iterator jter = children.iterator(); jter.hasNext();)
{
Element le = (Element) jter.next();
Folder.addContent((Element)le.clone());
}
} catch (Exception ch) {}
}
Repository.modifyDatastreamByValue(pid, "KML", "text/xml",outputter.outputString(kml).replaceAll("<k:","<").replaceAll("</k:","</"));
System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");
return true;
}
return false;
} catch (Exception e) {
log.error(e.getLocalizedMessage(),e);
} finally {
System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");
}
return false;
}
public boolean aggregatePELAGIOS(String pid, String tit, Document pelagios, Transformer transformer) {
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') or contains(s:model/@uri,'cm:OAIRecord')]");
xpath.addNamespace( Common.xmlns_sparql );
List nodes = (List) xpath.selectNodes( doc );
if (nodes.size() > 0) {
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
Format format = Format.getRawFormat();
format.setEncoding("UTF-8");
XMLOutputter outputter = new XMLOutputter(format);
Element root = pelagios.getRootElement();
for (Iterator iter = nodes.iterator(); iter.hasNext();)
{
Element el = (Element) iter.next();
String oid = el.getChild("pid", Common.xmlns_sparql).getAttributeValue("uri").substring(Common.INFO_FEDORA.length());
String model = el.getChild("model", Common.xmlns_sparql).getAttributeValue("uri");
String dsid;
if (model.contains("cm:TEI")) dsid = "TEI_SOURCE";
else if (model.contains("cm:LIDO")) dsid = "LIDO_SOURCE";
else dsid = "EDM_STREAM";
Document data = db.build (Repository.getDatastream(oid, dsid));
transformer.setParameter("pid", oid);
transformer.setParameter("model", model);
JDOMSource in = new JDOMSource(data);
JDOMResult out = new JDOMResult();
transformer.transform(in, out);
try {
List children = out.getDocument().getRootElement().getChildren();
for (Iterator jter = children.iterator(); jter.hasNext();)
{
Element le = (Element) jter.next();
root.addContent((Element)le.clone());
}
} catch (Exception ch) {}
}
Repository.modifyDatastreamByValue(pid, "PELAGIOS", "text/xml",outputter.outputString(pelagios));
System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");
return true;
}
return false;
} catch (Exception e) {
log.error(e.getLocalizedMessage(),e);
} finally {
System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");
}
return false;
}
public boolean aggregateCMIF(String pid, String tit, Document cmif, Transformer transformer) {
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')]");
xpath.addNamespace( Common.xmlns_sparql );
List nodes = (List) xpath.selectNodes( doc );
if (nodes.size() > 0) {
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
Format format = Format.getRawFormat();
format.setEncoding("UTF-8");
XMLOutputter outputter = new XMLOutputter(format);
XPath qpath = XPath.newInstance("/t:TEI/t:teiHeader/t:profileDesc");
qpath.addNamespace( Common.xmlns_tei_p5);
Element root = (Element) qpath.selectSingleNode( cmif );
for (Iterator iter = nodes.iterator(); iter.hasNext();)
{
Element el = (Element) iter.next();
String oid = el.getChild("pid", Common.xmlns_sparql).getAttributeValue("uri").substring(Common.INFO_FEDORA.length());
Document data = db.build (Repository.getDatastream(oid, "TEI_SOURCE" ));
transformer.setParameter("pid", oid);
JDOMSource in = new JDOMSource(data);
JDOMResult out = new JDOMResult();
transformer.transform(in, out);
try {
List children = out.getDocument().getRootElement().getChildren();
for (Iterator jter = children.iterator(); jter.hasNext();)
{
Element le = (Element) jter.next();
root.addContent((Element)le.clone());
}
} catch (Exception ch) {}
}
Repository.modifyDatastreamByValue(pid, "CMIF", "text/xml",outputter.outputString(cmif));
System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");
return true;
}
return false;
} catch (Exception e) {
log.error(e.getLocalizedMessage(),e);
} finally {
System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");
}
return false;
}
}