2009年4月13日月曜日

Ant Taskでつぶやく

動機の部分をちょっとなおした.相変わらずひどい日本語だ.


動機
ひらめいったーでとあるひらめきをみかける.
おいらはantの終了時にsound taskを利用してこの手の問題に対応しているのだが,このひらめきに触発されフトantの自作taskってつくれないかななどと思う(すでに脱線).

参考
そこでグーグル先生にきいてみた.で得られた参考
参考:ありがとうございます!
  • Ant タスク自作 - @//メモ
  • Java による簡単な HTTP 通信
  • Twitter API 仕様書 (現時点での最新?)
    あと昔やったとき書いたBASIC認証周りのコード(いろいろ忘れてるw.)

    やってみた
     コンパイル (${ANT_HOME}/lib/ant.jarを含めてclasspathへ入れてコンパイルすること.)
    MyTask.java
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.Authenticator;
    import java.net.HttpURLConnection;
    import java.net.PasswordAuthentication;
    import java.net.URL;
    import java.util.Iterator;
    import java.util.Map;

    import org.apache.tools.ant.BuildException;
    import org.apache.tools.ant.Task;

    public class MyTask extends Task {
    private String _username = null;
    private String _password = null;
    private String _message = null;

    public void setUsername(String username) {
    _username = username;
    }

    public void setPassword(String password) {
    _password = password;
    }

    public void setMessage(String message) {
    _message = message;
    }

    public void execute() throws BuildException {
    if (_username == null) {
    throw new BuildException("user attribute must be set!");
    }
    if (_password == null) {
    throw new BuildException("passwd attribute must be set!");
    }
    if (_message == null) {
    _message = "This is test.";
    }
    try {
    update(_username, _password, _message);
    } catch (IOException e) {
    throw new BuildException("the post failed!");
    }
    }

    @SuppressWarnings("unchecked")
    public static void update(String username, String password, String message)
    throws IOException {
    URL url = new URL("http://twitter.com/statuses/update.xml");

    HttpAuthenticator http_authenticator = new HttpAuthenticator(username,
    password);
    Authenticator.setDefault(http_authenticator);

    HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();

    urlConn.setRequestMethod("POST");
    urlConn.setDoOutput(true);
    urlConn.setInstanceFollowRedirects(false);
    //urlConn.setRequestProperty("Accept-Language", "ja;q=0.7,en;q=0.3");
    urlConn.connect();

    OutputStreamWriter osw = new OutputStreamWriter(urlConn
    .getOutputStream());
    osw.write("status=" + message);
    osw.flush();
    osw.close();

    Map headers = urlConn.getHeaderFields();
    Iterator it = headers.keySet().iterator();
    System.out.println("レスポンスヘッダ:");
    while (it.hasNext()) {
    String key = (String) it.next();
    System.out.print(" " + key + ": " + headers.get(key) + "\n");
    }

    System.out.println("レスポンスコード[" + urlConn.getResponseCode() + "] "
    + "レスポンスメッセージ[" + urlConn.getResponseMessage() + "]");
    System.out.println("\n---- ボディ ----");

    BufferedReader reader = new BufferedReader(new InputStreamReader(
    urlConn.getInputStream()));

    while (true) {
    String line = reader.readLine();
    if (line == null) {
    break;
    }
    System.out.println(line + "\n");
    }

    reader.close();
    urlConn.disconnect();

    System.out.println("完了");
    }

    }

    class HttpAuthenticator extends Authenticator {

    private String username;
    private String password;

    public HttpAuthenticator(String username, String password) {
    this.username = username;
    this.password = password;
    }

    protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(username, password.toCharArray());
    }

    public String myGetRequestingPrompt() {
    return super.getRequestingPrompt();
    }
    }


    赤いところを使えばフツーにPOSTのための実装例だね.


     Antでjarを作る(lib/MyTask.jarができる).
    build.xml (make用)
    <project name="AntExam_Make" basedir="." default="make_task">

    <!-- ******************************************************************* -->
    <!-- クラスパスの設定 -->
    <path id="class.path">
    <fileset dir="/path/to/ANT_HOME/lib/">
    <include name="*.jar" />
    </fileset>

    <fileset dir="lib/">
    <include name="*.jar" />
    </fileset>
    </path>

    <!-- ******************************************************************* -->
    <!-- MyTaskタスクの作成 -->
    <target name="make_task" depends="" description="antタスクを作成します">

    <javac srcdir="src" destdir="bin" classpathref="class.path" />

    <mkdir dir="lib"/>

    <jar jarfile="lib/MyTask.jar">
    <fileset dir="bin">
    <include name="**/*.class" />
    </fileset>
    </jar>

    </target>

    </project>

    mkdirタスクを追加.lib作らないとエラーだ.


     AntでTaskを使う("taskdef"で宣言する)
    build.xml (exec用)
    <project name="AntExam_Exec" basedir="." default="exec_task">

    <path id="class.path">
    <fileset dir="lib/">
    <include name="*.jar" />
    </fileset>
    </path>

    <!-- ******************************************************************* -->
    <!-- MyTaskタスクの実行 -->
    <taskdef name="myTask" classname="MyTask" classpathref="class.path" />

    <target name="exec_task" description="antタスクを実行します">
    <myTask username="username" password="password" message="This is test from the custom ant task." />
    </target>

    </project>

    class.pathに${ANT_HOME}/lib/*.jarを入れてたのを削除.実行時は要らんよなw.


    結果
    送り出したのがこれ
  • 0 件のコメント: