フォトアルバム

2009年7月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

なかのひと

アンケート

  • Do you Like?
    アンケート
    どのColdfusion用フレームワークが好き?
    ModelGlue:Unity
    ModelGLue
    Mach-II
    FuseBox
    LiteWire
    OnTap
    ColdBox
    OnAir
    cfWheels
    CFRails

    [PR]アンログ.jp 自動車保険

373news.com

想ひ出

  • Dvc00050
    携帯で撮った写真をアルバムにしています。

サムネイル

  • CF-OOP









  • ganymean.org









  • シナプス

Google Analytics

ColdSpring

cf.objective 2007 サマリ

Coldfusionファンには、生唾ものの情報です。

CF-OOPのまとめをしなきゃと思って、本家メンバーのRSSフィードをチェックしていたら、cf.objectiveのプレゼン概要を、Matt Woodwardが日々google Docs形式でアップしています。ご覧あれ!

 cf.objective 2007 - Jason Delmore KeynoteColdFusion Weekly Flickr Photos
 Mark Mandel - Intro to Transfer ORM
 Hal Helms - Object Modeling
Sean Corfield - AJAX in Scorpio
Adam Lehman - .NET and Exchange Integration with Scorpio 
 CFEclipse Project - Mark Drew
Adam Lehman - Scorpio Server Monitoring and Alerts
 Peter Farrell - Head First Mach-II
 Peter Farrell - What's New in Mach-II 1.5
Jason Delmore - 1337 Scorpio
Sean Corfield - Real World SOA With ColdSpring and Transfer
Ben Forta - Top Secret Scorpio
 Dave Ross - ColdSpring 101
 Maxim Porges - Maximizing Your CF/Flex Applications With Java

 


Mach-IIとColdspringの統合

ModelGlue:UnityとColldspringの統合アプリケーションは希少なので、Mach-IIとColdspringの統合例を探してみました。テンプレート的なものから本格的なものまで以下の3つが大変参考になります。

  1. appbooster(Kurt Wiersma、テンプレート的アプリ)
  2. M2bookstorereactor(Matt Williams、ORM:Reactor使用)
  3. Machblog(Matt Woodward / Peter J. Farrell、本格ブログ)

また、Kurt Wiersmaのプレゼンは、大変わかりやすです。ご参考までにどうぞ!

Coldfusion最新アーキテクチャ

Brian KotekのmgbookstorereactorのUnity版を作成してから、Coldfusionによるアプリケーション設計の最新アーキテクチャを再検証してみました。
FrameworkConference2007におけるプレゼンターからColdspring関連のものを拾い出してみると、以下の記事が目に付きます。

  1. Leveraging ColdSpring To Make Better Applications(Kurt Wiersma)
  2. Designing Framework-Agnostic Models with CFCs(Brian Kotek)
  3. ColdSpring Powered Fusebox Applications(Adam Wayne Lehman)

Kurtのプレゼンは、ModelGlue、Mach-II、Fusebox5などのWebアプリケーション用Framework間でCFCsを共用するためためのサービスアーキテクチャについて言及されています。

 Brianのプレゼンは、ModelGlueとFlexでCFCsを共用するためのアーキテクチャについて、言及されています。

Virtualreprentationofservicelayer_3 Apparchtecture

 

 

 

 

 


 


 



 


これをふまえると、ModelGlue:UnityのCFC設計では、

 

  1. Contoller.cfcでserviceのsetter/getterとビジネスロジックを定義
  2. service.cfcでエンティティ(VO)やDAO、Gatewayへのsetter/getterを定義

     

し、あとはColdspringを使って、各オブジェクトをAutowireしたり、AOPを展開すればよいようです。AOPのサンプルパターンを絵にすると、以下の絵になると思います。

Coldspringaopsample

 

 

MG1.1からMG:Unityへのアップグレード(その1)

ModelGlue:UnityによるCFアプリケーション開発の慣らし運転として、ModelGlue1.1ベースで作成されたサンプルアプリケーションをModelGlue:Unityにアップグレードしてみます。

選定するサンプルアプリケーションは、以前の記事で紹介したBrian Kotekのmgbookstorereactor。DIにColdspringを、ORMにReactorを使用しているので、ModelGlue:Unityへの移行ポイントがつかみやすいと思います。

移行ポイントは、以下の3点になります。

  1. Coldspring.xmlによる依存性注入パラメータの集中管理
  2. ormAdaptorとormServiceによるORM選択(Reactor/Transfer)
  3. 各種コントローラからinit()メソッドの削除

続きを読む "MG1.1からMG:Unityへのアップグレード(その1)" »

CF-OOPのリソースリスト

昨日に続いて、CF-OOPに関する頭の体操をしています。
やはり、参考になるのは、Brian Rinaldi のディレクトリかなあーと思って、ググッてみると、
Objects and Frameworks - the Big Resource List
というタイトルで、CF-OOPマニアにはヨダレが垂れるような記事をわかりやすく整理してくれています。

これを読んで頭慣らしかなあー。

Model-Glue:Unity 最新プレゼンテーション2

