-こんな感じ
テンプレートでひとつひとつ機能を作っていく。。。Velocityテンプレートで書くのが難しいロジックは、バッキングBeanで細工していく、そんなステップです。
@ThrowableHandler public Class<?> dumpException(Exception e, CalcModel model) throws Throwable { System.out.println("result: " + model.getResult()); e.printStackTrace(System.err); throw e; }
こんなの(一部)を、以下のテンプレート(一部)でジェネレート。
public Object handleThrowable(ApplicationAdaptor application, Throwable t) throws Throwable { #foreach($throwableHandler in ${inspector.throwableHandlers}) if(t instanceof ${throwableHandler.throwableParameter.qualifiedName}) { #foreach($param in ${throwableHandler.parameters}) #if(${param.throwable} == false) #if(${param.packageName} == ${inspector.userType.packageName}) ${param.shortName} ${param.parameterName} = application.getComponent(this, ${param.shortName}.class); #else ${param.qualifiedName} ${param.parameterName} = application.getComponent(this, ${param.qualifiedName}.class); #end #end #end return ${throwableHandler.callSignature}; } #end throw t; }
元を継承してできるクラスの、該当箇所に関わる結果は、
public Object handleThrowable(ApplicationAdaptor application, Throwable t) throws Throwable { if(t instanceof Exception) { CalcModel model = application.getComponent(this, CalcModel.class); return dumpException((Exception)t, model); } throw t; }
ちょっと自然なJavaコードではないですね。スパイラルに作りこんでいずれは美しくジェネレートしたいと思っています。