You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomee.apache.org by Shawn Jiang <ge...@gmail.com> on 2011/04/16 16:20:32 UTC

org.apache.openejb.config.NewLoaderLogic.callers() will return abstract classes which can't pass the validation logic in org.apache.openejb.config.rules.CheckClasses.check_hasEjbClass(EnterpriseBean)

org.apache.openejb.config.NewLoaderLogic.callers() will return some callers
and then use these callers to create a new ejbmodule.

When there are abstract classes in the caller stacktrace,  the abstract
classes will also be used to create the ejbmodule.      Because
org.apache.openejb.config.rules.CheckClasses.check_hasEjbClass(EnterpriseBean)
does not allow abstract class as an EJB class.    I've seen lots of geronimo
ejb tck regression because of abstractDeclaredAsBean validation failures.
  I think the abstract classes should be filtered out from the callers in
NewLoaderLogic.callers().

>From the log,  seems this part of work is still ongoing.   Is there a better
way in plan to handle this issue ?


On Fri, Apr 8, 2011 at 9:30 AM, <db...@apache.org> wrote:

> Author: dblevins
> Date: Fri Apr  8 01:30:11 2011
> New Revision: 1090081
>
> URL: http://svn.apache.org/viewvc?rev=1090081&view=rev
> Log:
> OpenEjbContainer and DeploymentLoader logic rewrite.  Midway through.
>  Temporarily putting the very close but not quite working logic in
> NewLoaderLogic
> Some validation tweaks to print the module path in output messages
> Tweaked 'null ejbClass' logic to use the right validation message (i had
> added one when there was already one there).  Yanking the one I added.
>
> Added:
>
>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
>   (with props)
>
>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
>   (with props)
> Modified:
>
>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
>
>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
>
>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java
>
>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
>
>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
>
>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java
>
>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java
>
>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
>
>  openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
>
>  openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java
>
>  openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java
>
>  openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java
>
>  openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java
>
> Modified:
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>
> ==============================================================================
> ---
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
> (original)
> +++
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
> Fri Apr  8 01:30:11 2011
> @@ -696,7 +696,7 @@ public class Assembler extends Assembler
>                 jndiEncBuilder.setUseCrossClassLoaderRef(false);
>                 Context context =
> jndiEncBuilder.build(JndiEncBuilder.JndiScope.comp);
>
> -                Debug.printContext(context);
> +//                Debug.printContext(context);
>
>                 containerSystem.getJNDIContext().bind("openejb/client/" +
> clientInfo.moduleId, context);
>
>
> Modified:
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>
> ==============================================================================
> ---
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
> (original)
> +++
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
> Fri Apr  8 01:30:11 2011
> @@ -1069,7 +1069,7 @@ public class AnnotationDeployer implemen
>                 try {
>                     clazz = classLoader.loadClass(ejbClassName);
>                 } catch (ClassNotFoundException e) {
> -                    fail(ejbName, "xml.missingEjbClass", ejbClassName);
> +                    // Handled in CheckClasses.java along with other
> missing classes
>                     continue;
>                 }
>                 final AnnotationFinder finder = new AnnotationFinder(new
> ClassesArchive(clazz));
>
> Modified:
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>
> ==============================================================================
> ---
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java
> (original)
> +++
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java
> Fri Apr  8 01:30:11 2011
> @@ -25,6 +25,8 @@ public interface DeploymentFilterable {
>     static final String SEARCH_CLASSPATH_FOR_DEPLOYMENTS_PROPERTY =
> DEPLOYMENTS_CLASSPATH_PROPERTY;
>     static final String CLASSPATH_INCLUDE =
> "openejb.deployments.classpath.include";
>     static final String CLASSPATH_EXCLUDE =
> "openejb.deployments.classpath.exclude";
> +    static final String PACKAGE_INCLUDE =
> "openejb.deployments.package.include";
> +    static final String PACKAGE_EXCLUDE =
> "openejb.deployments.package.exclude";
>     static final String CLASSPATH_REQUIRE_DESCRIPTOR =
> RequireDescriptors.PROPERTY;
>     static final String CLASSPATH_FILTER_DESCRIPTORS =
> "openejb.deployments.classpath.filter.descriptors";
>     static final String CLASSPATH_FILTER_SYSTEMAPPS =
> "openejb.deployments.classpath.filter.systemapps";
>
> Modified:
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>
> ==============================================================================
> ---
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
> (original)
> +++
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
> Fri Apr  8 01:30:11 2011
> @@ -1269,7 +1269,7 @@ public class DeploymentLoader implements
>             }
>         }
>
> -        Class<? extends DeploymentModule> cls =
> checkAnnotations(Arrays.asList(baseUrl), classLoader,
> scanPotentialEjbModules, scanPotentialClientModules);
> +        Class<? extends DeploymentModule> cls = checkAnnotations(baseUrl,
> classLoader, scanPotentialEjbModules, scanPotentialClientModules);
>         if (cls != null) return cls;
>
>         if (descriptors.containsKey("persistence.xml")) {
> @@ -1279,7 +1279,7 @@ public class DeploymentLoader implements
>         throw new UnknownModuleTypeException("Unknown module type: url=" +
> baseUrl.toExternalForm());
>     }
>
> -    private Class<? extends DeploymentModule>
> checkAnnotations(Collection<URL> urls, ClassLoader classLoader, final
> boolean scanPotentialEjbModules, final boolean scanPotentialClientModules) {
> +    private Class<? extends DeploymentModule> checkAnnotations(URL urls,
> ClassLoader classLoader, final boolean scanPotentialEjbModules, final
> boolean scanPotentialClientModules) {
>         Class<? extends DeploymentModule> cls = null;
>         if (scanPotentialEjbModules || scanPotentialClientModules) {
>             AnnotationFinder classFinder = new
> AnnotationFinder(classLoader, urls);
>
> Modified:
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>
> ==============================================================================
> ---
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
> (original)
> +++
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
> Fri Apr  8 01:30:11 2011
> @@ -16,26 +16,26 @@
>  */
>  package org.apache.openejb.config;
>
> -import static org.apache.openejb.util.URLs.toFile;
> -
>  import org.apache.openejb.config.sys.Deployments;
>  import org.apache.openejb.config.sys.JaxbOpenejb;
>  import org.apache.openejb.loader.FileUtils;
> -import org.apache.openejb.loader.SystemInstance;
>  import org.apache.openejb.loader.Options;
> +import org.apache.openejb.loader.SystemInstance;
>  import org.apache.openejb.util.Logger;
>  import org.apache.xbean.finder.UrlSet;
>
>  import java.io.File;
>  import java.io.IOException;
> -import java.net.URL;
>  import java.net.MalformedURLException;
> +import java.net.URL;
>  import java.util.ArrayList;
>  import java.util.Collections;
> +import java.util.EnumSet;
>  import java.util.HashMap;
>  import java.util.List;
>  import java.util.Set;
> -import java.util.EnumSet;
> +
> +import static org.apache.openejb.util.URLs.toFile;
>
>  /**
>  * @version $Rev$ $Date$
> @@ -314,6 +314,7 @@ public class DeploymentsResolver impleme
>     }
>
>     private static UrlSet applyBuiltinExcludes(UrlSet urlSet) throws
> MalformedURLException {
> +
>         urlSet = urlSet.exclude(".*/activation(-[\\d.]+)?.jar(!/)?");
>         urlSet =
> urlSet.exclude(".*/activeio-core(-[\\d.]+)?(-incubator)?.jar(!/)?");
>         urlSet =
> urlSet.exclude(".*/activemq-(core|ra)(-[\\d.]+)?.jar(!/)?");
> @@ -378,7 +379,7 @@ public class DeploymentsResolver impleme
>         return urlSet;
>     }
>
> -    private static void processUrls(List<URL> urls, ClassLoader
> classLoader, Set<RequireDescriptors> requireDescriptors, FileUtils base,
> List<URL> jarList) {
> +    public static void processUrls(List<URL> urls, ClassLoader
> classLoader, Set<RequireDescriptors> requireDescriptors, FileUtils base,
> List<URL> jarList) {
>         for (URL url : urls) {
>
>             String urlProtocol = url.getProtocol();
>
> Added:
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java?rev=1090081&view=auto
>
> ==============================================================================
> ---
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
> (added)
> +++
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
> Fri Apr  8 01:30:11 2011
> @@ -0,0 +1,448 @@
> +/**
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *     http://www.apache.org/licenses/LICENSE-2.0
> + *
> + *  Unless required by applicable law or agreed to in writing, software
> + *  distributed under the License is distributed on an "AS IS" BASIS,
> + *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + *  See the License for the specific language governing permissions and
> + *  limitations under the License.
> + */
> +package org.apache.openejb.config;
> +
> +import org.apache.openejb.loader.FileUtils;
> +import org.apache.openejb.loader.Options;
> +import org.apache.openejb.loader.SystemInstance;
> +import org.apache.openejb.util.Join;
> +import org.apache.openejb.util.Logger;
> +import org.apache.openejb.util.PerformanceTimer;
> +import org.apache.openejb.util.URLs;
> +import org.apache.xbean.finder.UrlSet;
> +import org.apache.xbean.finder.archive.Archive;
> +import org.apache.xbean.finder.archive.ClasspathArchive;
> +import org.apache.xbean.finder.archive.FilteredArchive;
> +import org.apache.xbean.finder.filter.Filter;
> +import org.apache.xbean.finder.filter.Filters;
> +import org.apache.xbean.finder.filter.IncludeExcludeFilter;
> +import org.apache.xbean.finder.filter.PatternFilter;
> +
> +import java.io.File;
> +import java.io.IOException;
> +import java.net.MalformedURLException;
> +import java.net.URL;
> +import java.util.ArrayList;
> +import java.util.Arrays;
> +import java.util.Collections;
> +import java.util.EnumSet;
> +import java.util.HashSet;
> +import java.util.Iterator;
> +import java.util.LinkedHashSet;
> +import java.util.List;
> +import java.util.Set;
> +
> +/**
> +* @version $Rev$ $Date$
> +*/
> +public class NewLoaderLogic {
> +
> +    private static final Logger logger = DeploymentLoader.logger;
> +
> +    public static UrlSet filterArchives(Filter filter, ClassLoader
> classLoader, UrlSet urlSet) {
> +
> +        for (URL url : urlSet.getUrls()) {
> +            for (Archive archive : ClasspathArchive.archives(classLoader,
> url)) {
> +
> +                FilteredArchive filtered = new FilteredArchive(archive,
> filter);
> +
> +                if (!filtered.iterator().hasNext()) {
> +                    urlSet = urlSet.exclude(url);
> +                }
> +
> +            }
> +        }
> +
> +        return urlSet;
> +    }
> +
> +    public static Set<String> callers() {
> +
> +        final Set<String> callers = new LinkedHashSet<String>();
> +
> +        final List<StackTraceElement> elements = new
> ArrayList<StackTraceElement>(Arrays.asList(new
> Exception().fillInStackTrace().getStackTrace()));
> +
> +        // Yank out everything until we find a known ENTRY point
> +        // if we don't find one, so be it, this is only a convenience
> +        {
> +            // Entry points are the following:
> +            Filter start =
> Filters.classes("javax.ejb.embedded.EJBContainer",
> "javax.naming.InitialContext");
> +
> +            Iterator<StackTraceElement> iterator = elements.iterator();
> +            while (iterator.hasNext()) {
> +                StackTraceElement element = iterator.next();
> +                iterator.remove();
> +
> +                // If we haven't yet reached an entry point, just keep
> going
> +                if (!start.accept(element.getClassName())) continue;
> +
> +                // We found an entry point.
> +                // Fast-forward past this class
> +
>  while(iterator.hasNext()&&element.getClassName().equals(iterator.next().getClassName()))
> iterator.remove();
> +
> +                // Ok, we have iterated up to the calling user class, so
> stop now
> +                break;
> +            }
> +        }
> +
> +
> +        // Now iterate till we find an END point
> +        // We don't want any of the classes after that
> +        {
> +            Filter end = Filters.packages(
> +                    "junit.",
> +                    "org.junit.",
> +                    "org.testng.",
> +                    "org.apache.maven.",
> +                    "org.eclipse.",
> +                    "com.intellij."
> +            );
> +
> +            // Everything between here and the end is part
> +            // of the call chain in which we are interested
> +            Iterator<StackTraceElement> iterator = elements.iterator();
> +            while (iterator.hasNext()) {
> +                StackTraceElement element = iterator.next();
> +
> +                if (end.accept(element.getClassName())) break;
> +
> +                callers.add(element.getClassName());
> +            }
> +        }
> +
> +        // We don't need this anymore
> +        elements.clear();
> +
> +        // Finally filter out everything that we definitely don't want
> +        {
> +            Filter unwanted = Filters.packages(
> +                    "java.",
> +                    "javax.",
> +                    "sun.reflect."
> +            );
> +
> +            Iterator<String> classes = callers.iterator();
> +            while (classes.hasNext()) {
> +                if (unwanted.accept(classes.next())) classes.remove();
> +            }
> +        }
> +
> +
> +        return callers;
> +    }
> +
> +    public static UrlSet applyBuiltinExcludes(UrlSet urlSet) throws
> MalformedURLException {
> +
> +        Filter filter = Filters.prefixes(
> +                "XmlSchema-",
> +                "activeio-",
> +                "activemq-",
> +                "antlr-",
> +                "aopalliance-",
> +                "avalon-framework-",
> +                "axis-",
> +                "axis2-",
> +                "bcprov-",
> +                "bsh-",
> +                "catalina-",
> +                "cglib-",
> +                "commons-cli-",
> +                "commons-codec-",
> +                "commons-collections-",
> +                "commons-dbcp-all-1.3-",
> +                "commons-discovery-",
> +                "commons-httpclient-",
> +                "commons-io-",
> +                "commons-lang-",
> +                "commons-logging-",
> +                "commons-logging-api-",
> +                "commons-net-",
> +                "commons-pool-",
> +                "cssparser-",
> +                "cxf-",
> +                "deploy.jar",
> +                "derby-",
> +                "dom4j-",
> +                "geronimo-",
> +                "guice-",
> +                "howl-",
> +                "hsqldb-",
> +                "htmlunit-",
> +                "hibernate-",
> +                "icu4j-",
> +                "idb-",
> +                "idea_rt.jar",
> +                "jasypt-",
> +                "javaee-",
> +                "javassist-",
> +                "javaws.jar",
> +                "javax.",
> +                "jaxb-",
> +                "jaxp-",
> +                "jboss-",
> +                "jbossall-",
> +                "jbosscx-",
> +                "jbossjts-",
> +                "jbosssx-",
> +                "jcommander-",
> +                "jetty-",
> +                "jmdns-",
> +                "jsp-api-",
> +                "jsr299-",
> +                "jsr311-",
> +                "juli-",
> +                "junit-",
> +                "kahadb-",
> +                "log4j-",
> +                "logkit-",
> +                "myfaces-",
> +                "neethi-",
> +                "nekohtml-",
> +                "openjpa-",
> +                "opensaml-",
> +                "openwebbeans-",
> +                "org.eclipse.",
> +                "org.junit.",
> +                "org.osgi.core-",
> +                "quartz-",
> +                "rmock-",
> +                "saaj-",
> +                "sac-",
> +                "scannotation-",
> +                "serializer-",
> +                "serp-",
> +                "servlet-api-",
> +                "slf4j-",
> +                "spring-",
> +                "stax-api-",
> +                "swizzle-",
> +                "testng-",
> +                "wsdl4j-",
> +                "wss4j-",
> +                "wstx-asl-",
> +                "xalan-",
> +                "xbean-",
> +                "xercesImpl-",
> +                "xml-apis-",
> +                "xml-resolver-",
> +                "xmlrpc-",
> +                "xmlsec-",
> +                "xmlunit-"
> +        );
> +
> +        filter = Filters.optimize(filter, new
> PatternFilter(".*/openejb-.*"));
> +        List<URL> urls = urlSet.getUrls();
> +        Iterator<URL> iterator = urls.iterator();
> +        while (iterator.hasNext()) {
> +            URL url = iterator.next();
> +            File file = URLs.toFile(url);
> +            String name = file.getName();
> +//            System.out.println("JAR "+name);
> +            if (filter.accept(name)) iterator.remove();
> +        }
> +
> +
> +
> +        return new UrlSet(urls);
> +    }
> +
> +    public static void _loadFromClasspath(FileUtils base, List<URL>
> jarList, ClassLoader classLoader) {
> +
> +        PerformanceTimer timer = new PerformanceTimer();
> +
> +        timer.event("create filters");
> +        Options options = SystemInstance.get().getOptions();
> +        String include = "";
> +        String exclude = "";
> +        PatternFilter classpathInclude = new
> PatternFilter(options.get(DeploymentFilterable.CLASSPATH_INCLUDE, ".*"));
> +        PatternFilter classpathExclude = new
> PatternFilter(options.get(DeploymentFilterable.CLASSPATH_EXCLUDE, ""));
> +        IncludeExcludeFilter classpathFilter = new
> IncludeExcludeFilter(classpathInclude, classpathExclude);
> +
> +
> +        PatternFilter packageInclude = new
> PatternFilter(options.get(DeploymentFilterable.PACKAGE_INCLUDE, ".*"));
> +        PatternFilter packageExclude = new
> PatternFilter(options.get(DeploymentFilterable.PACKAGE_EXCLUDE, ""));
> +
> +        IncludeExcludeFilter packageFilter;
> +        if (classpathInclude.getPattern().pattern().equals(".*") &&
> packageInclude.getPattern().pattern().equals(".*")) {
> +
> +            timer.event("callers");
> +
> +            Set<String> callers = callers();
> +
> +            timer.event("parse packages");
> +
> +            callers.size();
> +
> +            Set<String> packages = new HashSet<String>();
> +            for (String caller : callers) {
> +                String[] parts = caller.split("\\.");
> +                if (parts.length > 2) {
> +                    parts = new String[]{parts[0], parts[1]};
> +                }
> +                packages.add(Join.join(".", parts));
> +            }
> +
> +            Filter includes = Filters.packages(packages.toArray(new
> String[0]));
> +
> +            packageFilter = new IncludeExcludeFilter(includes,
> packageExclude);
> +
> +        } else {
> +
> +            packageFilter = new IncludeExcludeFilter(packageInclude,
> packageExclude);
> +
> +        }
> +
> +        timer.event("urlset");
> +
> +        Set<RequireDescriptors> requireDescriptors =
> options.getAll(DeploymentFilterable.CLASSPATH_REQUIRE_DESCRIPTOR,
> RequireDescriptors.CLIENT);
> +        boolean filterDescriptors =
> options.get(DeploymentFilterable.CLASSPATH_FILTER_DESCRIPTORS, false);
> +        boolean filterSystemApps =
> options.get(DeploymentFilterable.CLASSPATH_FILTER_SYSTEMAPPS, true);
> +
> +        try {
> +            UrlSet urlSet = new UrlSet(classLoader);
> +
> +            timer.event("exclude system urls");
> +            urlSet =
> urlSet.exclude(ClassLoader.getSystemClassLoader().getParent());
> +            urlSet = urlSet.excludeJavaExtDirs();
> +            urlSet = urlSet.excludeJavaEndorsedDirs();
> +            urlSet = urlSet.excludeJavaHome();
> +            urlSet =
> urlSet.excludePaths(System.getProperty("sun.boot.class.path", ""));
> +            urlSet = urlSet.exclude(".*/JavaVM.framework/.*");
> +
> +
> +            timer.event("classpath filter");
> +
> +            UrlSet beforeFiltering = urlSet;
> +
> +            urlSet = urlSet.filter(classpathFilter);
> +
> +
> +            // If the user filtered out too much, that's a problem
> +            if (urlSet.size() == 0) {
> +                final String message = String.format("Classpath
> Include/Exclude resulted in zero URLs.  There were %s possible URLs before
> filtering and 0 after: include=\"%s\", exclude=\"%s\"",
> beforeFiltering.size(), include, exclude);
> +                logger.error(message);
> +                logger.info("Eligible Classpath before filtering:");
> +
> +                for (URL url : beforeFiltering) {
> +                    logger.info(String.format("   %s",
> url.toExternalForm()));
> +                }
> +//                throw new IllegalStateException(message);
> +
> +            }
> +
> +            // If they are the same size, than nothing was filtered
> +            // and we know the user did not take action to change the
> default
> +            final boolean userSuppliedClasspathFilter =
> beforeFiltering.size() != urlSet.size();
> +
> +            if (!userSuppliedClasspathFilter) {
> +
> +                logger.info("Applying buildin classpath excludes");
> +                timer.event("buildin excludes");
> +                urlSet = applyBuiltinExcludes(urlSet);
> +
> +            }
> +
> +            DeploymentsResolver.processUrls(urlSet.getUrls(), classLoader,
> EnumSet.allOf(RequireDescriptors.class), base, jarList);
> +
> +
> +            timer.event("package filter");
> +
> +            urlSet = filterArchives(packageFilter, classLoader, urlSet);
> +
> +            timer.event("process urls");
> +
> +            // we should exclude system apps before and apply user
> properties after
> +//            if (filterSystemApps){
> +//                urlSet =
> urlSet.exclude(".*/openejb-[^/]+(.(jar|ear|war)(!/)?|/target/(test-)?classes/?)");
> +//            }
> +
> +            List<URL> urls = urlSet.getUrls();
> +            int size = urls.size();
> +//            if (size == 0) {
> +//                logger.warning("No classpath URLs matched.  Current
> settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " + CLASSPATH_INCLUDE
> + "='" + include + "'");
> +//                return;
> +//            } else if (size == 0 && (!filterDescriptors &&
> prefiltered.getUrls().size() == 0)) {
> +//                return;
> +//            } else if (size < 20) {
> +//                logger.debug("Inspecting classpath for applications: " +
> urls.size() + " urls.");
> +//            } else {
> +//                // Has the user allowed some module types to be
> discoverable via scraping?
> +//                boolean willScrape = requireDescriptors.size() <
> RequireDescriptors.values().length;
> +//
> +//                if (size < 50 && willScrape) {
> +//                    logger.info("Inspecting classpath for applications:
> " + urls.size() + " urls. Consider adjusting your exclude/include.  Current
> settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " + CLASSPATH_INCLUDE
> + "='" + include + "'");
> +//                } else if (willScrape) {
> +//                    logger.warning("Inspecting classpath for
> applications: " + urls.size() + " urls.");
> +//                    logger.warning("ADJUST THE EXCLUDE/INCLUDE!!!.
>  Current settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " +
> CLASSPATH_INCLUDE + "='" + include + "'");
> +//                }
> +//            }
> +
> +            long begin = System.currentTimeMillis();
> +            DeploymentsResolver.processUrls(urls, classLoader,
> requireDescriptors, base, jarList);
> +            long end = System.currentTimeMillis();
> +            long time = end - begin;
> +
> +            timer.stop(System.out);
> +
> +            UrlSet unchecked = new UrlSet();
> +//            if (!filterDescriptors){
> +//                unchecked = prefiltered.exclude(urlSet);
> +//                if (filterSystemApps){
> +//                    unchecked =
> unchecked.exclude(".*/openejb-[^/]+(.(jar|ear|war)(./)?|/target/classes/?)");
> +//                }
> +                DeploymentsResolver.processUrls(unchecked.getUrls(),
> classLoader, EnumSet.allOf(RequireDescriptors.class), base, jarList);
> +//            }
> +
> +            if (logger.isDebugEnabled()) {
> +                int urlCount = urlSet.getUrls().size() +
> unchecked.getUrls().size();
> +                logger.debug("URLs after filtering: "+ urlCount);
> +                for (URL url : urlSet.getUrls()) {
> +                    logger.debug("Annotations path: " + url);
> +                }
> +                for (URL url : unchecked.getUrls()) {
> +                    logger.debug("Descriptors path: " + url);
> +                }
> +            }
> +
> +            if (urls.size() == 0) return;
> +
> +            if (time < 1000) {
> +                logger.debug("Searched " + urls.size() + " classpath urls
> in " + time + " milliseconds.  Average " + (time / urls.size()) + "
> milliseconds per url.");
> +            } else if (time < 4000 || urls.size() < 3) {
> +                logger.info("Searched " + urls.size() + " classpath urls
> in " + time + " milliseconds.  Average " + (time / urls.size()) + "
> milliseconds per url.");
> +            } else if (time < 10000) {
> +                logger.warning("Searched " + urls.size() + " classpath
> urls in " + time + " milliseconds.  Average " + (time / urls.size()) + "
> milliseconds per url.");
> +                logger.warning("Consider adjusting your " +
> DeploymentFilterable.CLASSPATH_EXCLUDE + " and " +
> DeploymentFilterable.CLASSPATH_INCLUDE + " settings.  Current settings:
> exclude='" + exclude + "', include='" + include + "'");
> +            } else {
> +                logger.fatal("Searched " + urls.size() + " classpath urls
> in " + time + " milliseconds.  Average " + (time / urls.size()) + "
> milliseconds per url.  TOO LONG!");
> +                logger.fatal("ADJUST THE EXCLUDE/INCLUDE!!!.  Current
> settings: " + DeploymentFilterable.CLASSPATH_EXCLUDE + "='" + exclude + "',
> " + DeploymentFilterable.CLASSPATH_INCLUDE + "='" + include + "'");
> +                List<String> list = new ArrayList<String>();
> +                for (URL url : urls) {
> +                    list.add(url.toExternalForm());
> +                }
> +                Collections.sort(list);
> +                for (String url : list) {
> +                    logger.info("Matched: " + url);
> +                }
> +            }
> +        } catch (IOException e1) {
> +            e1.printStackTrace();
> +            logger.warning("Unable to search classpath for modules:
> Received Exception: " + e1.getClass().getName() + " " + e1.getMessage(),
> e1);
> +        }
> +
> +    }
> +}
>
> Propchange:
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
>
> ------------------------------------------------------------------------------
>    svn:eol-style = native
>
> Modified:
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>
> ==============================================================================
> ---
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java
> (original)
> +++
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java
> Fri Apr  8 01:30:11 2011
> @@ -102,7 +102,8 @@ public class ReportValidationResults imp
>
>         if (context.hasErrors() || context.hasFailures()) {
>
> -            logger.error("Invalid
> "+context.getModuleType()+"(path="+context.getName()+")");
> +            DeploymentModule module = context.getModule();
> +            logger.error(String.format("Invalid %s(name=%s, path=%s)",
> context.getModuleType(), module.getModuleId(), module.getFile()));
>  //            logger.error("Validation: "+errors.length + " errors,
> "+failures.length+ " failures, in
> "+context.getModuleType()+"(path="+context.getJarPath()+")");
>         } else if (context.hasWarnings()) {
>             if (context.getWarnings().length == 1) {
>
> Modified:
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>
> ==============================================================================
> ---
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java
> (original)
> +++
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java
> Fri Apr  8 01:30:11 2011
> @@ -45,6 +45,10 @@ public class ValidationContext implement
>         this.name = null;
>     }
>
> +    public DeploymentModule getModule() {
> +        return module;
> +    }
> +
>     public void fail(String component, String key, Object... details) {
>         ValidationFailure failure = new ValidationFailure(key);
>         failure.setDetails(details);
>
> Modified:
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>
> ==============================================================================
> ---
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
> (original)
> +++
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
> Fri Apr  8 01:30:11 2011
> @@ -74,6 +74,9 @@ public class CheckClasses extends Valida
>             try {
>                 Class<?> beanClass = check_hasEjbClass(bean);
>
> +                // All the subsequent checks require the bean class
> +                if (beanClass == null) continue;
> +
>                 if (!(bean instanceof RemoteBean)) continue;
>                 RemoteBean b = (RemoteBean) bean;
>
> @@ -208,8 +211,10 @@ public class CheckClasses extends Valida
>
>         String ejbName = b.getEjbName();
>
> -        Class<?> beanClass = lookForClass(b.getEjbClass(), "<ejb-class>",
> ejbName);
> +        Class<?> beanClass = lookForClass(b.getEjbClass(), "ejb-class",
> ejbName);
>
> +        if (beanClass == null) return null;
> +
>         if (beanClass.isInterface()){
>             fail(ejbName, "interfaceDeclaredAsBean", beanClass.getName());
>         }
>
> Added:
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java?rev=1090081&view=auto
>
> ==============================================================================
> ---
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
> (added)
> +++
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
> Fri Apr  8 01:30:11 2011
> @@ -0,0 +1,73 @@
> +/**
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License.  You may obtain a copy of the License at
> + *
> + *     http://www.apache.org/licenses/LICENSE-2.0
> + *
> + *  Unless required by applicable law or agreed to in writing, software
> + *  distributed under the License is distributed on an "AS IS" BASIS,
> + *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + *  See the License for the specific language governing permissions and
> + *  limitations under the License.
> + */
> +package org.apache.openejb.util;
> +
> +import org.apache.openejb.config.DeploymentsResolver;
> +
> +import java.io.PrintStream;
> +import java.util.concurrent.TimeUnit;
> +
> +/**
> +* @version $Rev$ $Date$
> +*/
> +public class PerformanceTimer {
> +
> +    protected Start start;
> +    private Event event;
> +
> +    public PerformanceTimer() {
> +        event = start = new Start();
> +    }
> +
> +    public void event(String event) {
> +        this.event = new Event(this.event, event);
> +    }
> +
> +    public void stop(PrintStream out) {
> +        Event event = new Event(this.event, "stop");
> +        this.event.stop(event, out);
> +        start.stop(event, out);
> +    }
> +
> +    private class Event {
> +        protected final long start = System.nanoTime();
> +        private final Event previous;
> +        private final String description;
> +
> +        private Event(Event previous, String description) {
> +            this.previous = previous;
> +            this.description = description;
> +        }
> +
> +        public void stop(Event next, PrintStream out) {
> +            if (previous != PerformanceTimer.this.start)
> previous.stop(this, out);
> +            out.printf("%s  %s", TimeUnit.NANOSECONDS.toMillis(next.start
> - this.start), this.description);
> +            out.println();
> +        }
> +    }
> +    private class Start extends Event {
> +        private Start() {
> +            super(null, "start");
> +        }
> +
> +        @Override
> +        public void stop(Event next, PrintStream out) {
> +            out.printf("%s  %s", TimeUnit.NANOSECONDS.toMillis(next.start
> - this.start), "total");
> +            out.println();
> +        }
> +    }
> +}
>
> Propchange:
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
>
> ------------------------------------------------------------------------------
>    svn:eol-style = native
>
> Modified:
> openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties?rev=1090081&r1=1090080&r2=1090081&view=diff
>
> ==============================================================================
> ---
> openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
> (original)
> +++
> openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
> Fri Apr  8 01:30:11 2011
> @@ -46,7 +46,7 @@
>  # 1 - Element (home, ejb-class, remote)
>  # 2 - Bean name
>  1.missing.class           Missing class
> -2.missing.class           Missing class {0}
> +2.missing.class           Missing class <{1}> {0}
>  3.missing.class           The class {0} not found. Check that the class
> specified in the <{1}> element for bean {2} is spelled correctly and the
> class is present in the jar
>
>  # 0 - Class name
> @@ -860,7 +860,3 @@ public interface {0} extends {2}'{}'
>  1.xml.noEjbClass = Element <ejb-class> unspecified.
>  2.xml.noEjbClass = Element <ejb-class> unspecified.  No annotated bean
> discovered with <ejb-name>{0}</ejb-name>
>  3.xml.noEjbClass = The <ejb-class> element is only optional if there is a
> matching annotated bean in the module with the bean name {0}.  No such bean
> was found.  Other beans in this module are: {1}
> -
> -1.xml.missingEjbClass = Specified <ejb-class> not found.
> -2.xml.missingEjbClass = Specified <ejb-class> not found {0}
> -3.xml.missingEjbClass = The <ejb-class> element specifies a class that
> cannot be found.  The {0} class should be in the module with the ejb-jar.xml
> or in a shared library
>
> Modified:
> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>
> ==============================================================================
> ---
> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java
> (original)
> +++
> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java
> Fri Apr  8 01:30:11 2011
> @@ -22,6 +22,7 @@ import org.springframework.context.suppo
>
>  public class BasicSpringTest extends TestCase {
>     public void test() throws Exception {
> +
>  System.setProperty("openejb.deployments.classpath.include",".*/spring-integration.*");
>         ClassPathXmlApplicationContext context = new
> ClassPathXmlApplicationContext("org/apache/openejb/spring/test.xml");
>         assertTrue(context.getBeanDefinitionCount() > 0);
>
>
> Modified:
> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>
> ==============================================================================
> ---
> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java
> (original)
> +++
> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java
> Fri Apr  8 01:30:11 2011
> @@ -34,7 +34,10 @@ import org.springframework.context.suppo
>
>  public class SpringTest extends TestCase {
>     public void test() throws Exception {
> +
>  System.setProperty("openejb.deployments.classpath.include",".*/openejb-spring.*");
> +
>         ClassPathXmlApplicationContext context = new
> ClassPathXmlApplicationContext("org/apache/openejb/spring/spring.xml");
> +
>         assertTrue(context.getBeanDefinitionCount() > 0);
>
>         //
>
> Modified:
> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>
> ==============================================================================
> ---
> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java
> (original)
> +++
> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java
> Fri Apr  8 01:30:11 2011
> @@ -17,6 +17,7 @@
>  package org.apache.openejb;
>
>  import junit.framework.TestCase;
> +import org.apache.openejb.config.DeploymentsResolver;
>  import org.apache.openejb.server.ejbd.EjbServer;
>  import org.apache.openejb.server.ServiceDaemon;
>  import org.apache.openejb.core.ServerFederation;
> @@ -35,8 +36,7 @@ public class AuthTest extends TestCase {
>         EjbServer ejbServer = new EjbServer();
>
>         Properties initProps = new Properties();
> -        initProps.setProperty("openejb.deployments.classpath.include",
> "");
> -
>  initProps.setProperty("openejb.deployments.classpath.filter.descriptors",
> "true");
> +        initProps.put(DeploymentsResolver.DEPLOYMENTS_CLASSPATH_PROPERTY,
> Boolean.toString(false));
>         OpenEJB.init(initProps, new ServerFederation());
>         ejbServer.init(new Properties());
>
>
> Modified:
> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java
> URL:
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>
> ==============================================================================
> ---
> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java
> (original)
> +++
> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java
> Fri Apr  8 01:30:11 2011
> @@ -17,6 +17,7 @@
>  package org.apache.openejb;
>
>  import junit.framework.TestCase;
> +import org.apache.openejb.config.DeploymentsResolver;
>  import org.apache.openejb.server.ejbd.EjbServer;
>  import org.apache.openejb.server.ServiceDaemon;
>  import org.apache.openejb.core.ServerFederation;
> @@ -47,8 +48,7 @@ public class JndiTest extends TestCase {
>         EjbServer ejbServer = new EjbServer();
>
>         Properties initProps = new Properties();
> -        initProps.setProperty("openejb.deployments.classpath.include",
> "");
> -
>  initProps.setProperty("openejb.deployments.classpath.filter.descriptors",
> "true");
> +        initProps.put(DeploymentsResolver.DEPLOYMENTS_CLASSPATH_PROPERTY,
> Boolean.toString(false));
>         OpenEJB.init(initProps, new ServerFederation());
>         ejbServer.init(new Properties());
>
>
>
>


-- 
Shawn

Re: org.apache.openejb.config.NewLoaderLogic.callers() will return abstract classes which can't pass the validation logic in org.apache.openejb.config.rules.CheckClasses.check_hasEjbClass(EnterpriseBean)

Posted by Shawn Jiang <ge...@gmail.com>.
Thank you !

On Wed, Apr 20, 2011 at 11:08 PM, David Blevins <da...@gmail.com>wrote:

> Hi Shawn!
>
> Thanks for pointing this out.  I committed something that should screen out
> those invalid classes.
>
>
> -David
>
> On Apr 20, 2011, at 7:10 AM, Shawn Jiang wrote:
>
> > Hi devs,
> >
> > Any ideas on this issue ?
> >
> > On Sat, Apr 16, 2011 at 10:20 PM, Shawn Jiang <ge...@gmail.com>
> wrote:
> >
> >> org.apache.openejb.config.NewLoaderLogic.callers() will return some
> callers
> >> and then use these callers to create a new ejbmodule.
> >>
> >> When there are abstract classes in the caller stacktrace,  the abstract
> >> classes will also be used to create the ejbmodule.      Because
> >>
> org.apache.openejb.config.rules.CheckClasses.check_hasEjbClass(EnterpriseBean)
> >> does not allow abstract class as an EJB class.    I've seen lots of
> geronimo
> >> ejb tck regression because of abstractDeclaredAsBean validation
> failures.
> >>  I think the abstract classes should be filtered out from the callers in
> >> NewLoaderLogic.callers().
> >>
> >> From the log,  seems this part of work is still ongoing.   Is there a
> >> better way in plan to handle this issue ?
> >>
> >>
> >> On Fri, Apr 8, 2011 at 9:30 AM, <db...@apache.org> wrote:
> >>
> >>> Author: dblevins
> >>> Date: Fri Apr  8 01:30:11 2011
> >>> New Revision: 1090081
> >>>
> >>> URL: http://svn.apache.org/viewvc?rev=1090081&view=rev
> >>> Log:
> >>> OpenEjbContainer and DeploymentLoader logic rewrite.  Midway through.
> >>> Temporarily putting the very close but not quite working logic in
> >>> NewLoaderLogic
> >>> Some validation tweaks to print the module path in output messages
> >>> Tweaked 'null ejbClass' logic to use the right validation message (i
> had
> >>> added one when there was already one there).  Yanking the one I added.
> >>>
> >>> Added:
> >>>
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
> >>>  (with props)
> >>>
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
> >>>  (with props)
> >>> Modified:
> >>>
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
> >>>
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
> >>>
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java
> >>>
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
> >>>
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
> >>>
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java
> >>>
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java
> >>>
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
> >>>
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
> >>>
> >>>
> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java
> >>>
> >>>
> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java
> >>>
> >>>
> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java
> >>>
> >>>
> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java
> >>>
> >>> Modified:
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
> >>> URL:
> >>>
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1090081&r1=1090080&r2=1090081&view=diff
> >>>
> >>>
> ==============================================================================
> >>> ---
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
> >>> (original)
> >>> +++
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
> >>> Fri Apr  8 01:30:11 2011
> >>> @@ -696,7 +696,7 @@ public class Assembler extends Assembler
> >>>                jndiEncBuilder.setUseCrossClassLoaderRef(false);
> >>>                Context context =
> >>> jndiEncBuilder.build(JndiEncBuilder.JndiScope.comp);
> >>>
> >>> -                Debug.printContext(context);
> >>> +//                Debug.printContext(context);
> >>>
> >>>                containerSystem.getJNDIContext().bind("openejb/client/"
> +
> >>> clientInfo.moduleId, context);
> >>>
> >>>
> >>> Modified:
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
> >>> URL:
> >>>
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1090081&r1=1090080&r2=1090081&view=diff
> >>>
> >>>
> ==============================================================================
> >>> ---
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
> >>> (original)
> >>> +++
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
> >>> Fri Apr  8 01:30:11 2011
> >>> @@ -1069,7 +1069,7 @@ public class AnnotationDeployer implemen
> >>>                try {
> >>>                    clazz = classLoader.loadClass(ejbClassName);
> >>>                } catch (ClassNotFoundException e) {
> >>> -                    fail(ejbName, "xml.missingEjbClass",
> ejbClassName);
> >>> +                    // Handled in CheckClasses.java along with other
> >>> missing classes
> >>>                    continue;
> >>>                }
> >>>                final AnnotationFinder finder = new AnnotationFinder(new
> >>> ClassesArchive(clazz));
> >>>
> >>> Modified:
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java
> >>> URL:
> >>>
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java?rev=1090081&r1=1090080&r2=1090081&view=diff
> >>>
> >>>
> ==============================================================================
> >>> ---
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java
> >>> (original)
> >>> +++
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java
> >>> Fri Apr  8 01:30:11 2011
> >>> @@ -25,6 +25,8 @@ public interface DeploymentFilterable {
> >>>    static final String SEARCH_CLASSPATH_FOR_DEPLOYMENTS_PROPERTY =
> >>> DEPLOYMENTS_CLASSPATH_PROPERTY;
> >>>    static final String CLASSPATH_INCLUDE =
> >>> "openejb.deployments.classpath.include";
> >>>    static final String CLASSPATH_EXCLUDE =
> >>> "openejb.deployments.classpath.exclude";
> >>> +    static final String PACKAGE_INCLUDE =
> >>> "openejb.deployments.package.include";
> >>> +    static final String PACKAGE_EXCLUDE =
> >>> "openejb.deployments.package.exclude";
> >>>    static final String CLASSPATH_REQUIRE_DESCRIPTOR =
> >>> RequireDescriptors.PROPERTY;
> >>>    static final String CLASSPATH_FILTER_DESCRIPTORS =
> >>> "openejb.deployments.classpath.filter.descriptors";
> >>>    static final String CLASSPATH_FILTER_SYSTEMAPPS =
> >>> "openejb.deployments.classpath.filter.systemapps";
> >>>
> >>> Modified:
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
> >>> URL:
> >>>
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1090081&r1=1090080&r2=1090081&view=diff
> >>>
> >>>
> ==============================================================================
> >>> ---
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
> >>> (original)
> >>> +++
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
> >>> Fri Apr  8 01:30:11 2011
> >>> @@ -1269,7 +1269,7 @@ public class DeploymentLoader implements
> >>>            }
> >>>        }
> >>>
> >>> -        Class<? extends DeploymentModule> cls =
> >>> checkAnnotations(Arrays.asList(baseUrl), classLoader,
> >>> scanPotentialEjbModules, scanPotentialClientModules);
> >>> +        Class<? extends DeploymentModule> cls =
> checkAnnotations(baseUrl,
> >>> classLoader, scanPotentialEjbModules, scanPotentialClientModules);
> >>>        if (cls != null) return cls;
> >>>
> >>>        if (descriptors.containsKey("persistence.xml")) {
> >>> @@ -1279,7 +1279,7 @@ public class DeploymentLoader implements
> >>>        throw new UnknownModuleTypeException("Unknown module type: url="
> +
> >>> baseUrl.toExternalForm());
> >>>    }
> >>>
> >>> -    private Class<? extends DeploymentModule>
> >>> checkAnnotations(Collection<URL> urls, ClassLoader classLoader, final
> >>> boolean scanPotentialEjbModules, final boolean
> scanPotentialClientModules) {
> >>> +    private Class<? extends DeploymentModule> checkAnnotations(URL
> urls,
> >>> ClassLoader classLoader, final boolean scanPotentialEjbModules, final
> >>> boolean scanPotentialClientModules) {
> >>>        Class<? extends DeploymentModule> cls = null;
> >>>        if (scanPotentialEjbModules || scanPotentialClientModules) {
> >>>            AnnotationFinder classFinder = new
> >>> AnnotationFinder(classLoader, urls);
> >>>
> >>> Modified:
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
> >>> URL:
> >>>
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java?rev=1090081&r1=1090080&r2=1090081&view=diff
> >>>
> >>>
> ==============================================================================
> >>> ---
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
> >>> (original)
> >>> +++
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
> >>> Fri Apr  8 01:30:11 2011
> >>> @@ -16,26 +16,26 @@
> >>> */
> >>> package org.apache.openejb.config;
> >>>
> >>> -import static org.apache.openejb.util.URLs.toFile;
> >>> -
> >>> import org.apache.openejb.config.sys.Deployments;
> >>> import org.apache.openejb.config.sys.JaxbOpenejb;
> >>> import org.apache.openejb.loader.FileUtils;
> >>> -import org.apache.openejb.loader.SystemInstance;
> >>> import org.apache.openejb.loader.Options;
> >>> +import org.apache.openejb.loader.SystemInstance;
> >>> import org.apache.openejb.util.Logger;
> >>> import org.apache.xbean.finder.UrlSet;
> >>>
> >>> import java.io.File;
> >>> import java.io.IOException;
> >>> -import java.net.URL;
> >>> import java.net.MalformedURLException;
> >>> +import java.net.URL;
> >>> import java.util.ArrayList;
> >>> import java.util.Collections;
> >>> +import java.util.EnumSet;
> >>> import java.util.HashMap;
> >>> import java.util.List;
> >>> import java.util.Set;
> >>> -import java.util.EnumSet;
> >>> +
> >>> +import static org.apache.openejb.util.URLs.toFile;
> >>>
> >>> /**
> >>> * @version $Rev$ $Date$
> >>> @@ -314,6 +314,7 @@ public class DeploymentsResolver impleme
> >>>    }
> >>>
> >>>    private static UrlSet applyBuiltinExcludes(UrlSet urlSet) throws
> >>> MalformedURLException {
> >>> +
> >>>        urlSet = urlSet.exclude(".*/activation(-[\\d.]+)?.jar(!/)?");
> >>>        urlSet =
> >>> urlSet.exclude(".*/activeio-core(-[\\d.]+)?(-incubator)?.jar(!/)?");
> >>>        urlSet =
> >>> urlSet.exclude(".*/activemq-(core|ra)(-[\\d.]+)?.jar(!/)?");
> >>> @@ -378,7 +379,7 @@ public class DeploymentsResolver impleme
> >>>        return urlSet;
> >>>    }
> >>>
> >>> -    private static void processUrls(List<URL> urls, ClassLoader
> >>> classLoader, Set<RequireDescriptors> requireDescriptors, FileUtils
> base,
> >>> List<URL> jarList) {
> >>> +    public static void processUrls(List<URL> urls, ClassLoader
> >>> classLoader, Set<RequireDescriptors> requireDescriptors, FileUtils
> base,
> >>> List<URL> jarList) {
> >>>        for (URL url : urls) {
> >>>
> >>>            String urlProtocol = url.getProtocol();
> >>>
> >>> Added:
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
> >>> URL:
> >>>
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java?rev=1090081&view=auto
> >>>
> >>>
> ==============================================================================
> >>> ---
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
> >>> (added)
> >>> +++
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
> >>> Fri Apr  8 01:30:11 2011
> >>> @@ -0,0 +1,448 @@
> >>> +/**
> >>> + * Licensed to the Apache Software Foundation (ASF) under one or more
> >>> + * contributor license agreements.  See the NOTICE file distributed
> with
> >>> + * this work for additional information regarding copyright ownership.
> >>> + * The ASF licenses this file to You under the Apache License, Version
> >>> 2.0
> >>> + * (the "License"); you may not use this file except in compliance
> with
> >>> + * the License.  You may obtain a copy of the License at
> >>> + *
> >>> + *     http://www.apache.org/licenses/LICENSE-2.0
> >>> + *
> >>> + *  Unless required by applicable law or agreed to in writing,
> software
> >>> + *  distributed under the License is distributed on an "AS IS" BASIS,
> >>> + *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> >>> implied.
> >>> + *  See the License for the specific language governing permissions
> and
> >>> + *  limitations under the License.
> >>> + */
> >>> +package org.apache.openejb.config;
> >>> +
> >>> +import org.apache.openejb.loader.FileUtils;
> >>> +import org.apache.openejb.loader.Options;
> >>> +import org.apache.openejb.loader.SystemInstance;
> >>> +import org.apache.openejb.util.Join;
> >>> +import org.apache.openejb.util.Logger;
> >>> +import org.apache.openejb.util.PerformanceTimer;
> >>> +import org.apache.openejb.util.URLs;
> >>> +import org.apache.xbean.finder.UrlSet;
> >>> +import org.apache.xbean.finder.archive.Archive;
> >>> +import org.apache.xbean.finder.archive.ClasspathArchive;
> >>> +import org.apache.xbean.finder.archive.FilteredArchive;
> >>> +import org.apache.xbean.finder.filter.Filter;
> >>> +import org.apache.xbean.finder.filter.Filters;
> >>> +import org.apache.xbean.finder.filter.IncludeExcludeFilter;
> >>> +import org.apache.xbean.finder.filter.PatternFilter;
> >>> +
> >>> +import java.io.File;
> >>> +import java.io.IOException;
> >>> +import java.net.MalformedURLException;
> >>> +import java.net.URL;
> >>> +import java.util.ArrayList;
> >>> +import java.util.Arrays;
> >>> +import java.util.Collections;
> >>> +import java.util.EnumSet;
> >>> +import java.util.HashSet;
> >>> +import java.util.Iterator;
> >>> +import java.util.LinkedHashSet;
> >>> +import java.util.List;
> >>> +import java.util.Set;
> >>> +
> >>> +/**
> >>> +* @version $Rev$ $Date$
> >>> +*/
> >>> +public class NewLoaderLogic {
> >>> +
> >>> +    private static final Logger logger = DeploymentLoader.logger;
> >>> +
> >>> +    public static UrlSet filterArchives(Filter filter, ClassLoader
> >>> classLoader, UrlSet urlSet) {
> >>> +
> >>> +        for (URL url : urlSet.getUrls()) {
> >>> +            for (Archive archive :
> ClasspathArchive.archives(classLoader,
> >>> url)) {
> >>> +
> >>> +                FilteredArchive filtered = new
> FilteredArchive(archive,
> >>> filter);
> >>> +
> >>> +                if (!filtered.iterator().hasNext()) {
> >>> +                    urlSet = urlSet.exclude(url);
> >>> +                }
> >>> +
> >>> +            }
> >>> +        }
> >>> +
> >>> +        return urlSet;
> >>> +    }
> >>> +
> >>> +    public static Set<String> callers() {
> >>> +
> >>> +        final Set<String> callers = new LinkedHashSet<String>();
> >>> +
> >>> +        final List<StackTraceElement> elements = new
> >>> ArrayList<StackTraceElement>(Arrays.asList(new
> >>> Exception().fillInStackTrace().getStackTrace()));
> >>> +
> >>> +        // Yank out everything until we find a known ENTRY point
> >>> +        // if we don't find one, so be it, this is only a convenience
> >>> +        {
> >>> +            // Entry points are the following:
> >>> +            Filter start =
> >>> Filters.classes("javax.ejb.embedded.EJBContainer",
> >>> "javax.naming.InitialContext");
> >>> +
> >>> +            Iterator<StackTraceElement> iterator =
> elements.iterator();
> >>> +            while (iterator.hasNext()) {
> >>> +                StackTraceElement element = iterator.next();
> >>> +                iterator.remove();
> >>> +
> >>> +                // If we haven't yet reached an entry point, just keep
> >>> going
> >>> +                if (!start.accept(element.getClassName())) continue;
> >>> +
> >>> +                // We found an entry point.
> >>> +                // Fast-forward past this class
> >>> +
> >>>
> while(iterator.hasNext()&&element.getClassName().equals(iterator.next().getClassName()))
> >>> iterator.remove();
> >>> +
> >>> +                // Ok, we have iterated up to the calling user class,
> so
> >>> stop now
> >>> +                break;
> >>> +            }
> >>> +        }
> >>> +
> >>> +
> >>> +        // Now iterate till we find an END point
> >>> +        // We don't want any of the classes after that
> >>> +        {
> >>> +            Filter end = Filters.packages(
> >>> +                    "junit.",
> >>> +                    "org.junit.",
> >>> +                    "org.testng.",
> >>> +                    "org.apache.maven.",
> >>> +                    "org.eclipse.",
> >>> +                    "com.intellij."
> >>> +            );
> >>> +
> >>> +            // Everything between here and the end is part
> >>> +            // of the call chain in which we are interested
> >>> +            Iterator<StackTraceElement> iterator =
> elements.iterator();
> >>> +            while (iterator.hasNext()) {
> >>> +                StackTraceElement element = iterator.next();
> >>> +
> >>> +                if (end.accept(element.getClassName())) break;
> >>> +
> >>> +                callers.add(element.getClassName());
> >>> +            }
> >>> +        }
> >>> +
> >>> +        // We don't need this anymore
> >>> +        elements.clear();
> >>> +
> >>> +        // Finally filter out everything that we definitely don't want
> >>> +        {
> >>> +            Filter unwanted = Filters.packages(
> >>> +                    "java.",
> >>> +                    "javax.",
> >>> +                    "sun.reflect."
> >>> +            );
> >>> +
> >>> +            Iterator<String> classes = callers.iterator();
> >>> +            while (classes.hasNext()) {
> >>> +                if (unwanted.accept(classes.next())) classes.remove();
> >>> +            }
> >>> +        }
> >>> +
> >>> +
> >>> +        return callers;
> >>> +    }
> >>> +
> >>> +    public static UrlSet applyBuiltinExcludes(UrlSet urlSet) throws
> >>> MalformedURLException {
> >>> +
> >>> +        Filter filter = Filters.prefixes(
> >>> +                "XmlSchema-",
> >>> +                "activeio-",
> >>> +                "activemq-",
> >>> +                "antlr-",
> >>> +                "aopalliance-",
> >>> +                "avalon-framework-",
> >>> +                "axis-",
> >>> +                "axis2-",
> >>> +                "bcprov-",
> >>> +                "bsh-",
> >>> +                "catalina-",
> >>> +                "cglib-",
> >>> +                "commons-cli-",
> >>> +                "commons-codec-",
> >>> +                "commons-collections-",
> >>> +                "commons-dbcp-all-1.3-",
> >>> +                "commons-discovery-",
> >>> +                "commons-httpclient-",
> >>> +                "commons-io-",
> >>> +                "commons-lang-",
> >>> +                "commons-logging-",
> >>> +                "commons-logging-api-",
> >>> +                "commons-net-",
> >>> +                "commons-pool-",
> >>> +                "cssparser-",
> >>> +                "cxf-",
> >>> +                "deploy.jar",
> >>> +                "derby-",
> >>> +                "dom4j-",
> >>> +                "geronimo-",
> >>> +                "guice-",
> >>> +                "howl-",
> >>> +                "hsqldb-",
> >>> +                "htmlunit-",
> >>> +                "hibernate-",
> >>> +                "icu4j-",
> >>> +                "idb-",
> >>> +                "idea_rt.jar",
> >>> +                "jasypt-",
> >>> +                "javaee-",
> >>> +                "javassist-",
> >>> +                "javaws.jar",
> >>> +                "javax.",
> >>> +                "jaxb-",
> >>> +                "jaxp-",
> >>> +                "jboss-",
> >>> +                "jbossall-",
> >>> +                "jbosscx-",
> >>> +                "jbossjts-",
> >>> +                "jbosssx-",
> >>> +                "jcommander-",
> >>> +                "jetty-",
> >>> +                "jmdns-",
> >>> +                "jsp-api-",
> >>> +                "jsr299-",
> >>> +                "jsr311-",
> >>> +                "juli-",
> >>> +                "junit-",
> >>> +                "kahadb-",
> >>> +                "log4j-",
> >>> +                "logkit-",
> >>> +                "myfaces-",
> >>> +                "neethi-",
> >>> +                "nekohtml-",
> >>> +                "openjpa-",
> >>> +                "opensaml-",
> >>> +                "openwebbeans-",
> >>> +                "org.eclipse.",
> >>> +                "org.junit.",
> >>> +                "org.osgi.core-",
> >>> +                "quartz-",
> >>> +                "rmock-",
> >>> +                "saaj-",
> >>> +                "sac-",
> >>> +                "scannotation-",
> >>> +                "serializer-",
> >>> +                "serp-",
> >>> +                "servlet-api-",
> >>> +                "slf4j-",
> >>> +                "spring-",
> >>> +                "stax-api-",
> >>> +                "swizzle-",
> >>> +                "testng-",
> >>> +                "wsdl4j-",
> >>> +                "wss4j-",
> >>> +                "wstx-asl-",
> >>> +                "xalan-",
> >>> +                "xbean-",
> >>> +                "xercesImpl-",
> >>> +                "xml-apis-",
> >>> +                "xml-resolver-",
> >>> +                "xmlrpc-",
> >>> +                "xmlsec-",
> >>> +                "xmlunit-"
> >>> +        );
> >>> +
> >>> +        filter = Filters.optimize(filter, new
> >>> PatternFilter(".*/openejb-.*"));
> >>> +        List<URL> urls = urlSet.getUrls();
> >>> +        Iterator<URL> iterator = urls.iterator();
> >>> +        while (iterator.hasNext()) {
> >>> +            URL url = iterator.next();
> >>> +            File file = URLs.toFile(url);
> >>> +            String name = file.getName();
> >>> +//            System.out.println("JAR "+name);
> >>> +            if (filter.accept(name)) iterator.remove();
> >>> +        }
> >>> +
> >>> +
> >>> +
> >>> +        return new UrlSet(urls);
> >>> +    }
> >>> +
> >>> +    public static void _loadFromClasspath(FileUtils base, List<URL>
> >>> jarList, ClassLoader classLoader) {
> >>> +
> >>> +        PerformanceTimer timer = new PerformanceTimer();
> >>> +
> >>> +        timer.event("create filters");
> >>> +        Options options = SystemInstance.get().getOptions();
> >>> +        String include = "";
> >>> +        String exclude = "";
> >>> +        PatternFilter classpathInclude = new
> >>> PatternFilter(options.get(DeploymentFilterable.CLASSPATH_INCLUDE,
> ".*"));
> >>> +        PatternFilter classpathExclude = new
> >>> PatternFilter(options.get(DeploymentFilterable.CLASSPATH_EXCLUDE, ""));
> >>> +        IncludeExcludeFilter classpathFilter = new
> >>> IncludeExcludeFilter(classpathInclude, classpathExclude);
> >>> +
> >>> +
> >>> +        PatternFilter packageInclude = new
> >>> PatternFilter(options.get(DeploymentFilterable.PACKAGE_INCLUDE, ".*"));
> >>> +        PatternFilter packageExclude = new
> >>> PatternFilter(options.get(DeploymentFilterable.PACKAGE_EXCLUDE, ""));
> >>> +
> >>> +        IncludeExcludeFilter packageFilter;
> >>> +        if (classpathInclude.getPattern().pattern().equals(".*") &&
> >>> packageInclude.getPattern().pattern().equals(".*")) {
> >>> +
> >>> +            timer.event("callers");
> >>> +
> >>> +            Set<String> callers = callers();
> >>> +
> >>> +            timer.event("parse packages");
> >>> +
> >>> +            callers.size();
> >>> +
> >>> +            Set<String> packages = new HashSet<String>();
> >>> +            for (String caller : callers) {
> >>> +                String[] parts = caller.split("\\.");
> >>> +                if (parts.length > 2) {
> >>> +                    parts = new String[]{parts[0], parts[1]};
> >>> +                }
> >>> +                packages.add(Join.join(".", parts));
> >>> +            }
> >>> +
> >>> +            Filter includes = Filters.packages(packages.toArray(new
> >>> String[0]));
> >>> +
> >>> +            packageFilter = new IncludeExcludeFilter(includes,
> >>> packageExclude);
> >>> +
> >>> +        } else {
> >>> +
> >>> +            packageFilter = new IncludeExcludeFilter(packageInclude,
> >>> packageExclude);
> >>> +
> >>> +        }
> >>> +
> >>> +        timer.event("urlset");
> >>> +
> >>> +        Set<RequireDescriptors> requireDescriptors =
> >>> options.getAll(DeploymentFilterable.CLASSPATH_REQUIRE_DESCRIPTOR,
> >>> RequireDescriptors.CLIENT);
> >>> +        boolean filterDescriptors =
> >>> options.get(DeploymentFilterable.CLASSPATH_FILTER_DESCRIPTORS, false);
> >>> +        boolean filterSystemApps =
> >>> options.get(DeploymentFilterable.CLASSPATH_FILTER_SYSTEMAPPS, true);
> >>> +
> >>> +        try {
> >>> +            UrlSet urlSet = new UrlSet(classLoader);
> >>> +
> >>> +            timer.event("exclude system urls");
> >>> +            urlSet =
> >>> urlSet.exclude(ClassLoader.getSystemClassLoader().getParent());
> >>> +            urlSet = urlSet.excludeJavaExtDirs();
> >>> +            urlSet = urlSet.excludeJavaEndorsedDirs();
> >>> +            urlSet = urlSet.excludeJavaHome();
> >>> +            urlSet =
> >>> urlSet.excludePaths(System.getProperty("sun.boot.class.path", ""));
> >>> +            urlSet = urlSet.exclude(".*/JavaVM.framework/.*");
> >>> +
> >>> +
> >>> +            timer.event("classpath filter");
> >>> +
> >>> +            UrlSet beforeFiltering = urlSet;
> >>> +
> >>> +            urlSet = urlSet.filter(classpathFilter);
> >>> +
> >>> +
> >>> +            // If the user filtered out too much, that's a problem
> >>> +            if (urlSet.size() == 0) {
> >>> +                final String message = String.format("Classpath
> >>> Include/Exclude resulted in zero URLs.  There were %s possible URLs
> before
> >>> filtering and 0 after: include=\"%s\", exclude=\"%s\"",
> >>> beforeFiltering.size(), include, exclude);
> >>> +                logger.error(message);
> >>> +                logger.info("Eligible Classpath before filtering:");
> >>> +
> >>> +                for (URL url : beforeFiltering) {
> >>> +                    logger.info(String.format("   %s",
> >>> url.toExternalForm()));
> >>> +                }
> >>> +//                throw new IllegalStateException(message);
> >>> +
> >>> +            }
> >>> +
> >>> +            // If they are the same size, than nothing was filtered
> >>> +            // and we know the user did not take action to change the
> >>> default
> >>> +            final boolean userSuppliedClasspathFilter =
> >>> beforeFiltering.size() != urlSet.size();
> >>> +
> >>> +            if (!userSuppliedClasspathFilter) {
> >>> +
> >>> +                logger.info("Applying buildin classpath excludes");
> >>> +                timer.event("buildin excludes");
> >>> +                urlSet = applyBuiltinExcludes(urlSet);
> >>> +
> >>> +            }
> >>> +
> >>> +            DeploymentsResolver.processUrls(urlSet.getUrls(),
> >>> classLoader, EnumSet.allOf(RequireDescriptors.class), base, jarList);
> >>> +
> >>> +
> >>> +            timer.event("package filter");
> >>> +
> >>> +            urlSet = filterArchives(packageFilter, classLoader,
> urlSet);
> >>> +
> >>> +            timer.event("process urls");
> >>> +
> >>> +            // we should exclude system apps before and apply user
> >>> properties after
> >>> +//            if (filterSystemApps){
> >>> +//                urlSet =
> >>>
> urlSet.exclude(".*/openejb-[^/]+(.(jar|ear|war)(!/)?|/target/(test-)?classes/?)");
> >>> +//            }
> >>> +
> >>> +            List<URL> urls = urlSet.getUrls();
> >>> +            int size = urls.size();
> >>> +//            if (size == 0) {
> >>> +//                logger.warning("No classpath URLs matched.  Current
> >>> settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " +
> CLASSPATH_INCLUDE
> >>> + "='" + include + "'");
> >>> +//                return;
> >>> +//            } else if (size == 0 && (!filterDescriptors &&
> >>> prefiltered.getUrls().size() == 0)) {
> >>> +//                return;
> >>> +//            } else if (size < 20) {
> >>> +//                logger.debug("Inspecting classpath for applications:
> "
> >>> + urls.size() + " urls.");
> >>> +//            } else {
> >>> +//                // Has the user allowed some module types to be
> >>> discoverable via scraping?
> >>> +//                boolean willScrape = requireDescriptors.size() <
> >>> RequireDescriptors.values().length;
> >>> +//
> >>> +//                if (size < 50 && willScrape) {
> >>> +//                    logger.info("Inspecting classpath for
> >>> applications: " + urls.size() + " urls. Consider adjusting your
> >>> exclude/include.  Current settings: " + CLASSPATH_EXCLUDE + "='" +
> exclude +
> >>> "', " + CLASSPATH_INCLUDE + "='" + include + "'");
> >>> +//                } else if (willScrape) {
> >>> +//                    logger.warning("Inspecting classpath for
> >>> applications: " + urls.size() + " urls.");
> >>> +//                    logger.warning("ADJUST THE EXCLUDE/INCLUDE!!!.
> >>> Current settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " +
> >>> CLASSPATH_INCLUDE + "='" + include + "'");
> >>> +//                }
> >>> +//            }
> >>> +
> >>> +            long begin = System.currentTimeMillis();
> >>> +            DeploymentsResolver.processUrls(urls, classLoader,
> >>> requireDescriptors, base, jarList);
> >>> +            long end = System.currentTimeMillis();
> >>> +            long time = end - begin;
> >>> +
> >>> +            timer.stop(System.out);
> >>> +
> >>> +            UrlSet unchecked = new UrlSet();
> >>> +//            if (!filterDescriptors){
> >>> +//                unchecked = prefiltered.exclude(urlSet);
> >>> +//                if (filterSystemApps){
> >>> +//                    unchecked =
> >>>
> unchecked.exclude(".*/openejb-[^/]+(.(jar|ear|war)(./)?|/target/classes/?)");
> >>> +//                }
> >>> +                DeploymentsResolver.processUrls(unchecked.getUrls(),
> >>> classLoader, EnumSet.allOf(RequireDescriptors.class), base, jarList);
> >>> +//            }
> >>> +
> >>> +            if (logger.isDebugEnabled()) {
> >>> +                int urlCount = urlSet.getUrls().size() +
> >>> unchecked.getUrls().size();
> >>> +                logger.debug("URLs after filtering: "+ urlCount);
> >>> +                for (URL url : urlSet.getUrls()) {
> >>> +                    logger.debug("Annotations path: " + url);
> >>> +                }
> >>> +                for (URL url : unchecked.getUrls()) {
> >>> +                    logger.debug("Descriptors path: " + url);
> >>> +                }
> >>> +            }
> >>> +
> >>> +            if (urls.size() == 0) return;
> >>> +
> >>> +            if (time < 1000) {
> >>> +                logger.debug("Searched " + urls.size() + " classpath
> urls
> >>> in " + time + " milliseconds.  Average " + (time / urls.size()) + "
> >>> milliseconds per url.");
> >>> +            } else if (time < 4000 || urls.size() < 3) {
> >>> +                logger.info("Searched " + urls.size() + " classpath
> urls
> >>> in " + time + " milliseconds.  Average " + (time / urls.size()) + "
> >>> milliseconds per url.");
> >>> +            } else if (time < 10000) {
> >>> +                logger.warning("Searched " + urls.size() + " classpath
> >>> urls in " + time + " milliseconds.  Average " + (time / urls.size()) +
> "
> >>> milliseconds per url.");
> >>> +                logger.warning("Consider adjusting your " +
> >>> DeploymentFilterable.CLASSPATH_EXCLUDE + " and " +
> >>> DeploymentFilterable.CLASSPATH_INCLUDE + " settings.  Current settings:
> >>> exclude='" + exclude + "', include='" + include + "'");
> >>> +            } else {
> >>> +                logger.fatal("Searched " + urls.size() + " classpath
> urls
> >>> in " + time + " milliseconds.  Average " + (time / urls.size()) + "
> >>> milliseconds per url.  TOO LONG!");
> >>> +                logger.fatal("ADJUST THE EXCLUDE/INCLUDE!!!.  Current
> >>> settings: " + DeploymentFilterable.CLASSPATH_EXCLUDE + "='" + exclude +
> "',
> >>> " + DeploymentFilterable.CLASSPATH_INCLUDE + "='" + include + "'");
> >>> +                List<String> list = new ArrayList<String>();
> >>> +                for (URL url : urls) {
> >>> +                    list.add(url.toExternalForm());
> >>> +                }
> >>> +                Collections.sort(list);
> >>> +                for (String url : list) {
> >>> +                    logger.info("Matched: " + url);
> >>> +                }
> >>> +            }
> >>> +        } catch (IOException e1) {
> >>> +            e1.printStackTrace();
> >>> +            logger.warning("Unable to search classpath for modules:
> >>> Received Exception: " + e1.getClass().getName() + " " +
> e1.getMessage(),
> >>> e1);
> >>> +        }
> >>> +
> >>> +    }
> >>> +}
> >>>
> >>> Propchange:
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
> >>>
> >>>
> ------------------------------------------------------------------------------
> >>>   svn:eol-style = native
> >>>
> >>> Modified:
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java
> >>> URL:
> >>>
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java?rev=1090081&r1=1090080&r2=1090081&view=diff
> >>>
> >>>
> ==============================================================================
> >>> ---
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java
> >>> (original)
> >>> +++
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java
> >>> Fri Apr  8 01:30:11 2011
> >>> @@ -102,7 +102,8 @@ public class ReportValidationResults imp
> >>>
> >>>        if (context.hasErrors() || context.hasFailures()) {
> >>>
> >>> -            logger.error("Invalid
> >>> "+context.getModuleType()+"(path="+context.getName()+")");
> >>> +            DeploymentModule module = context.getModule();
> >>> +            logger.error(String.format("Invalid %s(name=%s, path=%s)",
> >>> context.getModuleType(), module.getModuleId(), module.getFile()));
> >>> //            logger.error("Validation: "+errors.length + " errors,
> >>> "+failures.length+ " failures, in
> >>> "+context.getModuleType()+"(path="+context.getJarPath()+")");
> >>>        } else if (context.hasWarnings()) {
> >>>            if (context.getWarnings().length == 1) {
> >>>
> >>> Modified:
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java
> >>> URL:
> >>>
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java?rev=1090081&r1=1090080&r2=1090081&view=diff
> >>>
> >>>
> ==============================================================================
> >>> ---
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java
> >>> (original)
> >>> +++
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java
> >>> Fri Apr  8 01:30:11 2011
> >>> @@ -45,6 +45,10 @@ public class ValidationContext implement
> >>>        this.name = null;
> >>>    }
> >>>
> >>> +    public DeploymentModule getModule() {
> >>> +        return module;
> >>> +    }
> >>> +
> >>>    public void fail(String component, String key, Object... details) {
> >>>        ValidationFailure failure = new ValidationFailure(key);
> >>>        failure.setDetails(details);
> >>>
> >>> Modified:
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
> >>> URL:
> >>>
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java?rev=1090081&r1=1090080&r2=1090081&view=diff
> >>>
> >>>
> ==============================================================================
> >>> ---
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
> >>> (original)
> >>> +++
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
> >>> Fri Apr  8 01:30:11 2011
> >>> @@ -74,6 +74,9 @@ public class CheckClasses extends Valida
> >>>            try {
> >>>                Class<?> beanClass = check_hasEjbClass(bean);
> >>>
> >>> +                // All the subsequent checks require the bean class
> >>> +                if (beanClass == null) continue;
> >>> +
> >>>                if (!(bean instanceof RemoteBean)) continue;
> >>>                RemoteBean b = (RemoteBean) bean;
> >>>
> >>> @@ -208,8 +211,10 @@ public class CheckClasses extends Valida
> >>>
> >>>        String ejbName = b.getEjbName();
> >>>
> >>> -        Class<?> beanClass = lookForClass(b.getEjbClass(),
> "<ejb-class>",
> >>> ejbName);
> >>> +        Class<?> beanClass = lookForClass(b.getEjbClass(),
> "ejb-class",
> >>> ejbName);
> >>>
> >>> +        if (beanClass == null) return null;
> >>> +
> >>>        if (beanClass.isInterface()){
> >>>            fail(ejbName, "interfaceDeclaredAsBean",
> beanClass.getName());
> >>>        }
> >>>
> >>> Added:
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
> >>> URL:
> >>>
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java?rev=1090081&view=auto
> >>>
> >>>
> ==============================================================================
> >>> ---
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
> >>> (added)
> >>> +++
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
> >>> Fri Apr  8 01:30:11 2011
> >>> @@ -0,0 +1,73 @@
> >>> +/**
> >>> + * Licensed to the Apache Software Foundation (ASF) under one or more
> >>> + * contributor license agreements.  See the NOTICE file distributed
> with
> >>> + * this work for additional information regarding copyright ownership.
> >>> + * The ASF licenses this file to You under the Apache License, Version
> >>> 2.0
> >>> + * (the "License"); you may not use this file except in compliance
> with
> >>> + * the License.  You may obtain a copy of the License at
> >>> + *
> >>> + *     http://www.apache.org/licenses/LICENSE-2.0
> >>> + *
> >>> + *  Unless required by applicable law or agreed to in writing,
> software
> >>> + *  distributed under the License is distributed on an "AS IS" BASIS,
> >>> + *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> >>> implied.
> >>> + *  See the License for the specific language governing permissions
> and
> >>> + *  limitations under the License.
> >>> + */
> >>> +package org.apache.openejb.util;
> >>> +
> >>> +import org.apache.openejb.config.DeploymentsResolver;
> >>> +
> >>> +import java.io.PrintStream;
> >>> +import java.util.concurrent.TimeUnit;
> >>> +
> >>> +/**
> >>> +* @version $Rev$ $Date$
> >>> +*/
> >>> +public class PerformanceTimer {
> >>> +
> >>> +    protected Start start;
> >>> +    private Event event;
> >>> +
> >>> +    public PerformanceTimer() {
> >>> +        event = start = new Start();
> >>> +    }
> >>> +
> >>> +    public void event(String event) {
> >>> +        this.event = new Event(this.event, event);
> >>> +    }
> >>> +
> >>> +    public void stop(PrintStream out) {
> >>> +        Event event = new Event(this.event, "stop");
> >>> +        this.event.stop(event, out);
> >>> +        start.stop(event, out);
> >>> +    }
> >>> +
> >>> +    private class Event {
> >>> +        protected final long start = System.nanoTime();
> >>> +        private final Event previous;
> >>> +        private final String description;
> >>> +
> >>> +        private Event(Event previous, String description) {
> >>> +            this.previous = previous;
> >>> +            this.description = description;
> >>> +        }
> >>> +
> >>> +        public void stop(Event next, PrintStream out) {
> >>> +            if (previous != PerformanceTimer.this.start)
> >>> previous.stop(this, out);
> >>> +            out.printf("%s  %s",
> TimeUnit.NANOSECONDS.toMillis(next.start
> >>> - this.start), this.description);
> >>> +            out.println();
> >>> +        }
> >>> +    }
> >>> +    private class Start extends Event {
> >>> +        private Start() {
> >>> +            super(null, "start");
> >>> +        }
> >>> +
> >>> +        @Override
> >>> +        public void stop(Event next, PrintStream out) {
> >>> +            out.printf("%s  %s",
> TimeUnit.NANOSECONDS.toMillis(next.start
> >>> - this.start), "total");
> >>> +            out.println();
> >>> +        }
> >>> +    }
> >>> +}
> >>>
> >>> Propchange:
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
> >>>
> >>>
> ------------------------------------------------------------------------------
> >>>   svn:eol-style = native
> >>>
> >>> Modified:
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
> >>> URL:
> >>>
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties?rev=1090081&r1=1090080&r2=1090081&view=diff
> >>>
> >>>
> ==============================================================================
> >>> ---
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
> >>> (original)
> >>> +++
> >>>
> openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
> >>> Fri Apr  8 01:30:11 2011
> >>> @@ -46,7 +46,7 @@
> >>> # 1 - Element (home, ejb-class, remote)
> >>> # 2 - Bean name
> >>> 1.missing.class           Missing class
> >>> -2.missing.class           Missing class {0}
> >>> +2.missing.class           Missing class <{1}> {0}
> >>> 3.missing.class           The class {0} not found. Check that the class
> >>> specified in the <{1}> element for bean {2} is spelled correctly and
> the
> >>> class is present in the jar
> >>>
> >>> # 0 - Class name
> >>> @@ -860,7 +860,3 @@ public interface {0} extends {2}'{}'
> >>> 1.xml.noEjbClass = Element <ejb-class> unspecified.
> >>> 2.xml.noEjbClass = Element <ejb-class> unspecified.  No annotated bean
> >>> discovered with <ejb-name>{0}</ejb-name>
> >>> 3.xml.noEjbClass = The <ejb-class> element is only optional if there is
> a
> >>> matching annotated bean in the module with the bean name {0}.  No such
> bean
> >>> was found.  Other beans in this module are: {1}
> >>> -
> >>> -1.xml.missingEjbClass = Specified <ejb-class> not found.
> >>> -2.xml.missingEjbClass = Specified <ejb-class> not found {0}
> >>> -3.xml.missingEjbClass = The <ejb-class> element specifies a class that
> >>> cannot be found.  The {0} class should be in the module with the
> ejb-jar.xml
> >>> or in a shared library
> >>>
> >>> Modified:
> >>>
> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java
> >>> URL:
> >>>
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java?rev=1090081&r1=1090080&r2=1090081&view=diff
> >>>
> >>>
> ==============================================================================
> >>> ---
> >>>
> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java
> >>> (original)
> >>> +++
> >>>
> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java
> >>> Fri Apr  8 01:30:11 2011
> >>> @@ -22,6 +22,7 @@ import org.springframework.context.suppo
> >>>
> >>> public class BasicSpringTest extends TestCase {
> >>>    public void test() throws Exception {
> >>> +
> >>>
> System.setProperty("openejb.deployments.classpath.include",".*/spring-integration.*");
> >>>        ClassPathXmlApplicationContext context = new
> >>> ClassPathXmlApplicationContext("org/apache/openejb/spring/test.xml");
> >>>        assertTrue(context.getBeanDefinitionCount() > 0);
> >>>
> >>>
> >>> Modified:
> >>>
> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java
> >>> URL:
> >>>
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java?rev=1090081&r1=1090080&r2=1090081&view=diff
> >>>
> >>>
> ==============================================================================
> >>> ---
> >>>
> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java
> >>> (original)
> >>> +++
> >>>
> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java
> >>> Fri Apr  8 01:30:11 2011
> >>> @@ -34,7 +34,10 @@ import org.springframework.context.suppo
> >>>
> >>> public class SpringTest extends TestCase {
> >>>    public void test() throws Exception {
> >>> +
> >>>
> System.setProperty("openejb.deployments.classpath.include",".*/openejb-spring.*");
> >>> +
> >>>        ClassPathXmlApplicationContext context = new
> >>> ClassPathXmlApplicationContext("org/apache/openejb/spring/spring.xml");
> >>> +
> >>>        assertTrue(context.getBeanDefinitionCount() > 0);
> >>>
> >>>        //
> >>>
> >>> Modified:
> >>>
> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java
> >>> URL:
> >>>
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java?rev=1090081&r1=1090080&r2=1090081&view=diff
> >>>
> >>>
> ==============================================================================
> >>> ---
> >>>
> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java
> >>> (original)
> >>> +++
> >>>
> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java
> >>> Fri Apr  8 01:30:11 2011
> >>> @@ -17,6 +17,7 @@
> >>> package org.apache.openejb;
> >>>
> >>> import junit.framework.TestCase;
> >>> +import org.apache.openejb.config.DeploymentsResolver;
> >>> import org.apache.openejb.server.ejbd.EjbServer;
> >>> import org.apache.openejb.server.ServiceDaemon;
> >>> import org.apache.openejb.core.ServerFederation;
> >>> @@ -35,8 +36,7 @@ public class AuthTest extends TestCase {
> >>>        EjbServer ejbServer = new EjbServer();
> >>>
> >>>        Properties initProps = new Properties();
> >>> -        initProps.setProperty("openejb.deployments.classpath.include",
> >>> "");
> >>> -
> >>>
> initProps.setProperty("openejb.deployments.classpath.filter.descriptors",
> >>> "true");
> >>> +
>  initProps.put(DeploymentsResolver.DEPLOYMENTS_CLASSPATH_PROPERTY,
> >>> Boolean.toString(false));
> >>>        OpenEJB.init(initProps, new ServerFederation());
> >>>        ejbServer.init(new Properties());
> >>>
> >>>
> >>> Modified:
> >>>
> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java
> >>> URL:
> >>>
> http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java?rev=1090081&r1=1090080&r2=1090081&view=diff
> >>>
> >>>
> ==============================================================================
> >>> ---
> >>>
> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java
> >>> (original)
> >>> +++
> >>>
> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java
> >>> Fri Apr  8 01:30:11 2011
> >>> @@ -17,6 +17,7 @@
> >>> package org.apache.openejb;
> >>>
> >>> import junit.framework.TestCase;
> >>> +import org.apache.openejb.config.DeploymentsResolver;
> >>> import org.apache.openejb.server.ejbd.EjbServer;
> >>> import org.apache.openejb.server.ServiceDaemon;
> >>> import org.apache.openejb.core.ServerFederation;
> >>> @@ -47,8 +48,7 @@ public class JndiTest extends TestCase {
> >>>        EjbServer ejbServer = new EjbServer();
> >>>
> >>>        Properties initProps = new Properties();
> >>> -        initProps.setProperty("openejb.deployments.classpath.include",
> >>> "");
> >>> -
> >>>
> initProps.setProperty("openejb.deployments.classpath.filter.descriptors",
> >>> "true");
> >>> +
>  initProps.put(DeploymentsResolver.DEPLOYMENTS_CLASSPATH_PROPERTY,
> >>> Boolean.toString(false));
> >>>        OpenEJB.init(initProps, new ServerFederation());
> >>>        ejbServer.init(new Properties());
> >>>
> >>>
> >>>
> >>>
> >>
> >>
> >> --
> >> Shawn
> >>
> >
> >
> >
> > --
> > Shawn
>
>


-- 
Shawn

Re: org.apache.openejb.config.NewLoaderLogic.callers() will return abstract classes which can't pass the validation logic in org.apache.openejb.config.rules.CheckClasses.check_hasEjbClass(EnterpriseBean)

Posted by David Blevins <da...@gmail.com>.
Hi Shawn!

Thanks for pointing this out.  I committed something that should screen out those invalid classes.


-David

On Apr 20, 2011, at 7:10 AM, Shawn Jiang wrote:

> Hi devs,
> 
> Any ideas on this issue ?
> 
> On Sat, Apr 16, 2011 at 10:20 PM, Shawn Jiang <ge...@gmail.com> wrote:
> 
>> org.apache.openejb.config.NewLoaderLogic.callers() will return some callers
>> and then use these callers to create a new ejbmodule.
>> 
>> When there are abstract classes in the caller stacktrace,  the abstract
>> classes will also be used to create the ejbmodule.      Because
>> org.apache.openejb.config.rules.CheckClasses.check_hasEjbClass(EnterpriseBean)
>> does not allow abstract class as an EJB class.    I've seen lots of geronimo
>> ejb tck regression because of abstractDeclaredAsBean validation failures.
>>  I think the abstract classes should be filtered out from the callers in
>> NewLoaderLogic.callers().
>> 
>> From the log,  seems this part of work is still ongoing.   Is there a
>> better way in plan to handle this issue ?
>> 
>> 
>> On Fri, Apr 8, 2011 at 9:30 AM, <db...@apache.org> wrote:
>> 
>>> Author: dblevins
>>> Date: Fri Apr  8 01:30:11 2011
>>> New Revision: 1090081
>>> 
>>> URL: http://svn.apache.org/viewvc?rev=1090081&view=rev
>>> Log:
>>> OpenEjbContainer and DeploymentLoader logic rewrite.  Midway through.
>>> Temporarily putting the very close but not quite working logic in
>>> NewLoaderLogic
>>> Some validation tweaks to print the module path in output messages
>>> Tweaked 'null ejbClass' logic to use the right validation message (i had
>>> added one when there was already one there).  Yanking the one I added.
>>> 
>>> Added:
>>> 
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
>>>  (with props)
>>> 
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
>>>  (with props)
>>> Modified:
>>> 
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
>>> 
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
>>> 
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java
>>> 
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
>>> 
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
>>> 
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java
>>> 
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java
>>> 
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
>>> 
>>> openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
>>> 
>>> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java
>>> 
>>> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java
>>> 
>>> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java
>>> 
>>> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java
>>> 
>>> Modified:
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
>>> URL:
>>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>> 
>>> ==============================================================================
>>> ---
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
>>> (original)
>>> +++
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
>>> Fri Apr  8 01:30:11 2011
>>> @@ -696,7 +696,7 @@ public class Assembler extends Assembler
>>>                jndiEncBuilder.setUseCrossClassLoaderRef(false);
>>>                Context context =
>>> jndiEncBuilder.build(JndiEncBuilder.JndiScope.comp);
>>> 
>>> -                Debug.printContext(context);
>>> +//                Debug.printContext(context);
>>> 
>>>                containerSystem.getJNDIContext().bind("openejb/client/" +
>>> clientInfo.moduleId, context);
>>> 
>>> 
>>> Modified:
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
>>> URL:
>>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>> 
>>> ==============================================================================
>>> ---
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
>>> (original)
>>> +++
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
>>> Fri Apr  8 01:30:11 2011
>>> @@ -1069,7 +1069,7 @@ public class AnnotationDeployer implemen
>>>                try {
>>>                    clazz = classLoader.loadClass(ejbClassName);
>>>                } catch (ClassNotFoundException e) {
>>> -                    fail(ejbName, "xml.missingEjbClass", ejbClassName);
>>> +                    // Handled in CheckClasses.java along with other
>>> missing classes
>>>                    continue;
>>>                }
>>>                final AnnotationFinder finder = new AnnotationFinder(new
>>> ClassesArchive(clazz));
>>> 
>>> Modified:
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java
>>> URL:
>>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>> 
>>> ==============================================================================
>>> ---
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java
>>> (original)
>>> +++
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java
>>> Fri Apr  8 01:30:11 2011
>>> @@ -25,6 +25,8 @@ public interface DeploymentFilterable {
>>>    static final String SEARCH_CLASSPATH_FOR_DEPLOYMENTS_PROPERTY =
>>> DEPLOYMENTS_CLASSPATH_PROPERTY;
>>>    static final String CLASSPATH_INCLUDE =
>>> "openejb.deployments.classpath.include";
>>>    static final String CLASSPATH_EXCLUDE =
>>> "openejb.deployments.classpath.exclude";
>>> +    static final String PACKAGE_INCLUDE =
>>> "openejb.deployments.package.include";
>>> +    static final String PACKAGE_EXCLUDE =
>>> "openejb.deployments.package.exclude";
>>>    static final String CLASSPATH_REQUIRE_DESCRIPTOR =
>>> RequireDescriptors.PROPERTY;
>>>    static final String CLASSPATH_FILTER_DESCRIPTORS =
>>> "openejb.deployments.classpath.filter.descriptors";
>>>    static final String CLASSPATH_FILTER_SYSTEMAPPS =
>>> "openejb.deployments.classpath.filter.systemapps";
>>> 
>>> Modified:
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
>>> URL:
>>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>> 
>>> ==============================================================================
>>> ---
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
>>> (original)
>>> +++
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
>>> Fri Apr  8 01:30:11 2011
>>> @@ -1269,7 +1269,7 @@ public class DeploymentLoader implements
>>>            }
>>>        }
>>> 
>>> -        Class<? extends DeploymentModule> cls =
>>> checkAnnotations(Arrays.asList(baseUrl), classLoader,
>>> scanPotentialEjbModules, scanPotentialClientModules);
>>> +        Class<? extends DeploymentModule> cls = checkAnnotations(baseUrl,
>>> classLoader, scanPotentialEjbModules, scanPotentialClientModules);
>>>        if (cls != null) return cls;
>>> 
>>>        if (descriptors.containsKey("persistence.xml")) {
>>> @@ -1279,7 +1279,7 @@ public class DeploymentLoader implements
>>>        throw new UnknownModuleTypeException("Unknown module type: url=" +
>>> baseUrl.toExternalForm());
>>>    }
>>> 
>>> -    private Class<? extends DeploymentModule>
>>> checkAnnotations(Collection<URL> urls, ClassLoader classLoader, final
>>> boolean scanPotentialEjbModules, final boolean scanPotentialClientModules) {
>>> +    private Class<? extends DeploymentModule> checkAnnotations(URL urls,
>>> ClassLoader classLoader, final boolean scanPotentialEjbModules, final
>>> boolean scanPotentialClientModules) {
>>>        Class<? extends DeploymentModule> cls = null;
>>>        if (scanPotentialEjbModules || scanPotentialClientModules) {
>>>            AnnotationFinder classFinder = new
>>> AnnotationFinder(classLoader, urls);
>>> 
>>> Modified:
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
>>> URL:
>>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>> 
>>> ==============================================================================
>>> ---
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
>>> (original)
>>> +++
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
>>> Fri Apr  8 01:30:11 2011
>>> @@ -16,26 +16,26 @@
>>> */
>>> package org.apache.openejb.config;
>>> 
>>> -import static org.apache.openejb.util.URLs.toFile;
>>> -
>>> import org.apache.openejb.config.sys.Deployments;
>>> import org.apache.openejb.config.sys.JaxbOpenejb;
>>> import org.apache.openejb.loader.FileUtils;
>>> -import org.apache.openejb.loader.SystemInstance;
>>> import org.apache.openejb.loader.Options;
>>> +import org.apache.openejb.loader.SystemInstance;
>>> import org.apache.openejb.util.Logger;
>>> import org.apache.xbean.finder.UrlSet;
>>> 
>>> import java.io.File;
>>> import java.io.IOException;
>>> -import java.net.URL;
>>> import java.net.MalformedURLException;
>>> +import java.net.URL;
>>> import java.util.ArrayList;
>>> import java.util.Collections;
>>> +import java.util.EnumSet;
>>> import java.util.HashMap;
>>> import java.util.List;
>>> import java.util.Set;
>>> -import java.util.EnumSet;
>>> +
>>> +import static org.apache.openejb.util.URLs.toFile;
>>> 
>>> /**
>>> * @version $Rev$ $Date$
>>> @@ -314,6 +314,7 @@ public class DeploymentsResolver impleme
>>>    }
>>> 
>>>    private static UrlSet applyBuiltinExcludes(UrlSet urlSet) throws
>>> MalformedURLException {
>>> +
>>>        urlSet = urlSet.exclude(".*/activation(-[\\d.]+)?.jar(!/)?");
>>>        urlSet =
>>> urlSet.exclude(".*/activeio-core(-[\\d.]+)?(-incubator)?.jar(!/)?");
>>>        urlSet =
>>> urlSet.exclude(".*/activemq-(core|ra)(-[\\d.]+)?.jar(!/)?");
>>> @@ -378,7 +379,7 @@ public class DeploymentsResolver impleme
>>>        return urlSet;
>>>    }
>>> 
>>> -    private static void processUrls(List<URL> urls, ClassLoader
>>> classLoader, Set<RequireDescriptors> requireDescriptors, FileUtils base,
>>> List<URL> jarList) {
>>> +    public static void processUrls(List<URL> urls, ClassLoader
>>> classLoader, Set<RequireDescriptors> requireDescriptors, FileUtils base,
>>> List<URL> jarList) {
>>>        for (URL url : urls) {
>>> 
>>>            String urlProtocol = url.getProtocol();
>>> 
>>> Added:
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
>>> URL:
>>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java?rev=1090081&view=auto
>>> 
>>> ==============================================================================
>>> ---
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
>>> (added)
>>> +++
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
>>> Fri Apr  8 01:30:11 2011
>>> @@ -0,0 +1,448 @@
>>> +/**
>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>> + * contributor license agreements.  See the NOTICE file distributed with
>>> + * this work for additional information regarding copyright ownership.
>>> + * The ASF licenses this file to You under the Apache License, Version
>>> 2.0
>>> + * (the "License"); you may not use this file except in compliance with
>>> + * the License.  You may obtain a copy of the License at
>>> + *
>>> + *     http://www.apache.org/licenses/LICENSE-2.0
>>> + *
>>> + *  Unless required by applicable law or agreed to in writing, software
>>> + *  distributed under the License is distributed on an "AS IS" BASIS,
>>> + *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>>> implied.
>>> + *  See the License for the specific language governing permissions and
>>> + *  limitations under the License.
>>> + */
>>> +package org.apache.openejb.config;
>>> +
>>> +import org.apache.openejb.loader.FileUtils;
>>> +import org.apache.openejb.loader.Options;
>>> +import org.apache.openejb.loader.SystemInstance;
>>> +import org.apache.openejb.util.Join;
>>> +import org.apache.openejb.util.Logger;
>>> +import org.apache.openejb.util.PerformanceTimer;
>>> +import org.apache.openejb.util.URLs;
>>> +import org.apache.xbean.finder.UrlSet;
>>> +import org.apache.xbean.finder.archive.Archive;
>>> +import org.apache.xbean.finder.archive.ClasspathArchive;
>>> +import org.apache.xbean.finder.archive.FilteredArchive;
>>> +import org.apache.xbean.finder.filter.Filter;
>>> +import org.apache.xbean.finder.filter.Filters;
>>> +import org.apache.xbean.finder.filter.IncludeExcludeFilter;
>>> +import org.apache.xbean.finder.filter.PatternFilter;
>>> +
>>> +import java.io.File;
>>> +import java.io.IOException;
>>> +import java.net.MalformedURLException;
>>> +import java.net.URL;
>>> +import java.util.ArrayList;
>>> +import java.util.Arrays;
>>> +import java.util.Collections;
>>> +import java.util.EnumSet;
>>> +import java.util.HashSet;
>>> +import java.util.Iterator;
>>> +import java.util.LinkedHashSet;
>>> +import java.util.List;
>>> +import java.util.Set;
>>> +
>>> +/**
>>> +* @version $Rev$ $Date$
>>> +*/
>>> +public class NewLoaderLogic {
>>> +
>>> +    private static final Logger logger = DeploymentLoader.logger;
>>> +
>>> +    public static UrlSet filterArchives(Filter filter, ClassLoader
>>> classLoader, UrlSet urlSet) {
>>> +
>>> +        for (URL url : urlSet.getUrls()) {
>>> +            for (Archive archive : ClasspathArchive.archives(classLoader,
>>> url)) {
>>> +
>>> +                FilteredArchive filtered = new FilteredArchive(archive,
>>> filter);
>>> +
>>> +                if (!filtered.iterator().hasNext()) {
>>> +                    urlSet = urlSet.exclude(url);
>>> +                }
>>> +
>>> +            }
>>> +        }
>>> +
>>> +        return urlSet;
>>> +    }
>>> +
>>> +    public static Set<String> callers() {
>>> +
>>> +        final Set<String> callers = new LinkedHashSet<String>();
>>> +
>>> +        final List<StackTraceElement> elements = new
>>> ArrayList<StackTraceElement>(Arrays.asList(new
>>> Exception().fillInStackTrace().getStackTrace()));
>>> +
>>> +        // Yank out everything until we find a known ENTRY point
>>> +        // if we don't find one, so be it, this is only a convenience
>>> +        {
>>> +            // Entry points are the following:
>>> +            Filter start =
>>> Filters.classes("javax.ejb.embedded.EJBContainer",
>>> "javax.naming.InitialContext");
>>> +
>>> +            Iterator<StackTraceElement> iterator = elements.iterator();
>>> +            while (iterator.hasNext()) {
>>> +                StackTraceElement element = iterator.next();
>>> +                iterator.remove();
>>> +
>>> +                // If we haven't yet reached an entry point, just keep
>>> going
>>> +                if (!start.accept(element.getClassName())) continue;
>>> +
>>> +                // We found an entry point.
>>> +                // Fast-forward past this class
>>> +
>>> while(iterator.hasNext()&&element.getClassName().equals(iterator.next().getClassName()))
>>> iterator.remove();
>>> +
>>> +                // Ok, we have iterated up to the calling user class, so
>>> stop now
>>> +                break;
>>> +            }
>>> +        }
>>> +
>>> +
>>> +        // Now iterate till we find an END point
>>> +        // We don't want any of the classes after that
>>> +        {
>>> +            Filter end = Filters.packages(
>>> +                    "junit.",
>>> +                    "org.junit.",
>>> +                    "org.testng.",
>>> +                    "org.apache.maven.",
>>> +                    "org.eclipse.",
>>> +                    "com.intellij."
>>> +            );
>>> +
>>> +            // Everything between here and the end is part
>>> +            // of the call chain in which we are interested
>>> +            Iterator<StackTraceElement> iterator = elements.iterator();
>>> +            while (iterator.hasNext()) {
>>> +                StackTraceElement element = iterator.next();
>>> +
>>> +                if (end.accept(element.getClassName())) break;
>>> +
>>> +                callers.add(element.getClassName());
>>> +            }
>>> +        }
>>> +
>>> +        // We don't need this anymore
>>> +        elements.clear();
>>> +
>>> +        // Finally filter out everything that we definitely don't want
>>> +        {
>>> +            Filter unwanted = Filters.packages(
>>> +                    "java.",
>>> +                    "javax.",
>>> +                    "sun.reflect."
>>> +            );
>>> +
>>> +            Iterator<String> classes = callers.iterator();
>>> +            while (classes.hasNext()) {
>>> +                if (unwanted.accept(classes.next())) classes.remove();
>>> +            }
>>> +        }
>>> +
>>> +
>>> +        return callers;
>>> +    }
>>> +
>>> +    public static UrlSet applyBuiltinExcludes(UrlSet urlSet) throws
>>> MalformedURLException {
>>> +
>>> +        Filter filter = Filters.prefixes(
>>> +                "XmlSchema-",
>>> +                "activeio-",
>>> +                "activemq-",
>>> +                "antlr-",
>>> +                "aopalliance-",
>>> +                "avalon-framework-",
>>> +                "axis-",
>>> +                "axis2-",
>>> +                "bcprov-",
>>> +                "bsh-",
>>> +                "catalina-",
>>> +                "cglib-",
>>> +                "commons-cli-",
>>> +                "commons-codec-",
>>> +                "commons-collections-",
>>> +                "commons-dbcp-all-1.3-",
>>> +                "commons-discovery-",
>>> +                "commons-httpclient-",
>>> +                "commons-io-",
>>> +                "commons-lang-",
>>> +                "commons-logging-",
>>> +                "commons-logging-api-",
>>> +                "commons-net-",
>>> +                "commons-pool-",
>>> +                "cssparser-",
>>> +                "cxf-",
>>> +                "deploy.jar",
>>> +                "derby-",
>>> +                "dom4j-",
>>> +                "geronimo-",
>>> +                "guice-",
>>> +                "howl-",
>>> +                "hsqldb-",
>>> +                "htmlunit-",
>>> +                "hibernate-",
>>> +                "icu4j-",
>>> +                "idb-",
>>> +                "idea_rt.jar",
>>> +                "jasypt-",
>>> +                "javaee-",
>>> +                "javassist-",
>>> +                "javaws.jar",
>>> +                "javax.",
>>> +                "jaxb-",
>>> +                "jaxp-",
>>> +                "jboss-",
>>> +                "jbossall-",
>>> +                "jbosscx-",
>>> +                "jbossjts-",
>>> +                "jbosssx-",
>>> +                "jcommander-",
>>> +                "jetty-",
>>> +                "jmdns-",
>>> +                "jsp-api-",
>>> +                "jsr299-",
>>> +                "jsr311-",
>>> +                "juli-",
>>> +                "junit-",
>>> +                "kahadb-",
>>> +                "log4j-",
>>> +                "logkit-",
>>> +                "myfaces-",
>>> +                "neethi-",
>>> +                "nekohtml-",
>>> +                "openjpa-",
>>> +                "opensaml-",
>>> +                "openwebbeans-",
>>> +                "org.eclipse.",
>>> +                "org.junit.",
>>> +                "org.osgi.core-",
>>> +                "quartz-",
>>> +                "rmock-",
>>> +                "saaj-",
>>> +                "sac-",
>>> +                "scannotation-",
>>> +                "serializer-",
>>> +                "serp-",
>>> +                "servlet-api-",
>>> +                "slf4j-",
>>> +                "spring-",
>>> +                "stax-api-",
>>> +                "swizzle-",
>>> +                "testng-",
>>> +                "wsdl4j-",
>>> +                "wss4j-",
>>> +                "wstx-asl-",
>>> +                "xalan-",
>>> +                "xbean-",
>>> +                "xercesImpl-",
>>> +                "xml-apis-",
>>> +                "xml-resolver-",
>>> +                "xmlrpc-",
>>> +                "xmlsec-",
>>> +                "xmlunit-"
>>> +        );
>>> +
>>> +        filter = Filters.optimize(filter, new
>>> PatternFilter(".*/openejb-.*"));
>>> +        List<URL> urls = urlSet.getUrls();
>>> +        Iterator<URL> iterator = urls.iterator();
>>> +        while (iterator.hasNext()) {
>>> +            URL url = iterator.next();
>>> +            File file = URLs.toFile(url);
>>> +            String name = file.getName();
>>> +//            System.out.println("JAR "+name);
>>> +            if (filter.accept(name)) iterator.remove();
>>> +        }
>>> +
>>> +
>>> +
>>> +        return new UrlSet(urls);
>>> +    }
>>> +
>>> +    public static void _loadFromClasspath(FileUtils base, List<URL>
>>> jarList, ClassLoader classLoader) {
>>> +
>>> +        PerformanceTimer timer = new PerformanceTimer();
>>> +
>>> +        timer.event("create filters");
>>> +        Options options = SystemInstance.get().getOptions();
>>> +        String include = "";
>>> +        String exclude = "";
>>> +        PatternFilter classpathInclude = new
>>> PatternFilter(options.get(DeploymentFilterable.CLASSPATH_INCLUDE, ".*"));
>>> +        PatternFilter classpathExclude = new
>>> PatternFilter(options.get(DeploymentFilterable.CLASSPATH_EXCLUDE, ""));
>>> +        IncludeExcludeFilter classpathFilter = new
>>> IncludeExcludeFilter(classpathInclude, classpathExclude);
>>> +
>>> +
>>> +        PatternFilter packageInclude = new
>>> PatternFilter(options.get(DeploymentFilterable.PACKAGE_INCLUDE, ".*"));
>>> +        PatternFilter packageExclude = new
>>> PatternFilter(options.get(DeploymentFilterable.PACKAGE_EXCLUDE, ""));
>>> +
>>> +        IncludeExcludeFilter packageFilter;
>>> +        if (classpathInclude.getPattern().pattern().equals(".*") &&
>>> packageInclude.getPattern().pattern().equals(".*")) {
>>> +
>>> +            timer.event("callers");
>>> +
>>> +            Set<String> callers = callers();
>>> +
>>> +            timer.event("parse packages");
>>> +
>>> +            callers.size();
>>> +
>>> +            Set<String> packages = new HashSet<String>();
>>> +            for (String caller : callers) {
>>> +                String[] parts = caller.split("\\.");
>>> +                if (parts.length > 2) {
>>> +                    parts = new String[]{parts[0], parts[1]};
>>> +                }
>>> +                packages.add(Join.join(".", parts));
>>> +            }
>>> +
>>> +            Filter includes = Filters.packages(packages.toArray(new
>>> String[0]));
>>> +
>>> +            packageFilter = new IncludeExcludeFilter(includes,
>>> packageExclude);
>>> +
>>> +        } else {
>>> +
>>> +            packageFilter = new IncludeExcludeFilter(packageInclude,
>>> packageExclude);
>>> +
>>> +        }
>>> +
>>> +        timer.event("urlset");
>>> +
>>> +        Set<RequireDescriptors> requireDescriptors =
>>> options.getAll(DeploymentFilterable.CLASSPATH_REQUIRE_DESCRIPTOR,
>>> RequireDescriptors.CLIENT);
>>> +        boolean filterDescriptors =
>>> options.get(DeploymentFilterable.CLASSPATH_FILTER_DESCRIPTORS, false);
>>> +        boolean filterSystemApps =
>>> options.get(DeploymentFilterable.CLASSPATH_FILTER_SYSTEMAPPS, true);
>>> +
>>> +        try {
>>> +            UrlSet urlSet = new UrlSet(classLoader);
>>> +
>>> +            timer.event("exclude system urls");
>>> +            urlSet =
>>> urlSet.exclude(ClassLoader.getSystemClassLoader().getParent());
>>> +            urlSet = urlSet.excludeJavaExtDirs();
>>> +            urlSet = urlSet.excludeJavaEndorsedDirs();
>>> +            urlSet = urlSet.excludeJavaHome();
>>> +            urlSet =
>>> urlSet.excludePaths(System.getProperty("sun.boot.class.path", ""));
>>> +            urlSet = urlSet.exclude(".*/JavaVM.framework/.*");
>>> +
>>> +
>>> +            timer.event("classpath filter");
>>> +
>>> +            UrlSet beforeFiltering = urlSet;
>>> +
>>> +            urlSet = urlSet.filter(classpathFilter);
>>> +
>>> +
>>> +            // If the user filtered out too much, that's a problem
>>> +            if (urlSet.size() == 0) {
>>> +                final String message = String.format("Classpath
>>> Include/Exclude resulted in zero URLs.  There were %s possible URLs before
>>> filtering and 0 after: include=\"%s\", exclude=\"%s\"",
>>> beforeFiltering.size(), include, exclude);
>>> +                logger.error(message);
>>> +                logger.info("Eligible Classpath before filtering:");
>>> +
>>> +                for (URL url : beforeFiltering) {
>>> +                    logger.info(String.format("   %s",
>>> url.toExternalForm()));
>>> +                }
>>> +//                throw new IllegalStateException(message);
>>> +
>>> +            }
>>> +
>>> +            // If they are the same size, than nothing was filtered
>>> +            // and we know the user did not take action to change the
>>> default
>>> +            final boolean userSuppliedClasspathFilter =
>>> beforeFiltering.size() != urlSet.size();
>>> +
>>> +            if (!userSuppliedClasspathFilter) {
>>> +
>>> +                logger.info("Applying buildin classpath excludes");
>>> +                timer.event("buildin excludes");
>>> +                urlSet = applyBuiltinExcludes(urlSet);
>>> +
>>> +            }
>>> +
>>> +            DeploymentsResolver.processUrls(urlSet.getUrls(),
>>> classLoader, EnumSet.allOf(RequireDescriptors.class), base, jarList);
>>> +
>>> +
>>> +            timer.event("package filter");
>>> +
>>> +            urlSet = filterArchives(packageFilter, classLoader, urlSet);
>>> +
>>> +            timer.event("process urls");
>>> +
>>> +            // we should exclude system apps before and apply user
>>> properties after
>>> +//            if (filterSystemApps){
>>> +//                urlSet =
>>> urlSet.exclude(".*/openejb-[^/]+(.(jar|ear|war)(!/)?|/target/(test-)?classes/?)");
>>> +//            }
>>> +
>>> +            List<URL> urls = urlSet.getUrls();
>>> +            int size = urls.size();
>>> +//            if (size == 0) {
>>> +//                logger.warning("No classpath URLs matched.  Current
>>> settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " + CLASSPATH_INCLUDE
>>> + "='" + include + "'");
>>> +//                return;
>>> +//            } else if (size == 0 && (!filterDescriptors &&
>>> prefiltered.getUrls().size() == 0)) {
>>> +//                return;
>>> +//            } else if (size < 20) {
>>> +//                logger.debug("Inspecting classpath for applications: "
>>> + urls.size() + " urls.");
>>> +//            } else {
>>> +//                // Has the user allowed some module types to be
>>> discoverable via scraping?
>>> +//                boolean willScrape = requireDescriptors.size() <
>>> RequireDescriptors.values().length;
>>> +//
>>> +//                if (size < 50 && willScrape) {
>>> +//                    logger.info("Inspecting classpath for
>>> applications: " + urls.size() + " urls. Consider adjusting your
>>> exclude/include.  Current settings: " + CLASSPATH_EXCLUDE + "='" + exclude +
>>> "', " + CLASSPATH_INCLUDE + "='" + include + "'");
>>> +//                } else if (willScrape) {
>>> +//                    logger.warning("Inspecting classpath for
>>> applications: " + urls.size() + " urls.");
>>> +//                    logger.warning("ADJUST THE EXCLUDE/INCLUDE!!!.
>>> Current settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " +
>>> CLASSPATH_INCLUDE + "='" + include + "'");
>>> +//                }
>>> +//            }
>>> +
>>> +            long begin = System.currentTimeMillis();
>>> +            DeploymentsResolver.processUrls(urls, classLoader,
>>> requireDescriptors, base, jarList);
>>> +            long end = System.currentTimeMillis();
>>> +            long time = end - begin;
>>> +
>>> +            timer.stop(System.out);
>>> +
>>> +            UrlSet unchecked = new UrlSet();
>>> +//            if (!filterDescriptors){
>>> +//                unchecked = prefiltered.exclude(urlSet);
>>> +//                if (filterSystemApps){
>>> +//                    unchecked =
>>> unchecked.exclude(".*/openejb-[^/]+(.(jar|ear|war)(./)?|/target/classes/?)");
>>> +//                }
>>> +                DeploymentsResolver.processUrls(unchecked.getUrls(),
>>> classLoader, EnumSet.allOf(RequireDescriptors.class), base, jarList);
>>> +//            }
>>> +
>>> +            if (logger.isDebugEnabled()) {
>>> +                int urlCount = urlSet.getUrls().size() +
>>> unchecked.getUrls().size();
>>> +                logger.debug("URLs after filtering: "+ urlCount);
>>> +                for (URL url : urlSet.getUrls()) {
>>> +                    logger.debug("Annotations path: " + url);
>>> +                }
>>> +                for (URL url : unchecked.getUrls()) {
>>> +                    logger.debug("Descriptors path: " + url);
>>> +                }
>>> +            }
>>> +
>>> +            if (urls.size() == 0) return;
>>> +
>>> +            if (time < 1000) {
>>> +                logger.debug("Searched " + urls.size() + " classpath urls
>>> in " + time + " milliseconds.  Average " + (time / urls.size()) + "
>>> milliseconds per url.");
>>> +            } else if (time < 4000 || urls.size() < 3) {
>>> +                logger.info("Searched " + urls.size() + " classpath urls
>>> in " + time + " milliseconds.  Average " + (time / urls.size()) + "
>>> milliseconds per url.");
>>> +            } else if (time < 10000) {
>>> +                logger.warning("Searched " + urls.size() + " classpath
>>> urls in " + time + " milliseconds.  Average " + (time / urls.size()) + "
>>> milliseconds per url.");
>>> +                logger.warning("Consider adjusting your " +
>>> DeploymentFilterable.CLASSPATH_EXCLUDE + " and " +
>>> DeploymentFilterable.CLASSPATH_INCLUDE + " settings.  Current settings:
>>> exclude='" + exclude + "', include='" + include + "'");
>>> +            } else {
>>> +                logger.fatal("Searched " + urls.size() + " classpath urls
>>> in " + time + " milliseconds.  Average " + (time / urls.size()) + "
>>> milliseconds per url.  TOO LONG!");
>>> +                logger.fatal("ADJUST THE EXCLUDE/INCLUDE!!!.  Current
>>> settings: " + DeploymentFilterable.CLASSPATH_EXCLUDE + "='" + exclude + "',
>>> " + DeploymentFilterable.CLASSPATH_INCLUDE + "='" + include + "'");
>>> +                List<String> list = new ArrayList<String>();
>>> +                for (URL url : urls) {
>>> +                    list.add(url.toExternalForm());
>>> +                }
>>> +                Collections.sort(list);
>>> +                for (String url : list) {
>>> +                    logger.info("Matched: " + url);
>>> +                }
>>> +            }
>>> +        } catch (IOException e1) {
>>> +            e1.printStackTrace();
>>> +            logger.warning("Unable to search classpath for modules:
>>> Received Exception: " + e1.getClass().getName() + " " + e1.getMessage(),
>>> e1);
>>> +        }
>>> +
>>> +    }
>>> +}
>>> 
>>> Propchange:
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
>>> 
>>> ------------------------------------------------------------------------------
>>>   svn:eol-style = native
>>> 
>>> Modified:
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java
>>> URL:
>>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>> 
>>> ==============================================================================
>>> ---
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java
>>> (original)
>>> +++
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java
>>> Fri Apr  8 01:30:11 2011
>>> @@ -102,7 +102,8 @@ public class ReportValidationResults imp
>>> 
>>>        if (context.hasErrors() || context.hasFailures()) {
>>> 
>>> -            logger.error("Invalid
>>> "+context.getModuleType()+"(path="+context.getName()+")");
>>> +            DeploymentModule module = context.getModule();
>>> +            logger.error(String.format("Invalid %s(name=%s, path=%s)",
>>> context.getModuleType(), module.getModuleId(), module.getFile()));
>>> //            logger.error("Validation: "+errors.length + " errors,
>>> "+failures.length+ " failures, in
>>> "+context.getModuleType()+"(path="+context.getJarPath()+")");
>>>        } else if (context.hasWarnings()) {
>>>            if (context.getWarnings().length == 1) {
>>> 
>>> Modified:
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java
>>> URL:
>>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>> 
>>> ==============================================================================
>>> ---
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java
>>> (original)
>>> +++
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java
>>> Fri Apr  8 01:30:11 2011
>>> @@ -45,6 +45,10 @@ public class ValidationContext implement
>>>        this.name = null;
>>>    }
>>> 
>>> +    public DeploymentModule getModule() {
>>> +        return module;
>>> +    }
>>> +
>>>    public void fail(String component, String key, Object... details) {
>>>        ValidationFailure failure = new ValidationFailure(key);
>>>        failure.setDetails(details);
>>> 
>>> Modified:
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
>>> URL:
>>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>> 
>>> ==============================================================================
>>> ---
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
>>> (original)
>>> +++
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
>>> Fri Apr  8 01:30:11 2011
>>> @@ -74,6 +74,9 @@ public class CheckClasses extends Valida
>>>            try {
>>>                Class<?> beanClass = check_hasEjbClass(bean);
>>> 
>>> +                // All the subsequent checks require the bean class
>>> +                if (beanClass == null) continue;
>>> +
>>>                if (!(bean instanceof RemoteBean)) continue;
>>>                RemoteBean b = (RemoteBean) bean;
>>> 
>>> @@ -208,8 +211,10 @@ public class CheckClasses extends Valida
>>> 
>>>        String ejbName = b.getEjbName();
>>> 
>>> -        Class<?> beanClass = lookForClass(b.getEjbClass(), "<ejb-class>",
>>> ejbName);
>>> +        Class<?> beanClass = lookForClass(b.getEjbClass(), "ejb-class",
>>> ejbName);
>>> 
>>> +        if (beanClass == null) return null;
>>> +
>>>        if (beanClass.isInterface()){
>>>            fail(ejbName, "interfaceDeclaredAsBean", beanClass.getName());
>>>        }
>>> 
>>> Added:
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
>>> URL:
>>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java?rev=1090081&view=auto
>>> 
>>> ==============================================================================
>>> ---
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
>>> (added)
>>> +++
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
>>> Fri Apr  8 01:30:11 2011
>>> @@ -0,0 +1,73 @@
>>> +/**
>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>> + * contributor license agreements.  See the NOTICE file distributed with
>>> + * this work for additional information regarding copyright ownership.
>>> + * The ASF licenses this file to You under the Apache License, Version
>>> 2.0
>>> + * (the "License"); you may not use this file except in compliance with
>>> + * the License.  You may obtain a copy of the License at
>>> + *
>>> + *     http://www.apache.org/licenses/LICENSE-2.0
>>> + *
>>> + *  Unless required by applicable law or agreed to in writing, software
>>> + *  distributed under the License is distributed on an "AS IS" BASIS,
>>> + *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>>> implied.
>>> + *  See the License for the specific language governing permissions and
>>> + *  limitations under the License.
>>> + */
>>> +package org.apache.openejb.util;
>>> +
>>> +import org.apache.openejb.config.DeploymentsResolver;
>>> +
>>> +import java.io.PrintStream;
>>> +import java.util.concurrent.TimeUnit;
>>> +
>>> +/**
>>> +* @version $Rev$ $Date$
>>> +*/
>>> +public class PerformanceTimer {
>>> +
>>> +    protected Start start;
>>> +    private Event event;
>>> +
>>> +    public PerformanceTimer() {
>>> +        event = start = new Start();
>>> +    }
>>> +
>>> +    public void event(String event) {
>>> +        this.event = new Event(this.event, event);
>>> +    }
>>> +
>>> +    public void stop(PrintStream out) {
>>> +        Event event = new Event(this.event, "stop");
>>> +        this.event.stop(event, out);
>>> +        start.stop(event, out);
>>> +    }
>>> +
>>> +    private class Event {
>>> +        protected final long start = System.nanoTime();
>>> +        private final Event previous;
>>> +        private final String description;
>>> +
>>> +        private Event(Event previous, String description) {
>>> +            this.previous = previous;
>>> +            this.description = description;
>>> +        }
>>> +
>>> +        public void stop(Event next, PrintStream out) {
>>> +            if (previous != PerformanceTimer.this.start)
>>> previous.stop(this, out);
>>> +            out.printf("%s  %s", TimeUnit.NANOSECONDS.toMillis(next.start
>>> - this.start), this.description);
>>> +            out.println();
>>> +        }
>>> +    }
>>> +    private class Start extends Event {
>>> +        private Start() {
>>> +            super(null, "start");
>>> +        }
>>> +
>>> +        @Override
>>> +        public void stop(Event next, PrintStream out) {
>>> +            out.printf("%s  %s", TimeUnit.NANOSECONDS.toMillis(next.start
>>> - this.start), "total");
>>> +            out.println();
>>> +        }
>>> +    }
>>> +}
>>> 
>>> Propchange:
>>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
>>> 
>>> ------------------------------------------------------------------------------
>>>   svn:eol-style = native
>>> 
>>> Modified:
>>> openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
>>> URL:
>>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties?rev=1090081&r1=1090080&r2=1090081&view=diff
>>> 
>>> ==============================================================================
>>> ---
>>> openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
>>> (original)
>>> +++
>>> openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
>>> Fri Apr  8 01:30:11 2011
>>> @@ -46,7 +46,7 @@
>>> # 1 - Element (home, ejb-class, remote)
>>> # 2 - Bean name
>>> 1.missing.class           Missing class
>>> -2.missing.class           Missing class {0}
>>> +2.missing.class           Missing class <{1}> {0}
>>> 3.missing.class           The class {0} not found. Check that the class
>>> specified in the <{1}> element for bean {2} is spelled correctly and the
>>> class is present in the jar
>>> 
>>> # 0 - Class name
>>> @@ -860,7 +860,3 @@ public interface {0} extends {2}'{}'
>>> 1.xml.noEjbClass = Element <ejb-class> unspecified.
>>> 2.xml.noEjbClass = Element <ejb-class> unspecified.  No annotated bean
>>> discovered with <ejb-name>{0}</ejb-name>
>>> 3.xml.noEjbClass = The <ejb-class> element is only optional if there is a
>>> matching annotated bean in the module with the bean name {0}.  No such bean
>>> was found.  Other beans in this module are: {1}
>>> -
>>> -1.xml.missingEjbClass = Specified <ejb-class> not found.
>>> -2.xml.missingEjbClass = Specified <ejb-class> not found {0}
>>> -3.xml.missingEjbClass = The <ejb-class> element specifies a class that
>>> cannot be found.  The {0} class should be in the module with the ejb-jar.xml
>>> or in a shared library
>>> 
>>> Modified:
>>> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java
>>> URL:
>>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>> 
>>> ==============================================================================
>>> ---
>>> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java
>>> (original)
>>> +++
>>> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java
>>> Fri Apr  8 01:30:11 2011
>>> @@ -22,6 +22,7 @@ import org.springframework.context.suppo
>>> 
>>> public class BasicSpringTest extends TestCase {
>>>    public void test() throws Exception {
>>> +
>>> System.setProperty("openejb.deployments.classpath.include",".*/spring-integration.*");
>>>        ClassPathXmlApplicationContext context = new
>>> ClassPathXmlApplicationContext("org/apache/openejb/spring/test.xml");
>>>        assertTrue(context.getBeanDefinitionCount() > 0);
>>> 
>>> 
>>> Modified:
>>> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java
>>> URL:
>>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>> 
>>> ==============================================================================
>>> ---
>>> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java
>>> (original)
>>> +++
>>> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java
>>> Fri Apr  8 01:30:11 2011
>>> @@ -34,7 +34,10 @@ import org.springframework.context.suppo
>>> 
>>> public class SpringTest extends TestCase {
>>>    public void test() throws Exception {
>>> +
>>> System.setProperty("openejb.deployments.classpath.include",".*/openejb-spring.*");
>>> +
>>>        ClassPathXmlApplicationContext context = new
>>> ClassPathXmlApplicationContext("org/apache/openejb/spring/spring.xml");
>>> +
>>>        assertTrue(context.getBeanDefinitionCount() > 0);
>>> 
>>>        //
>>> 
>>> Modified:
>>> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java
>>> URL:
>>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>> 
>>> ==============================================================================
>>> ---
>>> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java
>>> (original)
>>> +++
>>> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java
>>> Fri Apr  8 01:30:11 2011
>>> @@ -17,6 +17,7 @@
>>> package org.apache.openejb;
>>> 
>>> import junit.framework.TestCase;
>>> +import org.apache.openejb.config.DeploymentsResolver;
>>> import org.apache.openejb.server.ejbd.EjbServer;
>>> import org.apache.openejb.server.ServiceDaemon;
>>> import org.apache.openejb.core.ServerFederation;
>>> @@ -35,8 +36,7 @@ public class AuthTest extends TestCase {
>>>        EjbServer ejbServer = new EjbServer();
>>> 
>>>        Properties initProps = new Properties();
>>> -        initProps.setProperty("openejb.deployments.classpath.include",
>>> "");
>>> -
>>> initProps.setProperty("openejb.deployments.classpath.filter.descriptors",
>>> "true");
>>> +        initProps.put(DeploymentsResolver.DEPLOYMENTS_CLASSPATH_PROPERTY,
>>> Boolean.toString(false));
>>>        OpenEJB.init(initProps, new ServerFederation());
>>>        ejbServer.init(new Properties());
>>> 
>>> 
>>> Modified:
>>> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java
>>> URL:
>>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>> 
>>> ==============================================================================
>>> ---
>>> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java
>>> (original)
>>> +++
>>> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java
>>> Fri Apr  8 01:30:11 2011
>>> @@ -17,6 +17,7 @@
>>> package org.apache.openejb;
>>> 
>>> import junit.framework.TestCase;
>>> +import org.apache.openejb.config.DeploymentsResolver;
>>> import org.apache.openejb.server.ejbd.EjbServer;
>>> import org.apache.openejb.server.ServiceDaemon;
>>> import org.apache.openejb.core.ServerFederation;
>>> @@ -47,8 +48,7 @@ public class JndiTest extends TestCase {
>>>        EjbServer ejbServer = new EjbServer();
>>> 
>>>        Properties initProps = new Properties();
>>> -        initProps.setProperty("openejb.deployments.classpath.include",
>>> "");
>>> -
>>> initProps.setProperty("openejb.deployments.classpath.filter.descriptors",
>>> "true");
>>> +        initProps.put(DeploymentsResolver.DEPLOYMENTS_CLASSPATH_PROPERTY,
>>> Boolean.toString(false));
>>>        OpenEJB.init(initProps, new ServerFederation());
>>>        ejbServer.init(new Properties());
>>> 
>>> 
>>> 
>>> 
>> 
>> 
>> --
>> Shawn
>> 
> 
> 
> 
> -- 
> Shawn


Re: org.apache.openejb.config.NewLoaderLogic.callers() will return abstract classes which can't pass the validation logic in org.apache.openejb.config.rules.CheckClasses.check_hasEjbClass(EnterpriseBean)

Posted by Shawn Jiang <ge...@gmail.com>.
Hi devs,

Any ideas on this issue ?

On Sat, Apr 16, 2011 at 10:20 PM, Shawn Jiang <ge...@gmail.com> wrote:

> org.apache.openejb.config.NewLoaderLogic.callers() will return some callers
> and then use these callers to create a new ejbmodule.
>
> When there are abstract classes in the caller stacktrace,  the abstract
> classes will also be used to create the ejbmodule.      Because
> org.apache.openejb.config.rules.CheckClasses.check_hasEjbClass(EnterpriseBean)
> does not allow abstract class as an EJB class.    I've seen lots of geronimo
> ejb tck regression because of abstractDeclaredAsBean validation failures.
>   I think the abstract classes should be filtered out from the callers in
> NewLoaderLogic.callers().
>
> From the log,  seems this part of work is still ongoing.   Is there a
> better way in plan to handle this issue ?
>
>
> On Fri, Apr 8, 2011 at 9:30 AM, <db...@apache.org> wrote:
>
>> Author: dblevins
>> Date: Fri Apr  8 01:30:11 2011
>> New Revision: 1090081
>>
>> URL: http://svn.apache.org/viewvc?rev=1090081&view=rev
>> Log:
>> OpenEjbContainer and DeploymentLoader logic rewrite.  Midway through.
>>  Temporarily putting the very close but not quite working logic in
>> NewLoaderLogic
>> Some validation tweaks to print the module path in output messages
>> Tweaked 'null ejbClass' logic to use the right validation message (i had
>> added one when there was already one there).  Yanking the one I added.
>>
>> Added:
>>
>>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
>>   (with props)
>>
>>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
>>   (with props)
>> Modified:
>>
>>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
>>
>>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
>>
>>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java
>>
>>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
>>
>>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
>>
>>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java
>>
>>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java
>>
>>  openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
>>
>>  openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
>>
>>  openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java
>>
>>  openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java
>>
>>  openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java
>>
>>  openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java
>>
>> Modified:
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
>> URL:
>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>
>> ==============================================================================
>> ---
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
>> (original)
>> +++
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
>> Fri Apr  8 01:30:11 2011
>> @@ -696,7 +696,7 @@ public class Assembler extends Assembler
>>                 jndiEncBuilder.setUseCrossClassLoaderRef(false);
>>                 Context context =
>> jndiEncBuilder.build(JndiEncBuilder.JndiScope.comp);
>>
>> -                Debug.printContext(context);
>> +//                Debug.printContext(context);
>>
>>                 containerSystem.getJNDIContext().bind("openejb/client/" +
>> clientInfo.moduleId, context);
>>
>>
>> Modified:
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
>> URL:
>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>
>> ==============================================================================
>> ---
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
>> (original)
>> +++
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
>> Fri Apr  8 01:30:11 2011
>> @@ -1069,7 +1069,7 @@ public class AnnotationDeployer implemen
>>                 try {
>>                     clazz = classLoader.loadClass(ejbClassName);
>>                 } catch (ClassNotFoundException e) {
>> -                    fail(ejbName, "xml.missingEjbClass", ejbClassName);
>> +                    // Handled in CheckClasses.java along with other
>> missing classes
>>                     continue;
>>                 }
>>                 final AnnotationFinder finder = new AnnotationFinder(new
>> ClassesArchive(clazz));
>>
>> Modified:
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java
>> URL:
>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>
>> ==============================================================================
>> ---
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java
>> (original)
>> +++
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentFilterable.java
>> Fri Apr  8 01:30:11 2011
>> @@ -25,6 +25,8 @@ public interface DeploymentFilterable {
>>     static final String SEARCH_CLASSPATH_FOR_DEPLOYMENTS_PROPERTY =
>> DEPLOYMENTS_CLASSPATH_PROPERTY;
>>     static final String CLASSPATH_INCLUDE =
>> "openejb.deployments.classpath.include";
>>     static final String CLASSPATH_EXCLUDE =
>> "openejb.deployments.classpath.exclude";
>> +    static final String PACKAGE_INCLUDE =
>> "openejb.deployments.package.include";
>> +    static final String PACKAGE_EXCLUDE =
>> "openejb.deployments.package.exclude";
>>     static final String CLASSPATH_REQUIRE_DESCRIPTOR =
>> RequireDescriptors.PROPERTY;
>>     static final String CLASSPATH_FILTER_DESCRIPTORS =
>> "openejb.deployments.classpath.filter.descriptors";
>>     static final String CLASSPATH_FILTER_SYSTEMAPPS =
>> "openejb.deployments.classpath.filter.systemapps";
>>
>> Modified:
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
>> URL:
>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>
>> ==============================================================================
>> ---
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
>> (original)
>> +++
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
>> Fri Apr  8 01:30:11 2011
>> @@ -1269,7 +1269,7 @@ public class DeploymentLoader implements
>>             }
>>         }
>>
>> -        Class<? extends DeploymentModule> cls =
>> checkAnnotations(Arrays.asList(baseUrl), classLoader,
>> scanPotentialEjbModules, scanPotentialClientModules);
>> +        Class<? extends DeploymentModule> cls = checkAnnotations(baseUrl,
>> classLoader, scanPotentialEjbModules, scanPotentialClientModules);
>>         if (cls != null) return cls;
>>
>>         if (descriptors.containsKey("persistence.xml")) {
>> @@ -1279,7 +1279,7 @@ public class DeploymentLoader implements
>>         throw new UnknownModuleTypeException("Unknown module type: url=" +
>> baseUrl.toExternalForm());
>>     }
>>
>> -    private Class<? extends DeploymentModule>
>> checkAnnotations(Collection<URL> urls, ClassLoader classLoader, final
>> boolean scanPotentialEjbModules, final boolean scanPotentialClientModules) {
>> +    private Class<? extends DeploymentModule> checkAnnotations(URL urls,
>> ClassLoader classLoader, final boolean scanPotentialEjbModules, final
>> boolean scanPotentialClientModules) {
>>         Class<? extends DeploymentModule> cls = null;
>>         if (scanPotentialEjbModules || scanPotentialClientModules) {
>>             AnnotationFinder classFinder = new
>> AnnotationFinder(classLoader, urls);
>>
>> Modified:
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
>> URL:
>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>
>> ==============================================================================
>> ---
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
>> (original)
>> +++
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
>> Fri Apr  8 01:30:11 2011
>> @@ -16,26 +16,26 @@
>>  */
>>  package org.apache.openejb.config;
>>
>> -import static org.apache.openejb.util.URLs.toFile;
>> -
>>  import org.apache.openejb.config.sys.Deployments;
>>  import org.apache.openejb.config.sys.JaxbOpenejb;
>>  import org.apache.openejb.loader.FileUtils;
>> -import org.apache.openejb.loader.SystemInstance;
>>  import org.apache.openejb.loader.Options;
>> +import org.apache.openejb.loader.SystemInstance;
>>  import org.apache.openejb.util.Logger;
>>  import org.apache.xbean.finder.UrlSet;
>>
>>  import java.io.File;
>>  import java.io.IOException;
>> -import java.net.URL;
>>  import java.net.MalformedURLException;
>> +import java.net.URL;
>>  import java.util.ArrayList;
>>  import java.util.Collections;
>> +import java.util.EnumSet;
>>  import java.util.HashMap;
>>  import java.util.List;
>>  import java.util.Set;
>> -import java.util.EnumSet;
>> +
>> +import static org.apache.openejb.util.URLs.toFile;
>>
>>  /**
>>  * @version $Rev$ $Date$
>> @@ -314,6 +314,7 @@ public class DeploymentsResolver impleme
>>     }
>>
>>     private static UrlSet applyBuiltinExcludes(UrlSet urlSet) throws
>> MalformedURLException {
>> +
>>         urlSet = urlSet.exclude(".*/activation(-[\\d.]+)?.jar(!/)?");
>>         urlSet =
>> urlSet.exclude(".*/activeio-core(-[\\d.]+)?(-incubator)?.jar(!/)?");
>>         urlSet =
>> urlSet.exclude(".*/activemq-(core|ra)(-[\\d.]+)?.jar(!/)?");
>> @@ -378,7 +379,7 @@ public class DeploymentsResolver impleme
>>         return urlSet;
>>     }
>>
>> -    private static void processUrls(List<URL> urls, ClassLoader
>> classLoader, Set<RequireDescriptors> requireDescriptors, FileUtils base,
>> List<URL> jarList) {
>> +    public static void processUrls(List<URL> urls, ClassLoader
>> classLoader, Set<RequireDescriptors> requireDescriptors, FileUtils base,
>> List<URL> jarList) {
>>         for (URL url : urls) {
>>
>>             String urlProtocol = url.getProtocol();
>>
>> Added:
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
>> URL:
>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java?rev=1090081&view=auto
>>
>> ==============================================================================
>> ---
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
>> (added)
>> +++
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
>> Fri Apr  8 01:30:11 2011
>> @@ -0,0 +1,448 @@
>> +/**
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You under the Apache License, Version
>> 2.0
>> + * (the "License"); you may not use this file except in compliance with
>> + * the License.  You may obtain a copy of the License at
>> + *
>> + *     http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + *  Unless required by applicable law or agreed to in writing, software
>> + *  distributed under the License is distributed on an "AS IS" BASIS,
>> + *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>> + *  See the License for the specific language governing permissions and
>> + *  limitations under the License.
>> + */
>> +package org.apache.openejb.config;
>> +
>> +import org.apache.openejb.loader.FileUtils;
>> +import org.apache.openejb.loader.Options;
>> +import org.apache.openejb.loader.SystemInstance;
>> +import org.apache.openejb.util.Join;
>> +import org.apache.openejb.util.Logger;
>> +import org.apache.openejb.util.PerformanceTimer;
>> +import org.apache.openejb.util.URLs;
>> +import org.apache.xbean.finder.UrlSet;
>> +import org.apache.xbean.finder.archive.Archive;
>> +import org.apache.xbean.finder.archive.ClasspathArchive;
>> +import org.apache.xbean.finder.archive.FilteredArchive;
>> +import org.apache.xbean.finder.filter.Filter;
>> +import org.apache.xbean.finder.filter.Filters;
>> +import org.apache.xbean.finder.filter.IncludeExcludeFilter;
>> +import org.apache.xbean.finder.filter.PatternFilter;
>> +
>> +import java.io.File;
>> +import java.io.IOException;
>> +import java.net.MalformedURLException;
>> +import java.net.URL;
>> +import java.util.ArrayList;
>> +import java.util.Arrays;
>> +import java.util.Collections;
>> +import java.util.EnumSet;
>> +import java.util.HashSet;
>> +import java.util.Iterator;
>> +import java.util.LinkedHashSet;
>> +import java.util.List;
>> +import java.util.Set;
>> +
>> +/**
>> +* @version $Rev$ $Date$
>> +*/
>> +public class NewLoaderLogic {
>> +
>> +    private static final Logger logger = DeploymentLoader.logger;
>> +
>> +    public static UrlSet filterArchives(Filter filter, ClassLoader
>> classLoader, UrlSet urlSet) {
>> +
>> +        for (URL url : urlSet.getUrls()) {
>> +            for (Archive archive : ClasspathArchive.archives(classLoader,
>> url)) {
>> +
>> +                FilteredArchive filtered = new FilteredArchive(archive,
>> filter);
>> +
>> +                if (!filtered.iterator().hasNext()) {
>> +                    urlSet = urlSet.exclude(url);
>> +                }
>> +
>> +            }
>> +        }
>> +
>> +        return urlSet;
>> +    }
>> +
>> +    public static Set<String> callers() {
>> +
>> +        final Set<String> callers = new LinkedHashSet<String>();
>> +
>> +        final List<StackTraceElement> elements = new
>> ArrayList<StackTraceElement>(Arrays.asList(new
>> Exception().fillInStackTrace().getStackTrace()));
>> +
>> +        // Yank out everything until we find a known ENTRY point
>> +        // if we don't find one, so be it, this is only a convenience
>> +        {
>> +            // Entry points are the following:
>> +            Filter start =
>> Filters.classes("javax.ejb.embedded.EJBContainer",
>> "javax.naming.InitialContext");
>> +
>> +            Iterator<StackTraceElement> iterator = elements.iterator();
>> +            while (iterator.hasNext()) {
>> +                StackTraceElement element = iterator.next();
>> +                iterator.remove();
>> +
>> +                // If we haven't yet reached an entry point, just keep
>> going
>> +                if (!start.accept(element.getClassName())) continue;
>> +
>> +                // We found an entry point.
>> +                // Fast-forward past this class
>> +
>>  while(iterator.hasNext()&&element.getClassName().equals(iterator.next().getClassName()))
>> iterator.remove();
>> +
>> +                // Ok, we have iterated up to the calling user class, so
>> stop now
>> +                break;
>> +            }
>> +        }
>> +
>> +
>> +        // Now iterate till we find an END point
>> +        // We don't want any of the classes after that
>> +        {
>> +            Filter end = Filters.packages(
>> +                    "junit.",
>> +                    "org.junit.",
>> +                    "org.testng.",
>> +                    "org.apache.maven.",
>> +                    "org.eclipse.",
>> +                    "com.intellij."
>> +            );
>> +
>> +            // Everything between here and the end is part
>> +            // of the call chain in which we are interested
>> +            Iterator<StackTraceElement> iterator = elements.iterator();
>> +            while (iterator.hasNext()) {
>> +                StackTraceElement element = iterator.next();
>> +
>> +                if (end.accept(element.getClassName())) break;
>> +
>> +                callers.add(element.getClassName());
>> +            }
>> +        }
>> +
>> +        // We don't need this anymore
>> +        elements.clear();
>> +
>> +        // Finally filter out everything that we definitely don't want
>> +        {
>> +            Filter unwanted = Filters.packages(
>> +                    "java.",
>> +                    "javax.",
>> +                    "sun.reflect."
>> +            );
>> +
>> +            Iterator<String> classes = callers.iterator();
>> +            while (classes.hasNext()) {
>> +                if (unwanted.accept(classes.next())) classes.remove();
>> +            }
>> +        }
>> +
>> +
>> +        return callers;
>> +    }
>> +
>> +    public static UrlSet applyBuiltinExcludes(UrlSet urlSet) throws
>> MalformedURLException {
>> +
>> +        Filter filter = Filters.prefixes(
>> +                "XmlSchema-",
>> +                "activeio-",
>> +                "activemq-",
>> +                "antlr-",
>> +                "aopalliance-",
>> +                "avalon-framework-",
>> +                "axis-",
>> +                "axis2-",
>> +                "bcprov-",
>> +                "bsh-",
>> +                "catalina-",
>> +                "cglib-",
>> +                "commons-cli-",
>> +                "commons-codec-",
>> +                "commons-collections-",
>> +                "commons-dbcp-all-1.3-",
>> +                "commons-discovery-",
>> +                "commons-httpclient-",
>> +                "commons-io-",
>> +                "commons-lang-",
>> +                "commons-logging-",
>> +                "commons-logging-api-",
>> +                "commons-net-",
>> +                "commons-pool-",
>> +                "cssparser-",
>> +                "cxf-",
>> +                "deploy.jar",
>> +                "derby-",
>> +                "dom4j-",
>> +                "geronimo-",
>> +                "guice-",
>> +                "howl-",
>> +                "hsqldb-",
>> +                "htmlunit-",
>> +                "hibernate-",
>> +                "icu4j-",
>> +                "idb-",
>> +                "idea_rt.jar",
>> +                "jasypt-",
>> +                "javaee-",
>> +                "javassist-",
>> +                "javaws.jar",
>> +                "javax.",
>> +                "jaxb-",
>> +                "jaxp-",
>> +                "jboss-",
>> +                "jbossall-",
>> +                "jbosscx-",
>> +                "jbossjts-",
>> +                "jbosssx-",
>> +                "jcommander-",
>> +                "jetty-",
>> +                "jmdns-",
>> +                "jsp-api-",
>> +                "jsr299-",
>> +                "jsr311-",
>> +                "juli-",
>> +                "junit-",
>> +                "kahadb-",
>> +                "log4j-",
>> +                "logkit-",
>> +                "myfaces-",
>> +                "neethi-",
>> +                "nekohtml-",
>> +                "openjpa-",
>> +                "opensaml-",
>> +                "openwebbeans-",
>> +                "org.eclipse.",
>> +                "org.junit.",
>> +                "org.osgi.core-",
>> +                "quartz-",
>> +                "rmock-",
>> +                "saaj-",
>> +                "sac-",
>> +                "scannotation-",
>> +                "serializer-",
>> +                "serp-",
>> +                "servlet-api-",
>> +                "slf4j-",
>> +                "spring-",
>> +                "stax-api-",
>> +                "swizzle-",
>> +                "testng-",
>> +                "wsdl4j-",
>> +                "wss4j-",
>> +                "wstx-asl-",
>> +                "xalan-",
>> +                "xbean-",
>> +                "xercesImpl-",
>> +                "xml-apis-",
>> +                "xml-resolver-",
>> +                "xmlrpc-",
>> +                "xmlsec-",
>> +                "xmlunit-"
>> +        );
>> +
>> +        filter = Filters.optimize(filter, new
>> PatternFilter(".*/openejb-.*"));
>> +        List<URL> urls = urlSet.getUrls();
>> +        Iterator<URL> iterator = urls.iterator();
>> +        while (iterator.hasNext()) {
>> +            URL url = iterator.next();
>> +            File file = URLs.toFile(url);
>> +            String name = file.getName();
>> +//            System.out.println("JAR "+name);
>> +            if (filter.accept(name)) iterator.remove();
>> +        }
>> +
>> +
>> +
>> +        return new UrlSet(urls);
>> +    }
>> +
>> +    public static void _loadFromClasspath(FileUtils base, List<URL>
>> jarList, ClassLoader classLoader) {
>> +
>> +        PerformanceTimer timer = new PerformanceTimer();
>> +
>> +        timer.event("create filters");
>> +        Options options = SystemInstance.get().getOptions();
>> +        String include = "";
>> +        String exclude = "";
>> +        PatternFilter classpathInclude = new
>> PatternFilter(options.get(DeploymentFilterable.CLASSPATH_INCLUDE, ".*"));
>> +        PatternFilter classpathExclude = new
>> PatternFilter(options.get(DeploymentFilterable.CLASSPATH_EXCLUDE, ""));
>> +        IncludeExcludeFilter classpathFilter = new
>> IncludeExcludeFilter(classpathInclude, classpathExclude);
>> +
>> +
>> +        PatternFilter packageInclude = new
>> PatternFilter(options.get(DeploymentFilterable.PACKAGE_INCLUDE, ".*"));
>> +        PatternFilter packageExclude = new
>> PatternFilter(options.get(DeploymentFilterable.PACKAGE_EXCLUDE, ""));
>> +
>> +        IncludeExcludeFilter packageFilter;
>> +        if (classpathInclude.getPattern().pattern().equals(".*") &&
>> packageInclude.getPattern().pattern().equals(".*")) {
>> +
>> +            timer.event("callers");
>> +
>> +            Set<String> callers = callers();
>> +
>> +            timer.event("parse packages");
>> +
>> +            callers.size();
>> +
>> +            Set<String> packages = new HashSet<String>();
>> +            for (String caller : callers) {
>> +                String[] parts = caller.split("\\.");
>> +                if (parts.length > 2) {
>> +                    parts = new String[]{parts[0], parts[1]};
>> +                }
>> +                packages.add(Join.join(".", parts));
>> +            }
>> +
>> +            Filter includes = Filters.packages(packages.toArray(new
>> String[0]));
>> +
>> +            packageFilter = new IncludeExcludeFilter(includes,
>> packageExclude);
>> +
>> +        } else {
>> +
>> +            packageFilter = new IncludeExcludeFilter(packageInclude,
>> packageExclude);
>> +
>> +        }
>> +
>> +        timer.event("urlset");
>> +
>> +        Set<RequireDescriptors> requireDescriptors =
>> options.getAll(DeploymentFilterable.CLASSPATH_REQUIRE_DESCRIPTOR,
>> RequireDescriptors.CLIENT);
>> +        boolean filterDescriptors =
>> options.get(DeploymentFilterable.CLASSPATH_FILTER_DESCRIPTORS, false);
>> +        boolean filterSystemApps =
>> options.get(DeploymentFilterable.CLASSPATH_FILTER_SYSTEMAPPS, true);
>> +
>> +        try {
>> +            UrlSet urlSet = new UrlSet(classLoader);
>> +
>> +            timer.event("exclude system urls");
>> +            urlSet =
>> urlSet.exclude(ClassLoader.getSystemClassLoader().getParent());
>> +            urlSet = urlSet.excludeJavaExtDirs();
>> +            urlSet = urlSet.excludeJavaEndorsedDirs();
>> +            urlSet = urlSet.excludeJavaHome();
>> +            urlSet =
>> urlSet.excludePaths(System.getProperty("sun.boot.class.path", ""));
>> +            urlSet = urlSet.exclude(".*/JavaVM.framework/.*");
>> +
>> +
>> +            timer.event("classpath filter");
>> +
>> +            UrlSet beforeFiltering = urlSet;
>> +
>> +            urlSet = urlSet.filter(classpathFilter);
>> +
>> +
>> +            // If the user filtered out too much, that's a problem
>> +            if (urlSet.size() == 0) {
>> +                final String message = String.format("Classpath
>> Include/Exclude resulted in zero URLs.  There were %s possible URLs before
>> filtering and 0 after: include=\"%s\", exclude=\"%s\"",
>> beforeFiltering.size(), include, exclude);
>> +                logger.error(message);
>> +                logger.info("Eligible Classpath before filtering:");
>> +
>> +                for (URL url : beforeFiltering) {
>> +                    logger.info(String.format("   %s",
>> url.toExternalForm()));
>> +                }
>> +//                throw new IllegalStateException(message);
>> +
>> +            }
>> +
>> +            // If they are the same size, than nothing was filtered
>> +            // and we know the user did not take action to change the
>> default
>> +            final boolean userSuppliedClasspathFilter =
>> beforeFiltering.size() != urlSet.size();
>> +
>> +            if (!userSuppliedClasspathFilter) {
>> +
>> +                logger.info("Applying buildin classpath excludes");
>> +                timer.event("buildin excludes");
>> +                urlSet = applyBuiltinExcludes(urlSet);
>> +
>> +            }
>> +
>> +            DeploymentsResolver.processUrls(urlSet.getUrls(),
>> classLoader, EnumSet.allOf(RequireDescriptors.class), base, jarList);
>> +
>> +
>> +            timer.event("package filter");
>> +
>> +            urlSet = filterArchives(packageFilter, classLoader, urlSet);
>> +
>> +            timer.event("process urls");
>> +
>> +            // we should exclude system apps before and apply user
>> properties after
>> +//            if (filterSystemApps){
>> +//                urlSet =
>> urlSet.exclude(".*/openejb-[^/]+(.(jar|ear|war)(!/)?|/target/(test-)?classes/?)");
>> +//            }
>> +
>> +            List<URL> urls = urlSet.getUrls();
>> +            int size = urls.size();
>> +//            if (size == 0) {
>> +//                logger.warning("No classpath URLs matched.  Current
>> settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " + CLASSPATH_INCLUDE
>> + "='" + include + "'");
>> +//                return;
>> +//            } else if (size == 0 && (!filterDescriptors &&
>> prefiltered.getUrls().size() == 0)) {
>> +//                return;
>> +//            } else if (size < 20) {
>> +//                logger.debug("Inspecting classpath for applications: "
>> + urls.size() + " urls.");
>> +//            } else {
>> +//                // Has the user allowed some module types to be
>> discoverable via scraping?
>> +//                boolean willScrape = requireDescriptors.size() <
>> RequireDescriptors.values().length;
>> +//
>> +//                if (size < 50 && willScrape) {
>> +//                    logger.info("Inspecting classpath for
>> applications: " + urls.size() + " urls. Consider adjusting your
>> exclude/include.  Current settings: " + CLASSPATH_EXCLUDE + "='" + exclude +
>> "', " + CLASSPATH_INCLUDE + "='" + include + "'");
>> +//                } else if (willScrape) {
>> +//                    logger.warning("Inspecting classpath for
>> applications: " + urls.size() + " urls.");
>> +//                    logger.warning("ADJUST THE EXCLUDE/INCLUDE!!!.
>>  Current settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " +
>> CLASSPATH_INCLUDE + "='" + include + "'");
>> +//                }
>> +//            }
>> +
>> +            long begin = System.currentTimeMillis();
>> +            DeploymentsResolver.processUrls(urls, classLoader,
>> requireDescriptors, base, jarList);
>> +            long end = System.currentTimeMillis();
>> +            long time = end - begin;
>> +
>> +            timer.stop(System.out);
>> +
>> +            UrlSet unchecked = new UrlSet();
>> +//            if (!filterDescriptors){
>> +//                unchecked = prefiltered.exclude(urlSet);
>> +//                if (filterSystemApps){
>> +//                    unchecked =
>> unchecked.exclude(".*/openejb-[^/]+(.(jar|ear|war)(./)?|/target/classes/?)");
>> +//                }
>> +                DeploymentsResolver.processUrls(unchecked.getUrls(),
>> classLoader, EnumSet.allOf(RequireDescriptors.class), base, jarList);
>> +//            }
>> +
>> +            if (logger.isDebugEnabled()) {
>> +                int urlCount = urlSet.getUrls().size() +
>> unchecked.getUrls().size();
>> +                logger.debug("URLs after filtering: "+ urlCount);
>> +                for (URL url : urlSet.getUrls()) {
>> +                    logger.debug("Annotations path: " + url);
>> +                }
>> +                for (URL url : unchecked.getUrls()) {
>> +                    logger.debug("Descriptors path: " + url);
>> +                }
>> +            }
>> +
>> +            if (urls.size() == 0) return;
>> +
>> +            if (time < 1000) {
>> +                logger.debug("Searched " + urls.size() + " classpath urls
>> in " + time + " milliseconds.  Average " + (time / urls.size()) + "
>> milliseconds per url.");
>> +            } else if (time < 4000 || urls.size() < 3) {
>> +                logger.info("Searched " + urls.size() + " classpath urls
>> in " + time + " milliseconds.  Average " + (time / urls.size()) + "
>> milliseconds per url.");
>> +            } else if (time < 10000) {
>> +                logger.warning("Searched " + urls.size() + " classpath
>> urls in " + time + " milliseconds.  Average " + (time / urls.size()) + "
>> milliseconds per url.");
>> +                logger.warning("Consider adjusting your " +
>> DeploymentFilterable.CLASSPATH_EXCLUDE + " and " +
>> DeploymentFilterable.CLASSPATH_INCLUDE + " settings.  Current settings:
>> exclude='" + exclude + "', include='" + include + "'");
>> +            } else {
>> +                logger.fatal("Searched " + urls.size() + " classpath urls
>> in " + time + " milliseconds.  Average " + (time / urls.size()) + "
>> milliseconds per url.  TOO LONG!");
>> +                logger.fatal("ADJUST THE EXCLUDE/INCLUDE!!!.  Current
>> settings: " + DeploymentFilterable.CLASSPATH_EXCLUDE + "='" + exclude + "',
>> " + DeploymentFilterable.CLASSPATH_INCLUDE + "='" + include + "'");
>> +                List<String> list = new ArrayList<String>();
>> +                for (URL url : urls) {
>> +                    list.add(url.toExternalForm());
>> +                }
>> +                Collections.sort(list);
>> +                for (String url : list) {
>> +                    logger.info("Matched: " + url);
>> +                }
>> +            }
>> +        } catch (IOException e1) {
>> +            e1.printStackTrace();
>> +            logger.warning("Unable to search classpath for modules:
>> Received Exception: " + e1.getClass().getName() + " " + e1.getMessage(),
>> e1);
>> +        }
>> +
>> +    }
>> +}
>>
>> Propchange:
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/NewLoaderLogic.java
>>
>> ------------------------------------------------------------------------------
>>    svn:eol-style = native
>>
>> Modified:
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java
>> URL:
>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>
>> ==============================================================================
>> ---
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java
>> (original)
>> +++
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ReportValidationResults.java
>> Fri Apr  8 01:30:11 2011
>> @@ -102,7 +102,8 @@ public class ReportValidationResults imp
>>
>>         if (context.hasErrors() || context.hasFailures()) {
>>
>> -            logger.error("Invalid
>> "+context.getModuleType()+"(path="+context.getName()+")");
>> +            DeploymentModule module = context.getModule();
>> +            logger.error(String.format("Invalid %s(name=%s, path=%s)",
>> context.getModuleType(), module.getModuleId(), module.getFile()));
>>  //            logger.error("Validation: "+errors.length + " errors,
>> "+failures.length+ " failures, in
>> "+context.getModuleType()+"(path="+context.getJarPath()+")");
>>         } else if (context.hasWarnings()) {
>>             if (context.getWarnings().length == 1) {
>>
>> Modified:
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java
>> URL:
>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>
>> ==============================================================================
>> ---
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java
>> (original)
>> +++
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/ValidationContext.java
>> Fri Apr  8 01:30:11 2011
>> @@ -45,6 +45,10 @@ public class ValidationContext implement
>>         this.name = null;
>>     }
>>
>> +    public DeploymentModule getModule() {
>> +        return module;
>> +    }
>> +
>>     public void fail(String component, String key, Object... details) {
>>         ValidationFailure failure = new ValidationFailure(key);
>>         failure.setDetails(details);
>>
>> Modified:
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
>> URL:
>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>
>> ==============================================================================
>> ---
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
>> (original)
>> +++
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/rules/CheckClasses.java
>> Fri Apr  8 01:30:11 2011
>> @@ -74,6 +74,9 @@ public class CheckClasses extends Valida
>>             try {
>>                 Class<?> beanClass = check_hasEjbClass(bean);
>>
>> +                // All the subsequent checks require the bean class
>> +                if (beanClass == null) continue;
>> +
>>                 if (!(bean instanceof RemoteBean)) continue;
>>                 RemoteBean b = (RemoteBean) bean;
>>
>> @@ -208,8 +211,10 @@ public class CheckClasses extends Valida
>>
>>         String ejbName = b.getEjbName();
>>
>> -        Class<?> beanClass = lookForClass(b.getEjbClass(), "<ejb-class>",
>> ejbName);
>> +        Class<?> beanClass = lookForClass(b.getEjbClass(), "ejb-class",
>> ejbName);
>>
>> +        if (beanClass == null) return null;
>> +
>>         if (beanClass.isInterface()){
>>             fail(ejbName, "interfaceDeclaredAsBean", beanClass.getName());
>>         }
>>
>> Added:
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
>> URL:
>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java?rev=1090081&view=auto
>>
>> ==============================================================================
>> ---
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
>> (added)
>> +++
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
>> Fri Apr  8 01:30:11 2011
>> @@ -0,0 +1,73 @@
>> +/**
>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>> + * contributor license agreements.  See the NOTICE file distributed with
>> + * this work for additional information regarding copyright ownership.
>> + * The ASF licenses this file to You under the Apache License, Version
>> 2.0
>> + * (the "License"); you may not use this file except in compliance with
>> + * the License.  You may obtain a copy of the License at
>> + *
>> + *     http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + *  Unless required by applicable law or agreed to in writing, software
>> + *  distributed under the License is distributed on an "AS IS" BASIS,
>> + *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>> + *  See the License for the specific language governing permissions and
>> + *  limitations under the License.
>> + */
>> +package org.apache.openejb.util;
>> +
>> +import org.apache.openejb.config.DeploymentsResolver;
>> +
>> +import java.io.PrintStream;
>> +import java.util.concurrent.TimeUnit;
>> +
>> +/**
>> +* @version $Rev$ $Date$
>> +*/
>> +public class PerformanceTimer {
>> +
>> +    protected Start start;
>> +    private Event event;
>> +
>> +    public PerformanceTimer() {
>> +        event = start = new Start();
>> +    }
>> +
>> +    public void event(String event) {
>> +        this.event = new Event(this.event, event);
>> +    }
>> +
>> +    public void stop(PrintStream out) {
>> +        Event event = new Event(this.event, "stop");
>> +        this.event.stop(event, out);
>> +        start.stop(event, out);
>> +    }
>> +
>> +    private class Event {
>> +        protected final long start = System.nanoTime();
>> +        private final Event previous;
>> +        private final String description;
>> +
>> +        private Event(Event previous, String description) {
>> +            this.previous = previous;
>> +            this.description = description;
>> +        }
>> +
>> +        public void stop(Event next, PrintStream out) {
>> +            if (previous != PerformanceTimer.this.start)
>> previous.stop(this, out);
>> +            out.printf("%s  %s", TimeUnit.NANOSECONDS.toMillis(next.start
>> - this.start), this.description);
>> +            out.println();
>> +        }
>> +    }
>> +    private class Start extends Event {
>> +        private Start() {
>> +            super(null, "start");
>> +        }
>> +
>> +        @Override
>> +        public void stop(Event next, PrintStream out) {
>> +            out.printf("%s  %s", TimeUnit.NANOSECONDS.toMillis(next.start
>> - this.start), "total");
>> +            out.println();
>> +        }
>> +    }
>> +}
>>
>> Propchange:
>> openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/PerformanceTimer.java
>>
>> ------------------------------------------------------------------------------
>>    svn:eol-style = native
>>
>> Modified:
>> openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
>> URL:
>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties?rev=1090081&r1=1090080&r2=1090081&view=diff
>>
>> ==============================================================================
>> ---
>> openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
>> (original)
>> +++
>> openejb/trunk/openejb3/container/openejb-core/src/main/resources/org/apache/openejb/config/rules/Messages.properties
>> Fri Apr  8 01:30:11 2011
>> @@ -46,7 +46,7 @@
>>  # 1 - Element (home, ejb-class, remote)
>>  # 2 - Bean name
>>  1.missing.class           Missing class
>> -2.missing.class           Missing class {0}
>> +2.missing.class           Missing class <{1}> {0}
>>  3.missing.class           The class {0} not found. Check that the class
>> specified in the <{1}> element for bean {2} is spelled correctly and the
>> class is present in the jar
>>
>>  # 0 - Class name
>> @@ -860,7 +860,3 @@ public interface {0} extends {2}'{}'
>>  1.xml.noEjbClass = Element <ejb-class> unspecified.
>>  2.xml.noEjbClass = Element <ejb-class> unspecified.  No annotated bean
>> discovered with <ejb-name>{0}</ejb-name>
>>  3.xml.noEjbClass = The <ejb-class> element is only optional if there is a
>> matching annotated bean in the module with the bean name {0}.  No such bean
>> was found.  Other beans in this module are: {1}
>> -
>> -1.xml.missingEjbClass = Specified <ejb-class> not found.
>> -2.xml.missingEjbClass = Specified <ejb-class> not found {0}
>> -3.xml.missingEjbClass = The <ejb-class> element specifies a class that
>> cannot be found.  The {0} class should be in the module with the ejb-jar.xml
>> or in a shared library
>>
>> Modified:
>> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java
>> URL:
>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>
>> ==============================================================================
>> ---
>> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java
>> (original)
>> +++
>> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/BasicSpringTest.java
>> Fri Apr  8 01:30:11 2011
>> @@ -22,6 +22,7 @@ import org.springframework.context.suppo
>>
>>  public class BasicSpringTest extends TestCase {
>>     public void test() throws Exception {
>> +
>>  System.setProperty("openejb.deployments.classpath.include",".*/spring-integration.*");
>>         ClassPathXmlApplicationContext context = new
>> ClassPathXmlApplicationContext("org/apache/openejb/spring/test.xml");
>>         assertTrue(context.getBeanDefinitionCount() > 0);
>>
>>
>> Modified:
>> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java
>> URL:
>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>
>> ==============================================================================
>> ---
>> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java
>> (original)
>> +++
>> openejb/trunk/openejb3/container/openejb-spring/src/test/java/org/apache/openejb/spring/SpringTest.java
>> Fri Apr  8 01:30:11 2011
>> @@ -34,7 +34,10 @@ import org.springframework.context.suppo
>>
>>  public class SpringTest extends TestCase {
>>     public void test() throws Exception {
>> +
>>  System.setProperty("openejb.deployments.classpath.include",".*/openejb-spring.*");
>> +
>>         ClassPathXmlApplicationContext context = new
>> ClassPathXmlApplicationContext("org/apache/openejb/spring/spring.xml");
>> +
>>         assertTrue(context.getBeanDefinitionCount() > 0);
>>
>>         //
>>
>> Modified:
>> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java
>> URL:
>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>
>> ==============================================================================
>> ---
>> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java
>> (original)
>> +++
>> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/AuthTest.java
>> Fri Apr  8 01:30:11 2011
>> @@ -17,6 +17,7 @@
>>  package org.apache.openejb;
>>
>>  import junit.framework.TestCase;
>> +import org.apache.openejb.config.DeploymentsResolver;
>>  import org.apache.openejb.server.ejbd.EjbServer;
>>  import org.apache.openejb.server.ServiceDaemon;
>>  import org.apache.openejb.core.ServerFederation;
>> @@ -35,8 +36,7 @@ public class AuthTest extends TestCase {
>>         EjbServer ejbServer = new EjbServer();
>>
>>         Properties initProps = new Properties();
>> -        initProps.setProperty("openejb.deployments.classpath.include",
>> "");
>> -
>>  initProps.setProperty("openejb.deployments.classpath.filter.descriptors",
>> "true");
>> +        initProps.put(DeploymentsResolver.DEPLOYMENTS_CLASSPATH_PROPERTY,
>> Boolean.toString(false));
>>         OpenEJB.init(initProps, new ServerFederation());
>>         ejbServer.init(new Properties());
>>
>>
>> Modified:
>> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java
>> URL:
>> http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java?rev=1090081&r1=1090080&r2=1090081&view=diff
>>
>> ==============================================================================
>> ---
>> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java
>> (original)
>> +++
>> openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/JndiTest.java
>> Fri Apr  8 01:30:11 2011
>> @@ -17,6 +17,7 @@
>>  package org.apache.openejb;
>>
>>  import junit.framework.TestCase;
>> +import org.apache.openejb.config.DeploymentsResolver;
>>  import org.apache.openejb.server.ejbd.EjbServer;
>>  import org.apache.openejb.server.ServiceDaemon;
>>  import org.apache.openejb.core.ServerFederation;
>> @@ -47,8 +48,7 @@ public class JndiTest extends TestCase {
>>         EjbServer ejbServer = new EjbServer();
>>
>>         Properties initProps = new Properties();
>> -        initProps.setProperty("openejb.deployments.classpath.include",
>> "");
>> -
>>  initProps.setProperty("openejb.deployments.classpath.filter.descriptors",
>> "true");
>> +        initProps.put(DeploymentsResolver.DEPLOYMENTS_CLASSPATH_PROPERTY,
>> Boolean.toString(false));
>>         OpenEJB.init(initProps, new ServerFederation());
>>         ejbServer.init(new Properties());
>>
>>
>>
>>
>
>
> --
> Shawn
>



-- 
Shawn