4/1に人事異動でカスタマフロント部門の責任者に配置されました。
現場の状況をつぶさに眺めてみると、一人ひとりのスタッフは本当によくがんばっているなあーという印象です。
でも、じっくりとスタッフのワークフローを見ていると、忙しい、時間がない、手作業、記憶・勘頼りと言った状況で、チームリーダしっかり考える余裕もなく、ひたすらワークに専念しています。
彼ら一人ひとりの持っている能力を引き出すことを通じて、会社の業績を向上させるのが、私の仕事。
というわけで、スタッフを拘束している単純作業を開放するための業務支援用WebプログラムをModel-Glue:Unityで作ることにしました。

ひさしぶりのModel-Glue:Unityプログラミングなので、慣らし運転用のチュートリアル教材を再度整理してみることにしました。

まずは、Model-Glue:Unityの開発者Joe Rinehartのビデオチュートリアル
時間は9分弱。
とても早口ですが、Scaffoldingのアウトラインを掴むだけにいいかもしれません。

次に、Steve "Cutter" Bladesのビデオチュートリアル
時間は1時間余り。
これもScaffolding向けのプレゼンです。前述のプレゼンよりはゆったりしているので、時間をかけて確認したい方に向いているかもしれません。

最後に、本家Joeのビデオチュートリアル
時間は1時間程度。
Model-Glue:Unityの全体像を理解するのに良いと思います。

ColdSpring in MG:Unity No.3

ColdSpringの公式ドキュメントのAutoWiringを意訳してみました。
前回紹介したpropertyチャイルドタグ/constructor-argチャイルドタグは、依存性の注入方法を規定していましたが、beanタグのautowire属性はColdSpringが注入先のCFCをどのようにして発見するかを規定していて、autowire属性が指定されていれば、セッターメソッドは不要であることが記述されています。
また、autowiringの設定には、"byName"および"byType"の2つがあるようです。

"autowire"とは、Bean定義用xmlファイルでお互いの依存性を定義せずに、ColdSpringのbeanFactoryが依存する相互のオブジェクトを自動的に結合する能力のことを指します。

ColdSpring beanFactoryの中でCFCsを定義すると、ColdSpringは各CFCのメタデータを点検して、他のCFCにpropertyかconstructor-argで指定するものがあるかどうかを探します。

autowiringはBeanFactory内で、デフォルトで'オフ'にされていますが、'オン'にセットすると(bean全体かbeanの要素毎にセットできます)、ColdSpringは自動的に、依存性の注入(と自動的にオブジェクト結合)を行います。

autowiringの設定には、"byName"および"byType"の2つがあります。

推測できると思いますが、"byName"は、beanのname属性つまりCFC内にsetSomeService(...)メソッドか"SomeService"をコンストラクタ引数に持つCFCとColdSpring.xmlでid="SomeService"がある<bean/>内のCFCを結合し、"SomeService"を該当するCFCにいつでも注入します。

"byType"は、ColdFusionコード内に"type"属性、つまり、セッターメソッドの引数(または、コンストラクタ引数に) type="type.of.SomeService"を使用することによって、ColdSpring.xmlにclass="type.ofSomeService"があるbeanがあれば、そのbeanを該当するCFCにいつでも注入します。

benaタグのエンティティ全体にautowiringをセットするには、default-autowire属性を使用してください:

<beans default-autowire="byName">
    <bean id="cfc1" class="..."/>
    <bean id="cfc2" class="..."/>
...
</beans>

各々のbean(default-autowire設定をオーバライドすることになります)にautowiringをセットするには、autowire属性を使用してください:

<beans>
    <bean id="cfc1" class="..." autowire="byType"/>
    <bean id="cfc2" class="..."/>
    <bean id="cfc3" class="..." autowire="byName"/>
...
</beans>

ColdSpring in MG:Unity No.2

前回に引き続き、Nandoのブログを紹介してみます。
Nando曰く、ModelGlue:UnityでColdSpringについて学ぶべきことは、最低3つとのことです。

最初に専念したほうがよいことは、Bean FactoryリファレンスのうちのBeanタグ属性Beanチャイルドタグチャイルドタグのconstructor-argとpropertyの3セクションです。

これらを理解すると、ModelGlueでColdSpingを使いこなすことができると思います。

なお、個人的には、Bean FactoryリファレンスAutoWiringDeveloping w/ColdSpringService Layers and ColdSpringも一読したほうがよいと思います。

beanのチャイルドタグであるpropertyタグとconstructor-argタグについて、Nandoは次のように解説しています。

1.propertyタグ

constructor-argと全く同様です。しかしながら、この場合、ColdSpringはname属性で特定されるセッターメソッドへの引数として何らかの単純変数かオブジェクトをBeanに渡します。

したがって、CFCには、propertyタグのname属性に合致するセッターメソッド名がなければなりません(例えば、propertyが"foo"なら、CFCはsetFoo()メソッドを必要とします)。

2.constructor-argタグ

constructor-argタグは、(CFCがinit()メソッドを通して)CFCが初期化されるときに、name属性で指定された引数を渡すことによって単純変数かオブジェクトへの参照をbeanに対して提供することを、Coldspringにもたらします。

