Webエンジニア susumuis の技術ブログ

このブログの内容は個人の見解であり、所属する組織の公式見解ではありません

今こんなの作ろうとしています。>独自の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"));
	}

}