今こんなの作ろうとしています。>独自のIRequestTargetUrlCodingStrategy 〜その2〜
下記の件について
HybridUrlCodingStrategyではさすがに敷居が高すぎるので、
とりあえず、ステートフルページは考慮しないことにして、
BookmarkablePageRequestTargetUrlCodingStrategyを元に作ってみた。
しかも、ページ名を最後に持ってくるのはとりあえずあきらめて、
最後のパラメータにhtmlをつければ目的達成できるじゃんと考えて、作ってみた:
http://domain/page.html/param1/value1/param2/value2.html
public class HtmlBookmarkablePageRequestTargetUrlCodingStrategy extends BookmarkablePageRequestTargetUrlCodingStrategy { public HtmlBookmarkablePageRequestTargetUrlCodingStrategy(String mountPath, Class<? extends Page> bookmarkablePageClass, String pageMapName) { super(mountPath, bookmarkablePageClass, pageMapName); } @Override protected void appendParameters(AppendingStringBuffer url, Map parameters) { super.appendParameters(url, parameters); if (parameters.size() > 0) { if (url.endsWith("/")) { url.delete(url.length() - 1, url.length()); url.append(".html"); } } } @Override protected ValueMap decodeParameters(String urlFragment, Map urlParameters) { if (urlFragment.endsWith(".html")) { urlFragment = urlFragment.substring(0, urlFragment.length() - ".html".length()); } return super.decodeParameters(urlFragment, urlParameters); } }
そのテストコードがこれ
public class HtmlBookmarkablePageRequestTargetUrlCodingStrategyTest { private static class DummyPage extends Page { } static final IRequestTargetUrlCodingStrategy rear = new HtmlBookmarkablePageRequestTargetUrlCodingStrategy("/page.html", DummyPage.class, null); static final IRequestTargetUrlCodingStrategy base = new BookmarkablePageRequestTargetUrlCodingStrategy("/page.html", DummyPage.class, null); static final PageParameters params = new PageParameters("item_cd=123,order=1"); @Before public void setUp() throws Exception { } @Test public void testDecode() { RequestParameters req = new RequestParameters(); req.setPath("page.html/item_cd/123/order/1.html"); IRequestTarget target = rear.decode(req); if (target instanceof BookmarkablePageRequestTarget) { BookmarkablePageRequestTarget bTarget = (BookmarkablePageRequestTarget) target; assertEquals(DummyPage.class, bTarget.getPageClass()); assertEquals("123", bTarget.getPageParameters().getString("item_cd")); assertEquals("1", bTarget.getPageParameters().getString("order")); assertEquals(2, bTarget.getPageParameters().size()); } else { fail("not instance of BookmarkablePageRequestTarget"); } req.setPath("page.html"); target = rear.decode(req); if (target instanceof BookmarkablePageRequestTarget) { BookmarkablePageRequestTarget bTarget = (BookmarkablePageRequestTarget) target; assertEquals(DummyPage.class, bTarget.getPageClass()); assertEquals(0, bTarget.getPageParameters().size()); } else { fail("not instance of BookmarkablePageRequestTarget"); } } @Test public void testEncode() { assertEquals("page.html/item_cd/123/order/1/", base.encode(new BookmarkablePageRequestTarget(DummyPage.class, params)).toString()); assertEquals("page.html/item_cd/123/order/1.html", rear.encode(new BookmarkablePageRequestTarget(DummyPage.class, params)).toString()); assertEquals("page.html", rear.encode(new BookmarkablePageRequestTarget(DummyPage.class, new PageParameters())).toString()); } @Test public void testMatches() { assertTrue(rear.matches("page.html")); assertTrue(rear.matches("page.html/a/b.html")); assertTrue(rear.matches("page.html/a/b/")); assertTrue(rear.matches("page.html/a/")); assertFalse(rear.matches("page.htm")); } }