= Dynamic Implementation
:jbake-date: 2016-09-06
:jbake-type: page
:jbake-tomeepdf:
:jbake-status: published

Example dynamic-implementation can be browsed at https://github.com/apache/tomee/tree/master/examples/dynamic-implementation


*Help us document this example! Click the blue pencil icon in the upper right to edit this page.*

==  SocialBean


[source,java]
----
package org.superbiz.dynamic;

import org.apache.openejb.api.Proxy;

import javax.ejb.Singleton;
import javax.interceptor.Interceptors;

@Singleton
@Proxy(SocialHandler.class)
@Interceptors(SocialInterceptor.class)
public interface SocialBean {
    public String facebookStatus();

    public String twitterStatus();

    public String status();
}
----


==  SocialHandler


[source,java]
----
package org.superbiz.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class SocialHandler implements InvocationHandler {
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        String mtd = method.getName();
        if (mtd.toLowerCase().contains("facebook")) {
            return "You think you have a life!";
        } else if (mtd.toLowerCase().contains("twitter")) {
            return "Wow, you eat pop corn!";
        }
        return "Hey, you have no virtual friend!";
    }
}
----


==  SocialInterceptor


[source,java]
----
packagenull
}
----


==  SocialTest


[source,java]
----
package org.superbiz.dynamic;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import javax.ejb.embeddable.EJBContainer;

import static junit.framework.Assert.assertTrue;

public class SocialTest {
    private static SocialBean social;
    private static EJBContainer container;

    @BeforeClass
    public static void init() throws Exception {
        container = EJBContainer.createEJBContainer();
        social = (SocialBean) container.getContext().lookup("java:global/dynamic-implementation/SocialBean");
    }

    @AfterClass
    public static void close() {
        container.close();
    }

    @Test
    public void simple() {
        assertTrue(social.facebookStatus().contains("think"));
        assertTrue(social.twitterStatus().contains("eat"));
        assertTrue(social.status().contains("virtual"));
    }
}
----


=  Running

    

[source]
----
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.superbiz.dynamic.SocialTest
Apache OpenEJB 4.0.0-beta-1    build: 20111002-04:06
http://tomee.apache.org/
INFO - openejb.home = /Users/dblevins/examples/dynamic-implementation
INFO - openejb.base = /Users/dblevins/examples/dynamic-implementation
INFO - Using 'javax.ejb.embeddable.EJBContainer=true'
INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service)
INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager)
INFO - Found EjbModule in classpath: /Users/dblevins/examples/dynamic-implementation/target/classes
INFO - Beginning load: /Users/dblevins/examples/dynamic-implementation/target/classes
INFO - Configuring enterprise application: /Users/dblevins/examples/dynamic-implementation
INFO - Configuring Service(id=Default Singleton Container, type=Container, provider-id=Default Singleton Container)
INFO - Auto-creating a container for bean SocialBean: Container(type=SINGLETON, id=Default Singleton Container)
INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container)
INFO - Auto-creating a container for bean org.superbiz.dynamic.SocialTest: Container(type=MANAGED, id=Default Managed Container)
INFO - Enterprise application "/Users/dblevins/examples/dynamic-implementation" loaded.
INFO - Assembling app: /Users/dblevins/examples/dynamic-implementation
INFO - Jndi(name="java:global/dynamic-implementation/SocialBean!org.superbiz.dynamic.SocialBean")
INFO - Jndi(name="java:global/dynamic-implementation/SocialBean")
INFO - Jndi(name="java:global/EjbModule236706648/org.superbiz.dynamic.SocialTest!org.superbiz.dynamic.SocialTest")
INFO - Jndi(name="java:global/EjbModule236706648/org.superbiz.dynamic.SocialTest")
INFO - Created Ejb(deployment-id=org.superbiz.dynamic.SocialTest, ejb-name=org.superbiz.dynamic.SocialTest, container=Default Managed Container)
INFO - Created Ejb(deployment-id=SocialBean, ejb-name=SocialBean, container=Default Singleton Container)
INFO - Started Ejb(deployment-id=org.superbiz.dynamic.SocialTest, ejb-name=org.superbiz.dynamic.SocialTest, container=Default Managed Container)
INFO - Started Ejb(deployment-id=SocialBean, ejb-name=SocialBean, container=Default Singleton Container)
INFO - Deployed Application(path=/Users/dblevins/examples/dynamic-implementation)
INFO - Undeploying app: /Users/dblevins/examples/dynamic-implementation
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.107 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
----

    
