try {
clazz = classLoader.loadClass(bean.getEjbClass());
} catch (ClassNotFoundException e) {
throw new OpenEJBException("Unable to load bean class: " + bean.getEjbClass(), e);
}
ClassFinder classFinder = new ClassFinder(clazz);
ClassFinder inheritedClassFinder = createInheritedClassFinder(clazz);
processCallbacks(bean, inheritedClassFinder);
if (bean.getTransactionType() == null) {
TransactionManagement tx = clazz.getAnnotation(TransactionManagement.class);
TransactionManagementType transactionType = TransactionManagementType.CONTAINER;
if (tx != null) {
transactionType = tx.value();
}
switch (transactionType) {
case BEAN:
bean.setTransactionType(TransactionType.BEAN);
break;
case CONTAINER:
bean.setTransactionType(TransactionType.CONTAINER);
break;
}
}
AssemblyDescriptor assemblyDescriptor = ejbModule.getEjbJar().getAssemblyDescriptor();
if (assemblyDescriptor == null) {
assemblyDescriptor = new AssemblyDescriptor();
ejbModule.getEjbJar().setAssemblyDescriptor(assemblyDescriptor);
}
if (bean.getTransactionType() == TransactionType.CONTAINER) {
Map<String, List<MethodTransaction>> methodTransactions = assemblyDescriptor.getMethodTransactions(ejbName);
// SET THE DEFAULT
if (!methodTransactions.containsKey("*")) {
TransactionAttribute attribute = clazz.getAnnotation(TransactionAttribute.class);
if (attribute != null) {
ContainerTransaction ctx = new ContainerTransaction(cast(attribute.value()), ejbName, "*");
assemblyDescriptor.getContainerTransaction().add(ctx);
}
}
List<Method> methods = classFinder.findAnnotatedMethods(TransactionAttribute.class);
for (Method method : methods) {
TransactionAttribute attribute = method.getAnnotation(TransactionAttribute.class);
if (!methodTransactions.containsKey(method.getName())) {
// no method with this name in descriptor
addContainerTransaction(attribute, ejbName, method, assemblyDescriptor);
} else {
// method name already declared
List<MethodTransaction> list = methodTransactions.get(method.getName());
for (MethodTransaction mtx : list) {
MethodParams methodParams = mtx.getMethodParams();
if (methodParams == null) {
// params not specified, so this is more specific
addContainerTransaction(attribute, ejbName, method, assemblyDescriptor);
} else {
List<String> params1 = methodParams.getMethodParam();
String[] params2 = asStrings(method.getParameterTypes());
if (params1.size() != params2.length) {
// params not the same
addContainerTransaction(attribute, ejbName, method, assemblyDescriptor);
} else {
for (int i = 0; i < params1.size(); i++) {
String a = params1.get(i);
String b = params2[i];
if (!a.equals(b)) {
// params not the same
addContainerTransaction(attribute, ejbName, method, assemblyDescriptor);
break;
}
}
}
}
}
}
}
}
RolesAllowed rolesAllowed = clazz.getAnnotation(RolesAllowed.class);
if (rolesAllowed != null) {
MethodPermission methodPermission = new MethodPermission();
methodPermission.getRoleName().addAll(Arrays.asList(rolesAllowed.value()));
methodPermission.getMethod().add(new org.apache.openejb.jee.Method(ejbName, "*"));
assemblyDescriptor.getMethodPermission().add(methodPermission);
}
for (Method method : classFinder.findAnnotatedMethods(RolesAllowed.class)) {
rolesAllowed = method.getAnnotation(RolesAllowed.class);
MethodPermission methodPermission = new MethodPermission();
methodPermission.getRoleName().addAll(Arrays.asList(rolesAllowed.value()));
methodPermission.getMethod().add(new org.apache.openejb.jee.Method(ejbName, method));
assemblyDescriptor.getMethodPermission().add(methodPermission);
}
PermitAll permitAll = clazz.getAnnotation(PermitAll.class);
if (permitAll != null) {
MethodPermission methodPermission = new MethodPermission();
methodPermission.setUnchecked(true);
methodPermission.getMethod().add(new org.apache.openejb.jee.Method(ejbName, "*"));
assemblyDescriptor.getMethodPermission().add(methodPermission);
}
for (Method method : classFinder.findAnnotatedMethods(PermitAll.class)) {
MethodPermission methodPermission = new MethodPermission();
methodPermission.setUnchecked(true);
methodPermission.getMethod().add(new org.apache.openejb.jee.Method(ejbName, method));
assemblyDescriptor.getMethodPermission().add(methodPermission);
}
for (Method method : classFinder.findAnnotatedMethods(DenyAll.class)) {
ExcludeList excludeList = assemblyDescriptor.getExcludeList();
excludeList.addMethod(new org.apache.openejb.jee.Method(ejbName, method));
}
RunAs runAs = clazz.getAnnotation(RunAs.class);
if (runAs != null && bean.getSecurityIdentity() == null) {
SecurityIdentity securityIdentity = new SecurityIdentity();
securityIdentity.setRunAs(runAs.value());
bean.setSecurityIdentity(securityIdentity);
}
DeclareRoles declareRoles = clazz.getAnnotation(DeclareRoles.class);
if (declareRoles != null && bean instanceof RemoteBean){
RemoteBean remoteBean = (RemoteBean) bean;
List<SecurityRoleRef> securityRoleRefs = remoteBean.getSecurityRoleRef();
for (String role : declareRoles.value()) {
securityRoleRefs.add(new SecurityRoleRef(role));
}
}
Interceptors interceptors = clazz.getAnnotation(Interceptors.class);
if (interceptors != null) {
EjbJar ejbJar = ejbModule.getEjbJar();
for (Class interceptor : interceptors.value()) {
if (ejbJar.getInterceptor(interceptor.getName()) == null) {
ejbJar.addInterceptor(new Interceptor(interceptor.getName()));
}
}
InterceptorBinding binding = new InterceptorBinding(bean);
assemblyDescriptor.getInterceptorBinding().add(0, binding);
for (Class interceptor : interceptors.value()) {
binding.getInterceptorClass().add(interceptor.getName());
}
}
for (Method method : classFinder.findAnnotatedMethods(Interceptors.class)) {
interceptors = method.getAnnotation(Interceptors.class);
if (interceptors != null) {
EjbJar ejbJar = ejbModule.getEjbJar();
for (Class interceptor : interceptors.value()) {
if (ejbJar.getInterceptor(interceptor.getName()) == null) {
ejbJar.addInterceptor(new Interceptor(interceptor.getName()));
}
}
InterceptorBinding binding = new InterceptorBinding(bean);
assemblyDescriptor.getInterceptorBinding().add(0, binding);
for (Class interceptor : interceptors.value()) {
binding.getInterceptorClass().add(interceptor.getName());
}
binding.setMethod(new NamedMethod(method));
}
}
ExcludeDefaultInterceptors excludeDefaultInterceptors = clazz.getAnnotation(ExcludeDefaultInterceptors.class);
if (excludeDefaultInterceptors != null) {
InterceptorBinding binding = assemblyDescriptor.addInterceptorBinding(new InterceptorBinding(bean));
binding.setExcludeDefaultInterceptors(true);
}
for (Method method : classFinder.findAnnotatedMethods(ExcludeDefaultInterceptors.class)) {
InterceptorBinding binding = assemblyDescriptor.addInterceptorBinding(new InterceptorBinding(bean));
binding.setExcludeDefaultInterceptors(true);
binding.setMethod(new NamedMethod(method));
}
ExcludeClassInterceptors excludeClassInterceptors = clazz.getAnnotation(ExcludeClassInterceptors.class);
if (excludeClassInterceptors != null) {
InterceptorBinding binding = assemblyDescriptor.addInterceptorBinding(new InterceptorBinding(bean));
binding.setExcludeClassInterceptors(true);
}
for (Method method : classFinder.findAnnotatedMethods(ExcludeClassInterceptors.class)) {
InterceptorBinding binding = assemblyDescriptor.addInterceptorBinding(new InterceptorBinding(bean));
binding.setExcludeClassInterceptors(true);
binding.setMethod(new NamedMethod(method));
}
if (bean instanceof RemoteBean) {
RemoteBean remoteBean = (RemoteBean) bean;
if (remoteBean.getHome() == null) {
RemoteHome remoteHome = clazz.getAnnotation(RemoteHome.class);
if (remoteHome != null) {
Class<?> homeClass = remoteHome.value();
try {
Method create = null;
for (Method method : homeClass.getMethods()) {
if (method.getName().startsWith("create")) {
create = method;
break;
}
}
if (create == null) throw new NoSuchMethodException("create");
Class<?> remoteClass = create.getReturnType();
remoteBean.setHome(homeClass.getName());
remoteBean.setRemote(remoteClass.getName());
} catch (NoSuchMethodException e) {
logger.error("Class annotated as a RemoteHome has no 'create()' method. Unable to determine remote interface type. Bean class: " + clazz.getName() + ", Home class: " + homeClass.getName());
}
}
}
if (remoteBean.getLocalHome() == null) {
LocalHome localHome = clazz.getAnnotation(LocalHome.class);
if (localHome != null) {
Class<?> homeClass = localHome.value();
try {
Method create = null;
for (Method method : homeClass.getMethods()) {
if (method.getName().startsWith("create")) {
create = method;
break;
}
}
if (create == null) throw new NoSuchMethodException("create");
Class<?> remoteClass = create.getReturnType();
remoteBean.setLocalHome(homeClass.getName());
remoteBean.setLocal(remoteClass.getName());
} catch (NoSuchMethodException e) {
logger.error("Class annotated as a LocalHome has no 'create()' method. Unable to determine remote interface type. Bean class: " + clazz.getName() + ", Home class: " + homeClass.getName());
}
}
}
if (remoteBean instanceof SessionBean) {
SessionBean sessionBean = (SessionBean) remoteBean;
// Anything declared in the xml is also not eligable
List<String> declared = new ArrayList<String>();
declared.addAll(sessionBean.getBusinessLocal());
declared.addAll(sessionBean.getBusinessRemote());
declared.add(sessionBean.getHome());
declared.add(sessionBean.getRemote());
declared.add(sessionBean.getLocalHome());
declared.add(sessionBean.getLocal());
declared.add(sessionBean.getServiceEndpoint());
List<Class<?>> interfaces = new ArrayList<Class<?>>();
for (Class<?> interfce : clazz.getInterfaces()) {
String name = interfce.getName();
if (!name.equals("java.io.Serializable") &&
!name.equals("java.io.Externalizable") &&
!name.startsWith("javax.ejb.") &&
!declared.contains(interfce.getName())) {
interfaces.add(interfce);
}
}
List<Class> remotes = new ArrayList<Class>();
Remote remote = clazz.getAnnotation(Remote.class);
if (remote != null) {
if (remote.value().length == 0) {
if (interfaces.size() != 1) {
validation.fail(ejbName, "ann.remote.noAttributes", join(", ", interfaces));
} else if (clazz.getAnnotation(Local.class) != null) {
validation.fail(ejbName, "ann.remoteLocal.ambiguous", join(", ", interfaces));
} else if (interfaces.get(0).getAnnotation(Local.class) != null) {
validation.fail(ejbName, "ann.remoteLocal.conflict", join(", ", interfaces));
} else {
validateRemoteInterface(interfaces.get(0), validation, ejbName);
remotes.add(interfaces.get(0));
interfaces.remove(0);
}
} else for (Class interfce : remote.value()) {
validateRemoteInterface(interfce, validation, ejbName);
remotes.add(interfce);
interfaces.remove(interfce);
}
}
List<Class> locals = new ArrayList<Class>();
Local local = clazz.getAnnotation(Local.class);
if (local != null) {
if (local.value().length == 0) {
if (interfaces.size() != 1) {
validation.fail(ejbName, "ann.local.noAttributes", join(", ", interfaces));
} else if (clazz.getAnnotation(Remote.class) != null) {
validation.fail(ejbName, "ann.localRemote.ambiguous", join(", ", interfaces));
} else if (interfaces.get(0).getAnnotation(Remote.class) != null) {
validation.fail(ejbName, "ann.localRemote.conflict", join(", ", interfaces));
} else {
validateLocalInterface(interfaces.get(0), validation, ejbName);
locals.add(interfaces.get(0));
interfaces.remove(0);
}
} else for (Class interfce : local.value()) {
validateLocalInterface(interfce, validation, ejbName);
locals.add(interfce);
interfaces.remove(interfce);
}
}
if (sessionBean.getServiceEndpoint() == null) {
WebService webService = clazz.getAnnotation(WebService.class);
if (webService != null) {
String endpointInterfaceName = webService.endpointInterface();
if (!endpointInterfaceName.equals("")){
try {
sessionBean.setServiceEndpoint(endpointInterfaceName);
Class endpointInterface = Class.forName(endpointInterfaceName, false, ejbModule.getClassLoader());
interfaces.remove(endpointInterface);
} catch (ClassNotFoundException e) {
throw new IllegalStateException("Class not found @WebService.endpointInterface: "+endpointInterfaceName, e);
}
} else {
sessionBean.setServiceEndpoint(DeploymentInfo.ServiceEndpoint.class.getName());
}
} else if (clazz.isAnnotationPresent(WebServiceProvider.class)) {
sessionBean.setServiceEndpoint(DeploymentInfo.ServiceEndpoint.class.getName());
}
}
for (Class interfce : copy(interfaces)) {
if (interfce.isAnnotationPresent(Remote.class)) {
remotes.add(interfce);
interfaces.remove(interfce);
} else {
locals.add(interfce);
interfaces.remove(interfce);
}
}
for (Class interfce : remotes) {
sessionBean.addBusinessRemote(interfce.getName());
}
for (Class interfce : locals) {
sessionBean.addBusinessLocal(interfce.getName());
}
}
}
if (bean instanceof MessageDrivenBean) {
MessageDrivenBean mdb = (MessageDrivenBean) bean;
MessageDriven messageDriven = clazz.getAnnotation(MessageDriven.class);
if (messageDriven != null) {
Class<?> interfce = messageDriven.messageListenerInterface();
if (interfce != null && !interfce.equals(Object.class)) {
if (!interfce.isInterface()) {
throw new OpenEJBException("MessageListenerInterface property of @MessageDriven is not an interface");
}
mdb.setMessagingType(interfce.getName());
}
javax.ejb.ActivationConfigProperty[] configProperties = messageDriven.activationConfig();
if (configProperties != null) {
ActivationConfig activationConfig = mdb.getActivationConfig();
if (activationConfig == null) {
activationConfig = new ActivationConfig();
mdb.setActivationConfig(activationConfig);
}
Properties properties = activationConfig.toProperties();
for (javax.ejb.ActivationConfigProperty property : configProperties) {
if (!properties.containsKey(property.propertyName())) {
activationConfig.addProperty(property.propertyName(), property.propertyValue());
}
}
}
if (mdb.getMessagingType() == null) {
List<Class<?>> interfaces = new ArrayList<Class<?>>();
for (Class<?> intf : clazz.getInterfaces()) {
String name = intf.getName();
if (!name.equals("java.io.Serializable") &&
!name.equals("java.io.Externalizable") &&
!name.startsWith("javax.ejb.")) {
interfaces.add(intf);
}
}
if (interfaces.size() != 1) {
String msg = "When annotating a bean class as @MessageDriven without declaring messageListenerInterface, the bean must implement exactly one interface, no more and no less. beanClass=" + clazz.getName() + " interfaces=";
for (Class<?> intf : interfaces) {
msg += intf.getName() + ", ";
}
throw new IllegalStateException(msg);
}
mdb.setMessagingType(interfaces.get(0).getName());
}
}
}
buildAnnotatedRefs(bean, inheritedClassFinder);
}
for (Interceptor interceptor : ejbModule.getEjbJar().getInterceptors()) {
Class<?> clazz = null;
try {
clazz = classLoader.loadClass(interceptor.getInterceptorClass());
} catch (ClassNotFoundException e) {
throw new OpenEJBException("Unable to load interceptor class: " + interceptor.getInterceptorClass(), e);
}
ClassFinder inheritedClassFinder = createInheritedClassFinder(clazz);
processCallbacks(interceptor, inheritedClassFinder);
buildAnnotatedRefs(interceptor, inheritedClassFinder);