// no pa found, this is not a process application deployment.
return null;
} else if(processApplicationAnnotations.size() > 1) {
// found multiple PAs -> unsupported.
throw new DeploymentUnitProcessingException("Detected multiple classes annotated with @" + ProcessApplication.class.getSimpleName()
+ ". A deployment must only provide a single @" + ProcessApplication.class.getSimpleName()
+ " class.");
} else {
// found single PA
AnnotationInstance annotationInstance = processApplicationAnnotations.get(0);
ClassInfo paClassInfo = (ClassInfo) annotationInstance.target();
String paClassName = paClassInfo.name().toString();
ComponentDescription paComponent = null;
// it can either be a Servlet Process Application or a Singleton Session Bean Component or
if(servletProcessApplications.contains(paClassInfo)) {
// Servlet Process Applications can only be deployed inside Web Applications
if(warMetaData == null) {
throw new DeploymentUnitProcessingException("@ProcessApplication class is a ServletProcessApplication but deployment is not a Web Application.");
}
// check whether it's already a servlet context listener:
JBossWebMetaData mergedJBossWebMetaData = warMetaData.getMergedJBossWebMetaData();
List<ListenerMetaData> listeners = mergedJBossWebMetaData.getListeners();
if(listeners == null) {
listeners = new ArrayList<ListenerMetaData>();
mergedJBossWebMetaData.setListeners(listeners);
}
boolean isListener = false;
for (ListenerMetaData listenerMetaData : listeners) {
if(listenerMetaData.getListenerClass().equals(paClassInfo.name().toString())) {
isListener = true;
}
}
if(!isListener) {
// register as Servlet Context Listener
ListenerMetaData listener = new ListenerMetaData();
listener.setListenerClass(paClassName);
listeners.add(listener);
// synthesize WebComponent
WebComponentDescription paWebComponent = new WebComponentDescription(paClassName,
paClassName,
eeModuleDescription,
deploymentUnit.getServiceName(),
eeApplicationClasses);
eeModuleDescription.addComponent(paWebComponent);
deploymentUnit.getAttachment(WebAttachments.WEB_COMPONENT_INSTANTIATORS).put(paWebComponent.getComponentClassName(), new WebComponentInstantiator(deploymentUnit, paWebComponent));
paComponent = paWebComponent;
} else {
// lookup the existing component
paComponent = eeModuleDescription.getComponentsByClassName(paClassName).get(0);
}
// deactivate sci
} else {
// if its not a ServletProcessApplication it must be a session bean component
List<ComponentDescription> componentsByClassName = eeModuleDescription.getComponentsByClassName(paClassName);
if (!componentsByClassName.isEmpty() && (componentsByClassName.get(0) instanceof SessionBeanComponentDescription)) {
paComponent = componentsByClassName.get(0);
} else {
throw new DeploymentUnitProcessingException("Class " + paClassName + " is annotated with @" + ProcessApplication.class.getSimpleName()
+ " but is neither a ServletProcessApplication nor an EJB Session Bean Component.");
}
}
// attach additional metadata to the deployment unit
if(!postDeployAnnnotations.isEmpty()) {
if(postDeployAnnnotations.size()==1) {
ProcessApplicationAttachments.attachPostDeployDescription(deploymentUnit, postDeployAnnnotations.get(0));
} else {
throw new DeploymentUnitProcessingException("There can only be a single method annotated with @PostDeploy. Found ["+postDeployAnnnotations+"]");
}
}
if(!preUndeployAnnnotations.isEmpty()) {
if(preUndeployAnnnotations.size()==1) {
ProcessApplicationAttachments.attachPreUndeployDescription(deploymentUnit, preUndeployAnnnotations.get(0));
} else {
throw new DeploymentUnitProcessingException("There can only be a single method annotated with @PreUndeploy. Found ["+preUndeployAnnnotations+"]");
}
}
return paComponent;
}