Benutzer-Werkzeuge

Webseiten-Werkzeuge


de:howto:java_source_preparator

====== Unterschiede ====== Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
de:howto:java_source_preparator [2009/03/05 20:59]
127.0.0.1 Externe Bearbeitung
de:howto:java_source_preparator [2024/09/18 08:32] (aktuell)
Zeile 1: Zeile 1:
-Parser ​für Java-Quellcode =+====== How-To: Präparator ​für Java-Quellcode ====== 
 + 
 +**Das Zusatzfeature:​** 
 + 
 +Parsen von Java-Quellcode ermöglichen und damit Java-Quellcode über regain durchsuchbar machen. 
 + 
 +**Lösungsansatz:​** 
 + 
 +Einen neuen [[:​de:​components:​preparator|Präparator]] implementieren. 
 + 
 +**Vorteile:​** 
 + 
 +  * Java-Quellcode muss nicht mit dem ''​PlainTextPreparator''​ geparsed werden. Der Quellcode ist nicht als einfacher Text im Index, sondern in aufbereiteter Form. 
 +  * Die Suche mit regain ist schneller als eine JAVA-IDE-Suche. 
 + 
 +**Nachteile:​** 
 + 
 +  * Benötigt große Teile der Eclipse IDE und ist dadurch schwergewichter als eigentlich nötig. D.h. es wird viel ungenutzter Code mitgeschleppt,​ so dass der Präparator 13 MB groß ist. 
 + 
 +**Autor:​** 
 + 
 +Thomas Tesche (thtesche), cluster:​Systems CSG GmbH, http://​www.clustersystems.info/​ 
 + 
 + 
 +===== Download ===== 
 + 
 +**Binaries:​**
  
