예제 #1
0
  /**
   * @param mBeanName
   * @param mBeanInstance
   * @param mBeanClassHierarchy
   * @param target
   * @param componentInstantiator
   * @param duServiceName the deployment unit's service name
   */
  MBeanServices(
      final String mBeanName,
      final Object mBeanInstance,
      final List<ClassReflectionIndex<?>> mBeanClassHierarchy,
      final ServiceTarget target,
      ServiceComponentInstantiator componentInstantiator,
      final ServiceName duServiceName) {
    if (mBeanClassHierarchy == null) {
      throw SarMessages.MESSAGES.nullVar("mBeanName");
    }
    if (mBeanInstance == null) {
      throw SarMessages.MESSAGES.nullVar("mBeanInstance");
    }
    if (target == null) {
      throw SarMessages.MESSAGES.nullVar("target");
    }

    final Method createMethod =
        ReflectionUtils.getMethod(mBeanClassHierarchy, CREATE_METHOD_NAME, NO_ARGS, false);
    final Method destroyMethod =
        ReflectionUtils.getMethod(mBeanClassHierarchy, DESTROY_METHOD_NAME, NO_ARGS, false);
    createDestroyService =
        new CreateDestroyService(
            mBeanInstance, createMethod, destroyMethod, componentInstantiator, duServiceName);
    createDestroyServiceName = ServiceNameFactory.newCreateDestroy(mBeanName);
    createDestroyServiceBuilder = target.addService(createDestroyServiceName, createDestroyService);
    if (componentInstantiator != null) {
      // the service that starts the EE component needs to start first
      createDestroyServiceBuilder.addDependency(
          componentInstantiator.getComponentStartServiceName());
    }

    final Method startMethod =
        ReflectionUtils.getMethod(mBeanClassHierarchy, START_METHOD_NAME, NO_ARGS, false);
    final Method stopMethod =
        ReflectionUtils.getMethod(mBeanClassHierarchy, STOP_METHOD_NAME, NO_ARGS, false);
    startStopService = new StartStopService(mBeanInstance, startMethod, stopMethod, duServiceName);
    startStopServiceName = ServiceNameFactory.newStartStop(mBeanName);
    startStopServiceBuilder = target.addService(startStopServiceName, startStopService);
    startStopServiceBuilder.addDependency(createDestroyServiceName);

    this.mBeanName = mBeanName;
    this.target = target;
    this.duServiceName = duServiceName;
  }
  /**
   * Process a deployment for jboss-service.xml files. Will parse the xml file and attach a
   * configuration discovered during processing.
   *
   * @param phaseContext the deployment unit context
   * @throws DeploymentUnitProcessingException
   */
  public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {

    final VirtualFile deploymentRoot =
        phaseContext.getDeploymentUnit().getAttachment(Attachments.DEPLOYMENT_ROOT).getRoot();

    if (deploymentRoot == null || !deploymentRoot.exists()) return;

    VirtualFile serviceXmlFile = null;
    if (deploymentRoot.isDirectory()) {
      serviceXmlFile = deploymentRoot.getChild(SERVICE_DESCRIPTOR_PATH);
    } else if (deploymentRoot
        .getName()
        .toLowerCase(Locale.ENGLISH)
        .endsWith(SERVICE_DESCRIPTOR_SUFFIX)) {
      serviceXmlFile = deploymentRoot;
    }
    if (serviceXmlFile == null || !serviceXmlFile.exists()) return;

    final XMLMapper xmlMapper = XMLMapper.Factory.create();
    final JBossServiceXmlDescriptorParser jBossServiceXmlDescriptorParser =
        new JBossServiceXmlDescriptorParser(
            JBossDescriptorPropertyReplacement.propertyReplacer(phaseContext.getDeploymentUnit()));
    xmlMapper.registerRootElement(
        new QName("urn:jboss:service:7.0", "server"), jBossServiceXmlDescriptorParser);
    xmlMapper.registerRootElement(new QName(null, "server"), jBossServiceXmlDescriptorParser);

    InputStream xmlStream = null;
    try {
      xmlStream = serviceXmlFile.openStream();
      final XMLStreamReader reader = inputFactory.createXMLStreamReader(xmlStream);
      final ParseResult<JBossServiceXmlDescriptor> result =
          new ParseResult<JBossServiceXmlDescriptor>();
      xmlMapper.parseDocument(result, reader);
      final JBossServiceXmlDescriptor xmlDescriptor = result.getResult();
      if (xmlDescriptor != null)
        phaseContext
            .getDeploymentUnit()
            .putAttachment(JBossServiceXmlDescriptor.ATTACHMENT_KEY, xmlDescriptor);
      else throw SarMessages.MESSAGES.failedXmlParsing(serviceXmlFile);
    } catch (Exception e) {
      throw SarMessages.MESSAGES.failedXmlParsing(e, serviceXmlFile);
    } finally {
      VFSUtils.safeClose(xmlStream);
    }
  }