natural born minority
少し前の話しなのですが…もうなんだか「すごく嬉しかった」ので、恥ずかしながら書いていきます。
仕事で使う目的で家でちょこちょこ触っていました「DBUnit」に、俺の変更を取り込んでいただきました。
(ここの “Upgrade Apache POI library from …” が「自分のプルリクの内容」です。)
よく考えなくともですが、仕事でgit使った事(その当時)ないし、多人数開発してないし、GitHubの垢あるけど他人にプルリク投げたことないし…。
そういう初物づくしだったけど「ま、こんだけ初物だらけやったらミスっても凹まんやろ」 ってのと「そろそろミソギが必要かな?」って思ってたので、勢い出してやってみたです。
ざっくり言えば「DBUnitのExcel読み書きを、xlsx形式にも対応した」だけです。
ドSIerな現場で「自動テストの事前条件流し込みの仕組みを考える」という仕事をした際に、 「皆が使えるつったらExcelだよな…」ということから、横の人に「死んだプロダクトを?いまさら?w」 とかなんとか言われつつも、DBUnitを使う事としました。
で、現場ではExcel2007だったので「xlsxで書いてもらえばいいか…」と思っていたのですが、 DBUnitは2007未満の形式であるxls形式にしか対応していなかったんです。
内部でExcelの読み書きに使っているPOIは、早々と対応していたし、 「対応する」というイシューも数年前に出てる…のに頓挫しているようでした。
そこで、自身の仕事の進みも関係あるので、直してプルリクしよう!と思ったのが発端です。
DBUnitの「Excelファイル <-> DB インポート/エクスポート機能」に、xlsx形式(Excel2007からのファイル形式)に対応しました。(今まで出来なかったのです)
xls形式,xlsx形式ファイル --> DBUnit(XlsDataSet) --> DB
DB --> DBUnit(XlsDataSet) --> xls形式ファイル
インポート時には「ファイル形式は自動判定」で読み込まれます。
エクスポート時は今まで通りxls形式ファイルがデフォルトですが__「少しの改造でxlsx形式を吐けるよう」__にしました(つもりです)。
例によりMaven Centralから「DBUnitを自プログラムに読み込む」ようにして下さい。
Mavenを使っているなら、pom.xml の<dependencies>
タグに以下ですね。
<dependency>
<groupId>org.dbunit</groupId>
<artifactId>dbunit</artifactId>
<version>2.5.1</version>
</dependency>
xlsx形式で読み込みたい場合は「いままで通りの実装方法」でOKです。
例えば、ExcelワークシートのデータをDBへインポートする一般的なコード…
public static void main(String[] args) throws Exception {
IDatabaseConnection con = null;
try {
con = getConnection();
IDataSet dataset = new XlsDataSet(new File("Excelのデータファイル"));
DatabaseOperation.CLEAN_INSERT.execute(con, dataset); // deleteしてからinsert
} finally {
if (con != null) {
con.close();
}
}
}
があるとした際に、"Excelのデータファイル"
が、xlsでもxlsxでも意識せず読み込みます。
あとは、おそらく使ってる方としては「自前FWとかなんかかぶせて使ってる」と思われるのですが
くらいが仕事かと思われますが「ファイルサイズが小さくなる」などそれなりのメリットに魅力があるなら移行されたらいかがでしょうか、というところで。
xlsx形式で書き込みたい場合「既存の実装を改造」する必要があります。
例えば、DB中のデータをExcelワークシートへエクスポートする一般的なコード…
public static void mail(String[] args) throws Exception {
IDatabaseConnection con = null;
try {
con = getConnection();
IDataSet dataset = con.createDataSet();
XlsDataSet.write(dataset, new FileOutputStream("Excelのデータファイル"));
} finally {
if (con != null) {
con.close();
}
}
}
があるとした場合、上記の
XlsDataSet.write(dataset, new FileOutputStream("Excelのデータファイル"));
の箇所は、内部の実装を展開すると
XlsDataSetWriter writer = new XlsDataSetWriter();
writer.write(dataset, new FileOutputStream("Excelのデータファイル"));
となるのですが、この”XlsDataSetWriter”のメソッドを一部オーバーライドすることにより、xlsx形式で出力できます。
実際に書いてみますと…
public static void main(String[] args) throws Exception {
IDatabaseConnection con = null;
try {
con = getConnection();
IDataSet dataset = con.createDataSet();
XlsDataSetWriter writer = new XlsDataSetWriter() {
@Override
public Workbook createWorkbook() {
return new XSSFWorkbook();
}
};
writer.write(dataset, new FileOutputStream("Excelのデータファイル"));
} finally {
if (con != null) {
con.close();
}
}
}
と「6行追加」の対応となります。
※割と煩雑ですね…今考えると、
など出来そうなのですが、当時(後述する理由で)ヘタレまくっていたのでいたしかたありません。
※俺は「英語力がクリオネばり」ですので、推測を多分に含むということを前置きしておきます。
この対応の要求はこちらに5年前に出ていたのですが…どうして「長らく対応が無かったか」というと…
ときて、
からの三年が今年。
「世の中って、こういうふうに停滞してくんだなぁ」という感じを垣間見ました。
なんとなく「うわぁ…ようSIer案件で見る『その話しはもう終わったことになってるから触れたらあかんヤーツ』っぽいわぁ…」と思いまして。
をアピりながら、プルリク投げました。
すべては「英語でのやりとり」につきます。(自身の英語力は小学生以下なので…)
経緯から「ありのままを伝わるカタチで書かないと蹴られるor無視されるだろう」と推測したので…
と「理由や経緯や願いを書く機会」があったのですが、すべてで
を行い、投稿してました。
プログラムについては
を心がけました。
経緯的に「Ticketの最初の人がテスト無しで蹴られている」ので、テストが「適切なカタチ」で存在しないと受け入れられないだろうと。
とはいえ…
なので、受け入れられるのは難しいと思っていました。
幸い今回の「変更の特性」が「既存のものにもう1パターン対応する」性質のものだったので、
に徹しました。(普通はアカンけど)
「よく知られ利用者も多い(だろう多分、だって俺でも知ってるし使ってんだもんw)プロダクト」なので 「既存の仕様をビタ一文変更してはならない」と心に決めて対応しました。
上にも書きましたが、「今回の対応で出力側もxlsx形式に変更する」ことも出来たのですが、
ので、
にしました。(これも本当はプロダクトのためにはアカンかもしれないし、ヘタレてるけれど)
そもそも目的が「使用しているライブラリの更新」なので、そんなに膨らまない性質のものなのですが…。
それでも「極力変更せずに目的を達成する」ことを頭に置きました。
具体的には「プロダクトコードは、3ファイルにそれぞれ30行以下に抑えて」という感覚に(最終的に)なりました。
なんとなく、記事中から「ドヤ顔ダブルピース」な感じが出てるのはなんとなく自覚の上ですが…。
「初老」だろうが「人生初」だろうが「トイメンが英語な人ら」だろうが「有名・無名」だろうが「変更内容がカスみたいなモノ」だろうが… 「とりあえず変更を投げてみた」ら良いと思ったんです。
受け入れられると超ハッピー!で、受け入れられなくとも経験になるし、なんか臆してたのがもったいないと思いまして。
たとえば…
などを「生活に支障のない程度に狙ってみる」のも、なんとなく楽しくなれるかもしれません。
俺みたいな「底辺落ちこぼれギョームプログラマー」でも(時と場合により)世界は優しいです。
以上、嬉しかった体験報告でした。
以下を参考にさせていただきました。ありがとうございます。