以上の2つのチャイルドタグを使って、あるファクトリクラスの初期化の際にパラメータを注入する方法が、次のように紹介されています。

◆bean.xml
<!-- "samasati.model.appFactory"クラスを"appFactory"として定義 -->
<bean id="appFactory" class="samasati.model.AppFactory">
   <!-- appFactory.init()に対して、appConfigを引数として渡す -->
   <constructor-arg name="appConfig">
      <!-- AppConfigビーンを参照 -->
      <ref bean="AppConfig" />
   </constructor-arg>
</bean>

<!-- "ModelGlue.Bean.CommonBeans.SimpleConfig"クラスの"AppConfig"として定義 -->
<bean id="AppConfig" class="ModelGlue.Bean.CommonBeans.SimpleConfig">
   <!-- Bean"AppConfig"の引数の実体は、property"config" -->
   <property name="config">
      <map>
         <entry key="dsn"><value>samasati</value></entry>
         <entry key="imagePath"><value>images/</value></entry>
      </map>
   </property>
</bean>


◆someContoroller.cfc
<cffunction name="init" access="public" output="false">
   <cfargument name="appConfig" required="true">
   <!--- Instansiated by setAppConfig Method passed through arguments.appConfig --->
   <cfset setAppConfig(arguments.appConfig) />
</cffunction>

<!--- autowire setters and getters for bean id:AppConfig --->
<cffunction name="setAppConfig" access="public" returntype="void" output="false">
   <cfargument name="appConfig" required="true">
   <cfset variables.appConfig = arguments.appConfig />
</cffunction>
   
<cffunction name="getAppConfig" access="private" output="false">
   <cfreturn variables.appConfig />
</cffunction>
   
<!--- autowire setters and getters for bean id:AppFactory --->
<cffunction name="setAppFactory" access="public" returntype="void" output="false">
   <cfargument name="appFactory" required="true">
   <cfset variables.appFactory = arguments.appFactory />
</cffunction>

<cffunction name="getAppFactory" access="private" output="false">
   <cfreturn variables.appFactory />
</cffunction>

ColdSpring in MG:Unity

ModelGlue:Unityを使って本格的なアプリケーションを考えようと、過去の記事やModelGlue、ColdSpring、Reactorの公式サイトのドキュメントを眺めていました。

そんなところに、Sean CorfieldがNandoのブログを紹介しているのが目に留まりました。
彼は、ModelGlueやColdSpringのメーリングリストにおいて、NewBie的なアプローチから大きな貢献をしているので、彼の書く記事は私と同じ目線、つまり独学でColdFusionやオブジェクト指向(OO)を学んでいるため、非常に共感できるものがあります。

彼の記念すべき第一回目の記事は、The Mystery of AutoWiring in Model-Glue Unity
つまり、ModelGlue:UnityにおけるAutoWiringに関するものです。

AutoWiringは、ColdSpringの公式ドキュメントにおいて、以下のように定義されています。

"autowire"は、Bean定義用xmlファイルでお互いの依存性を定義せずに、ColdSpringのbeanFactoryが依存する相互のオブジェクトを自動的に結合する能力のことを指します。

このことをNandoも、最初のころはなんのこっちゃ全然わからんかったと言っています。

MGを学ぼうとする人々を困らせるように思えるものの1つは、autowiring機能です。

多くの人々が、ドキュメンテーションでまだそれほど明確に説明していないので、それが存在するのを知ってさえいないかもしれません。

autowiringを使いこなすには、ColdSpringを少しいじくる必要があります。

ColdSpringがColdFusionと異なった名称を使うので、最初は外国に行ったみたいな感覚になります。

ColdSpringでは、CFCをBean、structをmap、arrayをlist などと呼びます。

しかし、あなたがいったん使用される用語を翻訳して、少しそのやり方に慣れると、突然として、とても簡単に使用することができるようになります。

そして、Nando曰く、ModelGlue:UnityにおけるAutoWiringとは、次のようなことであると・・・

簡単に言うと、AutoWiringは、ColdSpringを使用してModelGlueのコントローラに記述されたCFCに初期化パラメータを注入する非常に便利な方法です。

そのことを、EmailServiceを例にとって、以下のように説明しています。

アプリケーション規模が大きくなると、おそらくModelGlueコントローラ内でサービスレイヤのCFCを初期化する必要が生じるでしょう。

そして、おそらくアプリケーションを論理的な単位に分割するため、複数のコントローラを使用し始めるでしょう。

そうなると、例えば、EmailService自身を初期化する代わりに、EmailServiceを必要とする各々のコントローラのinit()メソッドで、ColdSpringが作成するEmailServiceのインスタンスに初期化パラメータを注入する際に、AutoWiringを使えばいいのです。

うーん、こういう風に説明されると、とてもしっくりと頭に入ります。

以前の記事で紹介したように、第三世代のMVCフレームワーク、即ちModel層における単調なコードの繰り返し記述を回避するため、Modelをビジネスロジック、サービス、パーシスタントという複数レイヤに分割することを支援してくれるんだなーという実感です。

