Monday, February 28, 2011

Groovy Monkeyでより良いEclipseライフを

あなたがEclipseのヘビーユーザなら、Groovy Monkeyを飼うことをお勧めします。この好奇心旺盛なおさるはあなたのEclipseへ機能を簡単に追加する方法を提供してくれます。

まずはおさるをアップデートサイトから手に入れましょう。私の知る限りペットは高いものですが、ラッキーなことにこのおさるは無料です :-)

おさるを手に入れましたか? あなたのEclipseのメニューバーに現れましたか? では彼を押してGroovy Monkeyチームが提供するサンプルプロジェクトを作りましょう。 このプロジェクトにはGroovy Monkeyを理解するための良い例が入っています。







その中からもっとも単純な例を取り上げましょう:
----
/*
 * Menu: Open Dialog > Groovy
 * Script-Path: /GroovyMonkeyScripts/monkey/OpenDialog_Groovy.gm
 * Kudos: ervinja
 * License: EPL 1.0
 * Job: UIJob
 * DOM: http://groovy-monkey.sourceforge.net/update/plugins/net.sf.groovyMonkey.dom
 */

out.println( 'hello world from Groovy' )
org.eclipse.jface.dialogs.MessageDialog.openInformation( window.getShell(),
                                                         'Monkey Dialog',
                                                         'Hello World from Groovy' )
----
とても単純でしょう?

Groovy Monkeyはヘッダにメタデータを持ちます。この例で重要なメタデータはMenuとJobです。Menuはこのスクリプトを実行するメニューアイテムの位置を表します。こんな風に:














Jobは実行するスレッドを表します。 JobにはJob、UIJob、WorkspaceJobの3つがあり、これらはEclipse Jobs APIに定義されています(詳細はこちらを参照してください)。 この例ではUIにアクセスする為UIJobが指定されています。

"out"と"window"がどこから来たのか不思議ですか? これらはDOM (Domain Object Model) と呼ばれる予め定義されているオブジェクトです。"out"はConsole DOMと呼ばれるorg.eclipse.ui.console.MessageConsoleStreamのオブジェクトでGroovy Monkeyが利用するEclipseコンソールにアクセスする為のものです。"window"はWindow DOMと呼ばれるorg.eclipse.ui.IWorkbenchWindowのオブジェクトでアクティブなEclipseウィンドウへアクセスする為のものです。DOMがなければ、この例は次のようになるでしょう:
----
import org.eclipse.ui.*
import org.eclipse.ui.console.*

def console = new MessageConsole('Groovy Monkey', null)
ConsolePlugin.default.consoleManager.with {
addConsoles([console] as IConsole[])
showConsoleView(console)
}
def out = console.newMessageStream()
def window = PlatformUI.workbench.activeWorkbenchWindow

out.println( 'hello world from Groovy' )
org.eclipse.jface.dialogs.MessageDialog.openInformation( window.getShell(),
                                                         'Monkey Dialog',
                                                         'Hello World from Groovy' )
----

Groovy Monkeyは他にもDOMを提供します。 これらはOutline ViewかInstalled DOMs Viewで確認できます。

もう1つ、私が書いた例を紹介しましょう。次の例はファイルのダウンロード機能を追加するもので、Includeメタデータを使ってGroovy Monkeyスクリプトからワークスペースのリソースを使う方法を示しています。この例を試すにはURLConnectionBuilderを取得する必要があります。

----
/*
 * Menu: Download File...
 * Script-Path: /GroovyMonkeyScripts/monkey/DownloadFile.gm
 * Kudos: Nagai Masato
 * License: EPL 1.0
 * Job: UIJob
 * Include: /GroovyMonkeyScripts/toybox/urlconnbuilder-0.0.2.jar
 */

import net.sourceforge.urlconnbuilder.*

def download = { url, filename ->
new URLConnectionBuilder().url(url) {
       connect {
           configure(requestProperties: ['User-Agent': 'George'])
           communicate(input: { conn, stream ->
               new File(filename).newOutputStream() << stream
           })
       }
}
}

shell = jface.shell(text: 'Download File') {
    def urlTxf, filenameTxf
    gridLayout(numColumns: 2)
    label(text: 'From:')
    urlTxf = text() {
        gridData(widthHint: 300)
    }
    label(text: 'To:')
    filenameTxf = text() {
        gridData(widthHint: 300)
    }
    button(text: 'Download') {
        gridData(
            horizontalSpan: 2,
            horizontalAlignment: org.eclipse.swt.layout.GridData.END
        )
        onEvent(type: 'Selection', closure: {
            download(urlTxf.text, filenameTxf.text)
            shell.close()
        })
    }
}
shell.pack()
shell.open()
----

Saturday, February 5, 2011

Groovy URLConnectionBuilder 0.0.2 が出ました

URLConnectionBuilder 0.0.2 をリリースしました。URLConnectionBuilderは初めてという方は先に以前の投稿を見てください。以下が変更点です。


1. パッケージ名の変更
新しいパッケージ名はnet.sourceforge.urlconnbuilderです。


2. プロキシへのより良いサポート
----
URLConnectionBuilder connBuilder = new URLConnectionBuilder()
connBuilder.url('http://groovy.codehaus.org/') {
    connect(proxy: 'http://proxyhost:proxyport') {
        configure(
            // configure URLConnection
        ) 
        communicate(
            input: { conn, stream ->
                println stream.text
            }
        )
    }
}
----


URL版:
----
proxy: new URL('http://proxyhost:proxyport')
----


URI版:
----
proxy: URI.create('socks5://proxyhost:proxyport')
----


3. 認証へのサポート
----
URLConnectionBuilder connBuilder = new URLConnectionBuilder()
connBuilder.url('http://groovy.codehaus.org/') {
    connect(authentication: 'username:password') {
        configure(
            // configure URLConnection
        ) 
        communicate(
            input: { conn, stream ->
                println stream.text
            }
        )
    }
}
----


List版:
----
authentication: [ 'username', 'password' ]
----


Map版:
----
authentication: [ username: 'username', password: 'password' ]
----