2008年3月31日月曜日

Trac XMLRPCをJavaから使用する

最近のエントリでTracで不便している事について書いたけど、これはTracに何かかぶせる事でなんとかなるんじゃないか、と。データ自体はTracのものをそのまま使用するが、外からかぶせる側でTicketの関連を保持するだけのDatabaseを独自にもってそれをうまく見せればいいだけかもしれない。 というワケでJavaからXMLRPCでTracを操作する方法について少しだけメモ。TracだしPythonがいいのかもしれんが、Pythonは興味が無いし、そもそもJava好きなのでJavaで。しかも、手を抜くためにApache XMLRPC-clientを使用するという事で。
どんなInterfaceを持っているのか?
これは、TracのURLの末尾に「/xmlrpc」を付加してリクエストすると表示される。もちろん、Trac側でXML-RPCPluginの導入が必要!
mavenでプロジェクトを作成し、apache xmlrpc-clientへの依存を追加する
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.blogspot.shin1o</groupId>
  <artifactId>studyTrac</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>studyTrac</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>org.apache.xmlrpc</groupId>
      <artifactId>xmlrpc-client</artifactId>
      <version>3.1</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.4</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>
Java側は以下のようなカンジで操作する。
@Test public void test01() throws MalformedURLException, XmlRpcException {
  XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
  config.setBasicUserName(USERNAME);
  config.setBasicPassword(PASSWORD);
  config.setServerURL(new URL(TRACRPCURL));
  XmlRpcClient client = new XmlRpcClient();

  // "system.listMethods"APIでAPIの一覧を取得する。
  String apiName = "system.listMethods";
  // 引数は不要。
  Object[] params = new Object[] {};
  Object[] apis = (Object[]) client.execute(config, apiName, params);
  for (Object api : apis) {
    // "system.methodHelp"APIでAPIのHelpを取得する。
    apiName = "system.methodHelp";
    // APIの名称を引数に設定する。
    params = new Object[] { api };
    Object help = client.execute(config, apiName, params);
    System.out.println("--" + api + " help--");
    System.out.println(help);
    // "system.methodSignature"APIでAPIの引数を取得する。
    apiName = "system.methodSignature";
    Object[] signatures = (Object[]) client.execute(config, apiName,
        params);
    System.out.println("--" + api + " sigunatures--");
    for (Object signature : signatures) {
      System.out.println(signature);
    }
  }
}
これでxmlrpcのページで出力されているような、使用できる全APIとその引数、が出力できる。
--ticket.create help--
int ticket.create(string summary, string description, struct attributes={}, boolean notify=False)

Create a new ticket, returning the ticket ID.
--ticket.create sigunatures--
int,string,string
int,string,string,struct
int,string,string,struct,boolean
--ticket.changeLog help--
struct ticket.changeLog(int id, int when=0)

Return the changelog as a list of tuples of the form
(time, author, field, oldvalue, newvalue, permanent).

While the other tuple elements are quite self-explanatory,
the `permanent` flag is used to distinguish collateral changes
that are not yet immutable (like attachments, currently).
--ticket.changeLog sigunatures--
struct,int
struct,int,int

0 件のコメント: