Package org.jboss.weld.tests.bootstrap.index.processAnnotatedType.type

Source Code of org.jboss.weld.tests.bootstrap.index.processAnnotatedType.type.VerifyingExtension

/*
* JBoss, Home of Professional Open Source
* Copyright 2013, Red Hat, Inc., and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* Licensed 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.jboss.weld.tests.bootstrap.index.processAnnotatedType.type;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.AfterBeanDiscovery;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.BeforeBeanDiscovery;
import javax.enterprise.inject.spi.Extension;
import javax.enterprise.inject.spi.ObserverMethod;

import org.jboss.weld.bean.builtin.BeanManagerProxy;
import org.jboss.weld.bootstrap.FastProcessAnnotatedTypeResolver;
import org.jboss.weld.bootstrap.api.ServiceRegistry;
import org.jboss.weld.bootstrap.events.ProcessAnnotatedTypeEventResolvable;
import org.jboss.weld.bootstrap.events.RequiredAnnotationDiscovery;
import org.jboss.weld.event.GlobalObserverNotifierService;
import org.jboss.weld.event.ObserverNotifier;
import org.jboss.weld.resolution.Resolvable;
import org.jboss.weld.resources.ClassTransformer;
import org.jboss.weld.resources.spi.ClassFileServices;
import org.junit.Assert;

public class VerifyingExtension implements Extension {

    private ObserverNotifier notifier;
    private FastProcessAnnotatedTypeResolver resolver;
    private RequiredAnnotationDiscovery discovery;
    private ClassTransformer transformer;
    private boolean initialized;
    private ClassFileServices classFileServices;

    void init(@Observes BeforeBeanDiscovery event, BeanManager manager) throws Exception {
        ServiceRegistry services = BeanManagerProxy.unwrap(manager).getServices();
        this.classFileServices = services.get(ClassFileServices.class);
        this.resolver = new FastProcessAnnotatedTypeResolver(services.get(GlobalObserverNotifierService.class).getAllObserverMethods());
        this.notifier = BeanManagerProxy.unwrap(manager).getGlobalLenientObserverNotifier();
        this.discovery = services.get(RequiredAnnotationDiscovery.class);
        this.transformer = services.get(ClassTransformer.class);
    }

    void test(@Observes AfterBeanDiscovery event) {
        compareResult(Alpha1Interface.class);
        compareResult(Alpha2Interface.class);
        compareResult(AlphaAbstract.class);
        compareResult(AlphaImpl.class);
        initialized = true;
    }

    private void compareResult(Class<?> javaClass) {
        @SuppressWarnings({ "rawtypes", "unchecked" })
        Set<?> expected = new HashSet(resolve(javaClass));
        Set<?> actual = resolver.resolveProcessAnnotatedTypeObservers(classFileServices, javaClass.getName());
        if (!expected.equals(actual)) {
            Set<?> notResolved = new HashSet<Object>(expected);
            notResolved.removeAll(actual);
            Set<?> notExpected = new HashSet<Object>(actual);
            notExpected.removeAll(expected);
            Assert.fail("Resolved observer mismatch for " + javaClass + ". Expected but not resolved: " + notResolved + ". Resolved but not expected: " + notExpected);
        }
    }

    private <T> List<ObserverMethod<? super T>> resolve(Class<?> javaClass) {
        Resolvable resolvable = ProcessAnnotatedTypeEventResolvable.forProcessAnnotatedType(transformer.getBackedAnnotatedType(javaClass, "foo"), discovery);
        return notifier.<T>resolveObserverMethods(resolvable);
    }

    public boolean isInitialized() {
        return initialized;
    }
}
TOP

Related Classes of org.jboss.weld.tests.bootstrap.index.processAnnotatedType.type.VerifyingExtension

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.