blob: b2a34005a14a6a91023665e19bd54ce607bad955 [file] [log] [blame]
/***********************************************************************************************************************
* 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";
}
}
}