You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bo...@apache.org on 2009/02/18 16:52:43 UTC
svn commit: r745545 - in /commons/sandbox/compress/trunk/src:
main/java/org/apache/commons/compress/archivers/jar/
main/java/org/apache/commons/compress/archivers/zip/
test/java/org/apache/commons/compress/archivers/jar/
test/java/org/apache/commons/co...
Author: bodewig
Date: Wed Feb 18 15:52:42 2009
New Revision: 745545
URL: http://svn.apache.org/viewvc?rev=745545&view=rev
Log:
Add a JarMarker to the very first entry in a jar. SANDBOX-289
Added:
commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/jar/
commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/jar/JarArchiveOutputStreamTest.java (with props)
Modified:
commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/jar/JarArchiveOutputStream.java
commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java (contents, props changed)
commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntryTest.java (contents, props changed)
Modified: commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/jar/JarArchiveOutputStream.java
URL: http://svn.apache.org/viewvc/commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/jar/JarArchiveOutputStream.java?rev=745545&r1=745544&r2=745545&view=diff
==============================================================================
--- commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/jar/JarArchiveOutputStream.java (original)
+++ commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/jar/JarArchiveOutputStream.java Wed Feb 18 15:52:42 2009
@@ -22,17 +22,28 @@
import java.io.OutputStream;
import org.apache.commons.compress.archivers.ArchiveEntry;
+import org.apache.commons.compress.archivers.zip.JarMarker;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
+/**
+ * Subclass that adds a special extra field to the very first entry
+ * which allows the created archive to be used as an executable jar on
+ * Solaris.
+ */
public class JarArchiveOutputStream extends ZipArchiveOutputStream {
- public JarArchiveOutputStream( final OutputStream out ) {
+ private boolean jarMarkerAdded = false;
+
+ public JarArchiveOutputStream(final OutputStream out) {
super(out);
}
- public void putArchiveEntry(ArchiveEntry entry) throws IOException {
- // TODO special jar stuff
- super.putArchiveEntry((ZipArchiveEntry) entry);
+ public void putNextEntry(ZipArchiveEntry ze) throws IOException {
+ if (!jarMarkerAdded) {
+ ze.addAsFirstExtraField(JarMarker.getInstance());
+ jarMarkerAdded = true;
+ }
+ super.putNextEntry(ze);
}
}
Modified: commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java
URL: http://svn.apache.org/viewvc/commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java?rev=745545&r1=745544&r2=745545&view=diff
==============================================================================
--- commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java (original)
+++ commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java Wed Feb 18 15:52:42 2009
@@ -216,6 +216,9 @@
/**
* Adds an extra fields - replacing an already present extra field
* of the same type.
+ *
+ * <p>If no extra field of the same type exists, the field will be
+ * added as last field.</p>
* @param ze an extra field
* @since 1.1
*/
@@ -228,6 +231,25 @@
}
/**
+ * Adds an extra fields - replacing an already present extra field
+ * of the same type.
+ *
+ * <p>The new extra field will be the first one.</p>
+ * @param ze an extra field
+ * @since 1.1
+ */
+ public void addAsFirstExtraField(ZipExtraField ze) {
+ LinkedHashMap copy = extraFields;
+ extraFields = new LinkedHashMap();
+ extraFields.put(ze.getHeaderId(), ze);
+ if (copy != null) {
+ copy.remove(ze.getHeaderId());
+ extraFields.putAll(copy);
+ }
+ setExtra();
+ }
+
+ /**
* Remove an extra fields.
* @param type the type of extra field to remove
* @since 1.1
Propchange: commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Feb 18 15:52:42 2009
@@ -0,0 +1 @@
+/ant/core/trunk/src/main/org/apache/tools/zip/ZipEntry.java:745537
Added: commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/jar/JarArchiveOutputStreamTest.java
URL: http://svn.apache.org/viewvc/commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/jar/JarArchiveOutputStreamTest.java?rev=745545&view=auto
==============================================================================
--- commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/jar/JarArchiveOutputStreamTest.java (added)
+++ commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/jar/JarArchiveOutputStreamTest.java Wed Feb 18 15:52:42 2009
@@ -0,0 +1,71 @@
+/*
+ * 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.commons.compress.archivers.jar;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import junit.framework.TestCase;
+
+import org.apache.commons.compress.archivers.zip.JarMarker;
+import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
+import org.apache.commons.compress.archivers.zip.ZipExtraField;
+import org.apache.commons.compress.archivers.zip.ZipFile;
+
+public class JarArchiveOutputStreamTest extends TestCase {
+
+ public void testJarMarker() throws IOException {
+ File testArchive = File.createTempFile("jar-aostest", ".jar");
+ JarArchiveOutputStream out = null;
+ ZipFile zf = null;
+ try {
+
+ out = new JarArchiveOutputStream(new FileOutputStream(testArchive));
+ out.putArchiveEntry(new ZipArchiveEntry("foo/"));
+ out.closeEntry();
+ out.putArchiveEntry(new ZipArchiveEntry("bar/"));
+ out.closeEntry();
+ out.close();
+ out = null;
+
+ zf = new ZipFile(testArchive);
+ ZipArchiveEntry ze = zf.getEntry("foo/");
+ assertNotNull(ze);
+ ZipExtraField[] fes = ze.getExtraFields();
+ assertEquals(1, fes.length);
+ assertTrue(fes[0] instanceof JarMarker);
+
+ ze = zf.getEntry("bar/");
+ assertNotNull(ze);
+ fes = ze.getExtraFields();
+ assertEquals(0, fes.length);
+ } finally {
+ if (out != null) {
+ try {
+ out.close();
+ } catch (IOException e) { /* swallow */ }
+ }
+ ZipFile.closeQuietly(zf);
+ if (testArchive.exists()) {
+ testArchive.delete();
+ }
+ }
+ }
+
+}
\ No newline at end of file
Propchange: commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/jar/JarArchiveOutputStreamTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntryTest.java
URL: http://svn.apache.org/viewvc/commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntryTest.java?rev=745545&r1=745544&r2=745545&view=diff
==============================================================================
--- commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntryTest.java (original)
+++ commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntryTest.java Wed Feb 18 15:52:42 2009
@@ -85,6 +85,46 @@
}
}
+ /**
+ * test handling of extra fields
+ *
+ * @since 1.1
+ */
+ public void testAddAsFirstExtraField() {
+ AsiExtraField a = new AsiExtraField();
+ a.setDirectory(true);
+ a.setMode(0755);
+ UnrecognizedExtraField u = new UnrecognizedExtraField();
+ u.setHeaderId(new ZipShort(1));
+ u.setLocalFileDataData(new byte[0]);
+
+ ZipArchiveEntry ze = new ZipArchiveEntry("test/");
+ ze.setExtraFields(new ZipExtraField[] {a, u});
+ byte[] data1 = ze.getExtra();
+
+ UnrecognizedExtraField u2 = new UnrecognizedExtraField();
+ u2.setHeaderId(new ZipShort(1));
+ u2.setLocalFileDataData(new byte[] {1});
+
+ ze.addAsFirstExtraField(u2);
+ byte[] data2 = ze.getExtra();
+ ZipExtraField[] result = ze.getExtraFields();
+ assertEquals("second pass", 2, result.length);
+ assertSame(u2, result[0]);
+ assertSame(a, result[1]);
+ assertEquals("length second pass", data1.length + 1, data2.length);
+
+ UnrecognizedExtraField u3 = new UnrecognizedExtraField();
+ u3.setHeaderId(new ZipShort(2));
+ u3.setLocalFileDataData(new byte[] {1});
+ ze.addAsFirstExtraField(u3);
+ result = ze.getExtraFields();
+ assertEquals("third pass", 3, result.length);
+ assertSame(u3, result[0]);
+ assertSame(u2, result[1]);
+ assertSame(a, result[2]);
+ }
+
public void testUnixMode() {
ZipArchiveEntry ze = new ZipArchiveEntry("foo");
assertEquals(0, ze.getPlatform());
Propchange: commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntryTest.java
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Wed Feb 18 15:52:42 2009
@@ -0,0 +1 @@
+/ant/core/trunk/src/tests/junit/org/apache/tools/zip/ZipEntryTest.java:745537