Search in sources :

Example 16 with AnnotationFinder

use of org.apache.xbean.finder.AnnotationFinder in project tomee by apache.

the class LocalBeanAnnotatedLocalTest method testWebServiceWithStateful.

@Keys({ @Key(value = "ann.local.forLocalBean", type = KeyType.WARNING) })
public AppModule testWebServiceWithStateful() {
    final EjbJar ejbJar = new EjbJar();
    ejbJar.addEnterpriseBean(new StatelessBean(LocalBeanLocal.class));
    final EjbModule ejbModule = new EjbModule(ejbJar);
    ejbModule.setFinder(new AnnotationFinder(new ClassesArchive(LocalBeanLocal.class)));
    return new AppModule(ejbModule);
}
Also used : AppModule(org.apache.openejb.config.AppModule) StatelessBean(org.apache.openejb.jee.StatelessBean) EjbModule(org.apache.openejb.config.EjbModule) ClassesArchive(org.apache.xbean.finder.archive.ClassesArchive) AnnotationFinder(org.apache.xbean.finder.AnnotationFinder) EjbJar(org.apache.openejb.jee.EjbJar)

Example 17 with AnnotationFinder

use of org.apache.xbean.finder.AnnotationFinder in project tomee by apache.

the class TomEEEmbeddedApplicationRunner method start.

