KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > hammurapi > inspectors > metrics > JspInspector


1 /*
2  * Created on May 29, 2004
3  *
4  *
5  * JSP invoke technique r Servlet response.redirect a HTML action L HTML HREF I
6  * JSP include f JSP forward X JavaScript s HTML Frame Source
7  *
8  */

9 package org.hammurapi.inspectors.metrics;
10
11 import java.io.FileInputStream JavaDoc;
12 import java.io.FileOutputStream JavaDoc;
13 import java.util.Collection JavaDoc;
14 import java.util.HashMap JavaDoc;
15 import java.util.Iterator JavaDoc;
16 import java.util.List JavaDoc;
17 import java.util.Map JavaDoc;
18 import java.util.Properties JavaDoc;
19
20 import org.hammurapi.InspectorBase;
21 import org.hammurapi.HammurapiException;
22 import org.hammurapi.results.AnnotationContext;
23 import org.hammurapi.results.LinkedAnnotation;
24 import org.w3c.dom.Document JavaDoc;
25 import org.w3c.dom.Element JavaDoc;
26
27 import com.pavelvlasov.config.ConfigurationException;
28 import com.pavelvlasov.jsel.JselException;
29 import com.pavelvlasov.jsel.Repository;
30 import com.pavelvlasov.jsel.TypeDefinition;
31 import com.pavelvlasov.jsel.VariableDefinition;
32 import com.pavelvlasov.jsel.expressions.MethodCall;
33 import com.pavelvlasov.jsel.expressions.StringConstant;
34 import com.pavelvlasov.render.RenderRequest;
35 import com.pavelvlasov.render.RenderingException;
36 import com.pavelvlasov.render.dom.AbstractRenderer;
37 import com.pavelvlasov.review.SourceMarker;
38 /**
39  * @author MUCBJ0
40  *
41  * TODO parameter for JspBase Type, Jsp File Extractor,
42  */

