/* * Copyright 2014 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jbpm.runtime.manager.impl.deploy; import java.io.ByteArrayInputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.drools.compiler.kie.builder.impl.InternalKieModule; import org.drools.compiler.kie.builder.impl.KieContainerImpl; import org.drools.compiler.kie.builder.impl.KieModuleKieProject; import org.kie.api.runtime.KieContainer; import org.kie.internal.runtime.conf.DeploymentDescriptor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DeploymentDescriptorManager { private static final Logger logger = LoggerFactory.getLogger(DeploymentDescriptorManager.class); private String defaultPU = "org.jbpm.persistence.jpa"; public DeploymentDescriptorManager() { } public DeploymentDescriptorManager(String defaultPU) { this.defaultPU = defaultPU; } public DeploymentDescriptor getDefaultDescriptor() { DeploymentDescriptor defaultDesc = null; URL defaultDescriptorLocation = getDefaultdescriptorlocation(); if (defaultDescriptorLocation != null) { try { logger.debug("Reading default descriptor from " + defaultDescriptorLocation); defaultDesc = DeploymentDescriptorIO.fromXml(defaultDescriptorLocation.openStream()); } catch (IOException e) { throw new RuntimeException("Unable to read default deployment descriptor from " + defaultDescriptorLocation, e); } } else { logger.debug("No descriptor found returning default instance"); defaultDesc = new DeploymentDescriptorImpl(defaultPU); } return defaultDesc; } public List<DeploymentDescriptor> getDeploymentDescriptorHierarchy(KieContainer kieContainer) { List<DeploymentDescriptor> descriptorHierarchy = new ArrayList<DeploymentDescriptor>(); InternalKieModule module = ((KieModuleKieProject) ((KieContainerImpl)kieContainer).getKieProject()).getInternalKieModule(); collectDeploymentDescriptors(module, descriptorHierarchy); // last is the default descriptor descriptorHierarchy.add(getDefaultDescriptor()); return descriptorHierarchy; } protected URL getDefaultdescriptorlocation() { String defaultDescriptorLocation = System.getProperty("org.kie.deployment.desc.location"); URL locationUrl = null; if (defaultDescriptorLocation != null) { if (defaultDescriptorLocation.startsWith("classpath:")) { String stripedLocation = defaultDescriptorLocation.replaceFirst("classpath:", ""); locationUrl = this.getClass().getResource(stripedLocation); if (locationUrl == null) { locationUrl = Thread.currentThread().getContextClassLoader().getResource(stripedLocation); } } else { try { locationUrl = new URL(defaultDescriptorLocation); } catch (MalformedURLException e) { locationUrl = this.getClass().getResource(defaultDescriptorLocation); if (locationUrl == null) { locationUrl = Thread.currentThread().getContextClassLoader().getResource(defaultDescriptorLocation); } } } } return locationUrl; } protected void collectDeploymentDescriptors(InternalKieModule kmodule, List<DeploymentDescriptor> descriptorHierarchy) { DeploymentDescriptor descriptor = getDescriptorFromKModule(kmodule); if (descriptor != null) { descriptorHierarchy.add(descriptor); } if (kmodule.getKieDependencies() != null) { Collection<InternalKieModule> depModules = kmodule.getKieDependencies().values(); for (InternalKieModule depModule : depModules) { collectDeploymentDescriptors(depModule, descriptorHierarchy); } } } protected DeploymentDescriptor getDescriptorFromKModule(InternalKieModule kmodule) { DeploymentDescriptor desc = null; if (kmodule.isAvailable(DeploymentDescriptor.META_INF_LOCATION)) { byte[] content = kmodule.getBytes(DeploymentDescriptor.META_INF_LOCATION); ByteArrayInputStream input = new ByteArrayInputStream(content); try { desc = DeploymentDescriptorIO.fromXml(input); } finally { try { input.close(); } catch (IOException e) { logger.debug("Error when closing stream of kie-deployment-descriptor.xml"); } } } return desc; } }