/*
 * 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;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.compress.AbstractTestCase;
import org.apache.commons.compress.archivers.ar.ArArchiveEntry;
import org.apache.commons.compress.utils.IOUtils;

public final class ArTestCase extends AbstractTestCase {

	public void testArArchiveCreation() throws Exception {
		final File output = new File(dir, "bla.ar");
		
		final File file1 = getFile("test1.xml");
		final File file2 = getFile("test2.xml");
		
		final OutputStream out = new FileOutputStream(output);
        final ArchiveOutputStream os = new ArchiveStreamFactory().createArchiveOutputStream("ar", out);
		os.putArchiveEntry(new ArArchiveEntry("test1.xml", file1.length()));
		IOUtils.copy(new FileInputStream(file1), os);
		os.closeArchiveEntry();
		
		os.putArchiveEntry(new ArArchiveEntry("test2.xml", file2.length()));
		IOUtils.copy(new FileInputStream(file2), os);
		os.closeArchiveEntry();
		
		os.close();
	}

	public void testArUnarchive() throws Exception {
		final File output = new File(dir, "bla.ar");
		{
			final File file1 = getFile("test1.xml");
			final File file2 = getFile("test2.xml");
			
			final OutputStream out = new FileOutputStream(output);
	        final ArchiveOutputStream os = new ArchiveStreamFactory().createArchiveOutputStream("ar", out);
			os.putArchiveEntry(new ArArchiveEntry("test1.xml", file1.length()));
			IOUtils.copy(new FileInputStream(file1), os);
			os.closeArchiveEntry();
			
			os.putArchiveEntry(new ArArchiveEntry("test2.xml", file2.length()));
			IOUtils.copy(new FileInputStream(file2), os);
			os.closeArchiveEntry();
			os.close();
			out.close();
		}
		
		// UnArArchive Operation
		final File input = output;
		final InputStream is = new FileInputStream(input);
		final ArchiveInputStream in = new ArchiveStreamFactory().createArchiveInputStream(new BufferedInputStream(is));
		final ArArchiveEntry entry = (ArArchiveEntry)in.getNextEntry();
		
		File target = new File(dir, entry.getName());
        final OutputStream out = new FileOutputStream(target);
        
        IOUtils.copy(in, out);
    
        out.close();
        in.close();
        is.close();
	}

	public void testArDelete() throws Exception {
		final File output = new File(dir, "bla.ar");
		
		{
			// create
			final File file1 = getFile("test1.xml");
			final File file2 = getFile("test2.xml");
			
			final OutputStream out = new FileOutputStream(output);
	        final ArchiveOutputStream os = new ArchiveStreamFactory().createArchiveOutputStream("ar", out);
			os.putArchiveEntry(new ArArchiveEntry("test1.xml", file1.length()));
			IOUtils.copy(new FileInputStream(file1), os);
			os.closeArchiveEntry();
			
			os.putArchiveEntry(new ArArchiveEntry("test2.xml", file2.length()));
			IOUtils.copy(new FileInputStream(file2), os);
			os.closeArchiveEntry();
			os.close();
			out.close();
		}
		
		final File output2 = new File(dir, "bla2.ar");		

		{
			// remove all but one file
			final InputStream is = new FileInputStream(output);
			final OutputStream os = new FileOutputStream(output2);
			final ArchiveOutputStream aos = new ArchiveStreamFactory().createArchiveOutputStream("ar", os);
			final ArchiveInputStream ais = new ArchiveStreamFactory().createArchiveInputStream(new BufferedInputStream(is));
			while(true) {
				final ArArchiveEntry entry = (ArArchiveEntry)ais.getNextEntry();
				if (entry == null) {
					break;
				}
				
				if ("test1.xml".equals(entry.getName())) {
					aos.putArchiveEntry(entry);
				}
			}
			ais.close();
			aos.close();
			is.close();
			os.close();			
		}

		
		long sum = 0;

		{
			final InputStream is = new FileInputStream(output2);
			final ArchiveInputStream ais = new ArchiveStreamFactory().createArchiveInputStream(is);
			while(true) {
				final ArArchiveEntry entry = (ArArchiveEntry)ais.getNextEntry();
				if (entry == null) {
					break;
				}
				
				final ByteArrayOutputStream os = new ByteArrayOutputStream();
		        IOUtils.copy(ais, os);
		        
		        sum +=  entry.getLength();
			}
			ais.close();
			is.close();			
		}

		assertEquals(0, sum);
		
	}

}

@@ -4503,25 +4503,130 @@
 entry);%0A%09%09%09%09
-%7D
+%09IOUtils.copy(ais, aos);%0A%09%09%09%09%7D else %7B%0A%09%09%09        IOUtils.copy(ais, new ByteArrayOutputStream());%0A%09%09%09%09%7D%0A%09%09%09
 %0A%09%09%09%7D%0A%09%09%09ais
@@ -4855,19 +4855,44 @@
 tStream(
+new BufferedInputStream(
 is)
+)
 ;%0A%09%09%09whi
@@ -5025,102 +5025,61 @@
 %09%0A%09%09
-%09%09final ByteArrayOutputStream os = new ByteArrayOutputStream();%0A%09%09        IOUtils.copy(ais, os
+        IOUtils.copy(ais, new ByteArrayOutputStream()
 );%0A%09
@@ -5184,17 +5184,18 @@
 tEquals(
-0
+76
 , sum);%0A

fixed the testcase