View Javadoc

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  }