diff options
-rw-r--r-- | java/sca/modules/implementation-bpel-runtime/src/main/java/org/apache/tuscany/sca/implementation/bpel/ode/DeploymentWorkspace.java | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/java/sca/modules/implementation-bpel-runtime/src/main/java/org/apache/tuscany/sca/implementation/bpel/ode/DeploymentWorkspace.java b/java/sca/modules/implementation-bpel-runtime/src/main/java/org/apache/tuscany/sca/implementation/bpel/ode/DeploymentWorkspace.java new file mode 100644 index 0000000000..8553574aa9 --- /dev/null +++ b/java/sca/modules/implementation-bpel-runtime/src/main/java/org/apache/tuscany/sca/implementation/bpel/ode/DeploymentWorkspace.java @@ -0,0 +1,233 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.apache.tuscany.sca.implementation.bpel.ode; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLConnection; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.UUID; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.apache.tuscany.sca.implementation.bpel.BPELImplementation; + +/** + * + */ +public class DeploymentWorkspace { + private static final Logger logger = Logger.getLogger(DeploymentWorkspace.class.getName()); + + static final String DEPLOY_FILENAME = "deploy.xml"; + + private BPELImplementation implementation; + private File workingDir; + private File bpelFile; + + /** + * @param implementation + */ + public DeploymentWorkspace(BPELImplementation implementation) { + super(); + this.implementation = implementation; + this.workingDir = createWorkingDirectory(); + } + + /** + * @param implementation + */ + public DeploymentWorkspace(BPELImplementation implementation, File workingDir) { + super(); + this.implementation = implementation; + this.workingDir = workingDir; + if (this.workingDir == null) { + this.workingDir = createWorkingDirectory(); + } + } + + public File getCBPFile() throws IOException { + String name = getBPELFile().getName(); + int index = name.lastIndexOf('.'); + if (index != -1) { + name = name.substring(0, index); + } + return new File(workingDir, name + ".cbp"); + } + + public synchronized File getBPELFile() throws IOException { + if (bpelFile != null) { + String location = implementation.getProcessDefinition().getLocation(); + String fileName = implementation.getProcessDefinition().getURI(); + File file = new File(workingDir, fileName); + if (file.isFile()) { + bpelFile = file; + return file; + } + URL url = new URL(location); + this.bpelFile = copy(url, workingDir, fileName); + } + return bpelFile; + } + + /** + * Escape the space in URL string + * @param uri + * @return + */ + public static URI createURI(String uri) { + if (uri == null) { + return null; + } + if (uri.indexOf('%') != -1) { + // Avoid double-escaping + return URI.create(uri); + } + int index = uri.indexOf(':'); + String scheme = null; + String ssp = uri; + if (index != -1) { + scheme = uri.substring(0, index); + ssp = uri.substring(index + 1); + } + try { + return new URI(scheme, ssp, null); + } catch (URISyntaxException e) { + throw new IllegalArgumentException(e); + } + } + + /** + * Gets the File containing the BPEL process definition + * @return - the File object containing the BPEL process + */ + private static File getContainer(String location) { + try { + File theProcess = null; + URI locationURI = createURI(location); + String protocol = locationURI.getScheme(); + if ("file".equals(protocol)) { + theProcess = new File(locationURI); + } else if ("jar".equals(protocol) || "wsjar".equals(protocol) || "zip".equals(protocol)) { + String uri = locationURI.toString(); + // jar contribution + uri = uri.substring(protocol.length() + 1, uri.lastIndexOf("!/")); + locationURI = createURI(uri); + if ("file".equals(locationURI.getScheme())) { + theProcess = new File(locationURI); + } + } + return theProcess; + } catch (Exception e) { + logger.log(Level.SEVERE, "Exception converting BPEL file URL to an URI: " + location, e); + } // end try + return null; + } // end getBPELFile + + /** + * Gets the directory containing the BPEL process + * @return + */ + static File getDirectory(String location) { + File file = getContainer(location); + if (file == null) { + return null; + } + File theDir = file.getParentFile(); + return theDir; + } // end getDirectory + + public File getDeployFile() { + return new File(workingDir, DEPLOY_FILENAME); + } + + private static String getSystemProperty(final String name) { + return AccessController.doPrivileged(new PrivilegedAction<String>() { + public String run() { + return System.getProperty(name); + } + }); + } + + private File createWorkingDirectory() { + String tmpDir = getSystemProperty("java.io.tmpdir"); + File root = new File(tmpDir); + // Add user name as the prefix. For multiple users on the same Lunix, + // there will be permission issue if one user creates the .tuscany folder + // first under /tmp with no write permission for others. + String userName = getSystemProperty("user.name"); + if (userName != null) { + root = new File(root, userName); + } + root = new File(root, ".tuscany/bpel/" + UUID.randomUUID().toString()); + if (logger.isLoggable(Level.FINE)) { + logger.fine("BPEL working directory: " + root); + } + return root; + } + + public static File copy(URL url, File directory, String fileName) throws IOException { + File file = new File(directory, fileName); + file.getParentFile().mkdirs(); + FileOutputStream os = new FileOutputStream(file); + URLConnection connection = url.openConnection(); + connection.setUseCaches(false); + InputStream is = connection.getInputStream(); + byte[] buf = new byte[8192]; + while (true) { + int size = is.read(buf); + if (size < 0) + break; + os.write(buf, 0, size); + } + is.close(); + os.close(); + return file; + } + + private static boolean deleteFiles(File file) { + boolean result = true; + if (file.isFile()) { + if (!file.delete()) { + result = false; + } + } else if (file.isDirectory()) { + for (File f : file.listFiles()) { + if (!deleteFiles(f)) { + result = false; + } + } + if (!file.delete()) { + result = false; + } + } + return result; + } + + public boolean delete() { + return deleteFiles(workingDir); + } + +} |