Author: bodewig
Date: Wed Jan  8 12:56:37 2014
New Revision: 1556519

URL: http://svn.apache.org/r1556519
Log:
Archive(In|Out)put isn't really a Channel itself

Modified:
    
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/archivers/ArchiveInput.java
    
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/archivers/ArchiveOutput.java
    
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/formats/ar/ArArchiveInput.java
    
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/formats/ar/ArArchiveOutput.java
    
commons/proper/compress/branches/compress-2.0/src/test/java/org/apache/commons/compress2/formats/ar/RoundTripTest.java

Modified: 
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/archivers/ArchiveInput.java
URL: 
http://svn.apache.org/viewvc/commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/archivers/ArchiveInput.java?rev=1556519&r1=1556518&r2=1556519&view=diff
==============================================================================
--- 
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/archivers/ArchiveInput.java
 (original)
+++ 
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/archivers/ArchiveInput.java
 Wed Jan  8 12:56:37 2014
@@ -18,6 +18,7 @@
  */
 package org.apache.commons.compress2.archivers;
 
+import java.io.Closeable;
 import java.io.IOException;
 import java.nio.channels.ReadableByteChannel;
 
@@ -25,7 +26,7 @@ import java.nio.channels.ReadableByteCha
  * A channel that reads {@link ArchiveEntry}s.
  * @NotThreadSafe
  */