MG:Unity カスタムコンフィグレーションの追加方法

今日から数回に分けて、Model-Glue:Unity(MG2:Unity)のマニュアルのうち、Ver1.1から大きく変更・追加されたところを紹介していきます。

第一回目は、ColdSpring.xmlを利用したカスタムコンフィグレーション方法についてです。
(原文タイトル:How To Add Custom Configuration)
メールサーバの情報を、Coldspring.xmlにbean定義し、メッセージリスナー内でこれを呼び出す方法を紹介しています。

アプリケーションでは、しばしばデータソース名かメールサーバなどの何らかの構成情報を知る必要があります。 例として、アプリケーションで<cfmail>タグを使用する必要があり、ファイル中にサーバ名、ユーザ名およびパスワードを、ソースコードの外部に保存する場合を仮定しましょう。このことは、とても良い習慣です。

(1.xからのアップグレードでない)どのModel-Glue: Unityアプリケーションには、全てのアプリケーション構成情報を集中管理するためのColdSpring.xmlがあります。

このColdsping.xmlファイルは、数組の<bean>タグで構成されています。 各々のbeanは、Model-Glueアプリケーション内で問い合わせ可能なCFCを表しています。

Model-Glue:Unityには、一般的な構成の雑事に適したbean(ModelGlue.Bean.CommonBeans.SimpleConfig)があります。そのbeanは、setConfig()ファンクションを通して構造体をセット可能な単一プロパティ(のコンフィグ)を持っています。 この構造は、アプリケーション構成情報を「登録」するのに役立ちます。beanのgetConfigSetting()ファンクションに検索するプロパティ名を与えることによって、各々の設定値にアクセスできます。

これをメールサーバのシナリオに適用するために、ColdSpring.xmlに以下を加えます:

<bean id="mailConfiguration" class="ModelGlue.Bean.CommonBeans.SimpleConfig">
    <property name="config">
        <!-- In Coldspring, a "map" represents a struct -->
        <map>
            <entry key="mailserver">
                <value>mail.mydomain.com</value>
            </entry>
            <entry key="username">
                <value>smtpUsername</value>
            </entry>
            <entry key="password">
                <value>smtpPassword</value>
            </entry>
        </map>
    </property>
</bean>

このXMLベースの構成情報をColdSpring.xmlに追加した後に、この構成設定を使用するのは簡単です。以下に、<cfmail>タグで構成設定を使用する例のリスナー機能を示します:

<cffunction name="sendEmail" access="public" returnType="void" output="false">
    <cfargument name="event" type="any">

    <cfset var message = arguments.event.getValue("message") />
    <cfset var subj = arguments.event.getValue("subj") />
    <cfset var to = arguments.event.getValue("to") />

    <!--- Get mail configuration --->
    <cfset var mailCfg = getModelGlue().getBean("mailConfiguration") />

    <!--- Use the mail configuration to send mail --->

    <cfmail
        to="#to#"
        subject="#subject#"
        server="#mailCfg.getConfigSetting("mailserver")#"
        username="#mailCfg.getConfigSetting("username")#"
        password="#mailCfg.getConfigSetting("password")#"
        >
        #message#
    </cfmail>

</cffunction>

ColdSpring 1.0リリース!

ColdSpringの1.0がリリースされました。
ドキュメントもRoboHelpバージョンでライブドキュメントになっています。
Model-Glue:UnityでBeanFactory機能は体感しているものの、AOPやサービスマネージメントを積極的に試していきたいものです。

Model-Glue:Unityサンプルアプリ

早速、Sean Corfieldが彼のブログでModel-Glue:Unity対応のサンプルアプリケーションggcc11をアップした。
このサンプルアプリケーションは、彼がFuseBox、Mach-II、Model-Glue、ColdSpring、TartanなどColdfusion向けFramework Sample Code、ggccシリーズの最新版です。
Model-Glue:Unityによって、

プレゼンテーション層:ModelGlue:Unity
コントローラー:ModelGlue:Unity(ビジネスロジック)
サービス層:ColdSpring
ORM層:Reactor

と各々のフレームワークが相当の機能を分担したため、今回Sean自身が書いたものは、プレゼンテーション層であるviewと、ビジネスロジック層のcontroller.cfcだけになっています。
私のホスティング環境では、エラーが発生しています。Reactor関連のパーミッションかもしれません。



Model-Glue:Unityの新機能

Joe RinehartがAdobe's Developers Weekで実施したModel-Glue:Unityのプレゼン内容を、Brian Rinaldiが彼のブログで紹介しています。

彼のプレゼンは、まだAdobeサイトにアップされていないので、Brian RinaldのブログからModel-Glue:Unityの新機能を読み取ってみます。

1.Model-Glue1.1との完全下位互換

  • Model-Glue1.1は、第二世代のフレームワークである。

即ち、MVCアーキテクチャを使って、プレゼンテーションからモデル層を分離することがその目的であった。
しかしながら、beans/Records、DAOs、Gatewaysなどの共通タスクを取り扱う繰り返しのコードを生むことになった。

  • Model-Glue:Unityは、第三世代のフレームワークである。

