[jboss-user] [Microcontainer] - Ignoring ClassLoader Roots

ALRubinger do-not-reply at jboss.com
Thu Nov 20 01:24:03 EST 2008


In doing some prototyping on AS Embedded, I've run into an issue where the bootstrap deployables in AS fail on definition of explicit roots:

<classloader name="aop-classloader" xmlns="urn:jboss:classloader:1.0" export-all="NON_EMPTY" import-all="true">
  |       <root>${jboss.lib.url}jboss-aop-asintegration-core.jar</root>
  | ...etc
  |    </classloader>

Ales kindly provided me with a NoopClassLoaderFactory:

http://anonsvn.jboss.org/repos/jbossas/projects/jboss-cl/trunk/classloading-vfs/src/test/java/org/jboss/test/classloading/vfs/metadata/xml/support/NoopClassLoaderFactory.java

...which has overridden:

@XmlTransient
  |    public List<BeanMetaData> getBeans()
  |    {
  |       return Collections.emptyList();
  |    }

Though what's needed is an implementation that won't allow "roots" to be specified, so I've rewritten this in a (as of yet uncommitted) implementation in the new jboss-embedded-core project.  This will be in SVN once I've got the proper JIRA rights to organize up and keep things documented.

Perhaps MC wants this code instead? 

/*
  |  * JBoss, Home of Professional Open Source.
  |  * Copyright 2008, Red Hat Middleware LLC, and individual contributors
  |  * as indicated by the @author tags. See the copyright.txt file in the
  |  * distribution for a full listing of individual contributors.
  |   *
  |  * This is free software; you can redistribute it and/or modify it
  |  * under the terms of the GNU Lesser General Public License as
  |  * published by the Free Software Foundation; either version 2.1 of
  |  * the License, or (at your option) any later version.
  |  *
  |  * This software is distributed in the hope that it will be useful,
  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  |  * Lesser General Public License for more details.
  |  *
  |  * You should have received a copy of the GNU Lesser General Public
  |  * License along with this software; if not, write to the Free
  |  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  |  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  |  */
  | package org.jboss.embedded.classloading;
  | 
  | import java.util.ArrayList;
  | import java.util.Collection;
  | import java.util.List;
  | 
  | import javax.xml.bind.annotation.XmlNsForm;
  | import javax.xml.bind.annotation.XmlRootElement;
  | 
  | import org.jboss.classloading.spi.vfs.metadata.VFSClassLoaderFactory;
  | import org.jboss.xb.annotations.JBossXmlSchema;
  | 
  | /**
  |  * NoOpClassLoaderFactory
  |  * 
  |  * ClassLoader Factory that will not allow roots to be added
  |  *
  |  * @author <a href="mailto:andrew.rubinger at jboss.org">ALR</a>
  |  * @version $Revision: $
  |  */
  | @JBossXmlSchema(namespace = "urn:jboss:classloader:1.0", elementFormDefault = XmlNsForm.QUALIFIED)
  | @XmlRootElement(name = "classloader")
  | public class NoOpClassLoaderFactory extends VFSClassLoaderFactory
  | {
  |    //------------------------------------------------------------------||
  |    // Class Members ---------------------------------------------------||
  |    //------------------------------------------------------------------||
  | 
  |    private static final long serialVersionUID = 1L;
  | 
  |    //------------------------------------------------------------------||
  |    // Instance Members ------------------------------------------------||
  |    //------------------------------------------------------------------||
  | 
  |    /**
  |     * Empty list which may never have contents.  Synchronization policy
  |     * on "this".
  |     */
  |    private volatile List<String> emptyList;
  | 
  |    //------------------------------------------------------------------||
  |    // Accessors / Mutators --------------------------------------------||
  |    //------------------------------------------------------------------||
  | 
  |    /**
  |     * An overridden implementation to obtain the roots for
  |     * this CL, which will always contain no elements
  |     */
  |    @Override
  |    public List<String> getRoots()
  |    {
  |       return this.getEmptyList();
  |    }
  | 
  |    //------------------------------------------------------------------||
  |    // Internal Helper Methods -----------------------------------------||
  |    //------------------------------------------------------------------||
  | 
  |    /**
  |     * Obtains an empty list (which may never become 
  |     * filled with any elements)
  |     * 
  |     * @return
  |     */
  |    private List<String> getEmptyList()
  |    {
  |       // Initialize
  |       List<String> returnValue = this.emptyList;
  | 
  |       // Check that underlying list is instanciated
  |       if (returnValue == null)
  |       {
  |          // Sync up
  |          synchronized (this)
  |          {
  |             // Double-check for instanciation
  |             if (returnValue == null)
  |             {
  |                // Create the underlying list
  |                this.emptyList = returnValue = new NoOpAdditiveList<String>();
  |             }
  |          }
  |       }
  | 
  |       // Return
  |       return returnValue;
  |    }
  | 
  |    //------------------------------------------------------------------||
  |    // Inner Classes ---------------------------------------------------||
  |    //------------------------------------------------------------------||
  | 
  |    /**
  |     * NoOpAdditiveOperationsList
  |     * 
  |     * An extension of ArrayList where the general contract 
  |     * of "Collection.add" is violated in favor of a NOOP
  |     * implementation
  |     * 
  |     * May be used in place of immutable lists when additions
  |     * should silently not take place, instead of throwing 
  |     * UnsupportedOperationException
  |     *
  |     * @author <a href="mailto:andrew.rubinger at jboss.org">ALR</a>
  |     * @version $Revision: $
  |     * @param <E>
  |     */
  |    private static class NoOpAdditiveOperationsList<E> extends ArrayList<E>
  |    {
  | 
  |       private static final long serialVersionUID = 1L;
  | 
  |       @Override
  |       public boolean add(E o)
  |       {
  |          return true;
  |       }
  | 
  |       @Override
  |       public void add(int index, E element)
  |       {
  |          return;
  |       }
  | 
  |       @Override
  |       public boolean addAll(Collection<? extends E> c)
  |       {
  |          return true;
  |       }
  | 
  |       @Override
  |       public boolean addAll(int index, Collection<? extends E> c)
  |       {
  |          return true;
  |       }
  | 
  |    }
  | 
  | }

S,
ALR


View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4190718#4190718

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4190718



More information about the jboss-user mailing list