-Feature: 
-Parsen von Java-Quellcode ermöglichen 
-;​Lösungsansatz: ​ 
-Einen neuen Preparator implementieren. 
-;​Vorteile: ​ 
-Java-Quellcode muss nicht mit einem PlainTextPreparator geparsed werden. Die Suche mit regain wird schneller als jede JAVA-IDE-Suche sein. 
-;​Schlüsselwörter: ​ 
-Java, Sourcecode, .java 
-;​Java-Quellen: ​ 
-*[http://​www.onjava.com/​pub/​a/​onjava/​2006/​01/​18/​using-lucene-to-search-java-source.html?​page=1 Using Lucene to Search Java Source Code] 
-*[http://​www-128.ibm.com/​developerworks/​opensource/​library/​os-ast/​ Exploring Eclipse'​s ASTParser] 
-;​Binaries: ​ 
 Man benötigt einen großen Teil einer Eclipse 3.3 Distribution. Da die verwendeten Klassen innerhalb der Distribution immer wieder verschoben werden, muss man die Abhängkeiten der aktuell verwendeten Distri berücksichtigen. Aus einer Eclipse 3.3.1 Distri wurden folgende jar's verwendet: Man benötigt einen großen Teil einer Eclipse 3.3 Distribution. Da die verwendeten Klassen innerhalb der Distribution immer wieder verschoben werden, muss man die Abhängkeiten der aktuell verwendeten Distri berücksichtigen. Aus einer Eclipse 3.3.1 Distri wurden folgende jar's verwendet:
-  * org.eclipse.core.contenttype_3.2.100.v20070319.jar 
-  * org.eclipse.core.jobs_3.3.1.R33x_v20070709.jar 
-  * org.eclipse.core.resources_3.3.1.R33x_v20080205.jar 
-  * org.eclipse.core.runtime_3.3.100.v20070530.jar 
-  * org.eclipse.equinox.common_3.3.0.v20070426.jar 
-  * org.eclipse.equinox.preferences_3.2.101.R33x_v20080117.jar 
-  * org.eclipse.jdt.core_3.3.3.v_793_R33x.jar 
-  * org.eclipse.osgi_3.3.2.R33x_v20080105.jar 
  
-;​Autor: ​ +  * ''​org.eclipse.core.contenttype_3.2.100.v20070319.jar''​ 
-Thomas Tesche (thtesche), cluster:​Consult,​ http://www.thtesche.com/ und http://​clusterconsult.thtesche.com/+  * ''​org.eclipse.core.jobs_3.3.1.R33x_v20070709.jar''​ 
 +  * ''​org.eclipse.core.resources_3.3.1.R33x_v20080205.jar''​ 
 +  * ''​org.eclipse.core.runtime_3.3.100.v20070530.jar''​ 
 +  * ''​org.eclipse.equinox.common_3.3.0.v20070426.jar''​ 
 +  * ''​org.eclipse.equinox.preferences_3.2.101.R33x_v20080117.jar''​ 
 +  * ''​org.eclipse.jdt.core_3.3.3.v_793_R33x.jar''​ 
 +  * ''​org.eclipse.osgi_3.3.2.R33x_v20080105.jar''​ 
 + 
 +**Download des fertigen Präparators:​** 
 + 
 +Enthalten in der regain Standardversion. 
 + 
 + 
 +===== Anleitung ===== 
 + 
 +Klasse ''​JavaPreparator'':​
  
-;Download: +<code java> 
-*[http://​www.assembla.com/​spaces/​files/​regain2 regain2 Download Seite] +package net.sf.regain.crawler.preparator;
-*[http://​clusterconsult.thtesche.com/​download/​regain-preview/​ cluster:​Consult Downloads (langsam)] +
-==Implementierung== +
-  * ''​JavaPreparator''​+
  
-''<​div>​package net.sf.regain.crawler.preparator;​ 
 import net.sf.regain.crawler.preparator.java.*;​ import net.sf.regain.crawler.preparator.java.*;​
 import java.util.ArrayList;​ import java.util.ArrayList;​
Zeile 39: Zeile 56:
 import net.sf.regain.crawler.document.AbstractPreparator;​ import net.sf.regain.crawler.document.AbstractPreparator;​
 import net.sf.regain.crawler.document.RawDocument;​ import net.sf.regain.crawler.document.RawDocument;​
 +
 public class JavaPreparator extends AbstractPreparator { public class JavaPreparator extends AbstractPreparator {
 +
   public JavaPreparator() throws RegainException {   public JavaPreparator() throws RegainException {
     super(new String[]{"​text/​java"​});​     super(new String[]{"​text/​java"​});​
   }   }
 +
   public void prepare(RawDocument rawDocument) throws RegainException {   public void prepare(RawDocument rawDocument) throws RegainException {
     Vector<​String>​ contentParts = new Vector<​String>​();​     Vector<​String>​ contentParts = new Vector<​String>​();​
     Vector<​String>​ titleParts = new Vector<​String>​();​     Vector<​String>​ titleParts = new Vector<​String>​();​
 +
     try {     try {
       // Creates the parser       // Creates the parser
Zeile 60: Zeile 81:
       setTitle(concatenateStringParts(titleParts,​ Integer.MAX_VALUE));​       setTitle(concatenateStringParts(titleParts,​ Integer.MAX_VALUE));​
       setCleanedContent(concatenateStringParts(contentParts,​ Integer.MAX_VALUE));​       setCleanedContent(concatenateStringParts(contentParts,​ Integer.MAX_VALUE));​
- 
     } catch (Exception ex) {     } catch (Exception ex) {
       throw new RegainException("​Error parsing Java file: " + rawDocument.getUrl(),​ ex);       throw new RegainException("​Error parsing Java file: " + rawDocument.getUrl(),​ ex);
     }     }
- 
   }   }
  
   private StringBuffer extractClassInfo(JClass cls, boolean innerClass) {   private StringBuffer extractClassInfo(JClass cls, boolean innerClass) {
- 
     StringBuffer strBuffer = new StringBuffer();​     StringBuffer strBuffer = new StringBuffer();​
  
Zeile 88: Zeile 106:
       strBuffer.append(",​ Superclass: "​).append(superCls);​       strBuffer.append(",​ Superclass: "​).append(superCls);​
     }     }
 +
     // Add interfaces it implements     // Add interfaces it implements
     ArrayList interfaces = cls.getInterfaces();​     ArrayList interfaces = cls.getInterfaces();​
Zeile 107: Zeile 126:
  
   private StringBuffer extractMethodInfo(JClass cls) {   private StringBuffer extractMethodInfo(JClass cls) {
- 
     StringBuffer strBuffer = new StringBuffer();​     StringBuffer strBuffer = new StringBuffer();​
  
Zeile 123: Zeile 141:
         }         }
       }       }
 +
       // Add method name field       // Add method name field
       strBuffer.append("​ "​).append(method.getMethodName()).append("​("​);​       strBuffer.append("​ "​).append(method.getMethodName()).append("​("​);​
Zeile 135: Zeile 154:
       }       }
       strBuffer.append("​) ");       strBuffer.append("​) ");
 +
       String code = method.getCodeBlock();​       String code = method.getCodeBlock();​
       if (code != null) //add the method code block       if (code != null) //add the method code block
Zeile 146: Zeile 166:
  
   private StringBuffer extractImportDeclarations(JavaParser parser) {   private StringBuffer extractImportDeclarations(JavaParser parser) {
- 
     StringBuffer strBuffer = new StringBuffer();​     StringBuffer strBuffer = new StringBuffer();​
  
Zeile 153: Zeile 172:
       return strBuffer;       return strBuffer;
     }     }
 +
     for (int i = 0; i < imports.size();​ i++) //add import declarations as keyword     for (int i = 0; i < imports.size();​ i++) //add import declarations as keyword
     {     {
Zeile 160: Zeile 180:
     return strBuffer;     return strBuffer;
   }   }
 +
   private StringBuffer extractComments(JavaParser parser) {   private StringBuffer extractComments(JavaParser parser) {
     StringBuffer strBuffer = new StringBuffer();​     StringBuffer strBuffer = new StringBuffer();​
Zeile 166: Zeile 187:
       return strBuffer;       return strBuffer;
     }     }
 +
     for (int i = 0; i < comments.size();​ i++) {     for (int i = 0; i < comments.size();​ i++) {
       String docComment = (String) comments.get(i);​       String docComment = (String) comments.get(i);​
       strBuffer.append(docComment);​       strBuffer.append(docComment);​
     }     }
 +
     return strBuffer;     return strBuffer;
   }   }
