作成するExcelシートのセルに日本語データを入れてみた。
cell = sheet.getWritableCell(0, 0); Label lbl = new Label(0, 0, "あいうえお"); sheet.addCell(lbl);ダウンロードしたExcelファイルを開いてみると、ちゃんと設定した値がセルに格納されていた。
なんか簡単すぎて拍子抜けした感じ...
cell = sheet.getWritableCell(0, 0); Label lbl = new Label(0, 0, "あいうえお"); sheet.addCell(lbl);ダウンロードしたExcelファイルを開いてみると、ちゃんと設定した値がセルに格納されていた。
ByteArrayOutputStream os = new ByteArrayOutputStream(); WritableWorkbook workbook = Workbook.createWorkbook(os); WritableSheet sheet = workbook.createSheet("SheetA", 0); Label label = new Label(0, 0, "ABC"); sheet.addCell(label); workbook.write(); workbook.close();ダウンロードしたファイルをExcelで開いてみると、ちゃんと[A1]のセルに"ABC"の文字が入っている。(^^)v
Workbook.createWorkbook(new File("output.xls"));とFileオブジェクトを使用している代わりにByteArrayOutputStreamを使用しているところ。
String templatePath = servletContext.getRealPath("/template/sample.xls"); File file = new File(templatePath); Workbook template = Workbook.getWorkbook(file); ByteArrayOutputStream os = new ByteArrayOutputStream(); WritableWorkbook workbook = Workbook.createWorkbook(os, template); WritableSheet sheet = workbook.getSheet(0); WritableCell cell = sheet.getWritableCell(1, 2); if (cell.getType() == CellType.LABEL) { Label l = (Label) cell; l.setString("modified cell"); } workbook.write(); workbook.close();さっそく実行してみると
java.lang.ArrayIndexOutOfBoundsException at java.lang.System.arraycopy(Native Method) at jxl.biff.StringHelper.getBytes(StringHelper.java:127) at jxl.write.biff.WriteAccessRecord.<init>(WriteAccessRecord.java:59) at jxl.write.biff.WritableWorkbookImpl.write(WritableWorkbookImpl.java:726) at jp.technosite.election.controller.pp.DlController.getExcelReport(DlController.java:73) at jp.technosite.election.controller.pp.DlController.run(DlController.java:41)とArrayIndexOutOfBoundsExceptionが発生してしまった。
jxl.write.biff.WriteAccessRecord.<init>(WriteAccessRecord.java:59)
の部分...public WriteAccessRecord(String userName) { super(Type.WRITEACCESS); data = new byte[112]; String astring = userName == null ? (new StringBuilder()).append("Java Excel API v").append(Workbook.getVersion()).toString() : userName; StringHelper.getBytes(astring, data, 0); for(int i = astring.length(); i < data.length; i++) data[i] = 32; }"StringHelper.getBytes()"の箇所で落ちている。
jxl.write.biff.WritableWorkbookImpl.write(WritableWorkbookImpl.java:726)
を調べてみると、WriteAccessRecord wr = new WriteAccessRecord(settings.getWriteAccess());
となっていて settings.getWriteAccess()の値が使われている。String templatePath = servletContext.getRealPath("/template/sample.xls"); File file = new File(templatePath); Workbook template = Workbook.getWorkbook(file); ByteArrayOutputStream os = new ByteArrayOutputStream(); WorkbookSettings settings = new WorkbookSettings(); settings.setWriteAccess(null); WritableWorkbook workbook = Workbook.createWorkbook(os, template, settings); WritableSheet sheet = workbook.getSheet(0); WritableCell cell = sheet.getWritableCell(1, 2); if (cell.getType() == CellType.LABEL) { Label l = (Label) cell; l.setString("modified cell"); } workbook.write(); workbook.close();実行してみると、めでたくsample.xlsがコピーされたExcelファイルがダウンロードできた。\(^o^)/
public MailItem receive(String pAddress, InputStream pInputStream) { MailItem mailItem = null; return mailItem; }これで、コンパイルは通るのでテストを実行してみる。
public MailItem receive(String pAddress, InputStream pInputStream) { MailItem mailItem = null; Properties prop = new Properties(); Session session = Session.getDefaultInstance(prop, null); try { MimeMessage message = new MimeMessage(session, pInputStream); mailItem = new MailItem(); mailItem.setFrom(message.getFrom()[0].toString()); mailItem.setTo(message.getRecipients(RecipientType.TO)[0].toString()); mailItem.setSubject(message.getSubject()); InputStream in = (InputStream)message.getInputStream(); Reader reader = new InputStreamReader(in); BufferedReader bufReader = new BufferedReader(reader); StringBuilder sb = new StringBuilder(); String line; while ((line = bufReader.readLine()) != null) { sb.append(line + "\n"); } mailItem.setBody(sb.toString()); Datastore.put(mailItem); } catch (MessagingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return mailItem; }◎コンパイルは通っているので、テストを実行してみる。もちろんGreen、これで基本パターンはOK (^_^)v
public class MailServiceTest extends AppEngineTestCase { private MailService service = new MailService(); /** * シングルパート(text/plain)を入力し{@link MailItem}オブジェクトが生成されること * @throws UnsupportedEncodingException */ @Test public void receive_plainText_UTF8() throws UnsupportedEncodingException { String mailFormat = "Received: by 10.115.25.19 with SMTP id c19mr2897164waj.34.1275464064977;\n" + "Wed, 02 Jun 2010 00:12:34 -0700 (PDT)\n" + "Return-Path: <%1$s>\n" + "Received: from smtp.hoge.org (ml.hoge.org [128.1.2.3])\n" + "by gmr-mx.google.com with ESMTP id u10si11332059wak.6.2010.06.02.00.34.24;\n" + "Wed, 02 Jun 2010 00:12:34 -0700 (PDT)\n" + "Received-SPF: pass (google.com: best guess record for domain of sender@hoge.org designates 128.1.2.3 as permitted sender) client-ip=128.1.2.3;\n" + "Authentication-Results: gmr-mx.google.com; spf=pass (google.com: best guess record for domain of sender@hoge.org designates 128.1.2.3 as permitted sender) smtp.mail=sender@hoge.org\n" + "Received: from [128.1.2.3] (unknown [128.1.2.3])\n" + "by smtp.hoge.org (Postfix) with ESMTPA id 8F1C716838E\n" + "for <%2$s>; Wed, 2 Jun 2010 00:12:34 -0700 (PDT)\n" + "Message-ID: <4C060983.1090109@hoge.org>\n" + "Date: Wed, 02 Jun 2010 00:12:34 -0700\n" + "From: SENDER <%1$s>\n" + "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4\n" + "MIME-Version: 1.0\n" + "To: RECEIVER <%2$s>\n" + "Subject: %3$s\n" + "Content-Type: text/plain; charset=UTF-8\n" + "\n" + "%4$s\n"; String encodedSubject = MimeUtility.encodeText("これは件名", "UTF-8", "B"); String mailStr = String.format(mailFormat, "sender@hoge.org", "reciever@fuga.org", encodedSubject, "本文1行目\n本文2行目"); byte[] bytes = mailStr.getBytes(); InputStream in = new ByteArrayInputStream(bytes); MailItem mailItem = service.receive("sender@hoge.org", in); assertThat(mailItem.getFrom(), is("SENDER <sender@hoge.org>")); assertThat(mailItem.getTo(), is("RECEIVER <reciever@fuga.org>")); assertThat(mailItem.getBody(), is("本文1行目\n本文2行目\n")); assertThat(mailItem.getSubject(), is("これは件名")); } }内容は、
byte[] bytes = mailStr.getBytes(); InputStream in = new ByteArrayInputStream(bytes);
import java.util.Properties; import javax.mail.Session; import javax.mail.internet.MimeMessage; Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); MimeMessage message = new MimeMessage(session, req.getInputStream());
<inbound-services> <service>mail</service> </inbound-services>
<security-constraint> <web-resource-collection> <url-pattern>/_ah/mail/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint>
public AppRouter() { addRouting("/_ah/mail/{address}", "/mail/receive?address={address}"); }このコードでは、メールを受信すると /mail/receiveにリクエストがくることになる。またメールの宛先(To)アドレスはリクエストパラメータ"address"として渡されてくる。
<c:forEach var="e" items="${tweetList}"> ${f:h(e.content)} <hr /> </c:forEach>
assertThat(tester.requestScope("tweetList"), is(notNullValue()));
ここで一つTips、eclipseに「moreUnit」プラグインがインストールされていれば"Ctrl+J"でテストクラスと対象クラスを行き来できるようになるので切り替えが楽チンです。修正後は下記のようになる。
public class IndexController extends Controller { private TwitterService service = new TwitterService(); @Override public Navigation run() throws Exception { List<Tweet> tweetList = service.getTweetList(); requestScope("tweetList", tweetList); return forward("index.jsp"); } }
@Test public void getTweetList() throws Exception { Tweet tweet = new Tweet(); tweet.setContent("Hello"); Datastore.put(tweet); List<Tweet> tweetList = service.getTweetList(); assertThat(tweetList.size(), is(1)); assertThat(tweetList.get(0).getContent(), is("Hello")); }
private TweetMeta t = new TweetMeta();getTweetListメソッドを次のように修正する
public List<Tweet> getTweetList() { return Datastore.query(t).sort(t.createdDate.desc).asList(); }
public Tweet tweet(Map<String, Object> input) { Tweet tweet = new Tweet(); BeanUtil.copy(input, tweet); Transaction tx = Datastore.beginTransaction(); Datastore.put(tweet); tx.commit(); return tweet; }
@Test public void run() throws Exception { tester.param("content", "Hello"); tester.start("/twitter/tweet"); TweetController controller = tester.getController(); assertThat(controller, is(notNullValue())); assertThat(tester.isRedirect(), is(true)); assertThat(tester.getDestinationPath(), is("/twitter/")); Tweet stored = Datastore.query(Tweet.class).asSingle(); assertThat(stored, is(notNullValue())); assertThat(stored.getContent(), is("Hello")); }
service.tweet(new RequestMap(request));
private String content; private Date createdDate = new Date();
@Test public void tweet() throws Exception { Map<string, object=""> input = new HashMap<string, object="">(); input.put("content", "Hello"); Tweet tweeted = service.tweet(input); assertThat(tweeted, is(notNullValue())); Tweet stored = Datastore.get(Tweet.class, tweeted.getKey()); assertThat(stored.getContent(), is("Hello")); }はい、ここで「あれ?」と気づいた人(^_^)/
public Tweet tweet(Map input) { Tweet tweet = new Tweet(); BeanUtil.copy(input, tweet); Transaction tx = Datastore.beginTransaction(); Datastore.put(tweet); tx.commit(); return tweet; }
<p>What are you doing?</p> <form method="post" action="tweet"> <textarea name="content"></textarea><br /> <input type="submit" value="tweet"/> </form>
assertThat(tester.isRedirect(), is(true));
assertThat(tester.getDestinationPath(), is("/twitter/"));
return redirect(basePath);
<context-param> <param-name>slim3.rootPackage</param-name> <param-value>tutorial</param-value> </context-param>