2012/07/06

Grailsでファイルアップロードするには

リファレンスに記載してあった。
http://grails.org/doc/latest/guide/theWebLayer.html#uploadingFiles

リファレンスのようにこんな感じで実装すればうまく動作した。

GSPに以下のようなタグを記述する。
Upload Form: <br />
    <g:uploadForm action="upload">
        <input type="file" name="myFile" />
        <input type="submit" />
    </g:uploadForm>
Controllerを以下のように実装する。
def upload() {
    def f = request.getFile('myFile')
    if (f.empty) {
        flash.message = 'file cannot be empty'
        render(view: 'uploadForm')
        return
    }
    f.transferTo(new File('/some/local/dir/myfile.txt'))
    response.sendError(200, 'Done')
}

Grailsのログ設定について

ここに詳しく掲載されていた。
http://grails.org/doc/latest/guide/single.html#logging


プロジェクトの作成時にConfig.groovyに以下のような設定がされているので、
あとは適切に設定すればいいみたい。
// log4j configuration
log4j = {
    // Example of changing the log pattern for the default console
    // appender:
    //
    //appenders {
    //    console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
    //}

    error   'org.codehaus.groovy.grails.web.servlet',  //  controllers
           'org.codehaus.groovy.grails.web.pages'     //  GSP,
           'org.codehaus.groovy.grails.web.sitemesh', //  layouts
           'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping
           'org.codehaus.groovy.grails.web.mapping', // URL mapping
           'org.codehaus.groovy.grails.commons', // core / classloading
           'org.codehaus.groovy.grails.plugins', // plugins
           'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration
           'org.springframework',
           'org.hibernate',
           'net.sf.ehcache.hibernate'
}

2012/07/03

[Grails] validationエラー時のメッセージを変更するには

概要

Domainクラスに定義できる制約(validation)でエラーが発生すると以下のようなメッセージが出力されます。
[class jp.co.wave.dsam.Test]クラスのプロパティ[name]の空白は許可されません。
これだとユーザーに全然優しくないので、分かりやすいメッセージに変更する方法を照会します。

検証環境

項目内容
OSMac OS X 10.06
Grails2.0.4

内容

リファレンスの7.5節に変更する方法が記載されていました。 抜粋します。
If a constraint is violated Grails will by convention look for a message code of the form:

[Class Name].[Property Name].[Constraint Code]
In the case of the blank constraint this would be user.login.blank so you would need a message such as the following in your grails-app/i18n/messages.properties file:

user.login.blank=Your login name must be specified!
The class name is looked for both with and without a package, with the packaged version taking precedence. So for example, com.mycompany.myapp.User.login.blank will be used before user.login.blank. This allows for cases where your domain class message codes clash with a plugin's.

For a reference on what codes are for which constraints refer to the reference guide for each constraint.
Googleで翻訳してみますと、
制約が違反している場合は、Grailsは慣例により、フォームのメッセージコードを探します。
[Class Name].[Property Name].[Constraint Code]

このようなあなたのgrails-app/i18n/messages.propertiesファイルに次のようなメッセージが必要になりますので、空白の制約の場合、これはuser.login.blank次のようになります。

user.login.blank=Your login name must be specified!

クラス名が優先してパッケージ化されたバージョンでは、とと、パッケージなしの両方で検索されます。したがって、たとえば、com.mycompany.myapp.User.login.blankはuser.login.blank前に使用されます。これは、ドメインクラスのメッセージコードは、プラグインのと衝突例が可能になります。

制約は、それぞれの制約のためにリファレンスガイドを参照しているコードが何であるかに参考のため。


これを自分なりに読み解きますと、
validationでエラーが発生すると、
grails-app/i18n/messages.propertiesから、
[Class Name].[Property Name].[Constraint Code]
という形式のメッセージコードを探します。

独自に定義することにより、プラグインで表示するメッセージとと異なるメッセージを出力することができます。
試しにやってみると、追加したメッセージが出力されることを確認しました。

参考情報

7 Validation - Reference Documentation

最後に

2012/06/26

[Swing] JXTreeTableを試す

概要

JXTreeTableを試してみました

検証環境

項目内容
OSMac OS X Lion

実装例

以下を参考に実装してみました。 http://d.hatena.ne.jp/takezoe/20100111 これにボタンとか独自のレンダラとか設定する方法はあるのだろうか。 独自に作ったエディターやら、レンダラーを設定するだけでいいのか、機会があったら調べたい。

2012/06/19

POIでシート名を変更する

概要

Apache POIを使用してExcelのWorkBookのシート名を変更する簡単な例を紹介します。

検証環境

項目内容
OSMac OS X Lion
POI3.8

実装例

import org.apache.poi.hssf.usermodel.HSSFWorkbook
import org.apache.poi.ss.usermodel.Workbook



class ChangeSheetName {



