Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Tapestry Wiki" for 
change notification.

The "JEE-Annotation" page has been changed by LennyPrimak:
http://wiki.apache.org/tapestry/JEE-Annotation?action=diff&rev1=7&rev2=8

  This works on Tapestry 5.3 or higher.
  Has been tested with Glassfish 3.1.
  
+ Code excerpts are from 
[[http://code.google.com/p/flowlogix/wiki/TapestryLibrary|Flow Logix Tapestry 
Library]]
- Keep in mind this only works for Stateless session beans,
- for stateful beans, see the usage example below.
  
  == In your AppModule.java file, add the following method ==
  
@@ -25, +24 @@

  
  (add this to one of your non-tapestry packages)
  
- {{{
+ 
[[http://code.google.com/p/flowlogix/source/browse/tapestry-services/src/main/java/com/flowlogix/web/services/internal/EJBAnnotationWorker.java|EJBAnnotationWorker.java]]
  
- /**
-  * Inject an EJB into tapestry sources
-  * 
-  * @author Magnus
-  * Enhancements by Lenny Primak
-  */
- public class EJBAnnotationWorker implements ComponentClassTransformWorker2
- {
-     @Override
-     @SneakyThrows(NamingException.class)
-     public void transform(PlasticClass plasticClass,
-             TransformationSupport support, MutableComponentModel model)
-     {
-         for (PlasticField field : 
plasticClass.getFieldsWithAnnotation(EJB.class))
-         {
-             final EJB annotation = field.getAnnotation(EJB.class);
-             String fieldType = field.getTypeName();
-             String lookupname = null;
- 
-             //try lookup
-             if (!isBlankOrNull(annotation.lookup()))
-             {
-                 lookupname = annotation.lookup();
-             } //try name
-             else if(!isBlankOrNull(annotation.name()))
-             {
-                 lookupname = annotation.name();
-             }
-             else if(!isBlankOrNull(annotation.beanName()))
-             {
-                 lookupname = annotation.beanName();
-             }
- 
-             //use type
-             if (lookupname == null)
-             {
-                 lookupname = guessByType(fieldType);
-             }
- 
-             lookupname = prependPortableName(lookupname);
- 
-             Object injectionValue = locator.getJNDIObject(lookupname);
- 
-             if (injectionValue != null)
-             {
-                 field.inject(injectionValue);
-                 field.claim(annotation);
-             }
-         }
-     }
-     
-     
-     public static String guessByType(String type) 
-     {
-         String lookupname = type.substring(type.lastIndexOf(".") + 1);
-         // support naming convention that strips Local/Remote from the
-         // end of an interface class to try to determine the actual bean name,
-         // to avoid @EJB(beanName="myBeanName"), and just use plain old @EJB
-         String uc = lookupname.toUpperCase();
-         if (uc.endsWith(LOCAL) || uc.endsWith(REMOTE)) {
-             lookupname = 
StripLocalPattern.matcher(lookupname).replaceFirst("");
-         }
-         return lookupname;
-     }
-     
-     
-     public static String prependPortableName(String lookupname)
-     {
-         //convert to jndi name
-         if (!lookupname.startsWith("java:")) 
-         {
-             lookupname = "java:module/" + lookupname;
-         }
-         return lookupname;
-     }
-     
- 
-     private boolean isBlankOrNull(String s)
-     {
-         return s == null || s.trim().equals("");
-     }
-     
- 
-     private final JNDIObjectLocator locator = new JNDIObjectLocator();
-     private static final String REMOTE = "REMOTE";
-     private static final String LOCAL = "LOCAL";
-     public static final Pattern StripLocalPattern = Pattern.compile(LOCAL + 
"|" + REMOTE, Pattern.CASE_INSENSITIVE);
- }
- 
- 
- }}}
- 
- == Using @EJB in your client code ==
+ == Using Stateless @EJB in your client code ==
  
  {{{
  
@@ -136, +43 @@

  
  class SomeTapestryPage
  {
+   private @EJB @Stateful MyStatefulBeanLocal statefulBean;  // stored as 
SessionState object
+   private @EJB @Stateful(isSessionAttribute = true) MyStatefulBeanLocal 
statefulBean2;  // stored as SessionAttribute object
-     @SetupRender
-     private void init()
-     {
-         if(statefulBeanExists == false)
-         {
-             statefulBean = new 
JNDIObjectLocator().getObject(MyStatefulBeanLocal.class);
-         }
- 
-         if(statefulBean2 == null)
-         {
-             // A new instance of JNDIObjectLocator has to be used for each 
lookup,
-             // because it caches lookups, and for stateful session beans this 
is a no-no
-             statefulBean2 = new 
JNDIObjectLocator().getObject(MyStatefulBeanLocal.class);
-         }     
-     }
- 
- 
-     @SessionState(create = false) private MyStatefulBeanLocal statefulBean;
-     private boolean statefulBeanExists;
- 
-     // another example
-     private @Persist MyStatefulBeanLocal statefulBean2;
  }
  
  }}}
  
- There is an even simpler way to use Stateful beans, if you are using
- the [[http://code.google.com/p/flowlogix/wiki/TapestryLibrary|Flow Logix 
Tapestry Library]]:
- {{{ 
-   private @EJB @Stateful MyStatefulBeanLocal statefulBean;  // its that 
simple!
- }}}
- 
  == JNDIObjectLocator.java, variant taken from Tapestry JumpStart ==
  
+ 
[[http://code.google.com/p/flowlogix/source/browse/tapestry-services/src/main/java/com/flowlogix/ejb/JNDIObjectLocator.java|JNDIObjectLocator.java]]
- {{{
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.Map;
- import javax.naming.InitialContext;
- import javax.naming.NameNotFoundException;
- import javax.naming.NamingException;
- import lombok.Getter;
- import lombok.SneakyThrows;
  
- /**
-  * JNDIObjectLocator is used to centralize all JNDI lookups. It minimises the 
overhead of JNDI lookups by caching the
-  * objects it looks up.
-  * 
-  * @author Geoff Callendar
-  * Enhancements by Lenny Primak
-  */
- public class JNDIObjectLocator
- {
-     @SneakyThrows(NamingException.class)
-     public JNDIObjectLocator()
-     {
-         initialContext = new InitialContext();
-     }
-     
-     
-     @SneakyThrows(NamingException.class)
-     public<T> T getObject(Class<T> beanClass)
-     {
-         String name = EJBAnnotationWorker.guessByType(beanClass.getName());
-         return getObject(EJBAnnotationWorker.prependPortableName(name));
-     }
-     
-     
-     @SuppressWarnings("unchecked")
-     public<T> T getObject(String jndiName) throws NamingException
-     {
-         return (T)getJNDIObject(jndiName);
-     }
- 
-     
-     public synchronized void clear()
-     {
-         jndiObjectCache.clear();
-     }
-     
- 
-     public Object getJNDIObject(String jndiName) throws NamingException
-     {
-         Object jndiObject = jndiObjectCache.get(jndiName);
- 
-         if (jndiObject == null && !jndiObjectCache.containsKey(jndiName))
-         {
-             try
-             {
-                 jndiObject = lookup(jndiName);
-                 jndiObjectCache.put(jndiName, jndiObject);
-             } catch (NamingException e)
-             {
-                 clear();
-                 throw e;
-             }
-         }
-         return jndiObject;
-     }
- 
-     
-     private synchronized Object lookup(String name) throws NamingException
-     {
- 
-         // Recheck the cache because the name we're looking for may have been 
added while we were waiting for sync.
- 
-         if (!jndiObjectCache.containsKey(name))
-         {
-             try
-             {
-                 return getInitialContext().lookup(name);
-             } catch (NameNotFoundException e)
-             {
-                 clear();
-                 throw e;
-             }
-         } else
-         {
-             return jndiObjectCache.get(name);
-         }
-     }
- 
-     
-     @Getter private final InitialContext initialContext;
-     private final Map<String, Object> jndiObjectCache = 
Collections.synchronizedMap(new HashMap<String, Object>());
- }
- 
- }}}
- 

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to