/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jbpm.pvm.internal.ant; import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.zip.ZipInputStream; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.taskdefs.MatchingTask; import org.apache.tools.ant.types.FileSet; import org.jbpm.api.NewDeployment; import org.jbpm.api.ProcessEngine; import org.jbpm.api.RepositoryService; /** * ant task for deploying process files and business archives. */ public class JbpmDeployTask extends MatchingTask { String jbpmCfg = null; File file = null; List fileSets = new ArrayList(); boolean failOnError = true; public void execute() throws BuildException { Thread currentThread = Thread.currentThread(); ClassLoader originalClassLoader = currentThread.getContextClassLoader(); currentThread.setContextClassLoader(JbpmDeployTask.class.getClassLoader()); try { // get the ProcessEngineImpl ProcessEngine processEngine = AntHelper.getProcessEngine(jbpmCfg); // if attribute process is set, deploy that process file if (file!=null) { deployFile(processEngine, file); } // loop over all files that are specified in the filesets Iterator iter = fileSets.iterator(); while (iter.hasNext()) { FileSet fileSet = (FileSet) iter.next(); DirectoryScanner dirScanner = fileSet.getDirectoryScanner(getProject()); File baseDir = dirScanner.getBasedir(); String[] includedFiles = dirScanner.getIncludedFiles(); List excludedFiles = Arrays.asList(dirScanner.getExcludedFiles()); for (int i = 0; i < includedFiles.length; i++) { String fileName = includedFiles[i]; if (!excludedFiles.contains(fileName)) { File file = new File(baseDir, fileName); deployFile(processEngine, file); } } } } finally { currentThread.setContextClassLoader(originalClassLoader); } } protected void deployFile(ProcessEngine processEngine, File processFile) { RepositoryService repositoryService = processEngine.getRepositoryService(); NewDeployment deployment = repositoryService.createDeployment(); deployment.setName(processFile.getName()); deployment.setTimestamp(System.currentTimeMillis()); if (processFile.getName().endsWith(".xml")) { log("deploying process file "+processFile.getName()); deployment.addResourceFromFile(processFile); } else if (processFile.getName().endsWith("ar")) { log("deploying business archive "+processFile.getName()); try { FileInputStream fileInputStream = new FileInputStream(processFile); ZipInputStream zipInputStream = new ZipInputStream(fileInputStream); deployment.addResourcesFromZipInputStream(zipInputStream); } catch (Exception e) { throw new BuildException("couldn't read business archive "+processFile, e); } } else { throw new BuildException("unsupported extension: "+processFile+" Only .xml files and .*ar archives are supported"); } deployment.deploy(); } public void addFileset(FileSet fileSet) { this.fileSets.add(fileSet); } public void setJbpmCfg(String jbpmCfg) { this.jbpmCfg = jbpmCfg; } public void setFile(File file) { this.file = file; } public void setFailOnError(boolean failOnError) { this.failOnError = failOnError; } }