モデル層における単調な繰り返しコード生成作業を自動化する。

2.他のフレームワークとの統合

  • 第三世代フレームワーク化推進のため、他のフレームワークとの統合を図った。

ColdSpring
サードバーティサービスの統合と依存性の注入(DI/IoC)をの実現。
依存性の注入は、Model-GlueとReactorのコンフィグ情報をColdSpring.xmlに記述することで実現。
Reactor
ORMの自動化に、Reactorを採用。
ModelGlue自身が実装したData Controllerを使って、イベントハンドラー内の<message>タグでGDMと呼ぶメッセージを記述して、DAOやGatewayを呼び出す。

  • ModelGLue.GenericList(Gateway)
  • ModelGLue.GenericRead(Read)
  • ModelGLue.GenericCommit(Create&Update)
  • ModelGLue.GenericDelete(Delete)

ORM用フレームワークには、Reactor以外も利用可能であるが、自分自身でcustom adapter, DataController, 及びscaffold .XSL を作成する必要がある。

     

3.Scaffolding

  • XSLによるカスタマイズ可能なHTMLの "scaffolds(足場)"を実現。
  • ModelGlue.xml内の<event-handlers>タグ内に<scaffold>タグを定義すれば良い。
  • <Scaffold>タグにより、5つのイベントを作成可能。
    • マスターリストの表示(table.list)
    • レコードデータとリレーションデータの修正フォームの表示(table.edit)
    • レコードデータの読み出し専用ビューの表示(table.view)
    • レコードデータの更新(table.commit)
    • レコードデータの削除(table.delete)
  • <Scaffold>タグ内には、<Broadcasts>、<Results>、<Views>タグを記述可能。
  • <Scaffold>タグの属性に、typeを指定することで、作成するイベントハンドラータイプを指定可能。

4.レコードデータのAutoValidation

  • GDMのGeneric.Commitで、<arguments>タグにname="validationName"を指定することにより、自動的にValidateを実行できます。(より複雑なValidateのカスタマイズは、Reactorが自動生成するDAOオブジェクトを拡張する必要がありますが・・・)

最後に、Joe Rinehartのビデオデモも参考になるので、一読をお勧めします。

MachBlog

Matt WoodwardとPeter J.Farrellが、Mach-IIとColdSpringを使ったMachBlogを立ち上げているようです。
URLは、その名のとおり、

http://www.machblog.org/

です。興味ある方は、コンタクトしてみてください。

CF-Unitedでの発表

[ColdSpring-Dev]のメーリングリストで、Sean A Corfieldが予告した。
6月下旬のCF-Unitedで、ModelGlue、ColdSpring、Reactor、そしてFuseBoxが商用利用可能なオープンソースとして公開されるらしい。
非常に楽しみだ。自社の開発に持ち込むか、このまま趣味の世界で続けるか悩むなあ・・・

MG/CS/Reactor連携アプリケーション例

Brian Kotekが、ModelGlue-ColdSpring-Reactor連携のブックストアアプリケーションを
彼のブログにアップしています。
早速、私のサイトにインストールしてみました。
(彼は、Windowsマシンで開発しているらしく、View関連のフォルダ名とファイル名は一部変更が必要です)

1.ColdSpringによるModelGlue用BeanFactoryLoaderとAutowiring用コントローラー
2.ColdSpringによるReactorオブジェクトのファクトリー機能
を活用して、Model内がビジネスロジック層、サービス層、パーシスタント層にきれいに構造化されています。

次回は、その概要を紹介してみます。

また、Mach-II-ColdSpring-Reactor連携モデルも彼のブログにアップされています。

フレームワーク連携

以前、ModelGlue+ColdSpring+reactorによるフレームワークの連携が
今後の主流になるかもしれないと予想しましたが、その後、
1.reactorの機能強化
2.ColdSpringによる外部Factory呼び出しの実装
3.ModelGlueにおけるAutowiringControllerの実装
を経て、それが現実的になろうとしています。

Seanの最近の記事には、彼のフレームワークサンプルggccのバリアント、
ModelGlue+ColdSpring+reactorに対応させるためのColdSpringとreactorの
連携が紹介されています。以下は、その関連記事です。

Model-Glue, ColdSpring and Reactor
Model-Glue, ColdSpring and Reactor - follow-up
Model-Glue, ColdSpring and Reactor - another follow-up

Sean曰く、bean.cfc、DAO.cfc、Gateway.cfcなど12のCFCsが不要に
なったとのことです。Seanのggcc10アプリケーションアップをアップを
楽しみにして待っていよう。

AjaxCFC

昨年、CFAjaxを見て、フレームワークとの整合性が悪いなあーと思っていたら、
CFCベースのAjaxフレームワークが出てきました。
Rob Gondaのブログに行くと、ModelGlueとの連携も紹介してくれています。
Robさん、サンキュ!
これで、GoogleMapsとのマッシュアップが簡単に出来そう!

ajaxCFC for Model-Glue Explained

