[webbeans-commits] Webbeans SVN: r2042 - in ri/tags/1.0.0.BETA1/impl: src/main/java/org/jboss/webbeans/util and 7 other directories.

webbeans-commits at lists.jboss.org webbeans-commits at lists.jboss.org
Mon Mar 16 10:18:43 EDT 2009


Author: vitold
Date: 2009-03-16 10:18:43 -0400 (Mon, 16 Mar 2009)
New Revision: 2042

Added:
   ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/
   ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/ClassReceiver.java
   ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/ParseXmlHelper.java
   ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/XmlConstants.java
   ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/XmlParserImpl.java
   ri/tags/1.0.0.BETA1/impl/src/test/java/com/
   ri/tags/1.0.0.BETA1/impl/src/test/java/com/mydomain/
   ri/tags/1.0.0.BETA1/impl/src/test/java/com/mydomain/myapp/
   ri/tags/1.0.0.BETA1/impl/src/test/java/com/mydomain/myapp/Order.java
   ri/tags/1.0.0.BETA1/impl/src/test/java/org/jboss/webbeans/test/unit/xml/XmlParserImplTest.java
Modified:
   ri/tags/1.0.0.BETA1/impl/pom.xml
   ri/tags/1.0.0.BETA1/impl/src/test/resources/org/jboss/webbeans/test/unit/xml/user-defined-beans.xml
Log:
add helper class for parsing beans.xml, test class for it, modify user-defined-beans.xml

Modified: ri/tags/1.0.0.BETA1/impl/pom.xml
===================================================================
--- ri/tags/1.0.0.BETA1/impl/pom.xml	2009-03-16 13:27:36 UTC (rev 2041)
+++ ri/tags/1.0.0.BETA1/impl/pom.xml	2009-03-16 14:18:43 UTC (rev 2042)
@@ -82,6 +82,12 @@
          <groupId>javassist</groupId>
          <artifactId>javassist</artifactId>
       </dependency>
+      
+      <dependency>
+      	 <groupId>dom4j</groupId>
+         <artifactId>dom4j</artifactId>
+         <version>1.6.1</version>
+      </dependency>
 
       <dependency>
          <groupId>log4j</groupId>

Added: ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/ClassReceiver.java
===================================================================
--- ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/ClassReceiver.java	                        (rev 0)
+++ ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/ClassReceiver.java	2009-03-16 14:18:43 UTC (rev 2042)
@@ -0,0 +1,12 @@
+package org.jboss.webbeans.util.xml;
+
+import java.lang.reflect.AnnotatedElement;
+
+import org.dom4j.Element;
+
+public interface ClassReceiver
+{
+   boolean accept(Element element);
+
+   AnnotatedElement reciveClass(Element element);
+}

