DocumentExporter.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 11/07/2014
011  *
012  */
013 
014 package gate;
015 
016 import gate.creole.AbstractResource;
017 import gate.util.ExtensionFileFilter;
018 
019 import java.io.File;
020 import java.io.FileOutputStream;
021 import java.io.IOException;
022 import java.io.OutputStream;
023 
024 import javax.swing.filechooser.FileFilter;
025 
026 import org.apache.commons.io.IOUtils;
027 
028 /**
029  * Adds support for exporting documents from GATE. Subclasses of
030  * DocumentExporter now how to export in a given format. These exporters
031  * are loaded as Creole resources and made easily available within the
032  * GUI, but can also be easily accessed from within the API.
033  */
034 public abstract class DocumentExporter extends AbstractResource {
035 
036   private static final long serialVersionUID = -4810523902750051704L;
037 
038   protected String fileType, defaultExtension, mimeType;
039 
040   protected FileFilter filter;
041 
042   /**
043    * Creates a new exporter instance for a given file type with default
044    * extension.
045    
046    @param fileType this is the human readable file type name that will
047    *          appear on the menu
048    @param defaultExtension the default file extension for this type
049    */
050   public DocumentExporter(String fileType, String defaultExtension, String mimeType) {
051     this.fileType = fileType;
052     this.defaultExtension = defaultExtension;
053     this.mimeType = mimeType;
054   }
055 
056   /**
057    * The name of the file type exported
058    
059    @return the name of the file type exported
060    */
061   public String getFileType() {
062     return fileType;
063   }
064 
065   /**
066    * The default extension added to files saved in this format
067    
068    @return the default extension added to files saved in this format
069    */
070   public String getDefaultExtension() {
071     return defaultExtension;
072   }
073   
074   @Override
075   public String getName() {
076     return fileType;
077   }
078   
079   public String getMimeType() {
080     return mimeType;
081   }
082 
083   /**
084    * A filter used in the file chooser to restrict the view to files of
085    * this type. The default implementation just uses the default
086    * extension as the filter constraint
087    */
088   public FileFilter getFileFilter() {
089     if(filter == null)
090       filter =
091               new ExtensionFileFilter(fileType + " Files (*."
092                       + defaultExtension + ")", defaultExtension);
093     return filter;
094   }
095 
096   /**
097    * Equivalent to {@link #export(Document,File,FeatureMap)} with an empty map
098    * of options.
099    */
100   public void export(Document doc, File filethrows IOException {
101     export(doc, file, Factory.newFeatureMap());
102   }
103 
104   /**
105    * Equivalent to {@link #export(Document,OutputStream,FeatureMap)} using a
106    * FileOutputStream instance constructed from the File param.
107    */
108   public void export(Document doc, File file, FeatureMap options)
109           throws IOException {
110     FileOutputStream out = null;
111     try {
112       out = new FileOutputStream(file);
113       export(doc, out, options);
114       out.flush();
115     finally {
116       IOUtils.closeQuietly(out);
117     }
118   }
119 
120   /**
121    * Equivalent to {@link #export(Document,OutputStream)} with an empty
122    * map of options.
123    */
124   public void export(Document doc, OutputStream outthrows IOException {
125     export(doc, out, Factory.newFeatureMap());
126   }
127 
128   /**
129    * Exports the provided {@link Document} instance to the specified
130    {@link OutputStream} using the specified options.
131    
132    @param doc the document to export
133    @param out the OutputStream to export the document to
134    @param options DocumentExporter specific options
135    */
136   public abstract void export(Document doc, OutputStream out, FeatureMap options)
137           throws IOException;
138   
139   public static DocumentExporter getInstance(String className) {
140     return (DocumentExporter)Gate.getCreoleRegister().get(className)
141             .getInstantiations().iterator().next();
142   }
143 }