/* DigiDoc4J library * * This software is released under either the GNU Library General Public * License (see LICENSE.LGPL). * * Note that the only valid version of the LGPL license as far as this * project is concerned is the original GNU Library General Public License * Version 2.1, February 1999 */ package org.digidoc4j.impl; import java.io.InputStream; import java.lang.reflect.Constructor; import org.digidoc4j.Configuration; import org.digidoc4j.Container; import org.digidoc4j.ContainerBuilder; import org.digidoc4j.exceptions.TechnicalException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CustomContainerBuilder extends ContainerBuilder { private static final Logger logger = LoggerFactory.getLogger(CustomContainerBuilder.class); private String containerType; public CustomContainerBuilder(String containerType) { this.containerType = containerType; } protected Container createNewContainer() { if (configuration != null) { return instantiateContainer(configuration); } return instantiateContainer(); } protected Container openContainerFromFile() { if (configuration != null) { return instantiateContainer(containerFilePath, configuration); } return instantiateContainer(containerFilePath); } protected Container openContainerFromStream() { if (configuration == null) { return instantiateContainer(containerInputStream); } return instantiateContainer(containerInputStream, configuration); } @Override public ContainerBuilder usingTempDirectory(String temporaryDirectoryPath) { logger.warn("Custom containers don't support setting temp directories"); return this; } private Container instantiateContainer() { return instantiateContainer((Class<?>[])null, (Object[])null); } private Container instantiateContainer(Configuration configuration) { Class<?>[] parameterTypes = new Class[] { Configuration.class }; Object[] constructorArguments = new Object[] { configuration }; return instantiateContainer(parameterTypes, constructorArguments); } private Container instantiateContainer(String containerFilePath) { Class<?>[] parameterTypes = new Class[] { String.class }; Object[] constructorArguments = new Object[] { containerFilePath }; return instantiateContainer(parameterTypes, constructorArguments); } private Container instantiateContainer(String containerFilePath, Configuration configuration) { Class<?>[] parameterTypes = new Class[] { String.class, Configuration.class }; Object[] constructorArguments = new Object[] { containerFilePath, configuration }; return instantiateContainer(parameterTypes, constructorArguments); } private Container instantiateContainer(InputStream containerInputStream) { Class<?>[] parameterTypes = new Class[] { InputStream.class }; Object[] constructorArguments = new Object[] { containerInputStream }; return instantiateContainer(parameterTypes, constructorArguments); } private Container instantiateContainer(InputStream containerInputStream, Configuration configuration) { Class<?>[] parameterTypes = new Class[] { InputStream.class, Configuration.class }; Object[] constructorArguments = new Object[] { containerInputStream, configuration }; return instantiateContainer(parameterTypes, constructorArguments); } private Container instantiateContainer(Class<?>[] parameterTypes, Object[] constructorArguments) { Class<? extends Container> containerClass = getContainerClass(); logger.debug("Instantiating " + containerType + " container from class " + containerClass.getName()); try { if (constructorArguments == null || constructorArguments.length == 0) { return containerClass.newInstance(); } else { Constructor<? extends Container> constructor = containerClass.getConstructor(parameterTypes); return constructor.newInstance(constructorArguments); } } catch (NoSuchMethodException e) { logger.error("Unable to instantiate " + containerType + " container from class " + containerClass.getName() + " - The class must be public and should have a default constructor and a constructor with Configuration parameter available."); throw new TechnicalException("Unable to instantiate " + containerType + " container from class " + containerClass.getName(), e); } catch (ReflectiveOperationException e) { logger.error("Unable to instantiate " + containerType + " container from class " + containerClass.getName()); throw new TechnicalException("Unable to instantiate " + containerType + " container from class " + containerClass.getName(), e); } } private Class<? extends Container> getContainerClass() { return containerImplementations.get(containerType); } }