-public interface ArchiveInput<A extends ArchiveEntry> extends 
ReadableByteChannel {
+public interface ArchiveInput<A extends ArchiveEntry> extends Closeable {
 
     /**
      * Obtains the next entry.
@@ -34,6 +35,13 @@ public interface ArchiveInput<A extends 
     A next() throws IOException;
 
     /**
+     * Obtains a channel the contents of the current entry can be read from.
+     * @return a channel to read the entry's contents from
+     */
+    // TODO use some sort of Tuple or Map.Entry<A, ReadableByteChannel> and 
combine with next() ?
+    ReadableByteChannel getChannel();
+
+    /**
      * Whether this channel is able to read the contents of the given entry.
      * 
      * <p>Some archive formats support variants or details that are not 
supported (yet).</p>

Modified: 
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/archivers/ArchiveOutput.java
URL: 
http://svn.apache.org/viewvc/commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/archivers/ArchiveOutput.java?rev=1556519&r1=1556518&r2=1556519&view=diff
==============================================================================
--- 
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/archivers/ArchiveOutput.java
 (original)
+++ 
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/archivers/ArchiveOutput.java
 Wed Jan  8 12:56:37 2014
@@ -18,6 +18,7 @@
  */
 package org.apache.commons.compress2.archivers;
 
+import java.io.Closeable;
 import java.io.IOException;
 import java.nio.channels.WritableByteChannel;
 
@@ -25,7 +26,7 @@ import java.nio.channels.WritableByteCha
  * A channel that writes {@link ArchiveEntry}s.
  * @NotThreadSafe
  */
-public interface ArchiveOutput<A extends ArchiveEntry> extends 
WritableByteChannel {
+public interface ArchiveOutput<A extends ArchiveEntry> extends Closeable {
 
     /**
      * Creates an ArchiveEntry for the given parameters.
@@ -52,9 +53,10 @@ public interface ArchiveOutput<A extends
      * process.</p>
      * 
      * @param entry describes the entry
+     * @return a channel to write the entry's contents to
      * @throws IOException
      */
-    void putEntry(A entry) throws IOException;
+    WritableByteChannel putEntry(A entry) throws IOException;
     
     /**
      * Closes the archive entry, writing any trailer information that may be 
required.

Modified: 
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/formats/ar/ArArchiveInput.java
URL: 
http://svn.apache.org/viewvc/commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/formats/ar/ArArchiveInput.java?rev=1556519&r1=1556518&r2=1556519&view=diff
==============================================================================
--- 
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/formats/ar/ArArchiveInput.java
 (original)
+++ 
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/formats/ar/ArArchiveInput.java
 Wed Jan  8 12:56:37 2014
@@ -226,18 +226,8 @@ public class ArArchiveInput extends Abst
     }
 
     @Override
-    public boolean isOpen() {
-        return !closed;
-    }
-
-    @Override
-    public int read(ByteBuffer b) throws IOException {
-        byte[] tmp = new byte[b.remaining()];
-        int read = wrappedStream.read(tmp);
-        if (read > 0) {
-            b.put(tmp, 0, read);
-        }
-        return read;
+    public ReadableByteChannel getChannel() {
+        return Channels.newChannel(wrappedStream);
     }
 
     private class WrappedStream extends FilterInputStream {

Modified: 
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/formats/ar/ArArchiveOutput.java
URL: 
http://svn.apache.org/viewvc/commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/formats/ar/ArArchiveOutput.java?rev=1556519&r1=1556518&r2=1556519&view=diff
==============================================================================
--- 
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/formats/ar/ArArchiveOutput.java
 (original)
+++ 
commons/proper/compress/branches/compress-2.0/src/main/java/org/apache/commons/compress2/formats/ar/ArArchiveOutput.java
 Wed Jan  8 12:56:37 2014
@@ -87,7 +87,7 @@ public class ArArchiveOutput extends Abs
     }
 
     @Override
-    public void putEntry(final ArArchiveEntry entry) throws IOException {
+    public WritableByteChannel putEntry(final ArArchiveEntry entry) throws 
IOException {
         if (finished) {
             throw new IOException("Stream has already been finished");
         }
@@ -110,6 +110,7 @@ public class ArArchiveOutput extends Abs
 
         entryOffset = 0;
         haveUnclosedEntry = true;
+        return new CurrentChannel();
     }
 
     private long fill( final long pOffset, final long pNewOffset, byte pFill ) 
throws IOException { 
@@ -124,14 +125,14 @@ public class ArArchiveOutput extends Abs
                 b.put(pFill);
             }
             b.flip();
-            write(b);
+            new CurrentChannel().write(b);
         }
 
         return pNewOffset;
     }
 
     private long write( final String data ) throws IOException {
-        return write(StandardCharsets.US_ASCII.encode(data));
+        return new 
CurrentChannel().write(StandardCharsets.US_ASCII.encode(data));
     }
 
     private long writeEntryHeader( final ArArchiveEntry pEntry ) throws 
IOException {
@@ -200,14 +201,6 @@ public class ArArchiveOutput extends Abs
         return offset;
     }
 
-    @Override
-    public int write(ByteBuffer b) throws IOException {
-        int len = out.write(b);
-        count(len);
-        entryOffset += len;
-        return len;
-    }
-
     /**
      * Calls finish if necessary, and then closes the nested Channel
      */
@@ -235,11 +228,6 @@ public class ArArchiveOutput extends Abs
         finished = true;
     }
 
-    @Override
-    public boolean isOpen() {
-        return out.isOpen();
-    }
-
     private int getUserId(OwnerInformation info) {
         return info == null ? 0 : info.getUserId();
     }
@@ -247,4 +235,24 @@ public class ArArchiveOutput extends Abs
     private int getGroupId(OwnerInformation info) {
         return info == null ? 0 : info.getGroupId();
     }
+
+    private class CurrentChannel implements WritableByteChannel {
+        @Override
+        public int write(ByteBuffer b) throws IOException {
+            int len = out.write(b);
+            count(len);
+            entryOffset += len;
+            return len;
+        }
+
+        @Override
+        public boolean isOpen() {
+            return out.isOpen();
+        }
+
+        @Override
+        public void close() {
+            // NO-OP
+        }
+    }
 }

Modified: 
commons/proper/compress/branches/compress-2.0/src/test/java/org/apache/commons/compress2/formats/ar/RoundTripTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/compress/branches/compress-2.0/src/test/java/org/apache/commons/compress2/formats/ar/RoundTripTest.java?rev=1556519&r1=1556518&r2=1556519&view=diff
==============================================================================
--- 
commons/proper/compress/branches/compress-2.0/src/test/java/org/apache/commons/compress2/formats/ar/RoundTripTest.java
 (original)
+++ 
commons/proper/compress/branches/compress-2.0/src/test/java/org/apache/commons/compress2/formats/ar/RoundTripTest.java
 Wed Jan  8 12:56:37 2014
@@ -58,12 +58,12 @@ public class RoundTripTest {
 
             final WritableByteChannel out = new 
FileOutputStream(output).getChannel();
             final ArArchiveOutput os = new ArArchiveOutput(out);
-            
os.putEntry(os.createEntry(ArchiveEntryParameters.fromFile(file1)));
-            IOUtils.copy(new FileInputStream(file1).getChannel(), os);
+            IOUtils.copy(new FileInputStream(file1).getChannel(),
+                         
os.putEntry(os.createEntry(ArchiveEntryParameters.fromFile(file1))));
             os.closeEntry();
 
-            
os.putEntry(os.createEntry(ArchiveEntryParameters.fromFile(file2)));
-            IOUtils.copy(new FileInputStream(file2).getChannel(), os);
+            IOUtils.copy(new FileInputStream(file2).getChannel(),
+                         
os.putEntry(os.createEntry(ArchiveEntryParameters.fromFile(file2))));
             os.closeEntry();
             os.close();
             out.close();
@@ -78,7 +78,7 @@ public class RoundTripTest {
         File target = new File(dir, entry.getName());
         final WritableByteChannel out = new 
FileOutputStream(target).getChannel();
 
-        IOUtils.copy(in, out);
+        IOUtils.copy(in.getChannel(), out);
 
         out.close();
         in.close();


Reply via email to