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);
+ }
+ }
+ }
+}