/*
* 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);
}
}