Author: tcurdt
Date: Tue Aug  1 21:45:26 2006
New Revision: 427890

URL: http://svn.apache.org/viewvc?rev=427890&view=rev
Log:
forgot a few files to add: draft 8 from C. Grobmeier, grant has been received, 
cheers

Added:
    
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/AbstractCompressor.java
   (with props)
    
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/Archive.java
   (with props)
    
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/ArchiverFactory.java
   (with props)
    
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressException.java
   (with props)
    
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressUtils.java
   (with props)
    
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/Compressor.java
   (with props)
    
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressorFactory.java
   (with props)
    
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/PackableObject.java
   (with props)

Added: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/AbstractCompressor.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/AbstractCompressor.java?rev=427890&view=auto
==============================================================================
--- 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/AbstractCompressor.java
 (added)
+++ 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/AbstractCompressor.java
 Tue Aug  1 21:45:26 2006
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2002,2004 The Apache Software Foundation.
+ * 
+ * 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.apache.commons.compress;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+/**
+ * AbstractCompressor handles all compression/decompression 
+ * actions on an abstract basis. 
+ */
+public abstract class AbstractCompressor 
+       extends PackableObject 
+       implements Compressor {
+       /**
+        * Constructor
+        */
+       public AbstractCompressor() {
+               super();
+       }
+
+       /**
+        * Returns a String with the default file extension
+        * for this compressor. For example, a zip-files default
+        * file extension would be "zip" (without leading dot).
+        *  
+        * @return the default file extension
+        */
+       public abstract String getDefaultFileExtension();
+       
+    
+       /* (non-Javadoc)
+        * @see 
org.apache.commons.compress.Compressor#compressStream(java.io.FileInputStream)
+        */
+       public InputStream compress(FileInputStream input) throws 
CompressException {
+               FileOutputStream outputStream = null;
+               FileOutputStream tempFileOutputStream = null;
+               try {
+                       File temp = File.createTempFile("commons_","jkt");;
+                       tempFileOutputStream = new FileOutputStream(temp);
+                       compressTo(input, tempFileOutputStream);
+                       return new FileInputStream(temp);
+               } catch (IOException e) {
+                       throw new CompressException("An IO Exception has 
occured", e);
+               } finally {
+                       try {
+                               tempFileOutputStream.close();
+                               outputStream.close();
+                       } catch (IOException e) {
+                               throw new CompressException("An IO Exception 
occured while closing the streams", e);
+                       }
+               }
+       }
+
+       /* (non-Javadoc)
+        * @see org.apache.commons.compress.Compressor#compress(java.io.File, 
java.io.File)
+        */
+       public void compressTo(File input, File output) throws 
CompressException {
+               FileOutputStream outputStream = null;
+               FileInputStream inputStream = null;
+               try {
+                       outputStream = new FileOutputStream( output );
+                       inputStream = new FileInputStream( input );
+                       this.compressTo(inputStream, outputStream);
+               } catch (FileNotFoundException e) {
+                       throw new CompressException("File not found" ,e);
+               } 
+       }
+
+       /* (non-Javadoc)
+        * @see org.apache.commons.compress.Compressor#compress(java.io.File)
+        */
+       public void compressToHere(File input) throws CompressException {
+               String pathToFile = 
input.getAbsolutePath().concat(".").concat(getDefaultFileExtension());
+               File output = new File(pathToFile);
+               this.compressTo(input, output);
+       }
+       
+       /* (non-Javadoc)
+        * @see 
org.apache.commons.compress.Compressor#compressStream(java.io.File)
+        */
+       public InputStream compress(File input) throws CompressException {
+               try {
+                       return this.compress(
+                               new FileInputStream(input));
+               } catch (FileNotFoundException e) {
+                       throw new CompressException("File could not be 
found.",e);
+               }
+       }
+       
+       /* (non-Javadoc)
+        * @see 
org.apache.commons.compress.Decompressor#decompress(java.io.File)
+        */
+       public InputStream decompress(File input) throws CompressException {
+               File temp;
+               InputStream result;
+               try {
+                       temp = File.createTempFile("compress_", "jkt");
+                       this.decompressTo(input, temp);
+                       result = new FileInputStream(temp);
+               } catch (IOException e) {
+                       throw new CompressException("Error while creating a 
temporary file", e);
+               } 
+               return result; 
+       }
+
+       /* (non-Javadoc)
+        * @see 
org.apache.commons.compress.Decompressor#decompress(java.io.FileInputStream)
+        */
+       public InputStream decompress(FileInputStream input) 
+               throws CompressException {
+               File temp;
+               InputStream result;
+               try {
+                       temp = File.createTempFile("compress_", "jkt");
+                       this.decompressTo(input, new FileOutputStream(temp));
+                       result = new FileInputStream(temp);
+               } catch (IOException e) {
+                       throw new CompressException("Error while creating a 
temporary file", e);
+               } 
+               return result;
+       }
+       
+       /* (non-Javadoc)
+        * @see org.apache.commons.compress.Compressor#decompress(java.io.File, 
java.io.File)
+        */
+       public void decompressTo(File input, File output) 
+               throws CompressException {
+               FileInputStream inputStream = null;
+               FileOutputStream outputStream = null;
+               try {
+                       outputStream = new FileOutputStream( output );
+                       inputStream = new FileInputStream( input );
+                       decompressTo(inputStream, outputStream);
+               } catch (FileNotFoundException e) {
+                       throw new CompressException("File could not be found", 
e);
+               } finally {
+               try {
+                               inputStream.close();
+                               outputStream.close();
+                       } catch (IOException e1) {
+                               throw new CompressException("An I/O Exception 
has occured while closing a stream", e1);
+                       }
+               }
+       }
+}
\ No newline at end of file

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/AbstractCompressor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/AbstractCompressor.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/AbstractCompressor.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/Archive.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/Archive.java?rev=427890&view=auto
==============================================================================
--- 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/Archive.java
 (added)
+++ 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/Archive.java
 Tue Aug  1 21:45:26 2006
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2002,2004 The Apache Software Foundation.
+ * 
+ * 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.apache.commons.compress;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Iterator;
+/**
+ * Archive is the interface which defines all operations 
+ * for all possible archive-operations.
+ * 
+ * TODO:
+ * - delete files from an archive
+ * - add files to an existing archive
+ * - recursivley add directories
+ */
+public interface Archive {
+       /**
+        * Adds a file to the internal filelist 
+        * for a possible pack-operation
+        */
+       public void add(File file) throws FileNotFoundException;
+       
+       /**
+        * Adds a FileInputStream to the internal filelist 
+        * for a possible pack-operation
+        */
+       public void add(ArchiveEntry entry);
+       
+       /**
+        * Packs a file. 
+        * The destination filename must be set manually with 
setDestinationFile(...).
+        * There must be at least 1 file to be packed.
+        * 
+        * @throws ArchiveException if there is no destination file or files to 
be packed
+        * @return true, if the operation has been ended without exceptions
+        */
+       public void save(FileOutputStream output) throws ArchiveException;
+
+       /**
+        * Packs this file. 
+        * This methods ignores what has been set in setDestinationFile(...) and
+        * uses the filename of the parameter. This string must not be null.
+        * 
+        * @throws ArchiveException if there is no destination file or files to 
be packed
+        */
+       public void save(File output) throws ArchiveException;
+
+       /**
+        * Sets an Archive for manipulating. An archive is set if someone
+        * saves an Archive or calls getInstance(...) with an archive.
+        * @param archive file to manipulate
+        */
+       void setArchive(File file);
+       
+       /**
+        * Returns the archive file and null,
+        * if this archiver has not been saved yet or
+        * there has not been set an archive manually.
+        * @return the archiver, or null
+        */
+       public File getArchive();
+
+       /**
+        * Unpacks to the specified directory 
+        * @param dir to unpack
+        * @throws UnpackException if an unpack error occurs
+        */
+       public void unpack(File destinationDir) throws UnpackException;
+       
+       /**
+        * Get an iterator of ArchiveEntrys which shall be archived
+        * @return the iterator
+        */
+       public Iterator getEntryIterator();
+       
+       /**
+        * Closes this archiver and all internal streams. 
+        */
+       public void close() throws IOException ;
+}

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/Archive.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/Archive.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/Archive.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/ArchiverFactory.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/ArchiverFactory.java?rev=427890&view=auto
==============================================================================
--- 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/ArchiverFactory.java
 (added)
+++ 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/ArchiverFactory.java
 Tue Aug  1 21:45:26 2006
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2002,2004 The Apache Software Foundation.
+ * 
+ * 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.apache.commons.compress;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.commons.compress.archivers.tar.TarArchive;
+import org.apache.commons.compress.archivers.zip.ZipArchive;
+/**
+ * Provides implementations for all ArchiverFactory methods.
+ */
+public class ArchiverFactory {
+       /* internal archiver list */
+       private static List archives;
+       
+       // pre-register archives 
+       static {
+               archives = new ArrayList();
+               try {
+                       registerArchiver(TarArchive.class);
+                       registerArchiver(ZipArchive.class);
+               } catch (ArchiveException e) {
+                       e.printStackTrace();
+               }
+       }
+       
+       /**
+        * Constructor.
+        * @param name name of the implementation
+        */
+       private ArchiverFactory() { 
+       }
+
+       /**
+        * Registers a new archiver in the factory.
+        * The archiver must implement the archiver interface.
+        * 
+        * @param className full qualified archiver implementation
+        * @throws ClassNotFoundException if the new archiver class could not 
be found
+        * @throws ArchiveException if the new archiver does not implement the 
archiver interface
+        */
+       public static void registerArchiver(String className) 
+               throws ClassNotFoundException, ArchiveException {
+               Class clazz = Class.forName(className);
+               registerArchiver(clazz);
+       }
+       
+       /**
+        * Registers a new archiver in the factory.
+        * The archiver must implement the archiver interface and must
+        * be an concrete implementation
+        * 
+        * @param className full qualified archiver implementation
+        * @throws ArchiveException if the new archiver does not implement the 
archiver interface
+        */
+       public static void registerArchiver(Class clazz) 
+               throws ArchiveException {
+               // register only, if the class is assignable and not an 
interface
+               if(Archive.class.isAssignableFrom(clazz) && 
!(clazz.isInterface())) {
+                       try {
+                               archives.add(clazz.newInstance());
+                       } catch (InstantiationException e) {
+                               throw new ArchiveException("Archive could not 
be instantiated", e);
+                       } catch (IllegalAccessException e) {
+                               throw new ArchiveException("Archive could not 
be instantiated", e);
+                       }
+               } else {
+                       throw new ArchiveException("Archive does not implement 
the Archive.class interface.");
+               }
+       }
+       
+       /**
+        * Returns an empty Archive, if an archiver could be found for this 
factory.
+        * If two Archive-implementations with the same name are registered,
+        * the first matching archiver will be instanciated.
+        * 
+        * @return the archiver, or null, if no matching archiver could be found
+        * @throws ArchiveException if the archiver could not be created
+        */
+       public static Archive getInstance(String archiverName) 
+               throws ArchiveException {
+               try {
+                       if(archiverName == null) {
+                               throw new ArchiveException("ArchiverFactory 
could not create instance");
+                       }
+                       Iterator it = archives.iterator();
+                       while(it.hasNext()) {
+                               PackableObject po = (PackableObject)it.next();
+                               if(po.isPackableWith(archiverName, 
PackableObject.CHOOSE_NAME)) {
+                                       return 
(Archive)po.getClass().newInstance();
+                               }
+                       }
+                       return null;
+               } catch (InstantiationException e) {
+                       throw new ArchiveException("ArchiverFactory could not 
create instance", e);
+               } catch (IllegalAccessException e) {
+                       throw new ArchiveException("ArchiverFactory could not 
create instance", e);
+               }
+       }
+
+       /**
+        * Returns an archiver, filled with an existing archive.
+        * Uses the byte header to identify the archiver. If no corresponding
+        * archiver could be found, a filename extension check will be done.
+        * @param archivedFile an existing archive
+        * @return an archiver, filled with the archive
+        */
+       public static Archive getInstance(File file) 
+               throws ArchiveException {
+               if(file == null && !file.isFile()) {
+                       throw new ArchiveException("ArchiverFactory could not 
create instance for this file");
+               }
+               
+               
+               /* Archive result */
+               PackableObject packable = null; 
+               
+               try {
+                       packable = PackableObject.identifyByHeader(file, 
archives);
+                       
+                       if(packable == null) {
+                               return null;
+                       }
+                       Archive archive = 
(Archive)packable.getClass().newInstance();
+                       archive.setArchive(file);
+                       return archive;
+               } catch (SecurityException e) {
+                       throw new ArchiveException("A security violation 
occured while reading the field ARCHIVER_NAME", e);
+               } catch (IllegalArgumentException e) {
+                       throw new ArchiveException("Internal factory 
exception", e);
+               } catch (InstantiationException e) {
+                       throw new ArchiveException("ArchiverFactory could not 
create instance", e);
+               } catch (IllegalAccessException e) {
+                       throw new ArchiveException("ArchiverFactory could not 
create instance", e);
+               } catch (PackableObjectException e) {
+                       throw new ArchiveException("ArchiverFactory could not 
create instance", e);
+               } 
+       }
+}

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/ArchiverFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/ArchiverFactory.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/ArchiverFactory.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressException.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressException.java?rev=427890&view=auto
==============================================================================
--- 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressException.java
 (added)
+++ 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressException.java
 Tue Aug  1 21:45:26 2006
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2002,2004 The Apache Software Foundation.
+ * 
+ * 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.apache.commons.compress;
+
+/**
+ * Exception occurs when a exception within 
+ * the compress actions occurs.
+ */
+public class CompressException extends PackableObjectException {
+       /**
+        * Comment for <code>serialVersionUID</code>
+        */
+       private static final long serialVersionUID = 3257005449554507057L;
+
+       /**
+        * Calls the IOException constructor
+        */
+       public CompressException() {
+               super();
+       }
+
+       /**
+        * Calls the IOException constructor with a message
+        * @param message the message
+        */
+       public CompressException(String message) {
+               super(message);
+       }
+       
+       /**
+        * Calls the IOException constructor with a message
+        * and fills the stacktrace with the stacktrace of 
+        * an exception
+        * 
+        * @param message the message
+        * @param e the exception 
+        */
+       public CompressException(String message, Exception e) {
+               super(message);
+               this.initCause(e);
+       }
+}

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressException.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressException.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressUtils.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressUtils.java?rev=427890&view=auto
==============================================================================
--- 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressUtils.java
 (added)
+++ 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressUtils.java
 Tue Aug  1 21:45:26 2006
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2002,2004 The Apache Software Foundation.
+ * 
+ * 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.apache.commons.compress;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * Utils for Compress.
+ */
+public class CompressUtils {
+       /*
+        * This class should not be constructed
+        */
+       private CompressUtils() {
+               // unused
+       }
+       
+       /**
+     * Copy bytes from an <code>InputStream</code> to an 
<code>OutputStream</code>.
+     */
+    public static void copy( final InputStream input,
+                              final OutputStream output )
+        throws IOException {
+        final byte[] buffer = new byte[ 8024 ];
+        int n = 0;
+        while( -1 != ( n = input.read( buffer ) ) ) {
+            output.write( buffer, 0, n );
+        }
+    }
+    
+    /**
+     * Compares one byte array to another
+        * @param source- the array to compare to 
+        * @param headerBytes - the bytearray match
+        */
+       public static boolean compareByteArrays(byte[] source, byte[] match) {
+               int i = 0;
+               while(source.length < i || i < match.length ) {
+                       if(source[i] != match[i]) {
+                               return false;
+                       }
+                       i++;
+               }
+               return true;
+       }
+}

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressUtils.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressUtils.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/Compressor.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/Compressor.java?rev=427890&view=auto
==============================================================================
--- 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/Compressor.java
 (added)
+++ 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/Compressor.java
 Tue Aug  1 21:45:26 2006
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2002,2004 The Apache Software Foundation.
+ * 
+ * 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.apache.commons.compress;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+/**
+ * The Compressor Interface defines all operations for 
+ * the compress/decompress actions.
+ */
+public interface Compressor {
+       /**
+        * Compresses this file and returns an 
+        * InputStream to the compressed File
+        * 
+        * @param input File to compress
+        * @return FileInputStream of the compressed file
+        * @throws CompressException if the Compressor reports an error
+        */
+       public InputStream compress(File input) 
+               throws CompressException;
+       
+       /**
+        * Compresses this InputStream and returns an 
+        * InputStream to the compressed file
+        * 
+        * @param input Stream to compress
+        * @return Stream to the compressed file
+        * @throws CompressException if the Compressor reports an error
+        */
+       public InputStream compress(FileInputStream input) 
+               throws CompressException;
+
+       /**
+        * Compresses the file input and creates a file in the same
+        * directory with the default file extension in its name.
+        * 
+        * @param input the file to compress
+        * @throws CompressException if the Compressor reports an error
+        */
+       public void compressToHere(File input) 
+               throws CompressException;
+
+       /**
+        * Creates the file "output" with the compressed
+        * content of file "input"
+        * 
+        * @param input the file to compress
+        * @param output the file to create
+        * @throws CompressException if the Compressor reports an error
+        */
+       public void compressTo(File input, File output) 
+               throws CompressException;
+       
+       /**
+        * Compresses the input stream and writes the compressed
+        * bytes to the output stream. This method must be implemented
+        * by all new compressortypes.
+        * 
+        * @param input InputStream to compress to
+        * @param output OutputStream to which the byte shall be written
+        * @throws CompressException if the Compressor reports an error
+        */
+       public void compressTo(FileInputStream input, FileOutputStream output) 
+               throws CompressException;
+       
+       /**
+        * Decompresses a file and returns an InputStream
+        * @param input file to decompress
+        * @return the decompressed file as an inputstream
+        */
+       public InputStream decompress(File input) 
+               throws CompressException;
+       
+       /**
+        * Decompresses a file and returns an InputStream
+        * @param input inputstream to decompress
+        * @return the decompressed InputStream
+        */
+       public InputStream decompress(FileInputStream inputStream) 
+               throws CompressException;;
+       
+       /**
+        * Decompresses this file and writes the decompressed byte to the 
output file
+        * @param input File to decompress
+        * @param output File to write the decompressed bytes to
+        * @throws DecompressException if the Compressor reports an error
+        */
+       public void decompressTo(File input, File output) 
+               throws CompressException;
+       
+       /**
+        * Decompresses this file and writes the decompressed file to the 
output-stream
+        * @param input Stream to decompress
+        * @param output Stream to write the decompressed bytes to
+        * @throws DecompressException if the Compressor reports an error
+        */
+       public void decompressTo(FileInputStream input, FileOutputStream 
output) 
+               throws CompressException;
+}
\ No newline at end of file

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/Compressor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/Compressor.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/Compressor.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressorFactory.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressorFactory.java?rev=427890&view=auto
==============================================================================
--- 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressorFactory.java
 (added)
+++ 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressorFactory.java
 Tue Aug  1 21:45:26 2006
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2002,2004 The Apache Software Foundation.
+ * 
+ * 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.apache.commons.compress;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.commons.compress.compressors.bzip2.BZip2Compressor;
+/**
+ * Compressor-Factory. 
+ * Use CompressorFactory.TYPE.getInstance() for an new Compressor-Instance.
+ */
+public abstract class CompressorFactory {
+       /* Name of this CompressorFactory*/
+       private final String name;
+       /* internal archiver list */
+       private static List compressors;
+       
+       // register compressors 
+       static {
+               compressors = new ArrayList();
+               try {
+                       registerCompressor(BZip2Compressor.class);
+               } catch (CompressException e) {
+                       e.printStackTrace();
+               }
+       }
+       
+       /**
+        * Registers a new archiver in the factory.
+        * The archiver must implement the archiver interface.
+        * 
+        * @param className full qualified archiver implementation
+        * @throws ClassNotFoundException if the new archiver class could not 
be found
+        * @throws ArchiveException if the new archiver does not implement the 
archiver interface
+        */
+       public static void registerCompressor(String className) 
+               throws ClassNotFoundException, CompressException {
+               Class clazz = Class.forName(className);
+               registerCompressor(clazz);
+       }
+       
+       /**
+        * Registers a new archiver in the factory.
+        * The archiver must implement the archiver interface and must
+        * be an concrete implementation
+        * 
+        * @param className full qualified archiver implementation
+        * @throws ArchiveException if the new archiver does not implement the 
archiver interface
+        */
+       public static void registerCompressor(Class clazz) 
+               throws CompressException {
+               // register only, if the class is assignable and not an 
interface
+               if(Compressor.class.isAssignableFrom(clazz) && 
!(clazz.isInterface())) {
+                       try {
+                               compressors.add(clazz.newInstance());
+                       } catch (InstantiationException e) {
+                               throw new CompressException("Compressor could 
not be instantiated", e);
+                       } catch (IllegalAccessException e) {
+                               throw new CompressException("Compressor could 
not be instantiated", e);
+                       }
+               } else {
+                       throw new CompressException("Compressor does not 
implement the Compressor.class interface.");
+               }
+       }
+
+       /**
+        * Constructor. Takes the name of the implementation.
+        * @param _name - name of the implementation
+        */
+       private CompressorFactory(String name) { 
+               this.name = name; 
+       }
+
+       /**
+        * Returns a compressor
+        * @return the compressor
+        */
+       public abstract Compressor getInstance();
+
+       /**
+        * Returns an empty Compressor, if an matching compressor 
+        * could be found within this factory.
+        * If two implementations with the same name are registered,
+        * the first matching implementation will be instanciated.
+        * 
+        * @return the compressor, or null, if no matching compressor could be 
found
+        * @throws CompressorException if the compressor could not be created
+        */
+       public static Compressor getInstance(String compressorName) 
+               throws CompressException {
+               try {
+                       if(compressorName == null) {
+                               throw new CompressException("CompressorFactory 
could not create instance");
+                       }
+                       Iterator it = compressors.iterator();
+                       while(it.hasNext()) {
+                               PackableObject po = (PackableObject)it.next();
+                               if(po.isPackableWith(compressorName, 
PackableObject.CHOOSE_NAME)) {
+                                       return 
(Compressor)po.getClass().newInstance();
+                               }
+                       }
+                       return null;
+               } catch (InstantiationException e) {
+                       throw new CompressException("CompressorFactory could 
not create instance", e);
+               } catch (IllegalAccessException e) {
+                       throw new CompressException("CompressorFactory could 
not create instance", e);
+               }
+       }
+       
+       /**
+        * Returns an archiver, filled with an existing archive.
+        * Uses the byte header to identify the archiver. If no corresponding
+        * archiver could be found, a filename extension check will be done.
+        * @param archivedFile an existing archive
+        * @return an archiver, filled with the archive
+        */
+       public static Compressor getInstance(File file) 
+               throws CompressException {
+               if(file == null && !file.isFile()) {
+                       throw new CompressException("CompressorFactory could 
not create instance for this file");
+               }
+               
+               
+               /* Archive result */
+               PackableObject packable = null; 
+               
+               try {
+                       packable = PackableObject.identifyByHeader(file, 
compressors);
+                       
+                       if(packable == null) {
+                               return null;
+                       }
+                       Compressor compressor = 
(Compressor)packable.getClass().newInstance();
+                       return compressor;
+               } catch (SecurityException e) {
+                       throw new CompressException("A security violation 
occured while reading the field ARCHIVER_NAME", e);
+               } catch (IllegalArgumentException e) {
+                       throw new CompressException("Internal factory 
exception", e);
+               } catch (InstantiationException e) {
+                       throw new CompressException("CompressorFactory could 
not create instance", e);
+               } catch (IllegalAccessException e) {
+                       throw new CompressException("CompressorFactory could 
not create instance", e);
+               } catch (PackableObjectException e) {
+                       throw new CompressException("CompressorFactory could 
not create instance", e);
+               } 
+       }
+       /**
+        * <code>BZIP2</code> Compressor Factory
+        */
+       public static CompressorFactory BZIP2 = new CompressorFactory("BZIP2") {
+               /* (non-Javadoc)
+                * @see 
org.apache.commons.compress.ArchiverFactory#getInstance()
+                */
+               public Compressor getInstance() { 
+                       return new BZip2Compressor(); 
+               }
+       };
+       
+       /* (non-Javadoc)
+        * @see java.lang.Object#toString()
+        */
+       public String toString() { 
+               return name; 
+       }
+}
\ No newline at end of file

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressorFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressorFactory.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/CompressorFactory.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/PackableObject.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/PackableObject.java?rev=427890&view=auto
==============================================================================
--- 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/PackableObject.java
 (added)
+++ 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/PackableObject.java
 Tue Aug  1 21:45:26 2006
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2002,2004 The Apache Software Foundation.
+ * 
+ * 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.apache.commons.compress;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+/**
+ * Abstract super object for Compressor and Archiver classes.
+ */
+public abstract class PackableObject {
+       /* Type for archive choosing: String */
+       protected static final int CHOOSE_EXTENSION = 1;
+       /* Type for archive choosing: Long */
+       protected static final int CHOOSE_NAME = 2;
+
+       /** 
+        * Header byte array for this archive. 
+        */
+       public abstract byte[] getHeader();
+
+       /** 
+        * Returns the default FileExtension for this archive,
+        * for example "zip", "tar"... 
+        */
+       public abstract String getDefaultFileExtension();
+       
+       /** 
+        * Returns the ArchiveName for this archive.  
+        */
+       public abstract String getName();
+
+       /**
+        * String Chooser.
+        * @param value
+        * @param methodName
+        * @return
+        * @throws ArchiveException
+        * @throws FileNotFoundException 
+        */
+       protected boolean isPackableWith(Object value, int choose) {
+               if(value == null) {
+                       return false;
+               }
+               if(choose == CHOOSE_EXTENSION) {
+                       if(value.equals( getDefaultFileExtension())) {
+                               return true;
+                       }
+               } else if (choose == CHOOSE_NAME) {
+                       if(value.equals( getName())) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+       
+       /**
+        * Compares a file to a list of packables and identifies an object by 
header.
+        * If no matching header is found, it identifies the file by file 
extension. 
+        * If identification was not successfull, null is returned
+        * 
+        * @param file the file to identify
+        * @param packables a list of packables
+        * @return a matching packable object, or null
+        * @throws ArchiveException
+        */
+       public static PackableObject identifyByHeader(File file, List 
packables) 
+               throws PackableObjectException {
+               /* FileInputStream for the archive */
+               FileInputStream fis = null;
+               
+               try {
+                       /* Archive result */
+                       PackableObject packable = null; 
+                       
+       //               identify archive by header
+                       fis = new FileInputStream(file);
+                       byte[] headerBytes = new byte[20];
+                       fis.read(headerBytes, 0, 20);
+                       
+                       Iterator iter = packables.iterator();
+                       while(iter.hasNext()) {
+                               PackableObject p = (PackableObject)iter.next();
+                               byte[] fieldHeader = p.getHeader();
+                               if(fieldHeader != null) {
+                                       
if(CompressUtils.compareByteArrays(headerBytes, fieldHeader)) {
+                                               return p;
+                                       }
+                               }
+                       }
+                       
+                       // if we couldn't find an archiver by header bytes, 
we'll give it a try
+                       // with the default name extension. This is useful, 
cause some archives 
+                       // like tar have no header.
+                       String name = file.getName();
+                       String extension = null;
+                       String[] s = name.split("\\.");
+                       if(s.length > 1) {
+                               extension = s[ s.length - 1];
+                       }
+                       Iterator it = packables.iterator();
+                       while(it.hasNext()) {
+                               PackableObject p = (PackableObject)it.next();
+                               if(p.isPackableWith(extension, 
PackableObject.CHOOSE_EXTENSION)) {
+                                       return p;
+                               }
+                       }
+                       
+                       // No implementation found
+                       return null;
+               } catch (FileNotFoundException e) {
+                       throw new PackableObjectException("File not found", e);
+               } catch (IOException e) {
+                       throw new PackableObjectException("Internal factory 
exception", e);
+               } finally {
+                       try {
+                               fis.close();
+                       } catch (IOException e1) {
+                               throw new PackableObjectException("Error while 
closing InputStream to file", e1);
+                       }
+               }
+       }
+}

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/PackableObject.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/PackableObject.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: 
jakarta/commons/sandbox/compress/trunk/src/java/org/apache/commons/compress/PackableObject.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to