You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2011/12/13 00:19:22 UTC

svn commit: r1213494 - in /openejb/trunk/openejb: assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ container/openejb-core/src/main/java/org/apache/openejb/util/reflection/

Author: rmannibucau
Date: Mon Dec 12 23:19:22 2011
New Revision: 1213494

URL: http://svn.apache.org/viewvc?rev=1213494&view=rev
Log:
Tomcat contains a bug regarding coda and prelude. It uses a HashSet instead of a LinkedHashSet (to preserve to order). This fix uses reflection to avoid to override a lot of code. To clean up when Tomcat will fix it.

Added:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/ReflectionUtil.java
Modified:
    openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
    openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java

Modified: openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java?rev=1213494&r1=1213493&r2=1213494&view=diff
==============================================================================
--- openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java (original)
+++ openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java Mon Dec 12 23:19:22 2011
@@ -19,6 +19,11 @@ package org.apache.tomee.catalina;
 import org.apache.catalina.core.StandardContext;
 import org.apache.catalina.deploy.WebXml;
 import org.apache.catalina.startup.ContextConfig;
+import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.util.reflection.ReflectionUtil;
+
+import javax.servlet.descriptor.JspPropertyGroupDescriptor;
+import java.util.LinkedHashSet;
 
 /**
  * @author rmannibucau
@@ -36,12 +41,21 @@ public class OpenEJBContextConfig extend
         return new OpenEJBWebXml(prefix);
     }
 
-    private class OpenEJBWebXml extends WebXml {
+    public class OpenEJBWebXml extends WebXml {
         public static final String OPENEJB_WEB_XML_MAJOR_VERSION_PROPERTY = "openejb.web.xml.major";
+
         private String prefix;
 
         public OpenEJBWebXml(String prefix) {
             this.prefix = prefix;
+
+            // some hack since tomcat doesn't preserve order of jsppropertygroup because of the hashset
+            // to remove if tomcat fixes it.
+            try {
+                ReflectionUtil.set(this, "jspPropertyGroups", new LinkedHashSet<JspPropertyGroupDescriptor>());
+            } catch (OpenEJBException e) {
+                // ignored, applications often work even with this error...which shouldn't happen often
+            }
         }
 
         @Override public int getMajorVersion() {

Modified: openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1213494&r1=1213493&r2=1213494&view=diff
==============================================================================
--- openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java (original)
+++ openejb/trunk/openejb/assembly/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java Mon Dec 12 23:19:22 2011
@@ -65,6 +65,7 @@ import org.apache.openejb.loader.SystemI
 import org.apache.openejb.util.LinkResolver;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
+import org.apache.openejb.util.reflection.ReflectionUtil;
 import org.apache.tomcat.InstanceManager;
 import org.apache.tomcat.util.digester.Digester;
 import org.apache.tomee.common.LegacyAnnotationProcessor;
@@ -82,6 +83,7 @@ import javax.naming.NamingException;
 import javax.persistence.EntityManagerFactory;
 import javax.servlet.ServletContext;
 import javax.servlet.SessionTrackingMode;
+import javax.servlet.descriptor.JspPropertyGroupDescriptor;
 import javax.servlet.jsp.JspApplicationContext;
 import javax.servlet.jsp.JspFactory;
 import javax.transaction.TransactionManager;
@@ -94,6 +96,7 @@ import java.lang.reflect.Field;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
@@ -471,6 +474,7 @@ public class TomcatWebAppBuilder impleme
      */
     @Override
     public void init(StandardContext standardContext) {
+        replaceHashSetForJspPropertyGroupsByLinkedHashSet(standardContext);
         standardContext.setCrossContext(Boolean.parseBoolean(System.getProperty(OPENEJB_CROSSCONTEXT_PROPERTY, "false")));
         standardContext.setNamingResources(new OpenEJBNamingResource());
 
@@ -500,6 +504,21 @@ public class TomcatWebAppBuilder impleme
     }
 
     /**
+     * a small hack to preserve order of jsppropertygroups.
+     *
+     * to remove if tomcat fixes it.
+     *
+     * @param standardContext
+     */
+    private static void replaceHashSetForJspPropertyGroupsByLinkedHashSet(StandardContext standardContext) {
+        try {
+            ReflectionUtil.set(standardContext.getJspConfigDescriptor(), "jspPropertyGroups", new LinkedHashSet<JspPropertyGroupDescriptor>());
+        } catch (OpenEJBException e) {
+            // ignored, applications often work even with this error...which shouldn't happen often
+        }
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override

Added: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/ReflectionUtil.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/ReflectionUtil.java?rev=1213494&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/ReflectionUtil.java (added)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/reflection/ReflectionUtil.java Mon Dec 12 23:19:22 2011
@@ -0,0 +1,37 @@
+package org.apache.openejb.util.reflection;
+
+import org.apache.openejb.OpenEJBException;
+
+import java.lang.reflect.Field;
+
+/**
+ * @author rmannibucau
+ */
+public final class ReflectionUtil {
+    private ReflectionUtil() {
+        // no-op
+    }
+
+    public static void set(Object notNullInstance, String fieldName, Object value) throws OpenEJBException {
+        Field field = null;
+        boolean accessible = true;
+        try {
+            Class<?> current = notNullInstance.getClass();
+            while (!current.equals(Object.class) && field == null) {
+                field = current.getDeclaredField(fieldName);
+                current = current.getSuperclass();
+            }
+            accessible = field.isAccessible();
+            if (!accessible) {
+                field.setAccessible(true);
+            }
+            field.set(notNullInstance, value);
+        } catch (Exception cce) {
+            throw new OpenEJBException(cce);
+        } finally {
+            if (field != null) {
+                field.setAccessible(accessible);
+            }
+        }
+    }
+}