unmarshallerimpl.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 518 行

JAVA
518
字号
/** Copyright (c) 1998-2006 Caucho Technology -- all rights reserved** This file is part of Resin(R) Open Source** Each copy or derived work must preserve the copyright notice and this* notice unmodified.** Resin Open Source is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation; either version 2 of the License, or* (at your option) any later version.** Resin Open Source is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty* of NON-INFRINGEMENT.  See the GNU General Public License for more* details.** You should have received a copy of the GNU General Public License* along with Resin Open Source; if not, write to the**   Free Software Foundation, Inc.*   59 Temple Place, Suite 330*   Boston, MA 02111-1307  USA** @author Adam Megacz*/package com.caucho.jaxb;import com.caucho.jaxb.adapters.BeanAdapter;import com.caucho.jaxb.skeleton.ClassSkeleton;import com.caucho.jaxb.property.Property;import com.caucho.util.L10N;import com.caucho.vfs.*;import com.caucho.xml.stream.*;import org.w3c.dom.*;import org.xml.sax.*;import javax.xml.bind.*;import javax.xml.bind.annotation.adapters.*;import javax.xml.bind.attachment.*;import javax.xml.bind.helpers.*;import javax.xml.namespace.QName;import javax.xml.stream.*;import javax.xml.stream.events.*;import javax.xml.transform.*;import javax.xml.transform.dom.*;import javax.xml.transform.sax.*;import javax.xml.validation.*;import java.net.URL;import java.io.*;import java.util.*;// XXX extends AbstractUnmarshallerImplpublic class UnmarshallerImpl implements Unmarshaller{  private static final L10N L = new L10N(UnmarshallerImpl.class);  private JAXBContextImpl _context;    protected boolean validating;  private AttachmentUnmarshaller _attachmentUnmarshaller = null;  private ValidationEventHandler _validationEventHandler = null;  private Listener _listener = null;  private HashMap<String,Object> _properties = new HashMap<String,Object>();  private Schema _schema = null;  private XMLReader _xmlreader = null;  private XmlAdapter _adapter = null;  private HashMap<Class,XmlAdapter> _adapters    = new HashMap<Class,XmlAdapter>();  UnmarshallerImpl(JAXBContextImpl context)    throws JAXBException  {    _context = context;    setEventHandler(JAXBContextImpl.DEFAULT_VALIDATION_EVENT_HANDLER);  }  //  // unmarshallers.  //  /**   * Unmarshall from a DOM node.   */  public Object unmarshal(Node node) throws JAXBException  {    try {      XMLInputFactory factory = _context.getXMLInputFactory();            return unmarshal(factory.createXMLStreamReader(new DOMSource(node)));    }    catch (XMLStreamException e) {      throw new JAXBException(e);    }  }  /**   * Unmarshall from an input source.   */  protected Object unmarshal(XMLReader reader, InputSource source)    throws JAXBException  {    throw new UnsupportedOperationException();  }  /**   * Unmarshall from an event reader.   */  public Object unmarshal(XMLEventReader reader) throws JAXBException  {    throw new UnsupportedOperationException();    /*    try {      XMLEvent event = null;      while (reader.hasNext()) {        event = reader.peek();        if (event.isStartElement()) {          StartElement start = (StartElement) event;          ClassSkeleton skel = _context.getRootElement(start.getName());          if (skel == null)            throw new JAXBException(L.l("'{0}' is an unknown root element",                  start.getName()));          return skel.read(this, reader);        }        event = reader.nextEvent();      }            throw new JAXBException(L.l("Expected root element"));    }    catch (JAXBException e) {      throw e;    }     catch (Exception e) {      throw new RuntimeException(e);    }*/  }  public <T> JAXBElement<T> unmarshal(XMLEventReader xmlEventReader,                                      Class<T> declaredType)    throws JAXBException  {    throw new UnsupportedOperationException();  }  public Object unmarshal(XMLStreamReader reader)    throws JAXBException  {    try {      if (reader.nextTag() != XMLStreamReader.START_ELEMENT)        throw new JAXBException(L.l("Expected root element"));      ClassSkeleton skel = _context.getRootElement(reader.getName());      if (skel == null)        throw new JAXBException(L.l("'{0}' is an unknown root element",              reader.getName()));      return skel.read(this, reader);    }     catch (JAXBException e) {      throw e;    }     catch (Exception e) {      throw new RuntimeException(e);    }  }  /**   * Parses the XML based on an InputStream   */  public Object unmarshal(InputStream is)    throws JAXBException  {    try {      XMLStreamReader reader = new XMLStreamReaderImpl(is);      try {        return unmarshal(reader);      }       finally {        reader.close();      }    }    catch (XMLStreamException e) {      throw new JAXBException(e);    }  }  public <T> JAXBElement<T> unmarshal(XMLStreamReader reader,                                      Class<T> declaredType)      throws JAXBException  {    try {      while (reader.getEventType() != XMLStreamReader.START_ELEMENT)        reader.next();      QName name = reader.getName();      Property property = _context.createProperty(declaredType);      T val = (T) property.read(this, reader, null);      return new JAXBElement<T>(name, declaredType, val);    }    catch (Exception e) {      throw new RuntimeException(e);    }  }  //  // From AbstractUnmarshallerImpl  //  public UnmarshallerHandler getUnmarshallerHandler()  {    // The idea here is that we return a SAX ContentHandler which the    // user writes to and we use those writes to construct an object.    // The object is retrieved using UnmarshallerHandler.getResult().    // This is a "reusable" operation, so we should return a new handler    // (or at least a reset one) for each call of this function.    return new UnmarshallerHandlerImpl();  }  protected UnmarshalException createUnmarshalException(SAXException e)  {    return new UnmarshalException(e);  }  public <A extends XmlAdapter> A getAdapter(Class<A> type)  {    A a = (A)_adapters.get(type);    if (a == null)      return (A)new BeanAdapter();    return a;  }  public AttachmentUnmarshaller getAttachmentUnmarshaller()  {    return _attachmentUnmarshaller;  }  public ValidationEventHandler getEventHandler() throws JAXBException  {    return _validationEventHandler;  }  public Listener getListener()  {    return _listener;  }  public Object getProperty(String name) throws PropertyException  {    return _properties.get(name);  }  public Schema getSchema()  {    return _schema;  }  protected XMLReader getXMLReader() throws JAXBException  {    return _xmlreader;  }  public boolean isValidating() throws JAXBException  {    return validating;  }  public <A extends XmlAdapter> void setAdapter(Class<A> type, A adapter)  {    _adapters.put(type, adapter);  }  public void setAdapter(XmlAdapter adapter)  {    setAdapter((Class)adapter.getClass(), adapter);  }  public void setAttachmentUnmarshaller(AttachmentUnmarshaller au)  {    _attachmentUnmarshaller = au;  }  public void setEventHandler(ValidationEventHandler handler)    throws JAXBException  {    _validationEventHandler = handler;  }  public void setListener(Listener listener)  {    _listener = listener;  }  public void setProperty(String name, Object value) throws PropertyException  {    _properties.put(name, value);  }  public void setSchema(Schema schema)  {    _schema = schema;  }  public void setValidating(boolean validating) throws JAXBException  {    this.validating = validating;  }  public Object unmarshal(File f) throws JAXBException  {    FileInputStream fis = null;    try {      fis = new FileInputStream(f);      XMLInputFactory factory = _context.getXMLInputFactory();      return unmarshal(factory.createXMLStreamReader(f.getAbsolutePath(), fis));    }    catch (XMLStreamException e) {      throw new JAXBException(e);    }    catch (IOException e) {      throw new JAXBException(e);    }    finally {      try {        if (fis != null)          fis.close();      }      catch (IOException e) {        throw new JAXBException(e);      }    }  }  public Object unmarshal(InputSource inputSource)     throws JAXBException  {    try {      XMLEventReader reader =         new SAXSourceXMLEventReaderImpl(new SAXSource(inputSource));      return unmarshal(reader);    }    catch (XMLStreamException e) {      throw new JAXBException(e);    }  }  public Object unmarshal(Reader reader) throws JAXBException  {    try {      XMLInputFactory factory = _context.getXMLInputFactory();            return unmarshal(factory.createXMLStreamReader(reader));    }    catch (XMLStreamException e) {      throw new JAXBException(e);    }  }  public Object unmarshal(Source source) throws JAXBException  {    try {      XMLInputFactory factory = _context.getXMLInputFactory();            return unmarshal(factory.createXMLEventReader(source));    }    catch (XMLStreamException e) {      throw new JAXBException(e);    }  }  public <T> JAXBElement<T> unmarshal(Node node, Class<T> declaredType)      throws JAXBException  {    throw new UnsupportedOperationException("subclasses must override this");  }  public <T> JAXBElement<T> unmarshal(Source node, Class<T> declaredType)      throws JAXBException  {    try {      XMLInputFactory factory = XMLInputFactory.newInstance();      return unmarshal(factory.createXMLStreamReader(node), declaredType);    }    catch (XMLStreamException e) {      throw new JAXBException(e);    }  }  public Object unmarshal(URL url) throws JAXBException  {    try {      InputStream is = url.openStream();      try {        return unmarshal(is);      }       finally {        is.close();      }    } catch (IOException e) {      throw new JAXBException(e);    }  }  private class UnmarshallerHandlerImpl implements UnmarshallerHandler {    private ContentHandler _handler;    private SAXSourceXMLEventReaderImpl _reader;    private boolean _done = false;    private Object _result = null;    public UnmarshallerHandlerImpl()    {      _reader = new SAXSourceXMLEventReaderImpl();      _handler = _reader.getContentHandler();    }    public Object getResult()      throws JAXBException    {      if (! _done)        throw new IllegalStateException();      if (_result == null)        _result = unmarshal(_reader);      return _result;    }    public void characters(char[] ch, int start, int length)      throws SAXException    {      _handler.characters(ch, start, length);    }    public void endDocument()      throws SAXException    {      _handler.endDocument();      _done = true;    }    public void endElement(String uri, String localName, String qName)      throws SAXException    {      _handler.endElement(uri, localName, qName);    }    public void endPrefixMapping(String prefix)      throws SAXException    {      _handler.endPrefixMapping(prefix);    }    public void ignorableWhitespace(char[] ch, int start, int length)      throws SAXException    {      _handler.ignorableWhitespace(ch, start, length);    }    public void processingInstruction(String target, String data)      throws SAXException    {      _handler.processingInstruction(target, data);    }    public void setDocumentLocator(Locator locator)    {      _handler.setDocumentLocator(locator);    }    public void skippedEntity(String name)      throws SAXException    {      _handler.skippedEntity(name);    }    public void startDocument()      throws SAXException    {      _handler.startDocument();    }    public void startElement(String uri, String localName, String qName,                              Attributes atts)      throws SAXException    {      _handler.startElement(uri, localName, qName, atts);    }    public void startPrefixMapping(String prefix, String uri)      throws SAXException    {      _handler.startPrefixMapping(prefix, uri);    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?