Ajax.cfcは、ModelGlueで利用可能な汎用modelです。したがって、コントローラで利用可能です。コントローラ内のinitファンクションで初期化し、コントローラ内のvariablesスコープに常駐させます。

<cffunction name="Init" access="Public" returnType="controller" output="false" hint="I build a new SampleController">
  <cfargument name="ModelGlue">
 
  <cfscript>
      super.Init(arguments.ModelGlue);
    variables.echo = createObject("component", "blog.projects.ajaxcfc.examples.modelgluesamples.echo.model.echo");
    variables.ajax = createObject("component", "blog.projects.ajaxcfc.examples.modelgluesamples.echo.model.ajax");
  </cfscript>
  <cfreturn this />
</cffunction>

Ajaxのリモートリクエストは、標準的なWebリクエストと同じく、以下のようにフローします。 

  1. ページがAJAXリクエストを発生させる。
  2. ModelGlueフレームワークによって、イベントが捕捉される。
  3. ModelGlueのイベントハンドラーがメッセージをブロードキャストする。
  4. コントローラでメッセージをピックアップする。
  5. AjaxCFCを使い、onRequestStart内で、メッセージをパースする。
  6. イベントに応じて他のmodelを利用し、レスポンスデータを作成する。
  7. 再度AjaxCFCを使い、レスポンスに備える。
  8. 'ajaxResponse'にレスポンス値をセットし、viewに渡す。
  9. modelGlue.xmlで、レスポンスを運びJavaScriptのコールバックファンクションに返すviewとしてのajaxResponse.cfmを含める。

ModelGlue+AjaxCFC+ColdspringでGoogleMapsとの連携版を作ってみよう!

ModelGlue+TarTan or ColdSpring(その2)

前回、紹介した資料の最終ページにあるとおり、
Sean CorfieldのColdfusionフレームワーク用サンプルアプリケーションGGCCでファイル数を比較してみると、ModelGlue+ColdSpringのModelGlue+Tartanに対する優位性がはっきりわかります。

  1. ggcc7 : ModelGlue                       17Files (Corrected at Nov 17, 2005 By suggest Sean Corfield)
  2. ggcc8 : ModelGlue+Tartan            27Files
  3. ggcc9 : ModelGlue+ColdSpring      21Files

Tartanは、サービスコントローラがあり、コマンドcfcを介して、VO/DAO/Gateway/Exceptionなどのモデルcfcにアクセスするため、サービスコントローラやCommandファイルの分だけファイル構成が複雑になります。
したがって、ModelGlueのフットワークの軽さにフィットするのは、ColdSpringになるのかもしれません。

ModelGlue+TarTan or ColdSpring

ColdSpringに触れてから、ModelGlue+ColdSpringの組合せを研究してきたけど、
ここらで一旦

  1. ModelGlue+Tartan
  2. ModelGlue+ColdSpring

の違いについて整理してみる。

  • Tartan
    • サービスフレームワーク
    • コマンドドリブンベース
    • IoC機能(DI機能)
    • サービスレイヤ機能
      • Service, VO, DAO, Gateway, Utility, Exception
  • ColdSpring
    • MVCフレームワークのサポート
    • AOP機能
    • IoC機能(DI機能)
    • サービスレイヤ支援機能(Bean化)
      • Service, VO, DAO, Gateway, Utility, Exception

各々の特徴と概観を資料 にまとめてみました。ご参考までに 。

LoggingAOP with ColdSpring

今日は、ColdSpringAOPとLog4jを使ったロギングサービスについて、解説します。
Chris ScottのColdSpringAOPのチュートリアルから引用してみます。

1.最初に、LoggingServiceを定義します。javaのlog4jからloggerクラスを生成しています。

<cfcomponent name="LoggingService" output="false">

  <cffunction name="init" returntype="net.klondike.service.LoggingService" access="public" output="false">
    <cfset var category = CreateObject("java", "org.apache.log4j.Category") />
    <cfset variables.logger = category.getInstance('net.klondike') />

    <cfreturn this />
  </cffunction>
 
  <cffunction name="info" access="public" returntype="void" output="false">
    <cfargument name=message" type="string" required="true" />
    <cfif variables.logger.isInfoEnabled()>
    <cfset variables.logger.info(arguments.message) />
    </cfif>

  </cffunction>
 
</cfcomponent>

2.次に、AOPパートです。loggingBeforeAdviceを定義します。

<cfcomponent name="loggingBeforeAdvice" extends="coldspring.aop.BeforeAdvice">

  <!--- setters for dependencies --->
  <cffunction name="setLoggingService" returntype="void" access="public""false" hint="Dependency: security service"> output=
    <cfargument name="loggingService" type="net.klondike.service.LoggingService" required="true"/>
    <cfset variables.m_loggingService = arguments.loggingService />
  </cffunction>
