JavaのRESTful(JAX-RS)実装であるjerseyの中身をみていることにした。
というのも、あのPathパラメータの実装が欲しいと思ったからです。
具体的には、JAX-RSの仕様では
@Path("/customer/{first}-{last}")
public void foo(
@PathParam("first") String firstName,
@PathParam("last") String lastName){
}
という表記をすると、
http://xxxxxx/customer/shinnosuke-nohara
のようなURLにアクセスしたときに、
foo(“shinnosuke”,”nohara”)
のメソッドを自動的に起動できる。
ドキュメントチックにRESTのURLのパターン仕様が記述できるので、
ある意味、わかりやすい。
このような仕様を今度作成するnettyで実現するRESTにも部分的に取り込もうと思う。
そこで、Jerseyではこの部分をどのようにやっているのかをみて、
まずはそこだけ借りてしまおうということです。
で、調べたのが、
com.sun.jersey.api.uri.UriTemplate
というクラス。これで、URLの正規表現と実際のパスからパラメータを抜き出すことができます。
では簡単な例。
public class PathPatternSample {
/**
* @param args
*/
public static void main(String[] args) {
checkPath("/foo/{arg1}/{arg2}/{num:[0-9]{3}}","/foo/test1/test2/999");
checkPath("/customer/{firstname}-{lastname}","/customer/shinnosuke-nohara");
}
public static void checkPath(String path,String input){
UriTemplate template = new UriTemplate(path);
Map<string , String> values = new HashMap</string><string , String>();
System.out.println("======>" + template.getTemplate() + "< ======");
if(template.match(input, values)){
for(String key: values.keySet()){
System.out.println(key + "=>[" + values.get(key) + "]");
}
}
}
}
これで、実行結果は
======>/foo/{arg1}/{arg2}/{num:[0-9]{3}}< ======
num=>[999]
arg2=>[test2]
arg1=>[test1]
======>/customer/{firstname}-{lastname}< ======
lastname=>[nohara]
firstname=>[shinnosuke]
となります。
これで、javaのアノテーションと組み合わせれば、
まずは完成といったところです。


