org.eclipse.smila.connectivity.framework.schema.ConfigurationLoader.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.smila.connectivity.framework.schema.ConfigurationLoader.java

Source

/***********************************************************************************************************************
 * Copyright (c) 2008 empolis GmbH and brox IT Solutions GmbH. All rights reserved. This program and the accompanying
 * materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: Ivan Churkin (brox IT Solutions GmbH) - initial creator Sebastian Voigt (brox IT Solutions GmbH)
 **********************************************************************************************************************/
package org.eclipse.smila.connectivity.framework.schema;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.smila.connectivity.framework.schema.config.DataSourceConnectionConfig;
import org.eclipse.smila.connectivity.framework.schema.config.DataSourceConnectionConfigSimple;
import org.eclipse.smila.connectivity.framework.schema.exceptions.SchemaNotFoundException;
import org.eclipse.smila.connectivity.framework.schema.exceptions.SchemaRuntimeException;
import org.eclipse.smila.connectivity.framework.schema.internal.JaxbPluginContext;
import org.eclipse.smila.connectivity.framework.schema.internal.JaxbThreadContext;
import org.eclipse.smila.utils.extensions.AbstractCollectionPluginRegistry;

/**
 * The Class ConfigurationLoader.
 */
public final class ConfigurationLoader {

    /**
     * The Constant REGISTRY.
     */
    private static final ConfigurationRegistry REGISTRY = new ConfigurationRegistry();

    /**
     * Does not instantiates - its a static.
     */
    private ConfigurationLoader() {

    }

    /**
     * New context.
     * 
     * @param bundleID
     *          the bundle id
     * 
     * @return the jAXB context
     * 
     * @throws SchemaNotFoundException
     *           the index order schema not found exception
     */
    public static JAXBContext newContext(final String bundleID) throws SchemaNotFoundException {
        final DataSourceConnectionConfigPlugin plugIn = getPlugin(bundleID);
        if (plugIn == null) {
            throw new SchemaNotFoundException(bundleID);
        }
        ClassLoader cl = plugIn.getClass().getClassLoader();
        final Class[] allClasses = new Class[2 + 1];
        allClasses[0] = DataSourceConnectionConfig.class;
        try {
            allClasses[1] = cl.loadClass(plugIn.getMessagesPackage() + ".Attribute");
            allClasses[2] = cl.loadClass(plugIn.getMessagesPackage() + ".Process");
        } catch (final ClassNotFoundException e) {
            throw new SchemaRuntimeException(e);
        }
        cl = Thread.currentThread().getContextClassLoader();
        try {
            Thread.currentThread().setContextClassLoader(ConfigurationLoader.class.getClassLoader());
            return JAXBContext.newInstance(allClasses);
        } catch (final JAXBException e) {
            throw new SchemaRuntimeException(e);
        } finally {
            Thread.currentThread().setContextClassLoader(cl);
        }
    }

    /**
     * New simple context.
     * 
     * @return the jAXB context
     */
    private static JAXBContext newSimpleContext() {
        final ClassLoader cl = Thread.currentThread().getContextClassLoader();
        try {
            Thread.currentThread().setContextClassLoader(ConfigurationLoader.class.getClassLoader());
            return JAXBContext.newInstance(DataSourceConnectionConfigSimple.class);
        } catch (final JAXBException e) {
            throw new SchemaRuntimeException(e);
        } finally {
            Thread.currentThread().setContextClassLoader(cl);
        }
    }