<cffunction name="getLoggingService" returntype="net.klondike.service.LoggingService""public" output="false" hint="Dependency: security service"> access=
    <cfreturn variables.m_loggingService />
  </cffunction>
 
  <!--- before() is called by the aop framework before method invocation --->
  <cffunction name="before" access="public" returntype="any">
    <cfargument name="method" type="coldspring.aop.Method" required="true" />
    <cfargument name="args" type="struct" required="true" />
    <cfargument name="target" type="any" required="true" />
   
    <cfset var arg = '' />
    <cfset var argString = '' />
    <cfset var objName = getMetadata(arguments.target).name />
    <cfloop collection="#args#" item="arg">
      <cfif isSimpleValue(args[arg])>
        <cfif len(argString)>
          <cfset argString = argString & ', ' />
        </cfif>
        <cfset argString = argString & arg & '=' & args[arg] >
      </cfif>
    </cfloop>
        <cfset variables.m_loggingService.info("[" & objName & "] " & method.getMethodName() & "(" & argString & ") called!") />
      </cffunction>
  </cfcomponent>

3.最後に、ColdSpringのbean定義を行います。

<beans>
 
  <!—define the logging service -->
  <bean id="loggingService"
        class="net.klondike.component.LoggingService" />

 
  <!--define the loggingBeforeAdvice and set its logging service property to reference the bean above -->
  <bean id="loggingBeforeAdvice"
        class="net.klondike.aspects.loggingBeforeAdvice">

    <property name="loggingService">
      <ref bean="loggingService" />
    </property>
  </bean>
 
  <!—now define a NamedMethodPointcutAdvisor, set the advice property to the bean above, and set its mappedNames property to ‘*’ which will create a pointcut to match all methods excluding any init method -->
  <bean id="loggingAdvisor"
        class="coldspring.aop.support.NamedMethodPointcutAdvisor">

    <property name="advice">
      <ref bean="loggingBeforeAdvice" />
    </property>
    <property name="mappedNames">
      <value>*</value>
    </property>
  </bean>
 
  <!-- to create the proxy object, first create our dao as the target object -->
  <bean id="catalogDaoTarget"
        class="net.klondike.component.catalogDAO">
    <property name="dsn">
      <value>klondike</value>
    </property>
  </bean>
 
  <!-- now create a ProxyFactoryBean with the id catalogDAO, set the target to the catalogDaoTarget bean above, and give it ,the id of the NamedMethodPointcutAdvisor above in the list of interceptorNames -->
  <bean id="catalogDAO"
        class="coldspring.aop.framework.ProxyFactoryBean">
    <property name="target">
      <ref bean="catalogDaoTarget" />
    </property>
    <property name="interceptorNames">
      <list>
        <value>loggingAdvisor</value>
      </list>
    </property>
  </bean>

 
  <!--now to use the proxy DAO, we give the id of the ProxyFactoryBean to the catalog service as the reference for the property catalogDAO -->
  <bean id="catalogService"
        class="net.klondike.component.CatalogService">
    <property name="catalogDAO">
      <ref bean="catalogDAO" />
    </property>
  </bean>

</beans>

ColdSpring Ver0.5

ColdSpringのMLで次期バージョンの内容がDave Rossからアナウンスされた。

次期バーションは0.5、12/15リリース予定

1.Hierarchical BeanFactory(階層化BeanFactory)
 親bean
  子bean(オーバライド可能)
 Mach-IIは、plugin動作の検証済み
 ModelGlueは、開発中(見送りもあり?)
2.Remoting helper classes
 Flash Remoting対応(to do mapping of CFC types to AS types)
3.ModelGlue controller autowiring by Sean
4.Mach-II controller (listener/filter/plugin) autowiring
5.コアBeanFactory機能のバグフィックス&アップグレード
6.AOP機能ののバグフィックス&アップグレード
7.factory-bean/factory-methodの属性サポート
8.AfterThrowing advice(例外処理後のAdvice)
9.bean生成における例外処理の強化

			

ColdSpringAOP Sample

SeanのModelGlue+ColdSpringサンプルアプリケーションGGCC9における
ColdSpringのAOP機能をチェックしてみます。

ggcc.xmlを眺めてみると・・・task関連処理におけるセキュリティチェックに
AOP機能を適用しているようです。

Target:
 taskDAOTarget(class->ggcc9.model.taskDAO)
 taskGatewayTarget(class->ggcc9.model.taskGateway)
Advice:
 checkIdentity(class->ggcc9.aspects.checkIdentity)
Advisor:
 securityAdvisor(Advice->checkIdentity MappedNames->*)
Service:
 taskDAO:Target->taskDAOTarget  InterCepternames->securityAdvisor
 taskGateway:Target->taskGatewayTarget  InterCepternames->securityAdvisor

このことによって、event-handlerの定義からセキュリティチェックの前処理がなくなって
います。
ggcc9->ModelGlue.xml->event-handler:showManager

        <event-handler name="ggcc.showmanager">
            <broadcasts>
                    <--
                    <message name="checkIdentity"/>        <--- AOP化したことにより、コメント化
                    -->
                <message name="needMembers"/>
                <message name="needMembersByID"/>
                <message name="needTasks"/>
                <message name="needStatii"/>
                <message name="needStatiiByID"/>
            </broadcasts>
            <views>
                <include template="dspShowTaskList.cfm" name="content">
                    <value name="XFA.AddTask" value="ggcc.newtask"/>
                    <value name="XFA.ChangeIdentity" value="ggcc.identify"/>
                    <value name="XFA.TaskDetail" value="ggcc.showtask"/>
                </include>
                <include template="layGGCC.cfm" name="final"/>
            </views>
        </event-handler>

