1 package org.vafer.jar.merging;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.security.NoSuchAlgorithmException;
6 import java.util.HashSet;
7 import java.util.Set;
8 import java.util.jar.JarEntry;
9
10 import org.apache.commons.io.IOUtils;
11 import org.apache.commons.io.output.NullOutputStream;
12 import org.vafer.jar.Jar;
13 import org.vafer.jar.JarProcessor;
14 import org.vafer.jar.handler.DelegatingJarHandler;
15 import org.vafer.jar.handler.VersionsJarHandler;
16 import org.vafer.jar.handler.VersionsJarHandler.Version;
17
18
19 public class MergeSameStrategy implements MergeStrategy {
20
21 public DelegatingJarHandler getMergeHandler( final Jar[] jars ) throws IOException {
22
23 final VersionsJarHandler checksumHandler;
24
25 try {
26 checksumHandler = new VersionsJarHandler();
27 } catch (NoSuchAlgorithmException e) {
28 return null;
29 };
30
31 new JarProcessor().processJars(jars, checksumHandler);
32
33 final Set seen = new HashSet();
34
35 final DelegatingJarHandler handler =
36 new DelegatingJarHandler() {
37
38 private void resourceRemove( JarEntry entry, InputStream input ) throws IOException {
39 IOUtils.copy(input, new NullOutputStream());
40 }
41
42 public void onResource( JarEntry entry, InputStream input ) throws IOException {
43 final String name = entry.getName();
44 final Version[] versions = checksumHandler.getVersions(name);
45
46 if (versions.length == 1) {
47 seen.add(name);
48 super.onResource(entry, input);
49 return;
50 }
51
52 if (sameVersions(versions)) {
53 if (seen.contains(name)) {
54 System.out.println("WARN: merged " + versions.length + " versions of " + name + " into one");
55 resourceRemove(entry, input);
56 return;
57 }
58 seen.add(name);
59 super.onResource(entry, input);
60 return;
61 }
62
63 System.out.println("ERROR: found clash on " + name);
64
65 resourceRemove(entry, input);
66 }
67
68 private boolean sameVersions( final Version[] versions ) {
69 final Version current = versions[0];
70 for (int i = 0; i < versions.length; i++) {
71 final Version version = versions[i];
72 if (!current.getDigestString().equals(version.getDigestString())) {
73 return false;
74 }
75 }
76 return true;
77 }
78 };
79
80 return handler;
81 }
82
83 }