War Util
/*
* Copyright 2005-2010 the original author or authors.
* 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 sdloader.util;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Properties;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
/**
* WarUtil
*
* @author c9katayama
*/
public class WarUtil {
//private static SDLoaderLog log = SDLoaderLogFactory.getLog(WarUtil.class);
private static final String LAST_MODIFIED_FILE = ".warlastmodified";
/**
* War?????????
*
* @param warFileName
* @return
*/
public static String getArchiveName(final String warFileName) {
return warFileName.substring(0, warFileName.length() - ".war".length());
}
private static long readLastModifiled(File file) {
if (file.exists()) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
return Long.valueOf(reader.readLine());
} catch (Exception e) {
// log.debug(e.getMessage(), e);
}
}
return 0;
}
private static void writeLastModifiled(File file, long time) {
BufferedWriter writer = null;
try {
if (!file.exists()) {
file.createNewFile();
}
writer = new BufferedWriter(new FileWriter(file));
writer.write(Long.toString(time));
writer.flush();
} catch (Exception e) {
}
}
/**
* WAR???????????
*
* @param warFile
* @param directory
* @throws IOException
*/
public static void extractWar(File warFile, File directory)
throws IOException {
try {
long timestamp = warFile.lastModified();
File warModifiedTimeFile = new File(directory, LAST_MODIFIED_FILE);
long lastModified = readLastModifiled(warModifiedTimeFile);
if (timestamp == lastModified) {
// log.info("war file " + warFile.getName() + " not modified.");
return;
}
if (directory.exists()) {
// IOUtil.forceRemoveDirectory(directory);
directory.mkdir();
}
// log.info("war extract start. warfile=" + warFile.getName());
JarInputStream jin = new JarInputStream(new BufferedInputStream(
new FileInputStream(warFile)));
JarEntry entry = null;
while ((entry = jin.getNextJarEntry()) != null) {
File file = new File(directory, entry.getName());
if (entry.isDirectory()) {
if (!file.exists()) {
file.mkdirs();
}
} else {
File dir = new File(file.getParent());
if (!dir.exists()) {
dir.mkdirs();
}
FileOutputStream fout = null;
try {
fout = new FileOutputStream(file);
ResourceUtil.copyStream(jin, fout);
} finally {
fout.flush();
fout.close();
fout = null;
}
if (entry.getTime() >= 0) {
file.setLastModified(entry.getTime());
}
}
}
writeLastModifiled(warModifiedTimeFile, timestamp);
//log.info("war extract success. lastmodified=" + timestamp);
} catch (IOException ioe) {
//log.info("war extract fail.");
throw ioe;
}
}
}
class ResourceUtil {
private static final int DEFAULT_BUFFER_SIZE = 16 * 1024;
private static final String SLASH = "/";
private static final String FILE_PROTOCOL = "file";
public static String stripFirstProtocolPart(String path) {
return path.substring(path.indexOf(":") + 1, path.length());
}
public static String stripExtension(String value) {
int dot = value.lastIndexOf(".");
if (dot >= 0) {
value = value.substring(0, dot);
}
return value;
}
public static URL createURL(final String url) {
try {
return new URL(url);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
public static URL createURL(final URL baseURL, String relativeURL) {
try {
String protocol = baseURL.getProtocol();
relativeURL = relativeURL.replace("\\", SLASH);
// TODO
if (protocol.startsWith(FILE_PROTOCOL)) {
if (relativeURL.startsWith(SLASH)) {
relativeURL = relativeURL
.substring(1, relativeURL.length());
}
return new URL(baseURL, relativeURL);
} else {
// TODO
String baseArchivePath = baseURL.toExternalForm();
if (baseArchivePath.endsWith(SLASH)) {
baseArchivePath = baseArchivePath.substring(0,
baseArchivePath.length() - 1);
}
if (baseArchivePath.endsWith("!")) {
baseArchivePath = baseArchivePath.substring(0,
baseArchivePath.length() - 1);
}
if (!relativeURL.startsWith(SLASH)) {
relativeURL = SLASH + relativeURL;
}
return new URL(baseArchivePath + "!" + relativeURL);
}
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
public static boolean isAbsoluteURL(String url) {
return (url.indexOf(":/") != -1);
}
public static boolean isResourceExist(URL resource) {
if (resource.getProtocol().equals(FILE_PROTOCOL)) {
try {
File file = new File(resource.toURI());
return file.exists();
} catch (URISyntaxException e) {
return false;
}
}
InputStream is = null;
try {
is = resource.openStream();
return (is != null);
} catch (Exception ioe) {
return false;
}
}
public static boolean isFileResource(URL resource) {
return !resource.toExternalForm().endsWith(SLASH);
}
public static boolean isDirectoryResource(URL resource) {
return resource.toExternalForm().endsWith(SLASH);
}
public static Properties loadProperties(String path, Class<?> caller) {
InputStream is = getResourceAsStream(path, caller);
if (is == null) {
return null;
}
Properties p = new Properties();
try {
p.load(is);
} catch (IOException ioe) {
return null;
}
return p;
}
/**
* ?????????????????
*
* @param path
* @param caller
* @return
*/
public static InputStream getResourceAsStream(String path, Class<?> caller) {
String resource = path;
if (resource.startsWith(SLASH)) {
resource = resource.substring(1);
}
InputStream is = null;
File file = new File(path);
if (file.exists() && file.isFile()) {
try {
is = new FileInputStream(file);
} catch (FileNotFoundException e) {
}
}
if (is == null) {
ClassLoader tcl = Thread.currentThread().getContextClassLoader();
if (tcl != null) {
is = tcl.getResourceAsStream(resource);
}
}
if (is == null) {
is = caller.getResourceAsStream(path);
}
if (is == null) {
is = ClassLoader.class.getResourceAsStream(path);
}
if (is == null) {
is = ClassLoader.getSystemResourceAsStream(resource);
}
return is;
}
/**
* ?????????????
*
* @param in
* @param out
* @param ???????
* @return ?????????
* @throws IOException
*/
public static final long copyStream(InputStream in, OutputStream out)
throws IOException {
return copyStream(in, out, DEFAULT_BUFFER_SIZE);
}
/**
* ?????????????
*
* @param in
* @param out
* @return ?????????
* @throws IOException
*/
public static final long copyStream(InputStream in, OutputStream out,
int bufferSize) throws IOException {
byte[] buf = new byte[bufferSize];
long totalSize = 0;
int s = -1;
while ((s = in.read(buf)) != -1) {
out.write(buf, 0, s);
totalSize += s;
}
buf = null;
return totalSize;
}
/**
* InputStream??byte[]???????
*
* @param is
* @return
* @throws IOException
*/
public static final byte[] getBytes(InputStream is) throws IOException {
ByteDataBuffer buf = new ByteDataBuffer();
copyStream(is, buf.getOutputStream());
return buf.toByteArray();
}
}
Related examples in the same category