1/**
2 * Copyright 2007 Google Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.tonicsystems.jarjar.util;
18
19import java.util.jar.JarEntry;
20import java.util.jar.JarFile;
21import java.util.jar.JarOutputStream;
22import java.util.Enumeration;
23import java.io.*;
24import java.util.*;
25
26public class StandaloneJarProcessor
27{
28    public static void run(File from, File to, JarProcessor proc) throws IOException {
29        byte[] buf = new byte[0x2000];
30
31        JarFile in = new JarFile(from);
32        final File tmpTo = File.createTempFile("jarjar", ".jar");
33        JarOutputStream out = new JarOutputStream(new FileOutputStream(tmpTo));
34        Set<String> entries = new HashSet<String>();
35        try {
36            EntryStruct struct = new EntryStruct();
37            Enumeration<JarEntry> e = in.entries();
38            while (e.hasMoreElements()) {
39                JarEntry entry = e.nextElement();
40                struct.name = entry.getName();
41                struct.time = entry.getTime();
42                ByteArrayOutputStream baos = new ByteArrayOutputStream();
43                IoUtil.pipe(in.getInputStream(entry), baos, buf);
44                struct.data = baos.toByteArray();
45                if (proc.process(struct)) {
46                    if (entries.add(struct.name)) {
47                        entry = new JarEntry(struct.name);
48                        entry.setTime(struct.time);
49                        entry.setCompressedSize(-1);
50                        out.putNextEntry(entry);
51                        out.write(struct.data);
52                    } else if (struct.name.endsWith("/")) {
53                        // TODO(chrisn): log
54                    } else {
55                        throw new IllegalArgumentException("Duplicate jar entries: " + struct.name);
56                    }
57                }
58            }
59
60        }
61        finally {
62            in.close();
63            out.close();
64        }
65
66         // delete the empty directories
67        IoUtil.copyZipWithoutEmptyDirectories(tmpTo, to);
68        tmpTo.delete();
69
70    }
71}
72