public synchronized void start(final Class<?> marker, final Properties config, final String... args) throws Exception {
    if (started) {
        return;
    }
    ensureAppInit(marker);
    started = true;
    final Class<?> appClass = app.getClass();
    final AnnotationFinder finder = new AnnotationFinder(new ClassesArchive(ancestors(appClass)));
    // setup the container config reading class annotation, using a randome http port and deploying the classpath
    final Configuration configuration = new Configuration();
    final ContainerProperties props = appClass.getAnnotation(ContainerProperties.class);
    if (props != null) {
        final Properties runnerProperties = new Properties();
        for (final ContainerProperties.Property p : props.value()) {
            final String name = p.name();
            if (name.startsWith("tomee.embedded.application.runner.")) {
                // allow to tune the Configuration
                // no need to filter there since it is done in loadFromProperties()
                runnerProperties.setProperty(name.substring("tomee.embedded.application.runner.".length()), p.value());
            } else {
                configuration.property(name, StrSubstitutor.replaceSystemProperties(p.value()));
            }
        }
        if (!runnerProperties.isEmpty()) {
            configuration.loadFromProperties(runnerProperties);
        }
    }
    // overrides, note that some config are additive by design
    configuration.loadFromProperties(System.getProperties());
    final List<Method> annotatedMethods = finder.findAnnotatedMethods(org.apache.openejb.testing.Configuration.class);
    if (annotatedMethods.size() > 1) {
        throw new IllegalArgumentException("Only one @Configuration is supported: " + annotatedMethods);
    }
    for (final Method m : annotatedMethods) {
        final Object o = m.invoke(app);
        if (Properties.class.isInstance(o)) {
            final Properties properties = Properties.class.cast(o);
            if (configuration.getProperties() == null) {
                configuration.setProperties(new Properties());
            }
            configuration.getProperties().putAll(properties);
        } else {
            throw new IllegalArgumentException("Unsupported " + o + " for @Configuration");
        }
    }
    final Collection<org.apache.tomee.embedded.LifecycleTask> lifecycleTasks = new ArrayList<>();
    final Collection<Closeable> postTasks = new ArrayList<>();
    final LifecycleTasks tasks = appClass.getAnnotation(LifecycleTasks.class);
    if (tasks != null) {
        for (final Class<? extends org.apache.tomee.embedded.LifecycleTask> type : tasks.value()) {
            final org.apache.tomee.embedded.LifecycleTask lifecycleTask = type.newInstance();
            lifecycleTasks.add(lifecycleTask);
            postTasks.add(lifecycleTask.beforeContainerStartup());
        }
    }
    final Map<String, Field> ports = new HashMap<>();
    {
        Class<?> type = appClass;
        while (type != null && type != Object.class) {
            for (final Field f : type.getDeclaredFields()) {
                final RandomPort annotation = f.getAnnotation(RandomPort.class);
                final String value = annotation == null ? null : annotation.value();
                if (value != null && value.startsWith("http")) {
                    f.setAccessible(true);
                    ports.put(value, f);
                }
            }
            type = type.getSuperclass();
        }
    }
    if (ports.containsKey("http")) {
        configuration.randomHttpPort();
    }
    // at least after LifecycleTasks to inherit from potential states (system properties to get a port etc...)
    final Configurers configurers = appClass.getAnnotation(Configurers.class);
    if (configurers != null) {
        for (final Class<? extends Configurer> type : configurers.value()) {
            type.newInstance().configure(configuration);
        }
    }
    final Classes classes = appClass.getAnnotation(Classes.class);
    String context = classes != null ? classes.context() : "";
    context = !context.isEmpty() && context.startsWith("/") ? context.substring(1) : context;
    Archive archive = null;
    if (classes != null && classes.value().length > 0) {
        archive = new ClassesArchive(classes.value());
    }
    final Jars jars = appClass.getAnnotation(Jars.class);
    final List<URL> urls;
    if (jars != null) {
        final Collection<File> files = ApplicationComposers.findFiles(jars);
        urls = new ArrayList<>(files.size());
        for (final File f : files) {
            urls.add(f.toURI().toURL());
        }
    } else {
        urls = null;
    }
    final WebResource resources = appClass.getAnnotation(WebResource.class);
    if (resources != null && resources.value().length > 1) {
        throw new IllegalArgumentException("Only one docBase is supported for now using @WebResource");
    }
    String webResource = null;
    if (resources != null && resources.value().length > 0) {
        webResource = resources.value()[0];
    } else {
        final File webapp = new File("src/main/webapp");
        if (webapp.isDirectory()) {
            webResource = "src/main/webapp";
        }
    }
    if (config != null) {
        // override other config from annotations
        configuration.loadFromProperties(config);
    }
    final Container container = new Container(configuration);
    SystemInstance.get().setComponent(TomEEEmbeddedArgs.class, new TomEEEmbeddedArgs(args, null));
    SystemInstance.get().setComponent(LifecycleTaskAccessor.class, new LifecycleTaskAccessor(lifecycleTasks));
    container.deploy(new Container.DeploymentRequest(context, // call ClasspathSearcher that lazily since container needs to be started to not preload logging
    urls == null ? new DeploymentsResolver.ClasspathSearcher().loadUrls(Thread.currentThread().getContextClassLoader()).getUrls() : urls, webResource != null ? new File(webResource) : null, true, null, archive));
    for (final Map.Entry<String, Field> f : ports.entrySet()) {
        switch(f.getKey()) {
            case "http":
                setPortField(f.getKey(), f.getValue(), configuration, context, app);
                break;
            case "https":
                break;
            default:
                throw new IllegalArgumentException("port " + f.getKey() + " not yet supported");
        }
    }
    SystemInstance.get().addObserver(app);
    composerInject(app);
    final AnnotationFinder appFinder = new AnnotationFinder(new ClassesArchive(appClass));
    for (final Method mtd : appFinder.findAnnotatedMethods(PostConstruct.class)) {
        if (mtd.getParameterTypes().length == 0) {
            if (!mtd.isAccessible()) {
                mtd.setAccessible(true);
            }
            mtd.invoke(app);
        }
    }
    hook = new Thread() {

        @Override
        public void run() {
            // ensure to log errors but not fail there
            for (final Method mtd : appFinder.findAnnotatedMethods(PreDestroy.class)) {
                if (mtd.getParameterTypes().length == 0) {
                    if (!mtd.isAccessible()) {
                        mtd.setAccessible(true);
                    }
                    try {
                        mtd.invoke(app);
                    } catch (final IllegalAccessException e) {
                        throw new IllegalStateException(e);
                    } catch (final InvocationTargetException e) {
                        throw new IllegalStateException(e.getCause());
                    }
                }
            }
            try {
                container.close();
            } catch (final Exception e) {
                e.printStackTrace();
            }
            for (final Closeable c : postTasks) {
                try {
                    c.close();
                } catch (final IOException e) {
                    e.printStackTrace();
                }
            }
            postTasks.clear();
            app = null;
            try {
                SHUTDOWN_TASKS.remove(this);
            } catch (final Exception e) {
            // no-op: that's ok at that moment if not called manually
            }
        }
    };
    SHUTDOWN_TASKS.put(hook, hook);
}
Also used : FileArchive(org.apache.xbean.finder.archive.FileArchive) ClassesArchive(org.apache.xbean.finder.archive.ClassesArchive) Archive(org.apache.xbean.finder.archive.Archive) HashMap(java.util.HashMap) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Closeable(java.io.Closeable) ArrayList(java.util.ArrayList) WebResource(org.apache.openejb.testing.WebResource) ContainerProperties(org.apache.openejb.testing.ContainerProperties) DeploymentsResolver(org.apache.openejb.config.DeploymentsResolver) Classes(org.apache.openejb.testing.Classes) Method(java.lang.reflect.Method) InvocationTargetException(java.lang.reflect.InvocationTargetException) RandomPort(org.apache.openejb.testing.RandomPort) PreDestroy(javax.annotation.PreDestroy) File(java.io.File) HashMap(java.util.HashMap) ConcurrentMap(java.util.concurrent.ConcurrentMap) Map(java.util.Map) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) AnnotationFinder(org.apache.xbean.finder.AnnotationFinder) TomEEEmbeddedArgs(org.apache.tomee.embedded.component.TomEEEmbeddedArgs) ContainerProperties(org.apache.openejb.testing.ContainerProperties) Properties(java.util.Properties) URL(java.net.URL) Field(java.lang.reflect.Field) IOException(java.io.IOException) IOException(java.io.IOException) InvocationTargetException(java.lang.reflect.InvocationTargetException) ClassesArchive(org.apache.xbean.finder.archive.ClassesArchive) Jars(org.apache.openejb.testing.Jars)

