/**
* Copyright 2005 Open Cloud Ltd.
*
* 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.mobicents.eclipslee.util.slee.jar;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Vector;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/**
* @author cath
*/
public class DeployableUnitJarFile extends JarFile {
public DeployableUnitJarFile(String name) throws IOException { super(name); }
public DeployableUnitJarFile(File file) throws IOException { super(file); }
public DeployableUnitJarFile(String name, boolean verify) throws IOException { super(name, verify); }
public DeployableUnitJarFile(File file, boolean verify) throws IOException { super(file, verify); }
public DeployableUnitJarFile(File file, boolean verify, int mode) throws IOException { super(file, verify, mode); }
private JarEntry[] getDirs() throws IOException {
Vector jarEntries = new Vector();
Enumeration entries = entries();
while (entries.hasMoreElements()) {
JarEntry entry = (JarEntry) entries.nextElement();
if (entry.isDirectory())
jarEntries.add(entry);
}
return (JarEntry []) jarEntries.toArray(new JarEntry[jarEntries.size()]);
}
private JarEntry[] getComponentEntries() throws IOException {
Vector jarEntries = new Vector();
Enumeration entries = entries();
while (entries.hasMoreElements()) {
JarEntry entry = (JarEntry) entries.nextElement();
if (entry.getName().toLowerCase().endsWith(".jar")) {
jarEntries.add(entry);
}
}
return (JarEntry []) jarEntries.toArray(new JarEntry[jarEntries.size()]);
}
/**
* Returns an array of potential component jar files. N.B. these are not
* guaranteed to be component jars, simply their entry name ends with '.jar'
* and they may not contain components.
* @return
* @throws IOException
*/
public InputStream[] getComponentJars() throws IOException {
JarEntry entries[] = getComponentEntries();
InputStream streams[] = new InputStream[entries.length];
for (int i = 0; i < entries.length; i++)
streams[i] = getInputStream(entries[i]);
return streams;
}
private JarEntry[] getServiceEntries() throws IOException {
Vector jarEntries = new Vector();
Enumeration entries = entries();
while (entries.hasMoreElements()) {
JarEntry entry = (JarEntry) entries.nextElement();
if (entry.getName().toLowerCase().endsWith("-service.xml")) {
jarEntries.add(entry);
}
}
return (JarEntry []) jarEntries.toArray(new JarEntry[jarEntries.size()]);
}
/**
* Returns an array of potential Service XML descriptors. N.B. this match
* is done based on name (the file ends with 'service.xml')
* @return an array of InputStream objects containing the potential descriptors.
* @throws IOException
*/
public InputStream[] getServiceDescriptors() throws IOException {
JarEntry entries[] = getServiceEntries();
InputStream streams[] = new InputStream[entries.length];
for (int i = 0; i < entries.length; i++)
streams[i] = getInputStream(entries[i]);
return streams;
}
private JarEntry getDeployableUnitEntry() throws IOException {
Enumeration entries = entries();
while (entries.hasMoreElements()) {
JarEntry entry = (JarEntry) entries.nextElement();
if (entry.getName().equalsIgnoreCase("meta-inf/deployable-unit.xml"))
return entry;
}
return null;
}
public InputStream getDeployableUnitDescriptor() throws IOException {
JarEntry entry = getDeployableUnitEntry();
if (entry == null)
return null;
return getInputStream(entry);
}
/**
* Unpacks the deployable unit descriptor, service descriptors and
* component jar files into the specified directory which must already
* exist.
* @param directory
*/
public void unpack(File directory) throws IOException {
if (!directory.exists())
throw new IOException("Target directory does not exist.");
if (!isDUJar())
throw new IOException("This is not a deployable unit jar.");
// Create all required directory structures first.
JarEntry entries[] = getDirs();
for (int i = 0; i < entries.length; i++) {
String fname = directory.getAbsolutePath() + File.separator + entries[i].getName();
if (entries[i].isDirectory()) {
File dir = new File(fname);
dir.mkdirs();
continue;
}
}
// The service XML descriptors
entries = getServiceEntries();
for (int i = 0; i < entries.length; i++) {
String fname = directory.getAbsolutePath() + File.separator + entries[i].getName();
if (entries[i].isDirectory()) {
File dir = new File(fname);
dir.mkdirs();
continue;
}
File outFile = new File(fname);
OutputStream os = new FileOutputStream(outFile);
InputStream is = getInputStream(entries[i]);
copy(is, os);
}
// The component Jar files
entries = getComponentEntries();
for (int i = 0; i < entries.length; i++) {
String fname = directory.getAbsolutePath() + File.separator + entries[i].getName();
if (entries[i].isDirectory()) {
File dir = new File(fname);
dir.mkdirs();
continue;
}
File outFile = new File(fname);
OutputStream os = new FileOutputStream(outFile);
InputStream is = getInputStream(entries[i]);
copy(is, os);
}
// The deployable-unit.xml file
String fname = directory.getAbsolutePath() + File.separator + "deployable-unit.xml";
File outFile = new File(fname);
OutputStream os = new FileOutputStream(outFile);
InputStream is = getDeployableUnitDescriptor();
copy(is, os);
}
public boolean isDUJar() {
try {
return getDeployableUnitEntry() == null ? false : true;
} catch (IOException e) {
return false;
}
}
private void copy(InputStream src, OutputStream dst) throws IOException {
byte[] buf = new byte[1024];
int len;
while ((len = src.read(buf)) > 0)
dst.write(buf, 0, len);
src.close();
dst.close();
}
}