S2Containerの登録状態を一覧表示する

ひがやすを blog Convention over Configurationの未来? 10:26


「明示的に書いているほうがメンテナンスしやすい」という声を聞くことがありますが、果たして本当でしょうか。
もし、明示的に書くことでメンテナンスしやすくなるのなら、フレームワークもいらないという話にもなってきます。
フレームワークというのは、一定のルールを守っていれば、中身を知らなくても使えるようにするものだからです。


規約をドキュメント化しておけばいいのです。1000行もある設定ファイルを理解するより、
10行の規約を理解するほうが簡単なはずです。

「メンテナンス」という観点では、「10行の規約を理解する」方が簡単だと思います。

ですが、開発するときに「10行の規約」に「完璧に沿って」コードを書いたことを確認するのは難しいかもしれません。
コンポーネントアスペクトの自動登録は便利なのですが、全部動かしてみないと本当に登録されているのかと不安になってしまいます。

コンポーネントは、登録されていなければアプリケーションとしてうまく動かないと思うので、いいのですが、
DIされる内容とか適用されるアスペクトとかは、間違っていてもそれなりに動いてしまいそうです。
(TraceInterceptorとかThrowsInterceptorとかは、適用漏れがあっても気付きにくそうです。)
(classPatternの正規表現を間違えて、実はアスペクトが適用されていないっていうのはありそう)

というわけで、コンポーネントと適用されているInterceptorを出力するコンポーネントを書いてみました。
(Seasar2のバージョンは、2.3.8で試してみました。)


import java.util.List;
import org.seasar.framework.container.S2Container;

public interface ViewS2Container {
public List getComponentList();
public String getContainerInfoInString();

public S2Container getContainer();

public void setContainer(S2Container container);
}


import java.util.ArrayList;
import java.util.List;

import org.seasar.framework.container.ComponentDef;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.impl.AspectDefImpl;
import org.seasar.framework.container.impl.ComponentDefImpl;

public class ViewS2ContainerImpl implements ViewS2Container {

private S2Container container;

public List getComponentList(){
List components = new ArrayList();
createComponentList(container,components);

return components;
}

public String getContainerInfoInString(){
StringBuffer sb = new StringBuffer();
List anComponents = getComponentList();
for(int i = 0; i < anComponents.size();i++){
AnalyzedComponent anComp = (AnalyzedComponent)anComponents.get(i);
sb.append("--------------------------------------\n");
sb.append("NameSpace:");
sb.append(anComp.getNameSpace() + "\n");
sb.append("ComponentName:");
sb.append(anComp.getComponentName() + "\n");
sb.append("ComponentClassName:");
sb.append(anComp.getComonentClassName() + "\n");

List anAspects = anComp.getAnalyzedAspects();
if(anAspects.size() > 0){
sb.append("\tApplied Interceptors:\n");
for(int j =0 ; j < anAspects.size() ; j++){
AnalyzedAspect anAspect = (AnalyzedAspect)anAspects.get(j);
sb.append("\t\tInterceptor Name:");
sb.append(anAspect.getExpression() + "\n");
sb.append("\t\tClass:");
sb.append(anAspect.getClassName() + "\n");
}
}

sb.append("--------------------------------------\n\n");
}

return sb.toString();
}


public S2Container getContainer() {
return container;
}
public void setContainer(S2Container container) {
this.container = container;
}

private AnalyzedComponent createAnalyzedComponent(ComponentDef def,String nameSpace){
AnalyzedComponent anComp = new AnalyzedComponent();
ComponentDefImpl defImpl =null;
try{
defImpl = (ComponentDefImpl) def;
}catch(ClassCastException ex){
ex.printStackTrace();
return null;
}
anComp.setNameSpace(nameSpace);
anComp.setComonentClassName(defImpl.getComponentClass().getName());
anComp.setComponentName(defImpl.getComponentName());
for(int i = 0; i < defImpl.getAspectDefSize(); i++){
AspectDefImpl asDefImpl = (AspectDefImpl) defImpl.getAspectDef(i);
anComp.addAnalyzedAspect(new AnalyzedAspect(asDefImpl.getExpression(),asDefImpl.getValue().getClass().getName()));
}

return anComp;

}

private void createComponentList(S2Container cont,List list){
int numComponents = cont.getComponentDefSize();
for(int i = 0; i < numComponents; i++){
list.add(createAnalyzedComponent(cont.getComponentDef(i),cont.getNamespace()));
}

int childSize = cont.getChildSize();
for(int i = 0; i < childSize; i++){
createComponentList(cont.getChild(i),list);
}
}
}

import java.util.ArrayList;
import java.util.List;

public class AnalyzedComponent {

private String componentName;
private String comonentClassName;
private String nameSpace;
private List analyzedAspects = new ArrayList();


public void addAnalyzedAspect(AnalyzedAspect anAspect){
analyzedAspects.add(anAspect);
}

public List getAnalyzedAspects() {
return analyzedAspects;
}
public void setAnalyzedAspects(List analyzedAspects) {
this.analyzedAspects = analyzedAspects;
}
public String getComonentClassName() {
return comonentClassName;
}
public void setComonentClassName(String comonentClassName) {
this.comonentClassName = comonentClassName;
}
public String getComponentName() {
return componentName;
}
public void setComponentName(String componentName) {
this.componentName = componentName;
}
public String getNameSpace() {
return nameSpace;
}
public void setNameSpace(String nameSpace) {
this.nameSpace = nameSpace;
}
}


public class AnalyzedAspect {
private String expression;
private String className;

public AnalyzedAspect(String expression,String className){
this.expression = expression;
this.className = className;
}

public String getExpression() {
return expression;
}
public void setExpression(String expression) {
this.expression = expression;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
}