/* * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.xml.internal.ws.api.server; import com.sun.xml.internal.stream.buffer.XMLStreamBuffer; import com.sun.xml.internal.ws.streaming.TidyXMLStreamReader; import com.sun.xml.internal.ws.api.streaming.XMLStreamReaderFactory; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import java.io.IOException; import java.io.InputStream; import java.net.URL; /** * SPI that provides the source of {@link SDDocument}. * * <p> * This abstract class could be implemented by appliations, or one of the * {@link #create} methods can be used. * * @author Kohsuke Kawaguchi */ public abstract class SDDocumentSource { /** * Returns the {@link XMLStreamReader} that reads the document. * * <p> * This method maybe invoked multiple times concurrently. * * @param xif * The implementation may choose to use this object when it wants to * create a new parser (or it can just ignore this parameter completely.) * @return * The caller is responsible for closing the reader to avoid resource leak. * * @throws XMLStreamException * if something goes wrong while creating a parser. * @throws IOException * if something goes wrong trying to read the document. */ public abstract XMLStreamReader read(XMLInputFactory xif) throws IOException, XMLStreamException; /** * Returns the {@link XMLStreamReader} that reads the document. * * <p> * This method maybe invoked multiple times concurrently. * * @return * The caller is responsible for closing the reader to avoid resource leak. * * @throws XMLStreamException * if something goes wrong while creating a parser. * @throws IOException * if something goes wrong trying to read the document. */ public abstract XMLStreamReader read() throws IOException, XMLStreamException; /** * System ID of this document. */ public abstract URL getSystemId(); /** * Creates {@link SDDocumentSource} from an URL. */ public static SDDocumentSource create(final URL url) { return new SDDocumentSource() { private final URL systemId = url; public XMLStreamReader read(XMLInputFactory xif) throws IOException, XMLStreamException { InputStream is = url.openStream(); return new TidyXMLStreamReader( xif.createXMLStreamReader(systemId.toExternalForm(),is), is); } public XMLStreamReader read() throws IOException, XMLStreamException { InputStream is = url.openStream(); return new TidyXMLStreamReader( XMLStreamReaderFactory.create(systemId.toExternalForm(),is,false), is); } public URL getSystemId() { return systemId; } }; } /** * Creates a {@link SDDocumentSource} from {@link XMLStreamBuffer}. */ public static SDDocumentSource create(final URL systemId, final XMLStreamBuffer xsb) { return new SDDocumentSource() { public XMLStreamReader read(XMLInputFactory xif) throws XMLStreamException { return xsb.readAsXMLStreamReader(); } public XMLStreamReader read() throws XMLStreamException { return xsb.readAsXMLStreamReader(); } public URL getSystemId() { return systemId; } }; } }