}
AnnotatedElementHandler aeHandler =
ainfo.getProcessingContext().getHandler();
if (aeHandler != null && aeHandler instanceof EjbContext) {
EjbContext context = (EjbContext)aeHandler;
EjbDescriptor desc = (EjbDescriptor) context.getDescriptor();
if (isValidEjbDescriptor(desc, annotation)) {
return getDefaultProcessedResult();
} else {
log(Level.SEVERE, ainfo,
localStrings.getLocalString(
"enterprise.deployment.annotation.handlers.notcompsuperclass",
"The annotation symbol defined in super-class is not compatible with {0} ejb {1}.",
new Object[] { desc.getType(), desc.getName() }));
return getDefaultFailedResult();
}
} else if (aeHandler == null || !(aeHandler instanceof EjbBundleContext)) {
return getInvalidAnnotatedElementHandlerResult(
ainfo.getProcessingContext().getHandler(), ainfo);
}
EjbBundleContext ctx = (EjbBundleContext)aeHandler;
if (logger.isLoggable(Level.FINE)) {
logger.fine("My context is " + ctx);
}
String elementName = getAnnotatedName(annotation);
if (elementName.length() == 0) {
elementName = ejbClass.getSimpleName();
}
EjbBundleDescriptorImpl currentBundle = (EjbBundleDescriptorImpl) ctx.getDescriptor();
EjbDescriptor ejbDesc = null;
try {
ejbDesc = currentBundle.getEjbByName(elementName);
} catch(IllegalArgumentException ex) {
//getEjbByName throws IllegalArgumentException when no ejb is found
}
if (ejbDesc != null && !(ejbDesc instanceof DummyEjbDescriptor) ) {
// element has already been defined in the standard DDs,
// overriding rules applies
if (logger.isLoggable(Level.FINE)) {
logger.fine("Overriding rules apply for " + ejbClass.getName());
}
// don't allow ejb-jar.xml overwrite ejb type
if (!isValidEjbDescriptor(ejbDesc, annotation)) {
// this is an error
log(Level.SEVERE, ainfo,
localStrings.getLocalString(
"enterprise.deployment.annotation.handlers.wrongejbtype",
"Wrong annotation symbol for ejb {0}",
new Object[] { ejbDesc }));
return getDefaultFailedResult();
}
// <ejb-class> is optional if a component-defining
// annotation is used. If present, <ejb-class> element
// must match the class on which the component defining annotation
// appears.
String descriptorEjbClass = ejbDesc.getEjbClassName();
if( descriptorEjbClass == null ) {
ejbDesc.setEjbClassName(ejbClass.getName());
ejbDesc.applyDefaultClassToLifecycleMethods();
} else if( !descriptorEjbClass.equals(ejbClass.getName()) ) {
log(Level.SEVERE, ainfo,
localStrings.getLocalString(
"enterprise.deployment.annotation.handlers.ejbclsmismatch",
"",
new Object[] { descriptorEjbClass, elementName,
ejbClass.getName() }));
return getDefaultFailedResult();
}
} else {
if (logger.isLoggable(Level.FINE)) {
logger.fine("Creating a new descriptor for "
+ ejbClass.getName());
}
EjbDescriptor dummyEjbDesc = ejbDesc;
ejbDesc = createEjbDescriptor(elementName, ainfo);
// create the actual ejb descriptor using annotation info and
// the information from dummy ejb descriptor if applicable