/*
 *  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.harmony.unpack200;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.jar.JarOutputStream;
import java.util.jar.Pack200.Unpacker;

import org.apache.harmony.unpack200.Pack200Exception;
import org.apache.harmony.unpack200.Segment;

/**
 * This class provides the binding between the standard Pack200 interface and
 * the internal interface for (un)packing. As this uses generics for the
 * SortedMap, this class must be compiled and run on a Java 1.5 system. However,
 * Java 1.5 is not necessary to use the internal libraries for unpacking.
 */
public class Pack200UnpackerAdapter extends Pack200Adapter implements Unpacker {
	/*
	 * (non-Javadoc)
	 *
	 * @see java.util.jar.Pack200.Unpacker#unpack(java.io.InputStream,
	 *      java.util.jar.JarOutputStream)
	 */
	public void unpack(InputStream in, JarOutputStream out) throws IOException {
		if (in == null || out == null)
			throw new IllegalArgumentException(
					"Must specify both input and output streams");
		completed(0);
		try {
			while (in.available() > 0) {
			    new Segment().unpack(in, out);
				out.flush();
			}
		} catch (Pack200Exception e) {
			throw new IOException("Failed to unpack Jar:" + String.valueOf(e));
		}
		completed(1);
		in.close();
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see java.util.jar.Pack200.Unpacker#unpack(java.io.File,
	 *      java.util.jar.JarOutputStream)
	 */
	public void unpack(File file, JarOutputStream out) throws IOException {
		if (file == null || out == null)
			throw new IllegalArgumentException(
					"Must specify both input and output streams");
		int size = (int) file.length();
		int bufferSize = (size > 0 && size < DEFAULT_BUFFER_SIZE ? size
				: DEFAULT_BUFFER_SIZE);
		InputStream in = new BufferedInputStream(new FileInputStream(file),
				bufferSize);
		unpack(in, out);
	}
}

@@ -1072,108 +1072,8 @@
 r;%0A%0A
-import org.apache.harmony.unpack200.Pack200Exception;%0Aimport org.apache.harmony.unpack200.Segment;%0A%0A
 /**%0A
@@ -1832,102 +1832,59 @@
 y %7B%0A
-%09%09%09while (in.available() %3E 0) %7B%0A%09%09%09    new Segment().unpack(in, out);%0A%09%09%09%09out.flush();%0A%09%09%09%7D%0A%09%09
+            new Archive(in, out).unpack();%0A        
 %7D ca
@@ -1910,19 +1910,28 @@
 on e) %7B%0A
-%09%09%09
+            
 throw ne
@@ -1990,18 +1990,24 @@
 Of(e));%0A
-%09%09
+        
 %7D%0A%09%09comp

Apply modified patch for HARMONY-5796 ([classlib][pack200] Pack200UnpackerAdapter still using Segment)