View Javadoc

1   package net.sf.jlayercheck.util.model;
2   
3   import java.io.File;
4   import java.io.FileInputStream;
5   import java.io.FileNotFoundException;
6   import java.io.IOException;
7   import java.net.MalformedURLException;
8   import java.net.URL;
9   import java.util.Map;
10  import java.util.TreeMap;
11  
12  import org.objectweb.asm.ClassReader;
13  import org.objectweb.asm.ClassVisitor;
14  
15  public class FilesystemClassSource implements ClassSource {
16  
17  	/** Path to the .class files */
18  	protected String bin;
19  	
20  	/** Path to the .java files */
21  	protected String src;
22  	
23  	/** Directory where the other pathes are relative to */
24  	protected String basedir;
25  	
26  	public FilesystemClassSource(String basedir, String bin, String src) {
27  		this.basedir = basedir;
28  		this.bin = bin;
29  		this.src = src;
30  	}
31  	
32      public void call(ClassVisitor v) throws IOException {
33  		File f = new File(getBasedir(), getBin());
34  
35          checkDirectory(v, f);
36  	}
37  
38  	protected void checkDirectory(ClassVisitor v, File f) throws IOException, FileNotFoundException {
39          File files[] = f.listFiles();
40          if (files != null) {
41          	for(File file : files) {
42          		if (file.isDirectory()) {
43          			checkDirectory(v, file);
44          		} else {
45          			String name = file.getAbsolutePath();
46          			if (name.endsWith(".class")) {
47          				new ClassReader(new FileInputStream(file)).accept(v, 0);
48          			}
49          		}
50          	}
51          }
52  	}
53  
54  	public Map<String, URL> getSourceFiles() {
55  		Map<String, URL> result = new TreeMap<String, URL>();
56  		
57  		result.putAll(findFiles(getSrc(), "", ".java"));
58  		
59  		return result;
60  	}
61  
62  	/**
63  	 * Returns a map containing all sources found by a recursive search.
64  	 * 
65  	 * @param src start directory
66  	 * @param extension only files with this extension are added
67  	 * @return
68  	 */
69  	protected Map<String, URL> findFiles(String base, String src, String extension) {
70  		Map<String, URL> result = new TreeMap<String, URL>();
71  		
72  		File searchbase = new File(base, src);
73  		File[] files = searchbase.listFiles();
74  		if (files != null) {
75  			for(File singlefile : files) {
76  				if (singlefile.isDirectory()) {
77  					result.putAll(findFiles(base, src + File.separator + singlefile.getName(), extension));
78  				}
79  
80  				if (singlefile.isFile()) {
81  					if (singlefile.getName().endsWith(extension)) {
82  						try {
83  							String filename = src + File.separator + singlefile.getName();
84  							filename = filename.replaceAll("^/", ""); // remove leading slash
85  							filename = filename.replaceAll(extension+"$", ""); // remove extension
86  							result.put(filename, singlefile.toURL());
87  						} catch (MalformedURLException e) {
88  							e.printStackTrace();
89  						}
90  					}
91  				}
92  			}
93  		}
94  		
95  		return result;
96  	}
97  
98  	public String getBin() {
99  		return bin;
100 	}
101 
102 	public void setBin(String bin) {
103 		this.bin = bin;
104 	}
105 
106 	public String getSrc() {
107 		return src;
108 	}
109 
110 	public void setSrc(String src) {
111 		this.src = src;
112 	}
113 
114 	public String getBasedir() {
115 		return basedir;
116 	}
117 
118 	public void setBasedir(String basedir) {
119 		this.basedir = basedir;
120 	}
121 }