All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.xmlbeans.XmlFactoryHook Maven / Gradle / Ivy

There is a newer version: 5.2.0_1
Show newest version
/*   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.DOMImplementation;
import org.w3c.dom.Node;

import javax.xml.stream.XMLStreamReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.lang.ref.SoftReference;

/**
 * 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.
 * 

* 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. * *

 * MyHook hook = new MyHook();
 * XmlFactoryHook.ThreadContext.setHook(hook);
 * // this results in a call to hook.parse(...)
 * XmlObject.Factory.parse(new File("test.xml"));
 * 
*

* 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. *

 * void parse(SchemaTypeLoader loader, ...)
 * {
 *     XmlFactoryHook remember = XmlFactoryHook.ThreadContext.getHook();
 *     XmlFactoryHook.ThreadContext.setHook(null);
 *     loader.parse(...); // isn't hooked.
 *     XmlFactoryHook.ThreadContext.setHook(remember);
 * }
 * 
*/ public interface XmlFactoryHook { /** * Hooks Factory.newInstance calls */ XmlObject newInstance(SchemaTypeLoader loader, SchemaType type, XmlOptions options); /** * Hooks Factory.parse calls */ XmlObject parse(SchemaTypeLoader loader, String xmlText, SchemaType type, XmlOptions options) throws XmlException; /** * Hooks Factory.parse calls */ XmlObject parse(SchemaTypeLoader loader, InputStream jiois, SchemaType type, XmlOptions options) throws XmlException, IOException; /** * Hooks Factory.parse calls */ XmlObject parse(SchemaTypeLoader loader, XMLStreamReader xsr, SchemaType type, XmlOptions options) throws XmlException; /** * Hooks Factory.parse calls */ XmlObject parse(SchemaTypeLoader loader, Reader jior, SchemaType type, XmlOptions options) throws XmlException, IOException; /** * Hooks Factory.parse calls */ XmlObject parse(SchemaTypeLoader loader, Node node, SchemaType type, XmlOptions options) throws XmlException; /** * Hooks Factory.newXmlSaxHandler calls */ XmlSaxHandler newXmlSaxHandler(SchemaTypeLoader loader, SchemaType type, XmlOptions options); /** * Hooks Factory.newDomImplementation calls */ DOMImplementation newDomImplementation(SchemaTypeLoader loader, XmlOptions options); /** * Used to manage the XmlFactoryHook for the current thread. */ final class ThreadContext { private static final 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 = threadHook.get(); return softRef == null ? null : 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() { } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy