org.jboss.weld.module.ejb.InternalEjbDescriptor Maven / Gradle / Ivy
/*
* 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 extends ForwardingEjbDescriptor {
static InternalEjbDescriptor of(EjbDescriptor ejbDescriptor) {
if (ejbDescriptor instanceof InternalEjbDescriptor>) {
return cast(ejbDescriptor);
}
return new InternalEjbDescriptor(ejbDescriptor);
}
private final Class> objectInterface;
private final EjbDescriptor delegate;
private final Collection removeMethodSignatures;
private final Set> localBusinessInterfaces;
private final Set> remoteBusinessInterfaces;
private InternalEjbDescriptor(EjbDescriptor ejbDescriptor) {
this.delegate = ejbDescriptor;
this.objectInterface = findObjectInterface(ejbDescriptor.getLocalBusinessInterfaces());
removeMethodSignatures = new ArrayList();
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> transformToClasses(Collection> interfaceDescriptors) {
if (interfaceDescriptors == null) {
return Collections.emptySet();
}
return interfaceDescriptors.stream().map(d -> d.getInterface()).collect(ImmutableSet.collector());
}
@Override
public EjbDescriptor delegate() {
return delegate;
}
public Class> getObjectInterface() {
return objectInterface;
}
public Collection getRemoveMethodSignatures() {
return removeMethodSignatures;
}
private static Class> findObjectInterface(Collection> interfaces) {
if (interfaces != null && !interfaces.isEmpty()) {
return interfaces.iterator().next().getInterface();
} else {
return null;
}
}
public Set> getLocalBusinessInterfacesAsClasses() {
return localBusinessInterfaces;
}
public Set> getRemoteBusinessInterfacesAsClasses() {
return remoteBusinessInterfaces;
}
public Class extends T> getImplementationClass() {
if (delegate instanceof SubclassedComponentDescriptor) {
SubclassedComponentDescriptor descriptor = Reflections.> cast(delegate);
Class extends T> implementationClass = descriptor.getComponentSubclass();
if (implementationClass != null) {
return implementationClass;
}
}
return delegate.getBeanClass();
}
}