blob: 55e7cc8e8319e04d1d90bd2b4bf1344fa58d6af5 [file] [log] [blame]
/* Copyright 2004 The Apache Software Foundation
*
* Licensed 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.xmlbeans;
import org.w3c.dom.Node;
import org.w3c.dom.DOMImplementation;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.lang.ref.SoftReference;
import javax.xml.stream.XMLStreamReader;
import org.apache.xmlbeans.xml.stream.XMLInputStream;
import org.apache.xmlbeans.xml.stream.XMLStreamException;
/**
* A hook for the XML Bean Factory mechanism.
* Provided for advanced users who wish to provide their own
* implementation of the Factory.parse methods. This is used, for example,
* to defer reading XML streams until needed.
* <p>
* To use the hook, call XmlFactoryHook.ThreadContext.setHook(), passing
* your own XmlFactoryHook implementation. Then every call to a Factory
* method will be delgated to your hook.
*
* <pre>
* MyHook hook = new MyHook();
* XmlFactoryHook.ThreadContext.setHook(hook);
* // this results in a call to hook.parse(...)
* XmlObject.Factory.parse(new File("test.xml"));
* </pre>
*
* If the hook needs to turn around and invoke the built-in parsers, then
* it should do so by calling the appropriate method on the passed
* SchemaTypeLoader. Since SchemaTypeLoader.parse() methods delegate
* to the registered hook, a hook that wishes to actually invoke the
* default parser without having itself called back again should
* unregister itself before calling loader.parse(), and then re-register
* itself again after the call.
* <pre>
* void parse(SchemaTypeLoader loader, ...)
* {
* XmlFactoryHook remember = XmlFactoryHook.ThreadContext.getHook();
* XmlFactoryHook.ThreadContext.setHook(null);
* loader.parse(...); // isn't hooked.
* XmlFactoryHook.ThreadContext.setHook(remember);
* }
* </pre>
*/
public interface XmlFactoryHook
{
/** Hooks Factory.newInstance calls */
public XmlObject newInstance ( SchemaTypeLoader loader, SchemaType type, XmlOptions options );
/** Hooks Factory.parse calls */
public XmlObject parse ( SchemaTypeLoader loader, String xmlText, SchemaType type, XmlOptions options ) throws XmlException;
/** Hooks Factory.parse calls */
public XmlObject parse ( SchemaTypeLoader loader, InputStream jiois, SchemaType type, XmlOptions options ) throws XmlException, IOException;
/** Hooks Factory.parse calls */
public XmlObject parse ( SchemaTypeLoader loader, XMLStreamReader xsr, SchemaType type, XmlOptions options ) throws XmlException;
/** Hooks Factory.parse calls */
public XmlObject parse ( SchemaTypeLoader loader, Reader jior, SchemaType type, XmlOptions options ) throws XmlException, IOException;
/** Hooks Factory.parse calls */
public XmlObject parse ( SchemaTypeLoader loader, Node node, SchemaType type, XmlOptions options ) throws XmlException;
/** Hooks Factory.parse calls
* @deprecated XMLInputStream was deprecated by XMLStreamReader from STaX - jsr173 API.
*/
public XmlObject parse ( SchemaTypeLoader loader, XMLInputStream xis, SchemaType type, XmlOptions options ) throws XmlException, XMLStreamException;
/** Hooks Factory.newXmlSaxHandler calls */
public XmlSaxHandler newXmlSaxHandler ( SchemaTypeLoader loader, SchemaType type, XmlOptions options );
/** Hooks Factory.newDomImplementation calls */
public DOMImplementation newDomImplementation ( SchemaTypeLoader loader, XmlOptions options );
/**
* Used to manage the XmlFactoryHook for the current thread.
*/
public final static class ThreadContext
{
private static ThreadLocal threadHook = new ThreadLocal();
public static void clearThreadLocals() {
threadHook.remove();
}
/**
* Returns the current thread's hook, or null if none.
*/
public static XmlFactoryHook getHook()
{
SoftReference softRef = (SoftReference)threadHook.get();
return softRef==null ? null : (XmlFactoryHook)softRef.get();
}
/**
* Sets the hook for the current thread.
*/
public static void setHook(XmlFactoryHook hook)
{
threadHook.set(new SoftReference(hook));
}
// provided to prevent unwanted construction
private ThreadContext()
{
}
}
}