Example 18 with AnnotationFinder

use of org.apache.xbean.finder.AnnotationFinder in project tomee by apache.

the class Container method deploy.

public Container deploy(final DeploymentRequest request) {
    final ClassLoader loader = Thread.currentThread().getContextClassLoader();
    final SystemInstance systemInstance = SystemInstance.get();
    String contextRoot = request.context == null ? "" : request.context;
    if (!contextRoot.isEmpty() && !contextRoot.startsWith("/")) {
        contextRoot = "/" + request.context;
    }
    File jarLocation = request.docBase == null || !request.docBase.isDirectory() ? fakeRootDir() : request.docBase;
    final WebModule webModule = new WebModule(new WebApp(), contextRoot, loader, jarLocation.getAbsolutePath(), contextRoot.replace("/", ""));
    if (request.docBase == null) {
        webModule.getProperties().put("fakeJarLocation", "true");
    }
    webModule.setUrls(request.jarList);
    webModule.setAddedUrls(Collections.<URL>emptyList());
    webModule.setRarUrls(Collections.<URL>emptyList());
    webModule.setScannableUrls(request.jarList);
    final AnnotationFinder finder;
    try {
        Filter filter = configuration.getClassesFilter();
        if (filter == null && (request.jarList.size() <= 4 || "true".equalsIgnoreCase(SystemInstance.get().getProperty("tomee.embedded.filter-container-classes")))) {
            filter = new ContainerClassesFilter(configuration.getProperties());
        }
        final Archive archive;
        if (request.archive == null) {
            archive = new WebappAggregatedArchive(webModule, request.jarList, // see org.apache.openejb.config.DeploymentsResolver.ClasspathSearcher.cleanUpUrlSet()
            filter);
        } else if (WebappAggregatedArchive.class.isInstance(request.archive)) {
            archive = request.archive;
        } else {
            archive = new WebappAggregatedArchive(request.archive, request.jarList);
        }
        finder = new FinderFactory.OpenEJBAnnotationFinder(archive).link();
        SystemInstance.get().fireEvent(new TomEEEmbeddedScannerCreated(finder));
        webModule.setFinder(finder);
    } catch (final Exception e) {
        throw new IllegalArgumentException(e);
    }
    final File beansXml = new File(request.docBase, "WEB-INF/beans.xml");
    if (beansXml.exists()) {
        // add it since it is not in the scanned path by default
        try {
            webModule.getAltDDs().put("beans.xml", beansXml.toURI().toURL());
        } catch (final MalformedURLException e) {
        // no-op
        }
    }
    // else no classpath finding since we'll likely find it
    DeploymentLoader.addBeansXmls(webModule);
    final AppModule app = new AppModule(loader, null);
    app.setStandloneWebModule();
    app.setStandaloneModule(true);
    app.setModuleId(webModule.getModuleId());
    try {
        final Map<String, URL> webDescriptors = DeploymentLoader.getWebDescriptors(jarLocation);
        if (webDescriptors.isEmpty()) {
            // likely so let's try to find them in the classpath
            final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            final Collection<String> metaDir = asList("META-INF/tomee/", "META-INF/");
            for (final String dd : asList("app-ctx.xml", "module.properties", "application.properties", "env-entries.properties", NewLoaderLogic.EXCLUSION_FILE, "web.xml", "ejb-jar.xml", "openejb-jar.xml", "validation.xml")) {
                if (Boolean.parseBoolean(SystemInstance.get().getProperty("tomee.embedded.descriptors.classpath." + dd + ".skip")) || webDescriptors.containsKey(dd)) {
                    continue;
                }
                for (final String meta : metaDir) {
                    final URL url = classLoader.getResource(meta + dd);
                    if (url != null) {
                        webDescriptors.put(dd, url);
                        break;
                    }
                }
            }
        }
        webDescriptors.remove("beans.xml");
        webModule.getAltDDs().putAll(webDescriptors);
        DeploymentLoader.addWebModule(webModule, app);
        DeploymentLoader.addWebModuleDescriptors(new File(webModule.getJarLocation()).toURI().toURL(), webModule, app);
    } catch (final Exception e) {
        throw new IllegalStateException(e);
    }
    if (!SystemInstance.isInitialized() || Boolean.parseBoolean(SystemInstance.get().getProperty("tomee.embedded.add-callers", "true"))) {
        addCallersAsEjbModule(loader, app, request.additionalCallers);
    }
    systemInstance.addObserver(new StandardContextCustomizer(configuration, webModule, request.keepClassloader));
    if (systemInstance.getComponent(AnnotationDeployer.FolderDDMapper.class) == null) {
        systemInstance.setComponent(AnnotationDeployer.FolderDDMapper.class, new AnnotationDeployer.FolderDDMapper() {

            @Override
            public File getDDFolder(final File dir) {
                try {
                    return isMaven(dir) || isGradle(dir) ? new File(request.docBase, "WEB-INF") : null;
                } catch (final RuntimeException re) {
                    // folder doesn't exist -> test is stopped which is expected
                    return null;
                }
            }

            private boolean isGradle(final File dir) {
                return dir.getName().equals("classes") && dir.getParentFile().getName().equals("target");
            }

            private boolean isMaven(final File dir) {
                return dir.getName().equals("main") && dir.getParentFile().getName().equals("classes") && dir.getParentFile().getParentFile().getName().equals("build");
            }
        });
    }
    try {
        final AppInfo appInfo = configurationFactory.configureApplication(app);
        systemInstance.getComponent(Assembler.class).createApplication(appInfo, loader);
    } catch (final Exception e) {
        throw new IllegalStateException(e);
    }
    return this;
}
Also used : TomEEEmbeddedScannerCreated(org.apache.tomee.embedded.event.TomEEEmbeddedScannerCreated) MalformedURLException(java.net.MalformedURLException) WebappAggregatedArchive(org.apache.openejb.config.WebappAggregatedArchive) Archive(org.apache.xbean.finder.archive.Archive) AppModule(org.apache.openejb.config.AppModule) ContainerClassesFilter(org.apache.openejb.util.ContainerClassesFilter) URL(java.net.URL) TomEERuntimeException(org.apache.tomee.catalina.TomEERuntimeException) SystemInstance(org.apache.openejb.loader.SystemInstance) WebModule(org.apache.openejb.config.WebModule) NamingException(javax.naming.NamingException) UndeployException(org.apache.openejb.UndeployException) LifecycleException(org.apache.catalina.LifecycleException) OpenEJBException(org.apache.openejb.OpenEJBException) NoSuchApplicationException(org.apache.openejb.NoSuchApplicationException) MalformedURLException(java.net.MalformedURLException) IOException(java.io.IOException) TomEERuntimeException(org.apache.tomee.catalina.TomEERuntimeException) WebAppInfo(org.apache.openejb.assembler.classic.WebAppInfo) AppInfo(org.apache.openejb.assembler.classic.AppInfo) AnnotationDeployer(org.apache.openejb.config.AnnotationDeployer) StandardContextCustomizer(org.apache.tomee.embedded.internal.StandardContextCustomizer) ContainerClassesFilter(org.apache.openejb.util.ContainerClassesFilter) Filter(org.apache.xbean.finder.filter.Filter) WebappAggregatedArchive(org.apache.openejb.config.WebappAggregatedArchive) Assembler(org.apache.openejb.assembler.classic.Assembler) File(java.io.File) AnnotationFinder(org.apache.xbean.finder.AnnotationFinder) WebApp(org.apache.openejb.jee.WebApp)

Aggregations

AnnotationFinder (org.apache.xbean.finder.AnnotationFinder)18 ClassesArchive (org.apache.xbean.finder.archive.ClassesArchive)13 URL (java.net.URL)6 AppModule (org.apache.openejb.config.AppModule)6 EjbModule (org.apache.openejb.config.EjbModule)6 EjbJar (org.apache.openejb.jee.EjbJar)6 Method (java.lang.reflect.Method)4 ArrayList (java.util.ArrayList)4 IAnnotationFinder (org.apache.xbean.finder.IAnnotationFinder)4 Archive (org.apache.xbean.finder.archive.Archive)4 FileArchive (org.apache.xbean.finder.archive.FileArchive)4 File (java.io.File)3 IOException (java.io.IOException)3 HashMap (java.util.HashMap)3 Map (java.util.Map)3 Test (org.junit.Test)3 Field (java.lang.reflect.Field)2 MalformedURLException (java.net.MalformedURLException)2 Iterator (java.util.Iterator)2 List (java.util.List)2