    /**
     * Unmarshall index order configuration.
     * 
     * @param is
     *          xml input stream
     * 
     * @return index order configuration
     * 
     * @throws JAXBException
     *           the JAXB exception
     * @throws IOException
     *           Signals that an I/O exception has occurred.
     * @throws SchemaNotFoundException
     *           the index order schema not found exception
     */
    public static DataSourceConnectionConfig unmarshall(final InputStream is)
            throws JAXBException, IOException, SchemaNotFoundException {
        final Log log = LogFactory.getLog(ConfigurationLoader.class);
        if (is == null) {
            throw new SchemaRuntimeException("Configaration stream is null!");
        }
        InputStream inputStream = null;
        try {
            java.io.ByteArrayOutputStream bos = new ByteArrayOutputStream();
            IOUtils.copy(is, bos);
            final byte[] array = bos.toByteArray();
            bos = null;
            inputStream = new ByteArrayInputStream(array);
            // preinit context
            JaxbThreadContext.setPluginContext(Thread.currentThread(), null);
            // unmarshall first time to locate plug-in
            final JAXBContext jaxbContext = newSimpleContext();
            jaxbContext.createUnmarshaller().unmarshal(inputStream);
            IOUtils.closeQuietly(inputStream);

            final JaxbPluginContext pluginContext = JaxbThreadContext.getPluginContext(Thread.currentThread());
            final Unmarshaller finalUnmarshaller = pluginContext.createValidatingUnmarshaller();
            inputStream = new ByteArrayInputStream(array);
            // unmarshall second time by plug-in
            return (DataSourceConnectionConfig) finalUnmarshaller.unmarshal(inputStream);
        } catch (final SchemaNotFoundException e) {
            if (log.isErrorEnabled()) {
                log.error(e);
            }
            throw e;
        } finally {
            JaxbThreadContext.removeKey(Thread.currentThread());
            IOUtils.closeQuietly(is);
            IOUtils.closeQuietly(inputStream);
        }

    }

    /**
     * Crate marshaller.
     * 
     * @param configuration
     *          the configuration
     * 
     * @return the marshaller
     * 
     * @throws JAXBException
     *           the JAXB exception
     * @throws SchemaNotFoundException
     *           the index order schema not found exception
     */
    public static Marshaller crateMarshaller(final DataSourceConnectionConfig configuration)
            throws JAXBException, SchemaNotFoundException {
        final String schemaID = configuration.getSchemaID();
        final DataSourceConnectionConfigPlugin schema = getPlugin(schemaID);
        if (schema == null) {
            throw new SchemaNotFoundException("Schema " + schemaID + " is not found");
        }
        System.out.println("Schema ID= " + schemaID);
        JaxbThreadContext.setPluginContext(Thread.currentThread(), null);
        final JAXBContext jaxbContext = newContext(schemaID);
        return jaxbContext.createMarshaller();
    }

    /**
     * Marshall.
     * 
     * @param configuration
     *          the configuration
     * @param writer
     *          the writer
     * 
     * @throws JAXBException
     *           the JAXB exception
     * @throws SchemaNotFoundException
     *           the index order schema not found exception
     */
    public static void marshall(final DataSourceConnectionConfig configuration, final Writer writer)
            throws JAXBException, SchemaNotFoundException {
        final Marshaller marshaller = crateMarshaller(configuration);
        marshaller.marshal(configuration, writer);
    }

    /**
     * Gets the plugin by id.
     * 
     * @param id
     *          the id
     * 
     * @return the plugin
     */
    public static DataSourceConnectionConfigPlugin getPlugin(final String id) {
        return REGISTRY.getPlugin(id);
    }

    /**
     * The Class CrowlerRegistry.
     */
    private static class ConfigurationRegistry
            extends AbstractCollectionPluginRegistry<DataSourceConnectionConfigPlugin> {
        /**
         * {@inheritDoc}
         * 
         * @see org.eclipse.smila.utils.extensions.AbstractCollectionPluginRegistry#createEmptyArray(int)
         */
        @Override
        protected DataSourceConnectionConfigPlugin[] createEmptyArray(final int size) {
            return new DataSourceConnectionConfigPlugin[size];
        }

        /**
         * {@inheritDoc}
         * 
         * @see org.eclipse.smila.utils.extensions.AbstractPluginRegistryBase#getExtensionPointNameSpace()
         */
        @Override
        protected String getExtensionPointNameSpace() {
            return "org.eclipse.smila.connectivity.framework.schema";
        }

        /**
         * {@inheritDoc}
         * 
         * @see org.eclipse.smila.utils.extensions.AbstractPluginRegistryBase#getExtensionPointLocalName()
         */
        @Override
        protected String getExtensionPointLocalName() {
            return "extension";
        }
    }

}