読者です 読者をやめる 読者になる 読者になる

文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

s2jdbc-genで自動生成するファイルをカスタマイズする

seasar s2jdbc

s2jdbc-genで自動生成されるentityですが、
mysqlのtinyintがShort型で生成されたりして、微妙に使いにくかったりします。
そこで、自動生成されるentityやserviceをカスタマイズしてみることにしました。

s2jdbc-genプロジェクトをダウンロードする。
http://s2container.seasar.org/2.4/ja/downloads.html
S2JDBC-Gen 2.4.45 ← ここからダウンロードする。

ダウンロード後、eclipseプロジェクトとしてインポートする。
(インポートの必要はありませんが、インポートした方が解りやすいです)

*.ftlファイルをコピーする。

S2JDBC-Genのテンプレートは、配布ファイルのresources/tempaltesディレクトリ以下にあります。 エンティティクラスのテンプレートはjava/entity.ftlになります。 これをコピーして、修正を加えるのが良いでしょう。 テンプレートの記述方法についてはFreeMarker のドキュメントを参照してください。

http://s2container.seasar.org/2.4/ja/s2jdbc_gen/tasks/gen_entity.html

とのことです。配布ファイルって何?と思いますが、要はs2jdbc-genのプロジェクトのソースのことですね。
今回は直接entity.ftlを修正してしまいます。
直接と言ってもoverride扱いになるので、不要になればプロジェクトから削除すれば、内蔵のftlファイルが使用されます。
以下のファイルをプロジェクトにコピーします。
f:id:treeapps:20120210220151p:image
↑これを、自動生成するプロジェクトに、以下のようにコピーします。
f:id:treeapps:20120210224031p:image

entity.ftlを修正する。
f:id:treeapps:20120210224526p:image
↑ここにあるentity.ftlを以下のように書き換えて、ShortをIntegerに、byte[]をStringに書き換えてみます。

    <#if useAccessor>private<#else>public</#if> ${attr.attributeClass.simpleName} ${attr.name}; 

↓以下のように書き換える。

  <#if attr.attributeClass.simpleName == "Short">
    <#if useAccessor>private<#else>public</#if> Integer ${attr.name};
  <#elseif attr.attributeClass.simpleName == "byte[]">
    <#if useAccessor>private<#else>public</#if> String ${attr.name};
  <#else>
    <#if useAccessor>private<#else>public</#if> ${attr.attributeClass.simpleName} ${attr.name};
  </#if>

gen-entityタスクを実行して確認する
カスタマイズしたテンプレートでgen-entityを実行し、entityをチェックします。
左が修正前、右が修正後です。
f:id:treeapps:20120210223312p:image

それぞれのテンプレートファイルと、生成されるファイルの対応は以下の通り。
entity.ftl → entity
names.ftl → entityNames
service.ftl → service
entitytest.ftl → entityTest
servicetest.ftl → serviceTest

私的には@Generatedのタイムスタンプが邪魔でしょうがないので、削除しました。
結構自動生成し直す機会があって、
timestampの部分だけ常に変化するから、svnで差分扱いされてしまうのです。timestamp部分しか差分無くても・・
なるべくsvnで差分があるファイルだけをコミットしたいから、timestampが邪魔なのです。
timestampしか差分が無いファイルを、コミット対象から手動で除外していく無意味な作業から、開放されましょう!

@Generated(value = {<#list generatedInfoList as info>"${info}"<#if info_has_next>, </#if></#list>}, date = "${currentDate?datetime}")

以下のように書き換える。

@Generated(value = {<#list generatedInfoList as info>"${info}"<#if info_has_next>, </#if></#list>})

上が修正前、下が修正後です。
f:id:treeapps:20120210223502p:image

カラム名のprefix・suffixによって独自のアノテーションを付与するなど、カスタマイズし放題です!

今回は修正していませんが、タブではなく半角スペースでインデントされているので、
タブに直したり、社内で使用しているコードフォーマッターを実行しても差分が無いよう、チマチマ修正するといいかと思います。

Seasar 2 徹底入門 SAStruts/S2JDBC 対応

Seasar 2 徹底入門 SAStruts/S2JDBC 対応