InlineXMLExporter.java
001 /*
002  *  Copyright (c) 1995-2014, The University of Sheffield. See the file
003  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
004  *
005  *  This file is part of GATE (see http://gate.ac.uk/), and is free
006  *  software, licenced under the GNU Library General Public License,
007  *  Version 2, June 1991 (in the distribution as file licence.html,
008  *  and also available at http://gate.ac.uk/gate/licence.html).
009  *
010  *  Mark A. Greenwood 14/08/2014
011  *
012  */
013 package gate.corpora.export;
014 
015 import gate.AnnotationSet;
016 import gate.Document;
017 import gate.DocumentExporter;
018 import gate.Factory;
019 import gate.FeatureMap;
020 import gate.GateConstants;
021 import gate.annotation.AnnotationSetImpl;
022 import gate.creole.metadata.AutoInstance;
023 import gate.creole.metadata.CreoleParameter;
024 import gate.creole.metadata.CreoleResource;
025 import gate.creole.metadata.Optional;
026 import gate.creole.metadata.RunTime;
027 import gate.util.InvalidOffsetException;
028 
029 import java.io.IOException;
030 import java.io.OutputStream;
031 import java.io.OutputStreamWriter;
032 import java.util.HashSet;
033 import java.util.List;
034 import java.util.Set;
035 
036 @CreoleResource(name = "Inline XML Exporter", tool = true, autoinstances = @AutoInstance, icon = "InlineXML")
037 public class InlineXMLExporter extends DocumentExporter {
038 
039   private static final long serialVersionUID = -9072204691197080958L;
040 
041   private String annotationSetName, rootElement, encoding;
042 
043   private List<String> annotationTypes;
044 
045   private Boolean includeFeatures, includeOriginalMarkups;
046 
047   public InlineXMLExporter() {
048     super("Inline XML""xml""text/xml");
049   }
050 
051   public String getAnnotationSetName() {
052     return annotationSetName;
053   }
054 
055   public String getEncoding() {
056     return encoding;
057   }
058 
059   @RunTime
060   @CreoleParameter(defaultValue = "UTF-8")
061   public void setEncoding(String encoding) {
062     this.encoding = encoding;
063   }
064 
065   public String getRootElement() {
066     return rootElement;
067   }
068 
069   @RunTime
070   @Optional
071   @CreoleParameter()
072   public void setRootElement(String rootElement) {
073     this.rootElement = rootElement;
074   }
075 
076   @RunTime
077   @Optional
078   @CreoleParameter
079   public void setAnnotationSetName(String annotationSetName) {
080     this.annotationSetName = annotationSetName;
081   }
082 
083   public List<String> getAnnotationTypes() {
084     return annotationTypes;
085   }
086 
087   @RunTime
088   @CreoleParameter(defaultValue = "Person;Location;Organization")
089   public void setAnnotationTypes(List<String> annotationTypes) {
090     this.annotationTypes = annotationTypes;
091   }
092 
093   public Boolean getIncludeOriginalMarkups() {
094     return includeOriginalMarkups;
095   }
096 
097   @RunTime
098   @CreoleParameter(defaultValue = "false")
099   public void setIncludeOriginalMarkups(Boolean includeOriginalMarkups) {
100     this.includeOriginalMarkups = includeOriginalMarkups;
101   }
102 
103   public Boolean getIncludeFeatures() {
104     return includeFeatures;
105   }
106 
107   @RunTime
108   @CreoleParameter(defaultValue = "true")
109   public void setIncludeFeatures(Boolean includeFeatures) {
110     this.includeFeatures = includeFeatures;
111   }
112 
113   @Override
114   public void export(Document doc, OutputStream out, FeatureMap options)
115           throws IOException {
116 
117     Integer rootID = null;
118     AnnotationSet withRoot = null;
119 
120     AnnotationSet originalMarkups = null;
121     AnnotationSet backupOriginalMarkups = null;
122 
123     try {
124       AnnotationSet allAnnots =
125               doc.getAnnotations((String)options.get("annotationSetName"));
126 
127       if(!(Boolean)options.get("includeOriginalMarkups")) {
128         originalMarkups =
129                 doc.getAnnotations(GateConstants.ORIGINAL_MARKUPS_ANNOT_SET_NAME);
130         backupOriginalMarkups = new AnnotationSetImpl(originalMarkups);
131         originalMarkups.clear();
132       }
133 
134       // first transfer the annotation types from a list to a set
135       @SuppressWarnings("unchecked")
136       Set<String> types2Export =
137               new HashSet<String>((List<String>)options.get("annotationTypes"));
138 
139       // then get the annotations for export
140       AnnotationSet annots2Export = allAnnots.get(types2Export);
141       withRoot = new AnnotationSetImpl(doc);
142       withRoot.addAll(annots2Export);
143 
144       String rootType = (String)options.get("rootElement");
145       if(rootType != null && !"".equals(rootType)) {
146 
147         // add the root element to the set
148         rootID =
149                 withRoot.add(0L, doc.getContent().size(),
150                         (String)options.get("rootElement"),
151                         Factory.newFeatureMap());
152       }
153 
154       // create a writer using the specified encoding
155       OutputStreamWriter writer =
156               new OutputStreamWriter(out, (String)options.get("encoding"));
157 
158       // write the document
159       writer.write(doc.toXml(withRoot, (Boolean)options.get("includeFeatures")));
160 
161       // make sure it gets written
162       writer.flush();
163     catch(InvalidOffsetException e) {
164       throw new IOException(e);
165     finally {
166       // delete the fake root element
167       if(rootID != nullwithRoot.remove(withRoot.get(rootID));
168 
169       // restore the original markups
170       if(backupOriginalMarkups != null)
171         originalMarkups.addAll(backupOriginalMarkups);
172     }
173   }
174 }