Search in sources :

Example 1 with ServletProcessApplication

use of org.camunda.bpm.application.impl.ServletProcessApplication 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;
    }
}
Also used : DeploymentUnitProcessingException(org.jboss.as.server.deployment.DeploymentUnitProcessingException) PostDeploy(org.camunda.bpm.application.PostDeploy) JBossWebMetaData(org.jboss.metadata.web.jboss.JBossWebMetaData) SessionBeanComponentDescription(org.jboss.as.ejb3.component.session.SessionBeanComponentDescription) ComponentDescription(org.jboss.as.ee.component.ComponentDescription) WebComponentDescription(org.jboss.as.web.common.WebComponentDescription) ServletProcessApplication(org.camunda.bpm.application.impl.ServletProcessApplication) PreUndeploy(org.camunda.bpm.application.PreUndeploy) CompositeIndex(org.jboss.as.server.deployment.annotation.CompositeIndex) WarMetaData(org.jboss.as.web.common.WarMetaData) ArrayList(java.util.ArrayList) ServletProcessApplication(org.camunda.bpm.application.impl.ServletProcessApplication) ProcessApplication(org.camunda.bpm.application.ProcessApplication) EEModuleDescription(org.jboss.as.ee.component.EEModuleDescription) WebComponentDescription(org.jboss.as.web.common.WebComponentDescription) EEApplicationClasses(org.jboss.as.ee.component.EEApplicationClasses) ListenerMetaData(org.jboss.metadata.web.spec.ListenerMetaData) ArrayList(java.util.ArrayList) List(java.util.List) SessionBeanComponentDescription(org.jboss.as.ejb3.component.session.SessionBeanComponentDescription) AnnotationInstance(org.jboss.jandex.AnnotationInstance) ClassInfo(org.jboss.jandex.ClassInfo)

Aggregations

ArrayList (java.util.ArrayList)1 List (java.util.List)1 PostDeploy (org.camunda.bpm.application.PostDeploy)1 PreUndeploy (org.camunda.bpm.application.PreUndeploy)1 ProcessApplication (org.camunda.bpm.application.ProcessApplication)1 ServletProcessApplication (org.camunda.bpm.application.impl.ServletProcessApplication)1 ComponentDescription (org.jboss.as.ee.component.ComponentDescription)1 EEApplicationClasses (org.jboss.as.ee.component.EEApplicationClasses)1 EEModuleDescription (org.jboss.as.ee.component.EEModuleDescription)1 SessionBeanComponentDescription (org.jboss.as.ejb3.component.session.SessionBeanComponentDescription)1 DeploymentUnitProcessingException (org.jboss.as.server.deployment.DeploymentUnitProcessingException)1 CompositeIndex (org.jboss.as.server.deployment.annotation.CompositeIndex)1 WarMetaData (org.jboss.as.web.common.WarMetaData)1 WebComponentDescription (org.jboss.as.web.common.WebComponentDescription)1 AnnotationInstance (org.jboss.jandex.AnnotationInstance)1 ClassInfo (org.jboss.jandex.ClassInfo)1 JBossWebMetaData (org.jboss.metadata.web.jboss.JBossWebMetaData)1 ListenerMetaData (org.jboss.metadata.web.spec.ListenerMetaData)1