1 package org.naftulin.classpathexplorer.dublicate.imlp;
2
3 import java.io.File;
4 import java.io.Serializable;
5 import java.util.ArrayList;
6 import java.util.List;
7
8 import org.naftulin.classpathexplorer.AccessibleResource;
9
10
11 /***
12 * Finds dublicate resource in the class path (unless a different path is provided).
13 * Most methods use class path to discover resources; to specify the path use
14 * {@link #getDublicateResources(String[])} method.
15 *
16 * @author henry naftulin
17 * @version 1.0
18 */
19 public class DuplicateResourcesReport implements Serializable {
20 private static final long serialVersionUID = 1L;
21 private String[] accesptedExtensions;
22 private static final AccessibleResource[] EMPTY_RESOURCES = new AccessibleResource[0];
23
24 /***
25 * Returns the extensions that are accepted and only file ending with those ending will be reported to in dublicate reported.
26 * @return the extensions that are accepted and only file ending with those ending will be reported to in dublicate reported.
27 */
28 public String[] getAccesptedExtensions() {
29 return (String[]) accesptedExtensions.clone();
30 }
31
32 /***
33 * Sets the extension that are accepted and only file ending with those ending will be reported to in dublicate reported.
34 * @param acceptedExtensions file ending with those ending will be reported to in dublicate reported.
35 */
36 public void setAccesptedExtensions(String[] acceptedExtensions) {
37 this.accesptedExtensions = (String[])acceptedExtensions.clone();
38 }
39
40 /***
41 * Returns dublicate resources.
42 * @return dublicate resources.
43 */
44 public AccessibleResource[] getDublicateResources() {
45 ResourceRegistry registry = init();
46 AccessibleResource[] retArray = doGetDublicateResources(registry);
47
48 return retArray;
49 }
50
51 /***
52 * Returns dublicate resources given initialized resource registry.
53 * @param registry initialized resource registry.
54 * @return dublicate resources.
55 */
56 private AccessibleResource[] doGetDublicateResources(ResourceRegistry registry) {
57 AccessibleResource[] retArray = EMPTY_RESOURCES;
58 AccessibleResource[] dups = registry.getDublicatedResources();
59 if (accesptedExtensions != null && accesptedExtensions.length >0) {
60 List list = new ArrayList(dups.length);
61 boolean acceptValue;
62 int j;
63 for(int i=0; i < dups.length; ++i) {
64 acceptValue = false;
65 j=0;
66 if (dups[i].getName()!= null) {
67 while(j<accesptedExtensions.length && !acceptValue) {
68 acceptValue |= dups[i].getName().endsWith(accesptedExtensions[j]);
69 ++j;
70 }
71 }
72 if (acceptValue) {
73 list.add(dups[i]);
74 }
75 }
76 retArray = new AccessibleResource[list.size()];
77 retArray = (AccessibleResource[]) list.toArray(retArray);
78 } else {
79 retArray = dups;
80 }
81 return retArray;
82 }
83
84 /***
85 * Returns dublicate resources as string.
86 * @return dublicate resources as string.
87 */
88 public String getDublicateResourcesAsStringReport() {
89 AccessibleResource[] dups = getDublicateResources();
90 StringBuffer buf = new StringBuffer(1000);
91 for(int i=0; i < dups.length; ++i) {
92 buf.append(dups[i]).append("\n");
93 }
94 return buf.toString();
95 }
96
97 /***
98 * Returns dublicate resources as xml string.
99 * @return dublicate resources as xml string.
100 */
101 public String getDublicateResourcesAsXmlReport() {
102 AccessibleResource[] dups = getDublicateResources();
103 StringBuffer buf = new StringBuffer(1000);
104 buf.append("<dublicateResources>\n");
105 for(int i=0; i < dups.length; ++i) {
106 buf.append(dups[i].toXml()).append("\n");
107 }
108 buf.append("</dublicateResources>");
109 return buf.toString();
110 }
111
112 /***
113 * Returns dublicate resources given archives path. Archives path points to either
114 * directories or .jar and .zip files.
115 * @param given archives path.
116 * @return dublicate resources
117 */
118 public AccessibleResource[] getDublicateResources(String[] archivesPath) {
119 ResourceRegistry registry = ResourceRegistry.getInstance();
120 registry.clearRegistry();
121 registry.discoverResources(archivesPath);
122 AccessibleResource[] retArray = doGetDublicateResources(registry);
123
124 return retArray;
125 }
126
127 /***
128 * Returns the initialized resource registry based on the class path.
129 * Package protected method for easy testing.
130 * @return initialized registry based on the class path
131 */
132 ResourceRegistry init() {
133 ResourceRegistry registry = ResourceRegistry.getInstance();
134 registry.clearRegistry();
135 String classPath = System.getProperty("java.class.path");
136 String[] classPathArr = classPath.split(File.pathSeparator);
137 registry.discoverResources(classPathArr);
138 return registry;
139 }
140
141 }