-} </​div>''​ 
  
-*''​JavaParser.java''​ +
-''​ +</​code>​ 
- ​package net.sf.regain.crawler.preparator.java;​ + 
- ​import java.util.ArrayList;​ + 
- ​import java.util.List;​ +Klasse ​''​JavaParser.java''​: 
- ​import java.util.ListIterator;​ + 
- ​import net.sf.regain.RegainException;​ +<code java> 
- ​import org.eclipse.jdt.core.dom.AST+package net.sf.regain.crawler.preparator.java;​ 
- import org.eclipse.jdt.core.dom.ASTParser;​ + 
- ​import org.eclipse.jdt.core.dom.Block;​ +import java.util.ArrayList;​ 
- ​import org.eclipse.jdt.core.dom.CompilationUnit;​ +import java.util.List;​ 
- ​import org.eclipse.jdt.core.dom.ImportDeclaration;​ +import java.util.ListIterator;​ 
- ​import org.eclipse.jdt.core.dom.Javadoc;​ +import net.sf.regain.RegainException;​ 
- ​import org.eclipse.jdt.core.dom.MethodDeclaration;​ +import org.eclipse.jdt.core.dom.*
- ​import org.eclipse.jdt.core.dom.SimpleType;​ + 
- ​import org.eclipse.jdt.core.dom.SingleVariableDeclaration;​ +public class JavaParser {
- ​import org.eclipse.jdt.core.dom.Type;​ +
- ​import org.eclipse.jdt.core.dom.TypeDeclaration;​ +
- ​public class JavaParser {+
   private ASTParser _parser = ASTParser.newParser(AST.JLS3);​   private ASTParser _parser = ASTParser.newParser(AST.JLS3);​
   private CompilationUnit _unit = null;   private CompilationUnit _unit = null;
Zeile 198: Zeile 217:
  
   public void setSource(String sourceStr) throws RegainException {   public void setSource(String sourceStr) throws RegainException {
- 
     try {     try {
       _parser.setKind(ASTParser.K_COMPILATION_UNIT);​       _parser.setKind(ASTParser.K_COMPILATION_UNIT);​
       _parser.setSource(sourceStr.toString().toCharArray());​       _parser.setSource(sourceStr.toString().toCharArray());​
       _unit = (CompilationUnit) _parser.createAST(null);​       _unit = (CompilationUnit) _parser.createAST(null);​
- 
     } catch (Exception ex) {     } catch (Exception ex) {
       throw new RegainException("​Error parsing Java file", ex);       throw new RegainException("​Error parsing Java file", ex);
     }     }
- 
   }   }
  
Zeile 215: Zeile 231:
       return null;       return null;
     }     }
 +
     ArrayList importDecl = new ArrayList();​     ArrayList importDecl = new ArrayList();​
     ListIterator iter = imports.listIterator();​     ListIterator iter = imports.listIterator();​