Added: ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/ParseXmlHelper.java
===================================================================
--- ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/ParseXmlHelper.java	                        (rev 0)
+++ ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/ParseXmlHelper.java	2009-03-16 14:18:43 UTC (rev 2042)
@@ -0,0 +1,215 @@
+package org.jboss.webbeans.util.xml;
+
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import javax.inject.DefinitionException;
+
+import org.dom4j.Element;
+import org.jboss.webbeans.CurrentManager;
+import org.jboss.webbeans.ManagerImpl;
+
+import com.sun.org.apache.xml.internal.serialize.XHTMLSerializer;
+
+public class ParseXmlHelper
+{
+   private static List<ClassReceiver> receivers;
+
+   static
+   {
+      receivers = initializeReceivers();
+   }
+
+   public static Set<AnnotatedElement> getBeanClasses(List<Element> beans)
+   {
+      Set<AnnotatedElement> result = new HashSet<AnnotatedElement>();
+
+      for (Element bean : beans)
+         result.add(reciveBeanClass(bean));
+
+      return result;
+   }
+
+   private static AnnotatedElement reciveBeanClass(Element element)
+   {
+      for (ClassReceiver receiver : receivers)
+      {
+         if (receiver.accept(element))
+         {
+            return receiver.reciveClass(element);
+         }
+      }
+
+      throw new DefinitionException("definition of a bean " + element.getName() + " is incorrect");
+   }
+
+   private static List<ClassReceiver> initializeReceivers()
+   {
+      List<ClassReceiver> receivers = new ArrayList<ClassReceiver>();
+
+      ClassReceiver jmsResourceClassReceiver = new ClassReceiver()
+      {
+         public boolean accept(Element element)
+         {
+            return isJMSResource(element);
+         }
+
+         public AnnotatedElement reciveClass(Element element)
+         {
+            return reciveJMSResourceClass(element);
+         }
+
+      };
+      ClassReceiver resourceClassReceiver = new ClassReceiver()
+      {
+         public boolean accept(Element element)
+         {
+            return isResource(element);
+         }
+
+         public AnnotatedElement reciveClass(Element element)
+         {
+            return reciveResourceClass(element);
+         }
+
+      };
+      ClassReceiver sessionBeanClassReceiver = new ClassReceiver()
+      {
+         public boolean accept(Element element)
+         {
+            return isSessionBean(element);
+         }
+
+         public AnnotatedElement reciveClass(Element element)
+         {
+            return reciveSessionBeanClass(element);
+         }
+
+      };
+      ClassReceiver simpleBeanClassReceiver = new ClassReceiver()
+      {
+         public boolean accept(Element element)
+         {
+            return isSimpleBean(element);
+         }
+
+         public AnnotatedElement reciveClass(Element element)
+         {
+            return reciveSimpleBeanClass(element);
+         }
+
+      };
+
+      receivers.add(jmsResourceClassReceiver);
+      receivers.add(resourceClassReceiver);
+      receivers.add(sessionBeanClassReceiver);
+      receivers.add(simpleBeanClassReceiver);
+
+      return receivers;
+   }
+
+   private static boolean isResource(Element element)
+   {
+      Iterator<?> elIterator = element.elementIterator();
+      while (elIterator.hasNext())
+      {
+         Element child = (Element) elIterator.next();
+         if (child.getNamespace().getURI().equalsIgnoreCase(XmlConstants.JAVA_EE_NAMESPACE) && 
+               (child.getName().equalsIgnoreCase(XmlConstants.RESOURCE) || 
+                     child.getName().equalsIgnoreCase(XmlConstants.PERSISTENCE_CONTEXT) || 
+                     child.getName().equalsIgnoreCase(XmlConstants.PERSISTENCE_UNIT) || 
+                     child.getName().equalsIgnoreCase(XmlConstants.EJB) || 
+                     child.getName().equalsIgnoreCase(XmlConstants.WEB_SERVICE_REF)))
+            return true;
+      }
+      return false;
+   }
+
+   private static AnnotatedElement reciveResourceClass(Element element)
+   {
+      // TODO:
+      return null;
+   }
+
+   private static boolean isJMSResource(Element element)
+   {
+      if (element.getNamespace().getURI().equalsIgnoreCase(XmlConstants.JAVA_EE_NAMESPACE) && 
+            (element.getName().equalsIgnoreCase(XmlConstants.TOPIC) || 
+                  element.getName().equalsIgnoreCase(XmlConstants.QUEUE)))
+         return true;
+      return false;
+   }
+
+   private static AnnotatedElement reciveJMSResourceClass(Element element)
+   {
+      // TODO:
+      return null;
+   }
+
+   private static boolean isSimpleBean(Element element)
+   {
+      Class<?> beanClass = loadClass(element);
+      ManagerImpl manager = CurrentManager.rootManager();
+      if (!Modifier.isAbstract(beanClass.getModifiers()) && 
+            !manager.getEjbDescriptorCache().containsKey(element.getName()) && 
+            beanClass.getTypeParameters().length == 0)
+         return true;
+
+      return false;
+   }
+
+   private static AnnotatedElement reciveSimpleBeanClass(Element element)
+   {
+      Class<?> beanClass = loadClass(element);
+
+      if (beanClass.isMemberClass())
+         throw new DefinitionException("class " + beanClass + " is a non-static inner class");
+
+//       if (beanClass.getTypeParameters().length > 0)
+//          throw new DefinitionException("class " + beanClass + " is a parameterized type");
+
+      // TODO:
+//       boolean isDecorator = false;
+//       if (Modifier.isAbstract(beanClass.getModifiers()) && !isDecorator)
+//          throw new DefinitionException("class " + beanClass + " is an abstract and not Decorator");
+
+      return beanClass;
+   }
+
+   private static boolean isSessionBean(Element element)
+   {
+      ManagerImpl manager = CurrentManager.rootManager();
+      if (manager.getEjbDescriptorCache().containsKey(element.getName()) ||
+            element.attribute(XmlConstants.EJB_NAME) != null)
+         return true;
+      return false;
+   }
+
+   private static AnnotatedElement reciveSessionBeanClass(Element element)
+   {
+      // TODO:
+      return null;
+   }
+
+   private static Class<?> loadClass(Element element)
+   {
+      String beanUri = element.getNamespace().getURI();
+      String packageName = beanUri.replaceFirst(XmlConstants.URN_PREFIX, "");
+      String classPath = packageName + "." + element.getName();
+
+      try
+      {
+         return Class.forName(classPath);
+      }
+      catch (ClassNotFoundException e)
+      {
+         throw new DefinitionException("class " + classPath + " not found");
+      }
+
+   }
+}

