/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.openejb.config; import junit.framework.TestCase; import org.apache.openejb.assembler.classic.Assembler; import org.apache.openejb.assembler.classic.EjbJarInfo; import org.apache.openejb.assembler.classic.MdbContainerInfo; import org.apache.openejb.assembler.classic.SecurityServiceInfo; import org.apache.openejb.assembler.classic.TransactionServiceInfo; import org.apache.openejb.config.sys.Container; import org.apache.openejb.config.sys.ServiceProvider; import org.apache.openejb.jee.EjbJar; import org.apache.openejb.jee.MessageDrivenBean; import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.Message; import javax.jms.MessageListener; import javax.resource.ResourceException; import javax.resource.spi.ActivationSpec; import javax.resource.spi.BootstrapContext; import javax.resource.spi.InvalidPropertyException; import javax.resource.spi.ResourceAdapterInternalException; import javax.resource.spi.endpoint.MessageEndpoint; import javax.resource.spi.endpoint.MessageEndpointFactory; import javax.transaction.xa.XAResource; import java.util.HashMap; import java.util.Map; import java.util.Properties; /** * @version $Rev$ $Date$ */ public class AutoConfigMdbContainerTest extends TestCase { private ConfigurationFactory config; private Assembler assembler; public void test() { } protected void _setUp() throws Exception { config = new ConfigurationFactory(); assembler = new Assembler(); assembler.createTransactionManager(config.configureService(TransactionServiceInfo.class)); assembler.createSecurityService(config.configureService(SecurityServiceInfo.class)); final ServiceProvider provider = new ServiceProvider(EmailResourceAdapter.class, EmailResourceAdapter.class.getSimpleName(), "Resource"); provider.getTypes().add(EmailResourceAdapter.class.getName()); ServiceUtils.getServiceProviders().add(provider); } public void _testJmsMdbNoContainerConfigured() throws Exception { final EjbJar ejbJar = new EjbJar(); ejbJar.addEnterpriseBean(new MessageDrivenBean(JmsBean.class)); final EjbJarInfo info = config.configureApplication(ejbJar); // assembler.createApplication(info); } public void _testConfiguredContainerSelection() throws Exception { // Create a JMS MDB Container final MdbContainerInfo info = config.configureService(MdbContainerInfo.class); assertEquals(MessageListener.class.getName(), info.properties.get("MessageListenerInterface")); assembler.createContainer(info); // Create an Email MDB Container final Container container = new Container("EmailContainer", "MESSAGE", null); final Properties properties = container.getProperties(); properties.setProperty("ResourceAdapter", EmailResourceAdapter.class.getSimpleName()); properties.setProperty("MessageListenerInterface", EmailConsumer.class.getName()); properties.setProperty("ActivationSpecClass", EmailAccountInfo.class.getName()); assembler.createContainer(config.configureService(container, MdbContainerInfo.class)); } @MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "FooQueue")}) public static class JmsBean implements MessageListener { public void onMessage(final Message message) { } } @MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "address", propertyValue = "dblevins@apache.org")}) public static class EmailBean implements EmailConsumer { public void receiveEmail(final Properties headers, final String body) { } } public static interface EmailConsumer { public void receiveEmail(Properties headers, String body); } public static class EmailResourceAdapter implements javax.resource.spi.ResourceAdapter { public boolean started; private final Map<String, EmailConsumer> consumers = new HashMap<String, EmailConsumer>(); public void start(final BootstrapContext bootstrapContext) throws ResourceAdapterInternalException { } public void stop() { } public void endpointActivation(final MessageEndpointFactory messageEndpointFactory, final ActivationSpec activationSpec) throws ResourceException { final EmailAccountInfo accountInfo = (EmailAccountInfo) activationSpec; final EmailConsumer emailConsumer = (EmailConsumer) messageEndpointFactory.createEndpoint(null); consumers.put(accountInfo.getAddress(), emailConsumer); } public void endpointDeactivation(final MessageEndpointFactory messageEndpointFactory, final ActivationSpec activationSpec) { final EmailAccountInfo accountInfo = (EmailAccountInfo) activationSpec; final EmailConsumer emailConsumer = consumers.remove(accountInfo.getAddress()); final MessageEndpoint endpoint = (MessageEndpoint) emailConsumer; endpoint.release(); } public XAResource[] getXAResources(final ActivationSpec[] activationSpecs) throws ResourceException { return new XAResource[0]; } public void deliverEmail(final Properties headers, final String body) throws Exception { final String to = headers.getProperty("To"); final EmailConsumer emailConsumer = consumers.get(to); if (emailConsumer == null) throw new Exception("No such account"); final MessageEndpoint endpoint = (MessageEndpoint) emailConsumer; endpoint.beforeDelivery(EmailConsumer.class.getMethod("receiveEmail", Properties.class, String.class)); emailConsumer.receiveEmail(headers, body); endpoint.afterDelivery(); } } public static class EmailAccountInfo implements ActivationSpec { private EmailResourceAdapter emailResourceAdapter; private String address; public void validate() throws InvalidPropertyException { } public String getAddress() { return address; } public void setAddress(final String address) { this.address = address; } public EmailResourceAdapter getResourceAdapter() { return emailResourceAdapter; } public void setResourceAdapter(final javax.resource.spi.ResourceAdapter resourceAdapter) { this.emailResourceAdapter = (EmailResourceAdapter) resourceAdapter; } } }