Zeile 221: Zeile 238:
       importDecl.add(decl.getName().toString());​       importDecl.add(decl.getName().toString());​
     }     }
 +
     return importDecl;     return importDecl;
   }   }
Zeile 229: Zeile 247:
       return null;       return null;
     }     }
 +
     ArrayList javaDocComments = new ArrayList();​     ArrayList javaDocComments = new ArrayList();​
     ListIterator iterator = comments.listIterator();​     ListIterator iterator = comments.listIterator();​
Zeile 239: Zeile 258:
       }       }
     }     }
 +
     return javaDocComments;​     return javaDocComments;​
   }   }
Zeile 267: Zeile 287:
     ListIterator interfaces = interfaceLst.listIterator();​     ListIterator interfaces = interfaceLst.listIterator();​
     while (interfaces.hasNext()) {     while (interfaces.hasNext()) {
-      ​+      SimpleType sin = (SimpleType) interfaces.next();​ 
-        ​SimpleType sin = (SimpleType) interfaces.next();​ +      cls.getInterfaces().add(sin.toString());​ 
-        cls.getInterfaces().add(sin.toString());​ +    }
-      }+
  
-    } 
     addMethods(cls,​ object);     addMethods(cls,​ object);
  
Zeile 282: Zeile 300:
     }     }
   }   }
 +
   private void addMethods(JClass cls, TypeDeclaration object) {   private void addMethods(JClass cls, TypeDeclaration object) {
     MethodDeclaration[] met = object.getMethods();​     MethodDeclaration[] met = object.getMethods();​
Zeile 306: Zeile 325:
     }     }
   }    } 
- }''​+} 
 +</​code>​
    
