1

非常に大きなプロジェクトのすべてのエンドポイントを文書化するプロジェクトがあります。ソースファイルしかないので、なんらかのドキュメントツールを実行できません。私の唯一のリソース(私が知る限り)は、perlやpythonなどの正規表現です。

メソッドのアノテーションの例を次に示します。

/**
 * Method Javadoc
 */
@Endpoint
@POST
@Path("path/{objectid}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@TypeHint(SomeObject.class)
public Response deleteObject(@PathParam("objectid") Integer objectid) {
  //method code
}

私が信頼できる唯一のことは、一貫性があるということです。すべてのエンドポイントメソッドに@Endpointアノテーションが付いているということです。これは最初の注釈である場合とそうでない場合があります。メソッドには任意の署名を付けることができます。

このようなものの正規表現の助けは素晴らしいでしょう。このすべての情報を照合するには、正規表現だけでなく少し時間がかかると思います。そのため、、さらにはも役立ちます。

私が何をしようとしているのかを知っているので(私はあなたが私のために仕事をすることを期待していません、私は主に正規表現の助けを探しています)、これから私が欲しいのは次の構成のcsvです:

SourceFile.java  |  MethodName  |      Path       | Method  |  QueryParams  |  FormParams  |  Consumes                  |  Produces                                                |  ReturnedObject
ClassName.java   | deleteObject | path/{objectid} |  POST   |  objectid,    |              | MediaType.APPLICATION_JSON |  {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} | SomeObject.class
4

2 に答える 2

3

正規表現が唯一の解決策であることにどのように取り組んでいますか?コードがコンパイルされている(またはコンパイルできる)こと、およびアフターアノテートがリテールされていることを前提として、すべてのクラスを調べ、class.forName()を使用してそれらをロードするJavaメソッドを記述し、クラス、メソッド、フィールドなどのアノテーションを検査するためのさまざまなリフレクションAPIを自由に使用できます。

クラスがjar化されている場合は、実行時にjarをクラスパスに追加し、ZipInputStreamを使用して開き、エントリを確認し、class.forName()を使用して1つずつロードします。その「爆発」(* .classファイルの束)であれば、作業はさらに簡単になります。

zip(* .jar、*。ear、*。war)を調べると、次のようになります。

ZipInputStream zis = new ZipInputStream(new FileInputStream("fileName"));
ZipEntry entry;
while ((entry = zis.getNextEntry())!=null) {
    if (entry.isDirectory()) {
        continue;
    }
    if (!entry.getName().endsWith(".class")) {
        continue;
    }
    Class theClass = Class.forName(entry.getName());
    Endpoint targetAnnotation = theClass.getAnnotation(Endpoint.class);
    if (targetAnnotation == null) {
        continue;
    }
    //probably what youre looking for
}

もちろん、呼び出しを機能させるには、実行のlasspath上でターゲット* .war / jar/earを使用してプログラムを実行する必要がありますClass.forName()。コンパイルされたコードが混乱していない場合は、非常によく似た方法でファイルシステムをトラバースできます。

後のアノテーションがコンパイル後に保持されない場合は、Javaコードを読み取って構文ツリーをたどることができるライブラリに取り込むことを検討してください。たとえば、次のようになります。

于 2013-03-04T21:20:50.350 に答える
2

このようなものはPerlで動作する可能性があります。

my $found_method;
my $found_endpoint;

# Iterate over each line of the input .java file
while (<>) {
  $found_method = 0;
  $found_endpoint = 0;

  # Look for an @endpoint annotation, and capture what's between the
  # parenthesees.  Do the same for each annotation.
  if (/\@endpoint/i) {
    $found_endpoint = 1;
  } elsif (/\@path\(([^\)]+)\)/i) {
    $path = $+;
  } elsif (/\@consumes\(([^\)]+)\)/i) {
    $consumes = $+;
  } elsif (/\@produces\(([^\)]+)\)/i) {
    $produces = $+;
  } elsif (/\@typehint\(([^\)]+)\)/i) {
    $typehint = $+;

  # Look for a method definition (all on one line)
  } elsif (/\w+\s+\w+\(.*{/i) {
    $open_brackets = 1;

    # Skip over the bracketed method definition
    while ($open_brackets) {
      $found_method = 1;
      if (/{/) {
        $open_brackets++;
      } elsif (/{/) {
        $open_brackets--;
      }
    }
  }

  # If we just finished passing over an annotated method, output what we
  # found
  if ($found_method and  $found_endpoint) {
    print "\npath = " . $path;
    print "\nconsumes = " . $consumes;
    print "\nproduces = " . $produces;
    print "\ntypehint = " . $typehint;
  }
}
于 2013-03-04T21:46:27.933 に答える