43 public class JspInspector extends InspectorBase
44         implements
45             com.pavelvlasov.config.Parameterizable {
46     
47     private Map JavaDoc jspList = new HashMap JavaDoc();
48     private boolean isJavaScriptStream = false;
49     private JspDescriptor currentJspDescriptor = null;
50     private String JavaDoc jspBaseClass = "";
51     
52     public void visit(MethodCall methodCall) {
53         // Pavel Vlasov - to avoid NPE
54
if (currentJspDescriptor == null) {
55             return;
56         }
57         // System.out.println("*> " + methodCall.getName());
58
if ("response.sendRedirect".equals(methodCall.getName().toString())) {
59             String JavaDoc referenceStr = methodCall.getParameters().get(0).toString();
60             JspXref jXref = new JspXref(currentJspDescriptor,
61                     "response.sendRedirect", referenceStr);
62             currentJspDescriptor.listOfInvokedJsp.add(jXref);
63         }
64         if ("pageContext.forward".equals(methodCall.getName().toString())) {
65             String JavaDoc referenceStr = methodCall.getParameters().get(0).toString();
66             JspXref jXref = new JspXref(currentJspDescriptor, "JSP Forward",
67                     referenceStr);
68             currentJspDescriptor.listOfInvokedJsp.add(jXref);
69         }
70         if ("out.print".equals(methodCall.getName().toString())
71                 || "out.println".equals(methodCall.getName().toString())) {
72             this.currentJspDescriptor.numberOfOutPrintOps++;
73         } else if ("out.write".equals(methodCall.getName().toString())) {
74             this.currentJspDescriptor.numberOfOutWriteOps++;
75             List JavaDoc parameterList = methodCall.getParameters();
76             for (int i = 0; i < parameterList.size(); i++) {
77                 Object JavaDoc param = parameterList.get(i);
78                 if (param instanceof StringConstant) {
79                     StringConstant strCnst = (StringConstant) param;
80                     
81                     if (!isJavaScriptStream
82                             && strCnst.toString().toLowerCase().indexOf(
83                                     "<script".toLowerCase()) > -1) {
84                         isJavaScriptStream = true;
85                         this.currentJspDescriptor.numberOfJavaScriptSnippets++;
86                         
87                         currentJspDescriptor.analyseJavaScriptPortion(strCnst
88                                 .toString());
89                     } else if (isJavaScriptStream
90                             && strCnst.toString().toLowerCase().indexOf(
91                                     "</script>".toLowerCase()) > -1) {
92                         
93                         currentJspDescriptor.analyseJavaScriptPortion(strCnst
94                                 .toString());
95                                         
96                         isJavaScriptStream = false;
97                     } else if (isJavaScriptStream) {
98                         
99                         currentJspDescriptor.analyseJavaScriptPortion(strCnst
100                                 .toString());
101                     }
102                     if (!isJavaScriptStream
103                             && strCnst.toString().toLowerCase().indexOf(
104                                     "<form".toLowerCase()) > -1) {
105                         currentJspDescriptor.analyseHtmlForm(strCnst.toString());
106                     }
107                 }
108             }
109         }
110     }
111     public void extractJavaScriptPortion(String JavaDoc jsStream) {
112         // Pavel Vlasov: to avoid NPE
113
if (currentJspDescriptor != null) {
114             currentJspDescriptor.analyseJavaScriptPortion(jsStream);
115         }
116     }
117     public void visit(VariableDefinition element) {
118         //!! SQL Extractor
119
}
120     public void visit(TypeDefinition typeDefinition) {
121         try {
122             if (typeDefinition.isKindOf(jspBaseClass)) {
123                 int start = typeDefinition.getAst().getFirstToken().getLine();
124                 int end = typeDefinition.getAst().getLastToken().getLine();
125                 JspDescriptor jspDescr = new JspDescriptor();
126                 CodeMetric typeCodeMetric = new CodeMetric();
127                 typeCodeMetric.setDescriptonEntity("Class");
128                 typeCodeMetric.setName(typeDefinition.getFcn());
129                 // packageName.replace('.','/')+compilationUnit.getName()
130
System.out.println("++ "
131                         + typeDefinition.getCompilationUnit().getPackage()
132                                 .getName().toString());
133                 typeCodeMetric.source_url = ((SourceMarker) typeDefinition)
134                         .getSourceURL();
135                 typeCodeMetric.source_line = ((SourceMarker) typeDefinition)
136                         .getLine();
137                 typeCodeMetric.source_col = ((SourceMarker) typeDefinition)
138                         .getColumn();
139                 typeCodeMetric.setNcss(end - start);
140                 jspDescr.codeMetric = typeCodeMetric;
141                 //!! potential thread issue !!
142
this.currentJspDescriptor = jspDescr;
143                 jspList.put((String JavaDoc) typeDefinition.getFcn(), jspDescr);
144             }
145         } catch (JselException e) {
146             // TODO Auto-generated catch block
147
e.printStackTrace();
148         }
149     }
150     public void leave(Repository repository) {
151         //aggregate();
152
context.annotate(new LinkedAnnotation() {
153             private String JavaDoc path;
154             public String JavaDoc getName() {
155                 return getContext().getDescriptor().getName();
156             }
157             public String JavaDoc getPath() {
158                 return path;
159             }
160             public void render(AnnotationContext context)
161                     throws HammurapiException {
162                 String JavaDoc errorCausingFile = "";
163                 // Output images here. See AnnotationTest for details.
164
class JspInspectorRenderer extends AbstractRenderer {
165                     JspInspectorRenderer() {
166                         super(new RenderRequest(JspInspector.this));
167                     }
168                     public Element JavaDoc render(Document JavaDoc document)
169                             throws RenderingException {
170                         Element JavaDoc entities = document.createElement("Entities");
171                         Element JavaDoc jspMetricElement = document
172                                 .createElement("JspMetric");
173                         Collection JavaDoc values = jspList.values();
174                         Iterator JavaDoc it = values.iterator();
175                         System.out.println("Number of JspDescriptors - "+values.size());
176                         while (it.hasNext()) {
177                             JspDescriptor jspD = (JspDescriptor) it.next();
178                             jspMetricElement.appendChild(jspD.toDom(document));
179                         }
180                         return jspMetricElement;
181                     }
182                 } //-- end class JspInspectorRenderer
183
/*
184                  * locReport = new LocReporter( context, classMaxLoc,
185                  * functionMaxLoc, ncssReport, chartDebugWindow );
186                  * locReport.setNcssClassList( ncssClassList );
187                  * locReport.setNcssFunctionList( ncssFunctionList );
188                  *
189                  * locReport.doIt( projectMetric) ;
190                  */

191                 AnnotationContext.FileEntry fileEntry = context
192                         .getNextFile(context.getExtension());
193                 path = fileEntry.getPath();
194                 System.out.println(".> " + this.getPath().toString());
195                 AnnotationContext.FileEntry fileEntryXml = context
196                         .getNextFile(".xml");
197                 try {
198                     JspInspectorRenderer renderer = new JspInspectorRenderer();
199                     FileOutputStream JavaDoc out = new FileOutputStream JavaDoc(fileEntry
200                             .getFile());
201                     renderer.setEmbeddedStyle(context.isEmbeddedStyle());
202                     try {
203                         errorCausingFile = fileEntry.getFile()
204                                 .getAbsolutePath();
205                         renderer.render(context.getParameter("style") == null
206                                 ? null
207                                 : new FileInputStream JavaDoc(context.getParameter(
208                                         "style").toString()), out);
209                     } finally {
210                         out.close();
211                     }
212                     //-- write a XML file for other XSL usage
213
FileOutputStream JavaDoc outXml = new FileOutputStream JavaDoc(fileEntryXml
214                             .getFile());
215                     try {
216                         errorCausingFile = fileEntryXml.getFile()
217                                 .getAbsolutePath();
218                         //-- write a XML file for other XSL usage
219
renderer.setEmbeddedStyle(false);
220                         renderer.render(outXml);
221                         // renderer.setPrettyPrint( true );
222
// InputStream
223
// inStream=getClass().getClassLoader().getResourceAsStream(xmlResourceName);
224
// renderer.render(inStream, outXml);
225
} finally {
226                         outXml.close();
227                     }
228                 } catch (Exception JavaDoc e) {
229                     throw new HammurapiException("Can't save "
230                             + errorCausingFile + ". " + e.getMessage());
231                 }
232             }
233             public Properties JavaDoc getProperties() {
234                 Properties JavaDoc ret = new Properties JavaDoc();
235                 ret.setProperty("left-panel", "yes");
236                 ret.setProperty("target", "JSP Metrics");
237                 return ret;
238             }
239         });
240     }
241     public boolean setParameter(String JavaDoc name, Object JavaDoc value)
242             throws ConfigurationException {
243         if ("jsp-base-class".equals(name)) {
244             jspBaseClass = value.toString();
245             return true;
246         } else {
247             throw new ConfigurationException("Parameter '" + name
248                     + "' is not supported");
249         }
250     }
251 }
252
Popular Tags