use of org.camunda.bpm.application.ProcessApplication in project camunda-bpm-platform by camunda.
the class ProcessesXmlProcessor method getDeploymentDescriptors.
protected String[] getDeploymentDescriptors(DeploymentUnit deploymentUnit) throws DeploymentUnitProcessingException {
final ComponentDescription processApplicationComponent = ProcessApplicationAttachments.getProcessApplicationComponent(deploymentUnit);
final String paClassName = processApplicationComponent.getComponentClassName();
String[] deploymentDescriptorResourceNames = null;
Module module = deploymentUnit.getAttachment(MODULE);
Class<?> paClass = null;
try {
paClass = (Class<?>) module.getClassLoader().loadClass(paClassName);
} catch (ClassNotFoundException e) {
throw new DeploymentUnitProcessingException("Unable to load process application class '" + paClassName + "'.");
}
ProcessApplication annotation = paClass.getAnnotation(ProcessApplication.class);
if (annotation == null) {
deploymentDescriptorResourceNames = new String[] { PROCESSES_XML };
} else {
deploymentDescriptorResourceNames = annotation.deploymentDescriptors();
}
return deploymentDescriptorResourceNames;
}
use of org.camunda.bpm.application.ProcessApplication in project camunda-bpm-platform by camunda.
the class ProcessApplicationProcessor method detectExistingComponent.
/**
* Detect an existing {@link ProcessApplication} component.
*/
protected ComponentDescription detectExistingComponent(DeploymentUnit deploymentUnit) throws DeploymentUnitProcessingException {
final EEModuleDescription eeModuleDescription = deploymentUnit.getAttachment(Attachments.EE_MODULE_DESCRIPTION);
final EEApplicationClasses eeApplicationClasses = deploymentUnit.getAttachment(Attachments.EE_APPLICATION_CLASSES_DESCRIPTION);
final CompositeIndex compositeIndex = deploymentUnit.getAttachment(org.jboss.as.server.deployment.Attachments.COMPOSITE_ANNOTATION_INDEX);
final WarMetaData warMetaData = deploymentUnit.getAttachment(WarMetaData.ATTACHMENT_KEY);
// extract deployment metadata
List<AnnotationInstance> processApplicationAnnotations = null;
List<AnnotationInstance> postDeployAnnnotations = null;
List<AnnotationInstance> preUndeployAnnnotations = null;
Set<ClassInfo> servletProcessApplications = null;
if (compositeIndex != null) {
processApplicationAnnotations = compositeIndex.getAnnotations(DotName.createSimple(ProcessApplication.class.getName()));
postDeployAnnnotations = compositeIndex.getAnnotations(DotName.createSimple(PostDeploy.class.getName()));
preUndeployAnnnotations = compositeIndex.getAnnotations(DotName.createSimple(PreUndeploy.class.getName()));
servletProcessApplications = compositeIndex.getAllKnownSubclasses(DotName.createSimple(ServletProcessApplication.class.getName()));
} else {
return null;
}
if (processApplicationAnnotations.isEmpty()) {
// 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.addToAttachmentList(WebComponentDescription.WEB_COMPONENTS, paWebComponent.getStartServiceName());
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.");
}
}
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;
}
}
Aggregations