SgmlDocumentFormat.java
001 /*
002  *  SgmlDocumentFormat.java
003  *
004  *  Copyright (c) 1995-2012, The University of Sheffield. See the file
005  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
006  *
007  *  This file is part of GATE (see http://gate.ac.uk/), and is free
008  *  software, licenced under the GNU Library General Public License,
009  *  Version 2, June 1991 (in the distribution as file licence.html,
010  *  and also available at http://gate.ac.uk/gate/licence.html).
011  *
012  *  Cristian URSU, 4/July/2000
013  *
014  *  $Id: SgmlDocumentFormat.java 17604 2014-03-09 10:08:13Z markagreenwood $
015  */
016 
017 package gate.corpora;
018 
019 import java.io.IOException;
020 
021 import javax.xml.parsers.*;
022 
023 import org.xml.sax.SAXException;
024 
025 import gate.Document;
026 import gate.Resource;
027 import gate.creole.ResourceInstantiationException;
028 import gate.creole.metadata.AutoInstance;
029 import gate.creole.metadata.CreoleResource;
030 import gate.event.StatusListener;
031 import gate.sgml.Sgml2Xml;
032 import gate.util.DocumentFormatException;
033 import gate.xml.XmlDocumentHandler;
034 
035 /** The format of Documents. Subclasses of DocumentFormat know about
036   * particular MIME types and how to unpack the information in any
037   * markup or formatting they contain into GATE annotations. Each MIME
038   * type has its own subclass of DocumentFormat, e.g. XmlDocumentFormat,
039   * RtfDocumentFormat, MpegDocumentFormat. These classes register themselves
040   * with a static index residing here when they are constructed. Static
041   * getDocumentFormat methods can then be used to get the appropriate
042   * format class for a particular document.
043   */
044 @CreoleResource(name = "GATE SGML Document Format", isPrivate = true,
045     autoinstances = {@AutoInstance(hidden = true)})
046 public class SgmlDocumentFormat extends TextualDocumentFormat
047 {
048   private static final long serialVersionUID = -3596255263987343560L;
049 
050   /** Default construction */
051   public SgmlDocumentFormat() { super()}
052 
053   /** Unpack the markup in the document. This converts markup from the
054     * native format (e.g. SGML) into annotations in GATE format.
055     * Uses the markupElementsMap to determine which elements to convert, and
056     * what annotation type names to use.
057     * The doc's content is first converted to a wel formed XML.
058     * If this succeddes then the document is saved into a temp file and parsed
059     * as an XML document.
060     *
061     @param doc The gate document you want to parse.
062     *
063     */
064   @Override
065   public void unpackMarkup(Document docthrows DocumentFormatException{
066     if ( (doc == null||
067          (doc.getSourceUrl() == null && doc.getContent() == null)){
068 
069       throw new DocumentFormatException(
070                "GATE document is null or no content found. Nothing to parse!");
071     }// End if
072     // Create a status listener
073     StatusListener statusListener = new StatusListener(){
074             @Override
075             public void statusChanged(String text){
076               fireStatusChanged(text);
077             }
078     };
079     XmlDocumentHandler xmlDocHandler = null;
080     try {
081       Sgml2Xml sgml2Xml = new Sgml2Xml(doc);
082 
083       fireStatusChanged("Performing SGML to XML...");
084 
085       // convert the SGML document
086       String xmlUri = sgml2Xml.convert();
087 
088       fireStatusChanged("DONE !");
089 
090       //Out.println("Conversion done..." + xmlUri);
091       //Out.println(sgml2Xml.convert());
092       // Get a parser factory.
093       SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
094       // Set up the factory to create the appropriate type of parser
095 
096       // Set up the factory to create the appropriate type of parser
097       // non validating one
098       saxParserFactory.setValidating(false);
099       // non namesapace aware one
100       saxParserFactory.setNamespaceAware(true);
101 
102       // Create a SAX parser
103       SAXParser parser = saxParserFactory.newSAXParser();
104 
105       // use it
106       if (null != doc){
107         // create a new Xml document handler
108         xmlDocHandler = new XmlDocumentHandler(doc,
109                                                this.markupElementsMap,
110                                                this.element2StringMap);
111 
112         // register a status listener with it
113         xmlDocHandler.addStatusListener(statusListener);
114 
115         parser.parse(xmlUri, xmlDocHandler);
116         ((DocumentImpldoc).setNextAnnotationId(
117                                           xmlDocHandler.getCustomObjectsId());
118      }// end if
119     catch (ParserConfigurationException e){
120         throw
121         new DocumentFormatException("XML parser configuration exception ", e);
122     catch (SAXException e){
123         throw new DocumentFormatException(e);
124     catch (IOException e){
125         throw new DocumentFormatException("I/O exception for " +
126                                       doc.getSourceUrl().toString());
127     }finally{
128       if (xmlDocHandler != null)
129         xmlDocHandler.removeStatusListener(statusListener);
130     }// End try
131 
132   }// unpackMarkup
133 
134   /** Initialise this resource, and return it. */
135   @Override
136   public Resource init() throws ResourceInstantiationException{
137     // Register SGML mime type
138     MimeType mime = new MimeType("text","sgml");
139     // Register the class handler for this mime type
140     mimeString2ClassHandlerMap.put(mime.getType()"/" + mime.getSubtype(),
141                                                                           this);
142     // Register the mime type with mine string
143     mimeString2mimeTypeMap.put(mime.getType() "/" + mime.getSubtype(), mime);
144     // Register file sufixes for this mime type
145     suffixes2mimeTypeMap.put("sgm",mime);
146     suffixes2mimeTypeMap.put("sgml",mime);
147     setMimeType(mime);
148     return this;
149   }// init
150 
151 }//class SgmlDocumentFormat