Added: ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/XmlConstants.java
===================================================================
--- ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/XmlConstants.java	                        (rev 0)
+++ ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/XmlConstants.java	2009-03-16 14:18:43 UTC (rev 2042)
@@ -0,0 +1,36 @@
+package org.jboss.webbeans.util.xml;
+
+public class XmlConstants
+{
+   public static final String JAVA_EE_NAMESPACE = "urn:java:ee";
+   
+   public static final String DEPLOY = "Deploy";
+   
+   public static final String INTERCEPTORS = "Interceptors";
+   
+   public static final String DECORATORS = "Decorators";
+   
+   public static final String BINDING_TYPE = "BindingType";
+   
+   public static final String INTERCEPTOR_BINDING_TYPE = "InterceptorBindingType";
+   
+   public static final String STEREOTYPE = "Stereotype";
+   
+   public static final String RESOURCE = "Resource";
+   
+   public static final String PERSISTENCE_CONTEXT = "PersistenceContext";
+   
+   public static final String PERSISTENCE_UNIT = "PersistenceUnit";
+   
+   public static final String EJB = "EJB";
+   
+   public static final String WEB_SERVICE_REF = "WebServiceRef";
+   
+   public static final String TOPIC = "Topic";
+   
+   public static final String QUEUE = "Queue";
+   
+   public static final String URN_PREFIX = "urn:java:";
+   
+   public static final String EJB_NAME = "ejbName";
+}

Added: ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/XmlParserImpl.java
===================================================================
--- ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/XmlParserImpl.java	                        (rev 0)
+++ ri/tags/1.0.0.BETA1/impl/src/main/java/org/jboss/webbeans/util/xml/XmlParserImpl.java	2009-03-16 14:18:43 UTC (rev 2042)
@@ -0,0 +1,93 @@
+package org.jboss.webbeans.util.xml;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.AnnotatedElement;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+
+public class XmlParserImpl // implements XmlParser
+{
+
+   private static Logger log = Logger.getLogger(XmlParserImpl.class);
+   
+   public Set<AnnotatedElement> parse(Set<URL> xmls)
+   {
+      Set<AnnotatedElement> result = new HashSet<AnnotatedElement>();
+
+      for (URL url : xmls)
+      {
+         try
+         {
+            InputStream xmlStream;
+
+            xmlStream = url.openStream();
+            SAXReader reader = new SAXReader();
+            Document document = reader.read(xmlStream);
+            List<Element> beanElements = findBeans(document);
+            result.addAll(ParseXmlHelper.getBeanClasses(beanElements));
+         }
+         catch (IOException e)
+         {
+            log.debug("Can not open stream for " + url, e);
+         }
+         catch (DocumentException e)
+         {
+            log.debug("Error during the processing of a DOM4J document for " + url, e);
+         }
+      }
+      return result;
+   }
+
+   private List<Element> findBeans(Document document)
+   {
+      List<Element> beans = new ArrayList<Element>();
+
+      Element root = document.getRootElement();
+
+      Iterator<?> elIterator = root.elementIterator();
+      while (elIterator.hasNext())
+      {
+         Element element = (Element) elIterator.next();
+         if (checkElementName(element) && checkElementChildrenNames(element))
+            beans.add(element);
+      }
+
+      return beans;
+   }   
+
+   private boolean checkElementName(Element element)
+   {
+      if (element.getNamespace().getURI().equalsIgnoreCase(XmlConstants.JAVA_EE_NAMESPACE) && 
+            (element.getName().equalsIgnoreCase(XmlConstants.DEPLOY) || 
+                  element.getName().equalsIgnoreCase(XmlConstants.INTERCEPTORS) || 
+                  element.getName().equalsIgnoreCase(XmlConstants.DECORATORS)))
+         return false;
+      return true;
+   }
+
+   private boolean checkElementChildrenNames(Element element)
+   {
+      Iterator<?> elIterator = element.elementIterator();
+      while (elIterator.hasNext())
+      {
+         Element child = (Element) elIterator.next();
+         if (child.getNamespace().getURI().equalsIgnoreCase(XmlConstants.JAVA_EE_NAMESPACE) && 
+               (child.getName().equalsIgnoreCase(XmlConstants.BINDING_TYPE) || 
+                     child.getName().equalsIgnoreCase(XmlConstants.INTERCEPTOR_BINDING_TYPE) || 
+                     child.getName().equalsIgnoreCase(XmlConstants.STEREOTYPE)))
+            return false;
+      }
+      return true;
+   }
+}

