/* * JBoss, Home of Professional Open Source * Copyright 2008, 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.module.ejb; import static org.jboss.weld.util.reflection.Reflections.cast; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Set; import org.jboss.weld.annotated.enhanced.MethodSignature; import org.jboss.weld.annotated.enhanced.jlr.MethodSignatureImpl; import org.jboss.weld.ejb.spi.BusinessInterfaceDescriptor; import org.jboss.weld.ejb.spi.EjbDescriptor; import org.jboss.weld.ejb.spi.SubclassedComponentDescriptor; import org.jboss.weld.ejb.spi.helpers.ForwardingEjbDescriptor; import org.jboss.weld.util.collections.ImmutableSet; import org.jboss.weld.util.reflection.Reflections; /** * More powerful version of {@link EjbDescriptor} that exposes Maps for some * metadata. The {@link EjbDescriptor} to enhance should be passed to the * constructor * * @author Pete Muir */ class InternalEjbDescriptor<T> extends ForwardingEjbDescriptor<T> { static <T> InternalEjbDescriptor<T> of(EjbDescriptor<T> ejbDescriptor) { if (ejbDescriptor instanceof InternalEjbDescriptor<?>) { return cast(ejbDescriptor); } return new InternalEjbDescriptor<T>(ejbDescriptor); } private final Class<?> objectInterface; private final EjbDescriptor<T> delegate; private final Collection<MethodSignature> removeMethodSignatures; private final Set<Class<?>> localBusinessInterfaces; private final Set<Class<?>> remoteBusinessInterfaces; private InternalEjbDescriptor(EjbDescriptor<T> ejbDescriptor) { this.delegate = ejbDescriptor; this.objectInterface = findObjectInterface(ejbDescriptor.getLocalBusinessInterfaces()); removeMethodSignatures = new ArrayList<MethodSignature>(); if (ejbDescriptor.getRemoveMethods() != null) { for (Method method : ejbDescriptor.getRemoveMethods()) { removeMethodSignatures.add(new MethodSignatureImpl(method)); } } this.localBusinessInterfaces = transformToClasses(getLocalBusinessInterfaces()); this.remoteBusinessInterfaces = transformToClasses(getRemoteBusinessInterfaces()); } private static Set<Class<?>> transformToClasses(Collection<BusinessInterfaceDescriptor<?>> interfaceDescriptors) { if (interfaceDescriptors == null) { return Collections.emptySet(); } return interfaceDescriptors.stream().map(d -> d.getInterface()).collect(ImmutableSet.collector()); } @Override public EjbDescriptor<T> delegate() { return delegate; } public Class<?> getObjectInterface() { return objectInterface; } public Collection<MethodSignature> getRemoveMethodSignatures() { return removeMethodSignatures; } private static Class<?> findObjectInterface(Collection<BusinessInterfaceDescriptor<?>> interfaces) { if (interfaces != null && !interfaces.isEmpty()) { return interfaces.iterator().next().getInterface(); } else { return null; } } public Set<Class<?>> getLocalBusinessInterfacesAsClasses() { return localBusinessInterfaces; } public Set<Class<?>> getRemoteBusinessInterfacesAsClasses() { return remoteBusinessInterfaces; } public Class<? extends T> getImplementationClass() { if (delegate instanceof SubclassedComponentDescriptor) { SubclassedComponentDescriptor<T> descriptor = Reflections.<SubclassedComponentDescriptor<T>>cast(delegate); Class<? extends T> implementationClass = descriptor.getComponentSubclass(); if (implementationClass != null) { return implementationClass; } } return delegate.getBeanClass(); } }