/* * RHQ Management Platform * Copyright (C) 2012 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.helpers.jeegen.ejb; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.URL; import java.util.Collection; import java.util.HashMap; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.DefaultObjectWrapper; import freemarker.template.Template; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ArchiveFormat; import org.jboss.shrinkwrap.api.ArchivePath; import org.jboss.shrinkwrap.api.Assignable; import org.jboss.shrinkwrap.api.Filter; import org.jboss.shrinkwrap.api.Node; import org.jboss.shrinkwrap.api.asset.Asset; import org.jboss.shrinkwrap.api.asset.ByteArrayAsset; import org.jboss.shrinkwrap.api.asset.ClassLoaderAsset; import org.jboss.shrinkwrap.api.asset.NamedAsset; import org.jboss.shrinkwrap.api.exporter.StreamExporter; import org.jboss.shrinkwrap.api.formatter.Formatter; import org.jboss.shrinkwrap.api.spec.JavaArchive; /** * An EJB JAR. * * @author Ian Springer */ public class EjbArchive implements JavaArchive { private static final String TEST_EJB_RESOURCE_PATH = "test/ejb"; private JavaArchive delegate; /** * Create a new JavaArchive with any type storage engine as backing. * * @param delegate The storage backing. */ public EjbArchive(JavaArchive delegate, String ejbVersion, int entityBeanCount, int statelessSessionBeanCount, int statefulSessionBeanCount, int messageDrivenBeanCount) { EjbVersionInfo ejbVersionInfo = EjbVersionInfo.forVersion(ejbVersion); this.delegate = delegate; Configuration config = new Configuration(); config.setClassForTemplateLoading(getClass(), ""); config.setObjectWrapper(new DefaultObjectWrapper()); ByteArrayOutputStream byteArrayOutputStream; try { Template template = config.getTemplate("v2/ejb-jar.xml.ftl"); Map<String, Object> dataModel = new HashMap<String, Object>(); dataModel.put("name", "Test"); dataModel.put("rootElement", ejbVersionInfo.getRootElement()); dataModel.put("mdbElements", ejbVersionInfo.getMdbElements()); dataModel.put("package", TEST_EJB_RESOURCE_PATH.replace('/', '.')); dataModel.put("entityBeanCount", entityBeanCount); dataModel.put("statelessSessionBeanCount", statelessSessionBeanCount); dataModel.put("statefulSessionBeanCount", statefulSessionBeanCount); dataModel.put("messageDrivenBeanCount", messageDrivenBeanCount); byteArrayOutputStream = new ByteArrayOutputStream(); Writer out = new OutputStreamWriter(byteArrayOutputStream); template.process(dataModel, out); } catch (Exception e) { throw new RuntimeException("Failed to add ejb-jar.xml to EJB-JAR.", e); } Asset ejbJarXml = new ByteArrayAsset(byteArrayOutputStream.toByteArray()); // add deployment descriptor addAsManifestResource(ejbJarXml, "ejb-jar.xml"); // add entity bean classes addAsResource(new ClassLoaderAsset(TEST_EJB_RESOURCE_PATH + "/EntityEJBHome.class"), TEST_EJB_RESOURCE_PATH + "/EntityEJBHome.class"); addAsResource(new ClassLoaderAsset(TEST_EJB_RESOURCE_PATH + "/EntityEJBObject.class"),TEST_EJB_RESOURCE_PATH + "/EntityEJBObject.class"); addAsResource(new ClassLoaderAsset(TEST_EJB_RESOURCE_PATH + "/EntityBean.class"), TEST_EJB_RESOURCE_PATH + "/EntityBean.class"); // add stateless session bean classes addAsResource(new ClassLoaderAsset(TEST_EJB_RESOURCE_PATH + "/StatelessSessionEJBHome.class"), TEST_EJB_RESOURCE_PATH + "/StatelessSessionEJBHome.class"); addAsResource(new ClassLoaderAsset(TEST_EJB_RESOURCE_PATH + "/StatelessSessionEJBObject.class"),TEST_EJB_RESOURCE_PATH + "/StatelessSessionEJBObject.class"); addAsResource(new ClassLoaderAsset(TEST_EJB_RESOURCE_PATH + "/StatelessSessionBean.class"), TEST_EJB_RESOURCE_PATH + "/StatelessSessionBean.class"); // add stateful session bean classes addAsResource(new ClassLoaderAsset(TEST_EJB_RESOURCE_PATH + "/StatefulSessionEJBHome.class"), TEST_EJB_RESOURCE_PATH + "/StatefulSessionEJBHome.class"); addAsResource(new ClassLoaderAsset(TEST_EJB_RESOURCE_PATH + "/StatefulSessionEJBObject.class"),TEST_EJB_RESOURCE_PATH + "/StatefulSessionEJBObject.class"); addAsResource(new ClassLoaderAsset(TEST_EJB_RESOURCE_PATH + "/StatefulSessionBean.class"), TEST_EJB_RESOURCE_PATH + "/StatefulSessionBean.class"); // add message-driven bean classes addAsResource(new ClassLoaderAsset(TEST_EJB_RESOURCE_PATH + "/MessageDrivenBean.class"), TEST_EJB_RESOURCE_PATH + "/MessageDrivenBean.class"); } @Override public String getName() { return delegate.getName(); } @Override public JavaArchive add(Asset asset, ArchivePath target) throws IllegalArgumentException { return delegate.add(asset, target); } @Override public JavaArchive add(Asset asset, ArchivePath target, String name) throws IllegalArgumentException { return delegate.add(asset, target, name); } @Override public JavaArchive add(Asset asset, String target, String name) throws IllegalArgumentException { return delegate.add(asset, target, name); } @Override public JavaArchive add(NamedAsset namedAsset) throws IllegalArgumentException { return delegate.add(namedAsset); } @Override public JavaArchive add(Asset asset, String target) throws IllegalArgumentException { return delegate.add(asset, target); } @Override public JavaArchive addAsDirectory(String path) throws IllegalArgumentException { return delegate.addAsDirectory(path); } @Override public JavaArchive addAsDirectories(String... paths) throws IllegalArgumentException { return delegate.addAsDirectories(paths); } @Override public JavaArchive addAsDirectory(ArchivePath path) throws IllegalArgumentException { return delegate.addAsDirectory(path); } @Override public JavaArchive addAsDirectories(ArchivePath... paths) throws IllegalArgumentException { return delegate.addAsDirectories(paths); } @Override public Node get(ArchivePath path) throws IllegalArgumentException { return delegate.get(path); } @Override public Node get(String path) throws IllegalArgumentException { return delegate.get(path); } @Override public <X extends Archive<X>> X getAsType(Class<X> type, String path) { return delegate.getAsType(type, path); } @Override public <X extends Archive<X>> X getAsType(Class<X> type, ArchivePath path) { return delegate.getAsType(type, path); } @Override public <X extends Archive<X>> Collection<X> getAsType(Class<X> type, Filter<ArchivePath> filter) { return delegate.getAsType(type, filter); } @Override public <X extends Archive<X>> X getAsType(Class<X> type, String path, ArchiveFormat archiveFormat) { return delegate.getAsType(type, path, archiveFormat); } @Override public <X extends Archive<X>> X getAsType(Class<X> type, ArchivePath path, ArchiveFormat archiveFormat) { return delegate.getAsType(type, path, archiveFormat); } @Override public <X extends Archive<X>> Collection<X> getAsType(Class<X> type, Filter<ArchivePath> filter, ArchiveFormat archiveFormat) { return delegate.getAsType(type, filter, archiveFormat); } @Override public boolean contains(ArchivePath path) throws IllegalArgumentException { return delegate.contains(path); } @Override public boolean contains(String path) throws IllegalArgumentException { return delegate.contains(path); } @Override public Node delete(ArchivePath path) throws IllegalArgumentException { return delegate.delete(path); } @Override public Node delete(String archivePath) throws IllegalArgumentException { return delegate.delete(archivePath); } @Override public Map<ArchivePath, Node> getContent() { return delegate.getContent(); } @Override public Map<ArchivePath, Node> getContent(Filter<ArchivePath> filter) { return delegate.getContent(filter); } @Override public JavaArchive add(Archive<?> archive, ArchivePath path, Class<? extends StreamExporter> exporter) throws IllegalArgumentException { return delegate.add(archive, path, exporter); } @Override public JavaArchive add(Archive<?> archive, String path, Class<? extends StreamExporter> exporter) throws IllegalArgumentException { return delegate.add(archive, path, exporter); } @Override public JavaArchive merge(Archive<?> source) throws IllegalArgumentException { return delegate.merge(source); } @Override public JavaArchive merge(Archive<?> source, Filter<ArchivePath> filter) throws IllegalArgumentException { return delegate.merge(source, filter); } @Override public JavaArchive merge(Archive<?> source, ArchivePath path) throws IllegalArgumentException { return delegate.merge(source, path); } @Override public JavaArchive merge(Archive<?> source, String path) throws IllegalArgumentException { return delegate.merge(source, path); } @Override public JavaArchive merge(Archive<?> source, ArchivePath path, Filter<ArchivePath> filter) throws IllegalArgumentException { return delegate.merge(source, path, filter); } @Override public JavaArchive merge(Archive<?> source, String path, Filter<ArchivePath> filter) throws IllegalArgumentException { return delegate.merge(source, path, filter); } @Override public String toString() { return delegate.toString(); } @Override public String toString(boolean verbose) { return delegate.toString(verbose); } @Override public String toString(Formatter formatter) throws IllegalArgumentException { return delegate.toString(formatter); } @Override public void writeTo(OutputStream outputStream, Formatter formatter) throws IllegalArgumentException { delegate.writeTo(outputStream, formatter); } @Override public <TYPE extends Assignable> TYPE as(Class<TYPE> clazz) { return delegate.as(clazz); } @Override public JavaArchive addAsServiceProviderAndClasses(Class<?> serviceInterface, Class<?>... serviceImpls) throws IllegalArgumentException { return delegate.addAsServiceProviderAndClasses(serviceInterface, serviceImpls); } @Override public JavaArchive setManifest(String resourceName) throws IllegalArgumentException { return delegate.setManifest(resourceName); } @Override public JavaArchive setManifest(File resource) throws IllegalArgumentException { return delegate.setManifest(resource); } @Override public JavaArchive setManifest(URL resource) throws IllegalArgumentException { return delegate.setManifest(resource); } @Override public JavaArchive setManifest(Asset resource) throws IllegalArgumentException { return delegate.setManifest(resource); } @Override public JavaArchive setManifest(Package resourcePackage, String resourceName) throws IllegalArgumentException { return delegate.setManifest(resourcePackage, resourceName); } @Override public JavaArchive addAsManifestResource(String resourceName) throws IllegalArgumentException { return delegate.addAsManifestResource(resourceName); } @Override public JavaArchive addAsManifestResource(File resource) throws IllegalArgumentException { return delegate.addAsManifestResource(resource); } @Override public JavaArchive addAsManifestResource(String resourceName, String target) throws IllegalArgumentException { return delegate.addAsManifestResource(resourceName, target); } @Override public JavaArchive addAsManifestResource(File resource, String target) throws IllegalArgumentException { return delegate.addAsManifestResource(resource, target); } @Override public JavaArchive addAsManifestResource(URL resource, String target) throws IllegalArgumentException { return delegate.addAsManifestResource(resource, target); } @Override public JavaArchive addAsManifestResource(Asset resource, String target) throws IllegalArgumentException { return delegate.addAsManifestResource(resource, target); } @Override public JavaArchive addAsManifestResource(String resourceName, ArchivePath target) throws IllegalArgumentException { return delegate.addAsManifestResource(resourceName, target); } @Override public JavaArchive addAsManifestResource(File resource, ArchivePath target) throws IllegalArgumentException { return delegate.addAsManifestResource(resource, target); } @Override public JavaArchive addAsManifestResource(URL resource, ArchivePath target) throws IllegalArgumentException { return delegate.addAsManifestResource(resource, target); } @Override public JavaArchive addAsManifestResource(Asset resource, ArchivePath target) throws IllegalArgumentException { return delegate.addAsManifestResource(resource, target); } @Override public JavaArchive addAsManifestResources(Package resourcePackage, String... resourceNames) throws IllegalArgumentException { return delegate.addAsManifestResources(resourcePackage, resourceNames); } @Override public JavaArchive addAsManifestResource(Package resourcePackage, String resourceName) throws IllegalArgumentException { return delegate.addAsManifestResource(resourcePackage, resourceName); } @Override public JavaArchive addAsManifestResource(Package resourcePackage, String resourceName, String target) throws IllegalArgumentException { return delegate.addAsManifestResource(resourcePackage, resourceName, target); } @Override public JavaArchive addAsManifestResource(Package resourcePackage, String resourceName, ArchivePath target) throws IllegalArgumentException { return delegate.addAsManifestResource(resourcePackage, resourceName, target); } @Override public JavaArchive addAsServiceProvider(Class<?> serviceInterface, Class<?>... serviceImpls) throws IllegalArgumentException { return delegate.addAsServiceProvider(serviceInterface, serviceImpls); } @Override public JavaArchive addAsServiceProvider(String arg0, String... arg1) { return delegate.addAsServiceProvider(arg0, arg1); } @Override public JavaArchive addManifest() throws IllegalArgumentException { return delegate.addManifest(); } @Override public JavaArchive addClass(Class<?> clazz) throws IllegalArgumentException { return delegate.addClass(clazz); } @Override public JavaArchive addClass(String fullyQualifiedClassName) throws IllegalArgumentException { return delegate.addClass(fullyQualifiedClassName); } @Override public JavaArchive addClass(String fullyQualifiedClassName, ClassLoader cl) throws IllegalArgumentException { return delegate.addClass(fullyQualifiedClassName, cl); } @Override public JavaArchive addClasses(Class<?>... classes) throws IllegalArgumentException { return delegate.addClasses(classes); } @Override public JavaArchive addPackage(Package pack) throws IllegalArgumentException { return delegate.addPackage(pack); } @Override public JavaArchive addDefaultPackage() { return delegate.addDefaultPackage(); } @Override public JavaArchive addPackages(boolean recursive, Package... packages) throws IllegalArgumentException { return delegate.addPackages(recursive, packages); } @Override public JavaArchive addPackages(boolean recursive, Filter<ArchivePath> filter, Package... packages) throws IllegalArgumentException { return delegate.addPackages(recursive, filter, packages); } @Override public JavaArchive addPackage(String pack) throws IllegalArgumentException { return delegate.addPackage(pack); } @Override public JavaArchive addPackages(boolean recursive, String... packages) throws IllegalArgumentException { return delegate.addPackages(recursive, packages); } @Override public JavaArchive addPackages(boolean recursive, Filter<ArchivePath> filter, String... packages) throws IllegalArgumentException { return delegate.addPackages(recursive, filter, packages); } @Override public JavaArchive addAsResource(String resourceName) throws IllegalArgumentException { return delegate.addAsResource(resourceName); } @Override public JavaArchive addAsResource(File resource) throws IllegalArgumentException { return delegate.addAsResource(resource); } @Override public JavaArchive addAsResource(String resourceName, String target) throws IllegalArgumentException { return delegate.addAsResource(resourceName, target); } @Override public JavaArchive addAsResource(File resource, String target) throws IllegalArgumentException { return delegate.addAsResource(resource, target); } @Override public JavaArchive addAsResource(URL resource, String target) throws IllegalArgumentException { return delegate.addAsResource(resource, target); } @Override public JavaArchive addAsResource(Asset resource, String target) throws IllegalArgumentException { return delegate.addAsResource(resource, target); } @Override public JavaArchive addAsResource(String resourceName, ArchivePath target) throws IllegalArgumentException { return delegate.addAsResource(resourceName, target); } @Override public JavaArchive addAsResource(String resourceName, ArchivePath target, ClassLoader classLoader) throws IllegalArgumentException { return delegate.addAsResource(resourceName, target, classLoader); } @Override public JavaArchive addAsResource(File resource, ArchivePath target) throws IllegalArgumentException { return delegate.addAsResource(resource, target); } @Override public JavaArchive addAsResource(URL resource, ArchivePath target) throws IllegalArgumentException { return delegate.addAsResource(resource, target); } @Override public JavaArchive addAsResource(Asset resource, ArchivePath target) throws IllegalArgumentException { return delegate.addAsResource(resource, target); } @Override public JavaArchive addAsResources(Package resourcePackage, String... resourceNames) throws IllegalArgumentException { return delegate.addAsResources(resourcePackage, resourceNames); } @Override public JavaArchive addAsResource(Package resourcePackage, String resourceName) throws IllegalArgumentException { return delegate.addAsResource(resourcePackage, resourceName); } @Override public JavaArchive addAsResource(Package resourcePackage, String resourceName, String target) throws IllegalArgumentException { return delegate.addAsResource(resourcePackage, resourceName, target); } @Override public JavaArchive addAsResource(Package resourcePackage, String resourceName, ArchivePath target) throws IllegalArgumentException { return delegate.addAsResource(resourcePackage, resourceName, target); } private static final String v2_1_AND_3_x_MDB_ELEMENTS = " <activation-config>\n" + " <activation-config-property>\n" + " <activation-config-property-name>messageSelector</activation-config-property-name>\n" + " <activation-config-property-value>RECIPIENT='MDB'</activation-config-property-value>\n" + " </activation-config-property>\n" + " <activation-config-property>\n" + " <activation-config-property-name>destinationType</activation-config-property-name>\n" + " <activation-config-property-value>javax.jms.Queue</activation-config-property-value>\n" + " </activation-config-property>\n" + " <activation-config-property>\n" + " <activation-config-property-name>destination</activation-config-property-name>\n" + " <activation-config-property-value>jms/persistentQueue</activation-config-property-value>\n" + " </activation-config-property>\n" + " </activation-config>"; private enum EjbVersionInfo { v2_0("2.0", "<!DOCTYPE ejb-jar PUBLIC \"-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN\"\n" + " \"http://java.sun.com/dtd/ejb-jar_2_0.dtd\">\n<ejb-jar>", " <message-selector>RECIPIENT='MDB'</message-selector>\n" + " <message-driven-destination>\n" + " <destination-type>javax.jms.Queue</destination-type>\n" + " </message-driven-destination>"), v2_1("2.1", "<ejb-jar version=\"2.1\"\n" + " xmlns=\"http://java.sun.com/xml/ns/j2ee\"\n" + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" + " xsi:schemaLocation=\"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd\">", v2_1_AND_3_x_MDB_ELEMENTS), v3_0("3.0", "<ejb-jar version=\"3.0\"\n" + "" + " xmlns=\"http://java.sun.com/xml/ns/javaee\"\n" + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" + " xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd\">", v2_1_AND_3_x_MDB_ELEMENTS), v3_1("3.1", "<ejb-jar version=\"3.1\"\n" + " xmlns=\"http://java.sun.com/xml/ns/javaee\"\n" + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" + " xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd\">", v2_1_AND_3_x_MDB_ELEMENTS); private String version; private String rootElement; private String mdbElements; EjbVersionInfo(String version, String rootElement, String mdbElements) { this.version = version; this.rootElement = rootElement; this.mdbElements = mdbElements; } private static final Map<String, EjbVersionInfo> VERSION_TO_VALUE_MAP = new HashMap<String, EjbVersionInfo>(values().length); static { for (EjbVersionInfo value : values()) { VERSION_TO_VALUE_MAP.put(value.getVersion(), value); } } public String getVersion() { return version; } public String getRootElement() { return rootElement; } public String getMdbElements() { return mdbElements; } public static EjbVersionInfo forVersion(String version) { if (!VERSION_TO_VALUE_MAP.containsKey(version)) { throw new IllegalArgumentException("Unsupported version: \"" + version + "\". The following versions are supported: " + VERSION_TO_VALUE_MAP.keySet()); } return VERSION_TO_VALUE_MAP.get(version); } } }