-*''​JClass.java''​ + 
-''​package net.sf.regain.crawler.preparator.java;​ +Klasse ​''​JClass.java''​
- ​import java.util.ArrayList;​ + 
- ​public class JClass {+<code java> 
 +package net.sf.regain.crawler.preparator.java;​ 
 + 
 +import java.util.ArrayList;​ 
 + 
 +public class JClass {
   private String className = null;   private String className = null;
   private boolean isInterface = false;   private boolean isInterface = false;
Zeile 318: Zeile 343:
   private String superClass = null;   private String superClass = null;
   private ArrayList interfaces = new ArrayList();​   private ArrayList interfaces = new ArrayList();​
 +
   public String getClassName() {   public String getClassName() {
     return className;     return className;
   }   }
 +
   public void setClassName(String className) {   public void setClassName(String className) {
     this.className = className;     this.className = className;
   }   }
 +
   public boolean isInterface() {   public boolean isInterface() {
     return isInterface;​     return isInterface;​
   }   }
 +
   public void setIsInterface(boolean isInterface) {   public void setIsInterface(boolean isInterface) {
     this.isInterface = isInterface;​     this.isInterface = isInterface;​
   }   }
 +
   public ArrayList getMethodDeclarations() {   public ArrayList getMethodDeclarations() {
     return methodDeclarations;​     return methodDeclarations;​
   }   }
 +
   public void setMethodDeclarations(ArrayList methodDeclarations) {   public void setMethodDeclarations(ArrayList methodDeclarations) {
     this.methodDeclarations = methodDeclarations;​     this.methodDeclarations = methodDeclarations;​
   }   }
 +
   public ArrayList getInnerClasses() {   public ArrayList getInnerClasses() {
     return innerClasses;​     return innerClasses;​
   }   }
 +
   public void setInnerClasses(ArrayList innerClasses) {   public void setInnerClasses(ArrayList innerClasses) {
     this.innerClasses = innerClasses;​     this.innerClasses = innerClasses;​
   }   }
 +
   public String getSuperClass() {   public String getSuperClass() {
     return superClass;     return superClass;
   }   }
 +
   public void setSuperClass(String superClass) {   public void setSuperClass(String superClass) {
     this.superClass = superClass;     this.superClass = superClass;
   }   }
 +
   public ArrayList getInterfaces() {   public ArrayList getInterfaces() {
     return interfaces;     return interfaces;
   }   }
 +
   public void setInterfaces(ArrayList interfaces) {   public void setInterfaces(ArrayList interfaces) {
     this.interfaces = interfaces;     this.interfaces = interfaces;
   }   }
- }''​+} 
 +</​code>​
  
-*''​JMethod.java''​ 
-''​ 
- ​package net.sf.regain.crawler.preparator.java;​ 
- ​import java.util.ArrayList;​ 
- ​public class JMethod { 
  
 +Klasse ''​JMethod.java'':​
 +
 +<code java>
 +package net.sf.regain.crawler.preparator.java;​
 +
 +import java.util.ArrayList;​
 +
 +public class JMethod {
   private String methodName = null;   private String methodName = null;
   private ArrayList parameters = new ArrayList();​   private ArrayList parameters = new ArrayList();​
   private String codeBlock = null;   private String codeBlock = null;
   private String returnType = null;   private String returnType = null;
 +
   public String getMethodName() {   public String getMethodName() {
     return methodName;     return methodName;
   }   }
 +
   public void setMethodName(String methodName) {   public void setMethodName(String methodName) {
     this.methodName = methodName;     this.methodName = methodName;
   }   }
 +
   public ArrayList getParameters() {   public ArrayList getParameters() {
     return parameters;     return parameters;
   }   }
 +
   public void setParameters(ArrayList parameters) {   public void setParameters(ArrayList parameters) {
     this.parameters = parameters;     this.parameters = parameters;
   }   }
 +
   public String getCodeBlock() {   public String getCodeBlock() {
     return codeBlock;     return codeBlock;
   }   }
 +
   public void setCodeBlock(String codeBlock) {   public void setCodeBlock(String codeBlock) {
     this.codeBlock = codeBlock;     this.codeBlock = codeBlock;
   }   }
 +
   public String getReturnType() {   public String getReturnType() {
     return returnType;     return returnType;
   }   }
 +
   public void setReturnType(String returnType) {   public void setReturnType(String returnType) {
     this.returnType = returnType;     this.returnType = returnType;
   }   }
- }''​+} 
 +</​code>​
  
  
-;​Änderungen im Quelltext: Alle Änderungen sind mit ... gekennzeichnet. Dies sind:  +===== Siehe auch =====
-Es wurden keine Klassen geändert, sondern nur neue hinzugefügt.+
  
-;Diskussion zum Hack]:+  * [[:de:howto]] - Übersicht über alle How-Tos 
 +  * [[http://​www.onjava.com/​pub/​a/​onjava/​2006/​01/​18/​using-lucene-to-search-java-source.html?​page=1|Using Lucene to Search Java Source Code]] 
 +  * [[http://​www-128.ibm.com/​developerworks/​opensource/​library/​os-ast/​|Exploring Eclipse'​s ASTParser]]
  
de/howto/java_source_preparator.1236283173.txt.gz · Zuletzt geändert: 2024/09/18 08:32 (Externe Bearbeitung)