動機
ひらめいったーでとあるひらめきをみかける.
おいらはantの終了時にsound taskを利用してこの手の問題に対応しているのだが,このひらめきに触発されフトantの自作taskってつくれないかななどと思う(すでに脱線).
参考
そこでグーグル先生にきいてみた.で得られた参考
参考:ありがとうございます!
あと昔やったとき書いたBASIC認証周りのコード(いろいろ忘れてるw.)
やってみた
コンパイル (${ANT_HOME}/lib/ant.jarを含めてclasspathへ入れてコンパイルすること.)
MyTask.javaimport 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 件のコメント:
コメントを投稿