    publicstaticvoid main(String[] args) {

        

        File file = new File('test.xls')

        

        file.withInputStream {

            Workbook wb = new HSSFWorkbook(it)

            // 0番目のシートの名前を変更する

            wb.setSheetName(0, 'シート名を変更した')

            

            // 複製した結果を元ファイルに書き込む

            file.withOutputStream {

                wb.write(it)

            }

        }

    }

}

POIでシートを複製する

概要

Apache POIを使用してExcelのWorkBookのシートを複製する簡単な例を紹介します。

検証環境

項目内容
OSMac OS X Lion
POI3.8

実装例

import org.apache.poi.hssf.usermodel.HSSFWorkbook
import org.apache.poi.ss.usermodel.Workbook

class CloneSheet {

    publicstaticvoid main(String[] args) {
        
        File file = new File('test.xls')
        
        file.withInputStream {
            Workbook wb = new HSSFWorkbook(it)
            // 0番目のシートを複製する
            wb.cloneSheet(0)
            
            // 複製した結果を元ファイルに書き込む
            file.withOutputStream {
                wb.write(it)
            }
        }
    }
}

2012/06/15

eclipseでGroupSessionの開発環境を構築する

概要

公式サイトに開発環境構築ガイドがあるのですが、思い切りはまりました。。。
試行錯誤の結果、環境構築することができたので、その方法についてのメモ。
※WTPで起動し、管理画面を操作できるところまで確認しました。

環境

項目内容
OSMac OS X Lion
JavaJava SE 7 (MacOS X Default)
eclipseEclipse Indigo(3.7)
TomcatTomcat6
GroupSession4.0.3(訳あって最新版ではないです)

下準備

・GroupSessionの入手
以下のURLから最新バージョンの「gsession_src.zip」をダウンロードします。
http://www.gs.sjts.co.jp/v4/download/index.html

ダウンロードが完了したら適当な場所に解凍します。

構築

公式サイトにあるEclipseでGroup Sessionの開発を行う方法を参考にやってみましたが、全然うまくいきませんでした。。。
Antのタスクを実行すると「BUILD SUCCESSFUL」とかなるのですが
WarningLogが出まくっているし、何が何やら。。。

そこで、以下のような手順を行い環境構築しました。

1.動的Webプロジェクトを作成します

2.WebContent直下に「gsession_src.zip」を解凍してできたファイルをコピーします

3.ソースフォルダを指定します
/gsession4/WebContent/WEB-INF/plugin直下にpluginがぎっしりあります。
それらを一つずつ開き、「src」フォルダがあれば、それを一つずつ指定していきます。
※数が多いので非常に時間がかかります。

なお、詳細な方法については、公式サイトで詳細に解説していましたので、
やり方が分からない場合、そちらを参考にして下さい。

やり終えるとこんな感じになるはずです。

4.ビルドパスを編集します
1.WEB-INF/libにある全てのJarをビルドパスに追加します。
2.WEB-INF/classesをクラスフォルダとしてビルドパスに追加します。
3.WEB-INF/plugin/licenseとmobileをクラスフォルダとしてビルドパスに追加します。

5.ビルドを実行します
Ctrl+Bでビルドを実行します。かなり時間がかかります。気長に待ちます。

6.ServersビューでTomcat6サーバを追加します。

7.追加したサーバに1で作成したプロジェクトを追加します。

8.サーバを起動します。
こんな感じのログが出力されます。
例外が発行されていなければ正常に動作していると思います。
--
2012/06/15 22:59:35 org.apache.catalina.core.AprLifecycleListener init
情報: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: .:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
2012/06/15 22:59:35 org.apache.tomcat.util.digester.SetPropertiesRule begin
警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:gsession4' did not find a matching property.
2012/06/15 22:59:36 org.apache.coyote.http11.Http11Protocol init
情報: Coyote HTTP/1.1を http-8080 で初期化します
2012/06/15 22:59:36 org.apache.catalina.startup.Catalina load
情報: Initialization processed in 1062 ms
2012/06/15 22:59:36 org.apache.catalina.core.StandardService start
情報: サービス Catalina を起動します
2012/06/15 22:59:36 org.apache.catalina.core.StandardEngine start
情報: Starting Servlet Engine: Apache Tomcat/6.0.35
log4j:WARN No appenders could be found for logger (jp.groupsession.v2.cmn.GroupSession).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
2012/06/15 22:59:46 org.apache.coyote.http11.Http11Protocol start
情報: Coyote HTTP/1.1を http-8080 で起動します
2012/06/15 22:59:46 org.apache.jk.common.ChannelSocket init
情報: JK: ajp13 listening on /0.0.0.0:8009
2012/06/15 22:59:46 org.apache.jk.server.JkMain start
情報: Jk running ID=0 time=0/64  config=null
2012/06/15 22:59:46 org.apache.catalina.startup.Catalina start
情報: Server startup in 10221 ms

--
正常に動作しているかブラウザで確認します。

うまく動作しているとこんな感じの画面が表示されるはずです。