package gate.compound.impl;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import gate.*;
import gate.alignment.Alignment;
import gate.creole.ResourceInstantiationException;
import gate.util.GateRuntimeException;
/**
* Implemention of the CompoundDocument. Compound Document is a set of
* one or more documents. It provides a more convenient way to group
* documents and interpret them as a single document. It has a
* capability to switch the focus among the different memebers of it.
*
* @author niraj
*/
public class CompoundDocumentFromXml extends CompoundDocumentImpl {
private static final long serialVersionUID = 8114328411647768889L;
/** Initialise this resource, and return it. */
public Resource init() throws ResourceInstantiationException {
// set up the source URL and create the content
if(sourceUrl == null) {
throw new ResourceInstantiationException(
"The sourceURL and document's content were null.");
}
try {
StringBuilder xmlString = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(sourceUrl
.openStream(), "utf-8"));
String line = br.readLine();
while(line != null) {
xmlString.append("\n").append(line);
line = br.readLine();
}
StringReader reader = new StringReader(xmlString.toString());
com.thoughtworks.xstream.XStream xstream = new com.thoughtworks.xstream.XStream(
new com.thoughtworks.xstream.io.xml.StaxDriver());
// asking the xstream library to use gate class loader
xstream.setClassLoader(Gate.getClassLoader());
// reading the xml object
Map<String, Object> globalMap = (HashMap<String, Object>)xstream
.fromXML(reader);
// now we read individual information
Map<String, String> docXmls = (HashMap<String, String>)globalMap
.get("docXmls");
Map<String, Object> features = (Map<String, Object>)globalMap
.get("feats");
String encoding = (String)features.get("encoding");
super.setEncoding(encoding);
File tempFile = File.createTempFile("example", ".xml");
File tempFolder = new File(tempFile.getParentFile(), "temp"
+ Gate.genSym());
if(!tempFolder.exists() && !tempFolder.mkdirs()) {
throw new GateRuntimeException("Temporary folder "
+ tempFolder.getAbsolutePath() + " could not be created");
}
tempFile.deleteOnExit();
tempFolder.deleteOnExit();
URL sourceUrl = null;
List<String> docIDs = new ArrayList<String>();
for(String id : docXmls.keySet()) {
docIDs.add(id);
File newFile = new File("X." + id + ".xml");
newFile.deleteOnExit();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(newFile), encoding));
bw.write(docXmls.get(id));
bw.flush();
bw.close();
sourceUrl = newFile.toURI().toURL();
}
super.setDocumentIDs(docIDs);
super.setSourceUrl(sourceUrl);
String name = (String)features.get("name");
features.remove("name");
FeatureMap fets = Factory.newFeatureMap();
for(String s : features.keySet()) {
fets.put(s, features.get(s));
}
this.setName(name);
super.init();
Document aDoc = getCurrentDocument();
setCurrentDocument(null);
FeatureMap docFeatures = (FeatureMap)globalMap.get("docFeats");
for(Object key : docFeatures.keySet()) {
Object value = docFeatures.get(key);
if(value instanceof Alignment) {
((Alignment)value).setSourceDocument(this);
}
}
setFeatures(docFeatures);
if(aDoc != null) setCurrentDocument(aDoc.getName());
br.close();
}
catch(UnsupportedEncodingException uee) {
throw new ResourceInstantiationException(uee);
}
catch(IOException ioe) {
throw new ResourceInstantiationException(ioe);
}
return this;
} // init()
}