Wicket-はてなダイアリに投稿する


を、今日作りました。
明日時間見つけてリファクタリングだ・・・!

日々のブログ更新を楽にする機能を色々加えていきたいです。

※(7/2)日本語がうまく投稿に反映されない問題があったので
出力用ストリームにエンコーディングの設定を追加しました。

PrintStream out = new PrintStream(urlconn.getOutputStream(), true, "UTF-8");

▼PostToHatenaDiary.java

import java.io.IOException;
import java.io.PrintStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class PostToHatenaDiary {
	/*** field ***/
	private String username;
	private String password;

	/*** constructor ***/

	public PostToHatenaDiary(String id, String pw) {
		this.username = id;
		this.password = pw;
	}

	/*** method ***/
	public boolean login() {
		int statusCode = 0;
		try {
			URL url = new URL("http://d.hatena.ne.jp/" + this.username
					+ "/atom");
			HttpURLConnection urlconn = (HttpURLConnection) url
					.openConnection();
			urlconn.setRequestMethod("GET");
			urlconn.setRequestProperty("X-WSSE", WSSE.getWsseHeaderValue(
					this.username, this.password));

			urlconn.connect();
			statusCode = urlconn.getResponseCode();
			System.out.println(statusCode);
			urlconn.disconnect();
		} catch (IOException e) {
			e.printStackTrace();
		}

		return statusCode == 200;
	}

	public boolean postNewDiary(String title, String content, String updated) {
		int statusCode = 0;
		try {
			URL url = new URL("http://d.hatena.ne.jp/" + this.username
					+ "/atom/blog");
			HttpURLConnection urlconn = (HttpURLConnection) url
					.openConnection();
			urlconn.setRequestMethod("POST");
			urlconn.setRequestProperty("X-WSSE", WSSE.getWsseHeaderValue(
					this.username, this.password));
			urlconn.setDoOutput(true);
			PrintStream out = new PrintStream(urlconn.getOutputStream(), true, "UTF-8");

			out.print("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
			out.print("<entry xmlns=\"http://purl.org/atom/ns#\">");
			out.print("<title>" + title + "</title>");
			out.print("<content type=\"text/plain\">");
			out.print(content);
			out.print("</content>");
			out.print("<updated>" + updated + "</updated>");
			out.print("</entry>");

			out.close();

			urlconn.connect();
			statusCode = urlconn.getResponseCode();
			urlconn.disconnect();

			System.out.println(statusCode);
		} catch (IOException e) {
			e.printStackTrace();
		}

                return statusCode == 201;
	}

	public String getUsername() {
		return username;
	}

	public String getPassword() {
		return password;
	}

}


▼SessionData.java

import java.io.Serializable;

public class SessionData extends PostToHatenaDiary implements Serializable {

	private static final long serialVersionUID = 1L;
	private String title;
	private String content;
	private String updated;

	public SessionData(String id, String pw) {
		super(id, pw);
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getTitle() {
		return title;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public String getContent() {
		return content;
	}

	public void setUpdated(String updated) {
		this.updated = updated;
	}

	public String getUpdated() {
		return updated;
	}

}


▼HomePage.java

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.CompoundPropertyModel;

/**
 * Homepage
 */
public class HomePage extends WebPage {

	private static final long serialVersionUID = 1L;

	protected SessionData session;

	/**
	 * Constructor that is invoked when page is invoked without a session.
	 * 
	 * @param parameters
	 *            Page parameters
	 */
	public HomePage() {
		session = new SessionData("", "");
		Form<SessionData> mainForm = new Form<SessionData>("mainForm",
				new CompoundPropertyModel<SessionData>(session));

		mainForm.add(new TextField<String>("username"), new PasswordTextField(
				"password"));
		mainForm.add(new Button("login") {
			private static final long serialVersionUID = 1L;

			@Override
			public void onSubmit() {
				if (session.login()) {
					setResponsePage(new PostPage(session));
				} else {
					setResponsePage(new ResultPage("ログインに失敗しました"));
				}
			}
		});
		this.add(new Label("pageTitle"), mainForm);

	}
}

PostPage.java

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.CompoundPropertyModel;

public class PostPage extends WebPage {
	protected SessionData session;

	public PostPage(SessionData userdata) {
		session = userdata;

		Form<SessionData> postForm = new Form<SessionData>("postForm",
				new CompoundPropertyModel<SessionData>(session));

		postForm.add(new TextField<String>("title"), new TextArea<String>(
				"content"), new TextField<String>("updated"));
		postForm.add(new Button("postButton") {

			private static final long serialVersionUID = 1L;

			@Override
			public void onSubmit() {
				if (session.postNewDiary(session.getTitle(),
					session.getContent(),
                    session.getUpdated())) {
					setResponsePage(new ResultPage("投稿に成功しました"));
				} else {
					setResponsePage(new ResultPage("投稿に失敗しました"));
				}
			}
		});
		this.add(new Label("pageTitle"), postForm);

	}

}


▼ResultPage.java

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;

public class ResultPage extends WebPage {

	public ResultPage(String message) {
		this.add(new Label("resultMessage", message));
	}

}


▽TestHomePage.java

import org.apache.wicket.util.tester.FormTester;
import org.apache.wicket.util.tester.WicketTester;
import org.junit.Before;
import org.junit.Test;

public class TestHomePage {
	private WicketTester tester = new WicketTester();

	@Before
	public void setup() {
		tester = new WicketTester(new WicketApplication());
		tester.startPage(HomePage.class);
	}

	@Test
	public void ページが表示されるか() {
		tester.assertRenderedPage(HomePage.class);
	}

	@Test
	public void PostPageが表示されるか() {
		FormTester formTester = tester.newFormTester("mainForm");
		formTester.setValue("username", "****");
		formTester.setValue("password", "****");
		formTester.submit("login");

		tester.clickLink("login");
		tester.assertRenderedPage(PostPage.class);
	}
}


▽PostPageTest.java

import org.apache.wicket.util.tester.WicketTester;
import org.junit.Before;
import org.junit.Test;


public class PostPageTest {
	private WicketTester tester = new WicketTester();

	@Before
	public void setup() {
		tester = new WicketTester(new WicketApplication());
		tester.startPage(PostPage.class);
	}
	@Test
	public void ページが表示されるか() {
		tester.assertRenderedPage(PostPage.class);
	}
}