/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.uima.util; import java.io.IOException; import java.io.InputStream; import org.apache.uima.cas.CAS; import org.apache.uima.cas.impl.OutOfTypeSystemData; import org.apache.uima.cas.impl.XCASDeserializer; import org.apache.uima.cas.impl.XmiCasDeserializer; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.XMLReaderFactory; /** * Deserializes a CAS from a standoff-XML format. This class can read the XMI format introduced in * UIMA v1.4 as well as the XCAS format from previous versions. */ public abstract class XmlCasDeserializer { /** * Deserializes a CAS from a standoff-XML format. * * @param aStream * input stream from which to read the XML document * @param aCAS * CAS into which to deserialize. This CAS must be set up with a type system that is * compatible with that in the XML. * * @throws SAXException * if an XML Parsing error occurs * @throws IOException * if an I/O failure occurs */ public static void deserialize(InputStream aStream, CAS aCAS) throws SAXException, IOException { deserialize(aStream, aCAS, false); } /** * Deserializes a CAS from XMI. * * @param aStream * input stream from which to read the XML document * @param aCAS * CAS into which to deserialize. This CAS must be set up with a type system that is * compatible with that in the XML * @param aLenient * if true, unknown Types will be ignored. If false, unknown Types will cause an * exception. The default is false. * * @throws SAXException * if an XML Parsing error occurs * @throws IOException * if an I/O failure occurs */ public static void deserialize(InputStream aStream, CAS aCAS, boolean aLenient) throws SAXException, IOException { XMLReader xmlReader = XMLReaderFactory.createXMLReader(); ContentHandler handler = new XmlCasDeserializerHandler(aCAS, aLenient); xmlReader.setContentHandler(handler); xmlReader.parse(new InputSource(aStream)); } static class XmlCasDeserializerHandler extends DefaultHandler { private CAS mCAS; private boolean mLenient; private ContentHandler mDelegateHandler; // will be set to either XMI or XCAS XmlCasDeserializerHandler(CAS cas, boolean lenient) { mCAS = cas; mLenient = lenient; } public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (mDelegateHandler == null) { // try to find out whether we should use the XCAS or XMI deserializers // if there's an xmi:version attribute, always use XMI String xmiVer = attributes.getValue("xmi:version"); if (xmiVer != null && xmiVer.length() > 0) { XmiCasDeserializer deser = new XmiCasDeserializer(mCAS.getTypeSystem()); mDelegateHandler = deser.getXmiCasHandler(mCAS, mLenient); } else if ("CAS".equals(localName)) // use XCAS { XCASDeserializer deser = new XCASDeserializer(mCAS.getTypeSystem()); mDelegateHandler = deser .getXCASHandler(mCAS, mLenient ? new OutOfTypeSystemData() : null); } else // default to XMI { XmiCasDeserializer deser = new XmiCasDeserializer(mCAS.getTypeSystem()); mDelegateHandler = deser.getXmiCasHandler(mCAS, mLenient); } mDelegateHandler.startDocument(); } mDelegateHandler.startElement(uri, localName, qName, attributes); } public void characters(char[] ch, int start, int length) throws SAXException { mDelegateHandler.characters(ch, start, length); } public void endDocument() throws SAXException { mDelegateHandler.endDocument(); } public void endElement(String uri, String localName, String qName) throws SAXException { mDelegateHandler.endElement(uri, localName, qName); } public void error(SAXParseException e) throws SAXException { throw e; } public void fatalError(SAXParseException e) throws SAXException { throw e; } public void warning(SAXParseException e) throws SAXException { throw e; } } }