[Seasar-user:2586] [S2Struts] アクション自動登録のURIについて

Jun Futagawa jfut
2005年 9月 19日 (月) 12:25:31 JST


ふたがわです。

S2StrutsV1.2.0-EA2の無設定Struts大変気に入りました。
ソース眺めてて思ったんですが、アクション登録時のURIが/hoge のように
すべて / 直下に登録されるようになっているため、下記のような場合
名前がぶつかってしまって良くないかなと思いました。

org.example.foo.HogeAction
 -> /hoge (/hoge.do)
org.example.bar.HogeAction
 -> /hoge (/hoge.do)

そこで、下記のようにパッケージ名のルートを設定で指定してルート以下の
パッケージ名もURIに含めるようにしていただけると嬉しいです。

* struts-config.xml
<plug-in className="org.seasar.struts.plugin.AutoStrutsConfigRegisterPlugIn">
	<set-property property="enableJar" value="false"/>
	<set-property property="docRoot" value="/pages"/>
	<set-property property="packageRoot" value="org.example"/>
</plug-in>

org.example.foo.HogeAction
 -> /foo/hoge (/foo/hoge.do)
org.example.bar.HogeAction
 -> /bar/hoge (/bar/hoge.do)

せっかくなのでS2StrutsExample-V1.2.0-EA2のActionに対応できるように考えると、
次のような書き方ができると便利なのかなと思います。

<set-property property="packageRoot" value="org.seasar.struts.examples.*.(action)"/>
  「*」の文字列をURIに含める
  「()」内の文字列がある場合は、それをURIに含めない
 上記に当てはまらない文字列はすべてURIに含める

下記修正例ですが、getActionPathが力ずくで賢くないので、
もっとスマートなやり方があると思います。。。

* org.seasar.struts.config.AutoStrutsConfigRuleImpl
* org.seasar.struts.config.AutoStrutsConfigRule
* org.seasar.struts.plugin.AutoStrutsConfigRegisterPlugIn
  packageRoot用のsetter/getter追加

* org.seasar.struts.config.rule.ZeroConfigActionRuleImpl.java
public String getPath(Class actionClass, ModuleConfig config) {
	return CommonNamingRule.getActionPath(configRule.getPackageRoot(), actionClass.getName());
}

* org.seasar.struts.config.rule.CommonNamingRule.java
public static String getActionPath(String regex, String path) {
	if (StringUtil.isEmpty(path))
		return null;
	if (! StringUtil.isEmpty(regex)) {
		regex = regex.replaceAll("\\(", "(?:").replaceAll("\\)", ".)?");
		regex = regex.replaceAll("\\.", "\\\\.").replaceAll("\\*", "(.*?)");
		regex += "(.*?)$";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(path);
		if (matcher.find()) {
			StringBuffer buffer = new StringBuffer();
			for (int i = 1; i < matcher.groupCount() + 1; i++) {
				buffer.append(decapitalizeName(matcher.group(i))).append(".");
			}
			buffer.deleteCharAt(buffer.length() - 1);
			path = buffer.toString();
		}
	}
	path = "." + decapitalizeName(path);
	path = path.replaceAll("\\.{2}?", ".").replaceAll("\\.", "/");
	return path.replaceFirst("Action$", "");
}

* testGetActionPath()
assertEquals("/validate/validate", CommonNamingRule.getActionPath(
		"org.seasar.struts.examples.*.(action)",
		"org.seasar.struts.examples.validate.ValidateAction"));
assertEquals("/employee/employeeSearch", CommonNamingRule.getActionPath(
		"org.seasar.struts.examples.*.(action)",
		"org.seasar.struts.examples.employee.action.EmployeeSearchAction"));
assertEquals("/add/add", CommonNamingRule.getActionPath(
		"org.seasar.struts.examples.*.(action)",
		"org.seasar.struts.examples.add.AddAction"));

ご検討よろしくお願いいたします。

-- 
ふたがわ



Seasar-user メーリングリストの案内