2008/02/28

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

意外と便利です。 使い方は簡単。
  • 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"))
        }
    }
}

0 件のコメント:

コメントを投稿