また、DAOとGatewayをビーン化したことにより、コントローラーtaskManager.cfcの
内部が非常にシンプルになっています。

■GGCC7->taskManager.cfc->saveTask

    <cffunction name="saveTask" returntype="ModelGlue.Core.Event" access="public" output="false">
        <cfargument name="event" type="ModelGlue.Core.Event" required="true"/>
        <cfset var taskID = arguments.event.getValue("taskID") />
        <cfset var ownerID = arguments.event.getValue("ownerID") />
        <cfset var statusID = arguments.event.getValue("statusID") />
        <cfquery datasource="#variables.dsn#" username="#variables.dbUser#" password="#variables.dbPass#">
            UPDATE ggcctask
            SET ownerID = <cfqueryparam value="#ownerID#" cfsqltype="cf_sql_varchar"/>,
                statusID = <cfqueryparam value="#statusID#" cfsqltype="cf_sql_varchar"/>,
                lastUpdated = <cfqueryparam value="#now()#" cfsqltype="cf_sql_date"/>
            WHERE taskID = <cfqueryparam value="#taskID#" cfsqltype="cf_sql_varchar"/>
        </cfquery>
        <cfreturn arguments.event />
    </cffunction>

■GGCC9->taskManager.cfc->saveTask

    <cffunction name="saveTask" returntype="ModelGlue.Core.Event" access="public" output="false">
        <cfargument name="event" type="ModelGlue.Core.Event" required="true"/>

        <cfset var task = createObject("component","ggcc9.beans.taskBean").init(argumentCollection=arguments.event.getAllValues()) />
        <cfset variables.taskDAO.update(task) />

        <cfreturn arguments.event />

    </cffunction>

次回は、Javaのlog4Jをロギングに使う場合のサンプルについて解説します。


ColdSpringAOP

ColdSpringsの 正式サイトがオープンしました。

SpikeのCFCDOCによるColdSpringのコード参照機能、
Raymond CamdenのGalleonによるフォーラム機能、
Daemonの FarcryによるCMS機能を使っているようです。
ColdfusionMX用フリーソフトを使ってここまでできるんですねえー。

  • The code (that helps)
  • Docs (those help too)
  • Forums powered by Ray's Galleon
  • API Docs powered by Spikes CFCDoc
  • And of course the whole site is powered by Daemon's Farcry.

ModelGlue+ColdSpringAOP

Model-Glue + ColdSpringAOP連携アプリケーション ggcc9
じっくりながめてみた。
Model-Glue + tartan連携アプリケーション ggcc8 と比べてみると
ColdSpringAOPのAOP機能ではなく、bean(VO)機能によって
ずいぶんシンプルコードがシンプルになったなーという印象。
 


続きを読む "ModelGlue+ColdSpringAOP" »

Spring

Springの概要を以下のサイトを参照しながら、まとめてみた。
もともとはJava/J2EEアプリケーション用に開発されたフレームフレームなので、
非常にシンプルな考えに基づいている。

概要とキーワードは以下のとおりだろうか・・・

Java / J2EE アプリケーション用フレームワーク(オープンソース)

MVC フレームワーク
JDBC抽象化フレームワーク
既存フレームワークの利活用
トランザクション管理
AOP (アスペクト指向プログラミング)

すべての層をカバー

プレゼンテーション層、ビジネス層、パーシスタント層

IoC ( Inversion of Control )コンテナ

コンテナ上でコンポーネントを管理するための技術
XML で記述された Bean 定義ファイルを使用
オブジェクトの生成、オブジェクト同士の関連を生成
既存フレームワークへの統合アクセスを実現

Struts
Hibernate
WebWork
JDO

以下のサイトが参考になります。
Spring-Java/J2EEアプリケーションフレームワークリファレンスドキュメント

徹底解剖! Spring Framework の実力を探る

 

o

ColdSpringAOP & ModelGlue

ModelGlue+Tartanで当面はアプリケーションを作っていこうと思っていたら、
今月、Dave Ross & Chirs ScottによるColdSpringAOP0.2.1がリリースされ、ModelGlueとの連携も
あっという間に、Seanが作り上げてしまった。

しばらく、ColdSpringAOP関連を追っかけて、
Model-Glueとの連携についても整理したので、まとめておきます。

ColdSpringAOPのまとめ ColdSpringAOP.txtをダウンロード
Model-Glue + ColdSpringAOP連携アプリケーション ggcc9

次回から数回にわたって、ColdSpringAOPの解説してみます。

ログイン

  • コントロールパネルへのログイン
    アカウント:

    パスワード:

PR情報

  • [[PR]]
  • おすすめバナー

更新ブログ

google Search

  • Google
    blog.ganymean.org
    WWW

最近のトラックバック

Google

SHINOBI

Blog powered by TypePad
Member since 04/2005