Groovyで、Stringクラス、Fileクラスを拡張してみる

2019-01-29Groovy

出前味噌ですが、意外と便利です。

使い方

  1. クラスパスの通っている場所に、 Extentions.groovy をおく
  2. 後は使用したいgroovyソースの先頭で、 Extentions.init() メソッド(static)を実行する

読み込ませ方などの詳細は明日説明します・・・仕事が・・・

追加メソッド

File.lostFiles(dir)

自分自身のディレクトリと引数のディレクトリを比較し、自分自身に存在しないファイルをリストで返します。

File.listEmptyDirs()

空のディレクトリをリストで返します。

String.padRightBytes(count)

文字列の右側をスペース詰めします。groovyのpadRightとの違いは、バイト数を計算してスペース詰めすることです。padRightは文字数でスペース詰めするため、日本語を使用した場合に問題がありました。

String.padLeftBytes(count)

文字列の左側をスペース詰めします。

String.toNarrowCase()

全角文字を半角に変換します。全角文字以外はそのままです。(一部対象外。理由は特になし)

String.toWideCase()

半角文字を全角に変換します。半角文字以外はそのままです。(一部対象外。希望があれば連絡ください)

ソースコード

**こちらのライブ

Extentions.groovy

import org.apache.poi.hssf.usermodel.*
import org.apache.poi.poifs.filesystem.*

class Extentions {
    static init = {
        File.metaClass.lostFiles = { newdir ->
            def thislist = []
            def olddir = delegate
            olddir.eachFileRecurse { thislist << it.path }
            def newlist = []
            newdir.eachFileRecurse { newlist << it.path }

            newlist = newlist.collect {
                it.replace(newdir.path, "")
            }

            thislist.findAll {
                !newlist.contains(it.replace(olddir.path, ""))
            }
        }

        File.metaClass.listEmptyDirs = {
            def list = []
            delegate.eachFileRecurse {
                if (it.isDirectory() && it.listFiles().size() == 0) {
                    list << it
                }
            }
            list
        }

        String.metaClass.padRightBytes = { count ->
            delegate.padRight(count - (delegate.bytes.size() - delegate.size()))
        }

        String.metaClass.padLeftBytes = { count ->
            delegate.padLeft(count - (delegate.bytes.size() - delegate.size()))
        }

        String.metaClass.toNarrowCase = {
            def wideChars = ('A'..'Z') + ('a'..'z') + ('0'..'9') + (['?', 'ー', '*', '=', '!', '”', '$', '%', '&', '(', ')'])
            def narrowChars = ('A'..'Z') + ('A'..'Z') + ('0'..'9') + (['-', 'ー', '*', '=', '!', '"', '$', '%', '&', '(', ')'])

            assert wideChars.size() == narrowChars.size()

            def text = delegate.toString()

            for (i in 0..wideChars.size() - 1) {
                text = text.replace(wideChars[i], narrowChars[i])
            }
            text
        }

        String.metaClass.toWideCase = {
            def wideChars = ('A'..'Z') + ('a'..'z') + ('0'..'9') + (['?', 'ー', '*', '=', '!', '”', '$', '%', '&', '(', ')'])
            def narrowChars = ('A'..'Z') + ('A'..'Z') + ('0'..'9') + (['-', 'ー', '*', '=', '!', '"', '$', '%', '&', '(', ')'])

            assert wideChars.size() == narrowChars.size()

            def text = delegate.toString()

            for (i in 0..narrowChars.size() - 1) {
                text = text.replace(narrowChars[i], wideChars[i])
            }
            text
        }

        HSSFWorkbook.metaClass.'static'.load = { file ->
            new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(file.path)));
        }

        HSSFWorkbook.metaClass.getSheets = {
            def list = []
            for (i in 0..delegate.getNumberOfSheets() - 1) {
                def sheet = delegate.getSheetAt(i)
                sheet.metaClass.parent = delegate
                list << sheet
            }
            list
        }

        org.apache.poi.hssf.usermodel.HSSFSheet.metaClass.cell = {
            row, col -> delegate.getRow(row)?.getCell((short) col)
        }

        org.apache.poi.hssf.usermodel.HSSFSheet.metaClass.cellValue = { row, col ->
            def result = 0

            //assert delegate.getRow(row):"行${row}がnullです。"

            def cell = delegate.getRow(row)?.getCell((short) col)
            switch (cell?.cellType) {
                case org.apache.poi.hssf.usermodel.HSSFCell.CELL_TYPE_NUMERIC:
                    result = cell?.numericCellValue
                    break;
                case org.apache.poi.hssf.usermodel.HSSFCell.CELL_TYPE_STRING:
                    result = cell?.stringCellValue
                    break;
                case org.apache.poi.hssf.usermodel.HSSFCell.CELL_TYPE_BOOLEAN:
                    result = cell?.booleanCellValue
                    break;
                case org.apache.poi.hssf.usermodel.HSSFCell.CELL_TYPE_FORMULA:
                    result = cell?.cellFormula
                    break;
                default:
                    //assert false:"${row}, ${col}が不正"
                    result = null
                    break;
            }

            result
        }

        java.util.PropertyResourceBundle.metaClass.'static'.load = { file ->
            new java.util.PropertyResourceBundle(new java.io.FileInputStream(file))
        }
        java.util.PropertyResourceBundle.metaClass.'static'.loadProject = {
            java.util.PropertyResourceBundle.load(new File("project-ascii.properties"))
        }
    }
}

2019-01-29Groovy