001: /*
002: * ========================================================================
003: *
004: * Copyright 2003 The Apache Software Foundation.
005: *
006: * Licensed under the Apache License, Version 2.0 (the "License");
007: * you may not use this file except in compliance with the License.
008: * You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS,
014: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: * See the License for the specific language governing permissions and
016: * limitations under the License.
017: *
018: * ========================================================================
019: */
020: package org.apache.cactus.integration.ant.deployment;
021:
022: import java.io.ByteArrayInputStream;
023: import java.io.ByteArrayOutputStream;
024: import java.io.File;
025: import java.io.FileInputStream;
026: import java.io.IOException;
027: import java.io.InputStream;
028: import java.util.ArrayList;
029: import java.util.List;
030: import java.util.jar.JarInputStream;
031: import java.util.zip.ZipEntry;
032:
033: /**
034: * Provide convenient methods to read information from a Jar archive.
035: *
036: * @since Cactus 1.5
037: * @version $Id: DefaultJarArchive.java 238812 2004-02-29 10:21:34Z vmassol $
038: */
039: public class DefaultJarArchive implements JarArchive {
040: // Instance Variables ------------------------------------------------------
041:
042: /**
043: * The content of the archive as an input stream.
044: */
045: private byte content[];
046:
047: // Constructors ------------------------------------------------------------
048:
049: /**
050: * Constructor.
051: *
052: * @param theFile The archive file
053: * @throws IOException If there was a problem reading the WAR
054: */
055: public DefaultJarArchive(File theFile) throws IOException {
056: this (new FileInputStream(theFile));
057: }
058:
059: /**
060: * Constructor.
061: *
062: * @param theInputStream The input stream for the archive (it will be closed
063: * after the constructor returns)
064: * @throws IOException If there was a problem reading the WAR
065: */
066: public DefaultJarArchive(InputStream theInputStream)
067: throws IOException {
068: try {
069: ByteArrayOutputStream baos = new ByteArrayOutputStream();
070: byte[] buffer = new byte[2048];
071: int bytesRead = -1;
072: while ((bytesRead = theInputStream.read(buffer)) != -1) {
073: baos.write(buffer, 0, bytesRead);
074: }
075: this .content = baos.toByteArray();
076: } finally {
077: if (theInputStream != null) {
078: theInputStream.close();
079: }
080: }
081: }
082:
083: // Public Methods ----------------------------------------------------------
084:
085: /**
086: * @see JarArchive#containsClass(String)
087: */
088: public boolean containsClass(String theClassName)
089: throws IOException {
090: String resourceName = theClassName.replace('.', '/') + ".class";
091: return (getResource(resourceName) != null);
092: }
093:
094: /**
095: * @see JarArchive#findResource(String)
096: */
097: public final String findResource(String theName) throws IOException {
098: JarInputStream in = null;
099: try {
100: in = new JarInputStream(getContentAsStream());
101: ZipEntry entry = null;
102: while ((entry = in.getNextEntry()) != null) {
103: String entryName = entry.getName();
104: int lastSlashIndex = entryName.lastIndexOf('/');
105: if (lastSlashIndex >= 0) {
106: entryName = entryName.substring(lastSlashIndex + 1);
107: }
108: if (entryName.equals(theName)) {
109: return entry.getName();
110: }
111: }
112: } finally {
113: if (in != null) {
114: in.close();
115: }
116: }
117: return null;
118: }
119:
120: /**
121: * @see JarArchive#getResource(String)
122: */
123: public final InputStream getResource(String thePath)
124: throws IOException {
125: JarInputStream in = null;
126: try {
127: in = getContentAsStream();
128: ZipEntry zipEntry = null;
129: while ((zipEntry = in.getNextEntry()) != null) {
130: if (thePath.equals(zipEntry.getName())) {
131: ByteArrayOutputStream buffer = new ByteArrayOutputStream();
132: byte bytes[] = new byte[2048];
133: int bytesRead = -1;
134: while ((bytesRead = in.read(bytes)) != -1) {
135: buffer.write(bytes, 0, bytesRead);
136: }
137: return new ByteArrayInputStream(buffer
138: .toByteArray());
139: }
140: }
141: } finally {
142: if (in != null) {
143: in.close();
144: }
145: }
146: return null;
147: }
148:
149: /**
150: * @see JarArchive#getResources(String)
151: */
152: public final List getResources(String thePath) throws IOException {
153: List resources = new ArrayList();
154: JarInputStream in = null;
155: try {
156: in = getContentAsStream();
157: ZipEntry zipEntry = null;
158: while ((zipEntry = in.getNextEntry()) != null) {
159: if ((zipEntry.getName().startsWith(thePath) && !zipEntry
160: .getName().equals(thePath))) {
161: resources.add(zipEntry.getName());
162: }
163: }
164: } finally {
165: if (in != null) {
166: in.close();
167: }
168: }
169: return resources;
170: }
171:
172: // Protected Methods -------------------------------------------------------
173:
174: /**
175: * Returns the content of the archive as <code>JarInputStream</code>.
176: *
177: * @return The input stream
178: * @throws IOException If an exception occurred reading the archive
179: */
180: protected final JarInputStream getContentAsStream()
181: throws IOException {
182: return new JarInputStream(
183: new ByteArrayInputStream(this.content));
184: }
185: }
|