Added: ri/tags/1.0.0.BETA1/impl/src/test/java/com/mydomain/myapp/Order.java
===================================================================
--- ri/tags/1.0.0.BETA1/impl/src/test/java/com/mydomain/myapp/Order.java	                        (rev 0)
+++ ri/tags/1.0.0.BETA1/impl/src/test/java/com/mydomain/myapp/Order.java	2009-03-16 14:18:43 UTC (rev 2042)
@@ -0,0 +1,6 @@
+package com.mydomain.myapp;
+
+public class Order
+{
+
+}

Added: ri/tags/1.0.0.BETA1/impl/src/test/java/org/jboss/webbeans/test/unit/xml/XmlParserImplTest.java
===================================================================
--- ri/tags/1.0.0.BETA1/impl/src/test/java/org/jboss/webbeans/test/unit/xml/XmlParserImplTest.java	                        (rev 0)
+++ ri/tags/1.0.0.BETA1/impl/src/test/java/org/jboss/webbeans/test/unit/xml/XmlParserImplTest.java	2009-03-16 14:18:43 UTC (rev 2042)
@@ -0,0 +1,56 @@
+package org.jboss.webbeans.test.unit.xml;
+
+import java.lang.reflect.AnnotatedElement;
+import java.net.URL;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jboss.webbeans.test.unit.AbstractTest;
+import org.jboss.webbeans.util.xml.XmlParserImpl;
+//import org.jboss.webbeans.tck.impl.SpecAssertion;
+import org.testng.annotations.Test;
+
+import com.mydomain.myapp.Order;
+
+public class XmlParserImplTest extends AbstractTest
+{
+   @Test
+   public void testParse()
+   {
+      Set<URL> xmls = new HashSet<URL>();
+      Iterable<URL> urls = getResources("user-defined-beans.xml");
+
+      for (URL url : urls)
+         xmls.add(url);
+
+      XmlParserImpl parser = new XmlParserImpl();
+      Set<AnnotatedElement> aSet = parser.parse(xmls);
+
+      assert aSet.size() == 1;
+      for(AnnotatedElement aElement : aSet){
+    	  assert aElement.equals(Order.class);
+      }      
+   }
+}
+
+/*
+<Beans xmlns="urn:java:ee" xmlns:myapp="urn:java:com.mydomain.myapp"
+xmlns:test="urn:java:org.jboss.webbeans.test.unit.xml">
+<Deploy>
+	<Standard />
+	<Production />
+	<test:AnotherDeploymentType />
+</Deploy>
+<myapp:Order>
+	<ConversationScoped />
+	<myapp:PaymentProcessor>
+		<myapp:Asynchronous />
+	</myapp:PaymentProcessor>
+	<myapp:User />
+</myapp:Order>
+<myapp:Login>
+	<ConversationScoped />
+	<BindingType />
+</myapp:Login>
+</Beans>
+*/

Modified: ri/tags/1.0.0.BETA1/impl/src/test/resources/org/jboss/webbeans/test/unit/xml/user-defined-beans.xml
===================================================================
--- ri/tags/1.0.0.BETA1/impl/src/test/resources/org/jboss/webbeans/test/unit/xml/user-defined-beans.xml	2009-03-16 13:27:36 UTC (rev 2041)
+++ ri/tags/1.0.0.BETA1/impl/src/test/resources/org/jboss/webbeans/test/unit/xml/user-defined-beans.xml	2009-03-16 14:18:43 UTC (rev 2042)
@@ -1,8 +1,19 @@
-<Beans xmlns="urn:java:ee"
-       xmlns:test="urn:java:org.jboss.webbeans.test.unit.xml"> 
-   <Deploy>
-      <Standard />
-      <Production />
-      <test:AnotherDeploymentType />
-   </Deploy>
-</Beans>
+<Beans xmlns="urn:java:ee" xmlns:myapp="urn:java:com.mydomain.myapp"
+	xmlns:test="urn:java:org.jboss.webbeans.test.unit.xml">
+	<Deploy>
+		<Standard />
+		<Production />
+		<test:AnotherDeploymentType />
+	</Deploy>
+	<myapp:Order>
+		<ConversationScoped />
+		<myapp:PaymentProcessor>
+			<myapp:Asynchronous />
+		</myapp:PaymentProcessor>
+		<myapp:User />
+	</myapp:Order>
+	<myapp:Login>
+		<ConversationScoped />
+		<BindingType />
+	</myapp:Login>
+</Beans>
\ No newline at end of file




More information about the weld-commits mailing list