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); } }