View Javadoc

1   /***
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3    */
4   package net.sourceforge.pmd.cpd;
5   
6   import net.sourceforge.pmd.PMD;
7   
8   import java.io.File;
9   import java.io.FileReader;
10  import java.io.LineNumberReader;
11  import java.io.Reader;
12  import java.io.StringReader;
13  import java.lang.ref.SoftReference;
14  import java.util.ArrayList;
15  import java.util.List;
16  
17  public class SourceCode {
18  
19      public static abstract class CodeLoader {
20          private SoftReference code;
21  
22          public List getCode() {
23              List c = null;
24              if (code != null) {
25                  c = (List) code.get();
26              }
27              if (c != null) {
28                  return c;
29              }
30              this.code = new SoftReference(load());
31              return (List) code.get();
32          }
33  
34          public abstract String getFileName();
35  
36          protected abstract Reader getReader() throws Exception;
37  
38          protected List load() {
39              LineNumberReader lnr = null;
40              try {
41                  lnr = new LineNumberReader(getReader());
42                  List lines = new ArrayList();
43                  String currentLine;
44                  while ((currentLine = lnr.readLine()) != null) {
45                      lines.add(currentLine);
46                  }
47                  return lines;
48              } catch (Exception e) {
49                  throw new RuntimeException("Problem while reading " + getFileName() + ":" + e.getMessage());
50              } finally {
51                  try {
52                      if (lnr != null)
53                          lnr.close();
54                  } catch (Exception e) {
55                      throw new RuntimeException("Problem while reading " + getFileName() + ":" + e.getMessage());
56                  }
57              }
58          }
59      }
60  
61      public static class FileCodeLoader extends CodeLoader {
62          private File file;
63  
64          public FileCodeLoader(File file) {
65              this.file = file;
66          }
67  
68          public Reader getReader() throws Exception {
69              return new FileReader(file);
70          }
71  
72          public String getFileName() {
73              return this.file.getAbsolutePath();
74          }
75      }
76  
77      public static class StringCodeLoader extends CodeLoader {
78          public static final String DEFAULT_NAME = "CODE_LOADED_FROM_STRING";
79  
80          private String source_code;
81  
82          private String name;
83  
84          public StringCodeLoader(String code) {
85              this(code, DEFAULT_NAME);
86          }
87  
88          public StringCodeLoader(String code, String name) {
89              this.source_code = code;
90              this.name = name;
91          }
92  
93          public Reader getReader() {
94              return new StringReader(source_code);
95          }
96  
97          public String getFileName() {
98              return name;
99          }
100     }
101 
102     private CodeLoader cl;
103 
104     public SourceCode(CodeLoader cl) {
105         this.cl = cl;
106     }
107 
108     public List getCode() {
109         return cl.getCode();
110     }
111 
112     public StringBuffer getCodeBuffer() {
113         StringBuffer sb = new StringBuffer();
114         List lines = cl.getCode();
115         for (int i = 0; i < lines.size(); i++) {
116             sb.append((String) lines.get(i));
117             sb.append(PMD.EOL);
118         }
119         return sb;
120     }
121 
122     public String getSlice(int startLine, int endLine) {
123         StringBuffer sb = new StringBuffer();
124         List lines = cl.getCode();
125         for (int i = startLine - 1; i < endLine && i < lines.size(); i++) {
126             if (sb.length() != 0) {
127                 sb.append(PMD.EOL);
128             }
129             sb.append((String) lines.get(i));
130         }
131         return sb.toString();
132     }
133 
134     public String getFileName() {
135         return cl.getFileName();
136     }
137 }