Nice job!

I think the general path to get things patched is to open a Jira issue and 
attach a proper patch file, possibly including a test. The committers can’t use 
your code otherwise for apache license reasons IIRC…

Cheers
Christian


> Am 01.12.2017 um 17:38 schrieb Luca Arzeni <l.arz...@iname.com>:
> 
> Hi to all,
> few years ago, I raised an alert concerning the compatibility between 
> Tapestry5 and JBoss; the thread was:
> 
> "Is tapestry plastic incompatible with JEE specs?"
> 
> https://mail-archives.apache.org/mod_mbox/tapestry-users/201512.mbox/%3Ctrinity-fc3b0e36-0402-4d71-b48a-4a464cbd6474-1449857158334@3capp-mailcom-lxa14%3E
> 
> At that time I found a workaround and concluded that there was no way to 
> solve the issue, thinking that was a problem related to the jboss classloader 
> (or, more generally, between an appserver classloader and the behaviour of 
> plastic).
> 
> Few days ago, working on a new project under JBoss 7.0.0.GA, I was again 
> badly hitted by this problem, but this time I investigated more thoroughly 
> the issue and I found the source of all evil: the class 
> "org.apache.tapestry5.internal.plastic.asm.ClassWriter" of plastic.
> 
> The classloader used to find (and load) the classes by plastic is really not 
> compatible with an appserver. An appserver is required to enforce classloaded 
> isolation and plastic ignores this.
> Anyway plastic can be patched to solve the issue; here I attach a patch, 
> please I ask to some developer to kindly forward and apply this patch to the 
> 5.4.x branch and to the 5.5.
> 
> I also want to give thanks to these guys to help me to focus the problem:
> 
> https://stackoverflow.com/questions/42423907/unable-to-move-tapestry-jars-out-of-the-war-with-page-code-inside-the-war-still
> https://blog.progs.be/50/tapestry-classloading-problems-on-jboss
> 
> Regards,
> Luca Arzeni
> 
> 
> *** Here is the original code: ***
> 
> 1752     protected String getCommonSuperClass(final String type1, final 
> String type2) {
> 1753         Class<?> c, d;
> 1754         ClassLoader classLoader = getClass().getClassLoader();
> 1755         try {
> 1756             c = Class.forName(type1.replace('/', '.'), false, 
> classLoader);
> 1757             d = Class.forName(type2.replace('/', '.'), false, 
> classLoader);
> 1758         } catch (Exception e) {
> 1759             throw new RuntimeException(e.toString());
> 1760         }
> 1761         if (c.isAssignableFrom(d)) {
> 1762             return type1;
> 1763         }
> 1764         if (d.isAssignableFrom(c)) {
> 1765             return type2;
> 1766         }
> 1767         if (c.isInterface() || d.isInterface()) {
> 1768             return "java/lang/Object";
> 1769         } else {
> 1770             do {
> 1771                 c = c.getSuperclass();
> 1772             } while (!c.isAssignableFrom(d));
> 1773             return c.getName().replace('.', '/');
> 1774         }
> 1775     }
> 
> *** Here is the patch: ***
> 
> 1752    protected String getCommonSuperClass(final String type1, final String 
> type2) {
> 1753        Class<?> c, d;
> 1754        ClassLoader classLoader = getClass().getClassLoader();
> 1755        try {
> 1756            c = Class.forName(type1.replace('/', '.'), false, 
> classLoader);
> 1757            d = Class.forName(type2.replace('/', '.'), false, 
> classLoader);
> 1758        } catch (Exception e) {
> // --- ARZILLO PATCH BEGIN 
> -----------------------------------------------------------
> 
>               System.err.println("WARNING: type1:" + type1 + ", type2: " + 
> type2 + ", exception: " + e + ", classLoader: " + classLoader +", attempting 
> to use the classloader of the current thread");
> 
>               classLoader = Thread.currentThread().getContextClassLoader();
>               if ( classLoader != null ) {
> 
>                       try {
>                               c = Class.forName(type1.replace('/', '.'), 
> false, classLoader);
>                               d = Class.forName(type2.replace('/', '.'), 
> false, classLoader);
>                       }
>                catch (Exception e_inner) {
>                       System.err.println("ERROR 1: type1:" + type1 + ", 
> type2: " + type2 + ", e_inner: " + e_inner + ", classLoader: " + classLoader 
> +", failed even using the classloader of the current thread");
>                       throw new RuntimeException(e_inner.toString());
>                }
>               }
>               else {
>                       System.err.println("ERROR 2: type1:" + type1 + ", 
> type2: " + type2 + ", exception: " + e + ", classLoader: " + classLoader +", 
> unable to get the classloader of the current thread");
>                       throw new RuntimeException(e.toString());
>               }
> // --- ARZILLO PATCH END 
> -----------------------------------------------------------
> 1760        }
> 1761          if (c.isAssignableFrom(d)) {
> 1762            return type1;
> 1763        }
> 1764        if (d.isAssignableFrom(c)) {
> 1765            return type2;
> 1766        }
> 1767        if (c.isInterface() || d.isInterface()) {
> 1768            return "java/lang/Object";
> 1779        } else {
> 1770            do {
> 1771                c = c.getSuperclass();
> 1772            } while (!c.isAssignableFrom(d));
> 1773            return c.getName().replace('.', '/');
> 1774        }
> 1775    }
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> For additional commands, e-mail: users-h...@tapestry.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to