SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

BPMとRuby on Rails Scaffoldの連携によるマスタメンテナンスアプリケーションの自動生成

SOAの上位ツールであるBPMとRuby on Railsの連携に関する検討

bpm_migrationの起動方法

 下記のコードにより、クリックされたリンクに対応するファイルを読み込み、bpm_migrationを起動します。

bpm_scaffold_controller.rb
class BpmScaffoldController < ApplicationController
  # (1)
  require "rexml/document"
  include REXML

  def file_list
  end
  
  #-------------------------------------------------------------------
  # xcdl ファイルを解析して、マイグレーションファイルとモデルクラス
  # を生成します。
  #-------------------------------------------------------------------
  def generate
    print "path = #{params[:path]}"
    params[:generation_output] = params[:path] + "\n"
    
    # (2)
    doc = Document.new File.new(params[:path])
    
    klass_name = "initialization"
    # (3) クラス名を取得します

    doc.elements.each("component"){ |component|
      klass_name = component.attributes["name"]
    }
    
    # (4) String型を取得します
    column_hash = Hash.new
    doc.elements.each("component/attributes/String"){ |string_element|
      column_hash[string_element.attributes["position"]] = string_element.attributes["name"] + ":String"
      if string_element.attributes["length"]
        column_hash[string_element.attributes["position"]] += ":" + string_element.attributes["length"]
      end
    }
    
    # (5) Time型を取得します。
    doc.elements.each("component/attributes/Time"){ |time_element|
      column_hash[time_element.attributes["position"]] = time_element.attributes["name"] + ":Time"
    }
    
    # (6) ジェネレータへのaction引数を作成します。
    arg_action = ""
    for i in 1..column_hash.length
      #params[:generation_output] += column_hash[i.to_s].to_s + "\n"
      arg_action += column_hash[i.to_s].to_s + " "
    end
    
    # (7)
    generation_output = `ruby script/generate bpm_migration --skip #{klass_name.downcase} #{arg_action}`
    print generation_output
    params[:generation_output] = "ruby script/generate bpm_migration --skip #{klass_name.downcase} #{arg_action}\n"
    params[:generation_output] += generation_output
    
    render :action=>'result'
  end
  1. Rubyでは、REXMLの機能を利用してXMLファイルの内容を解析することができます。
  2. params[:path]に格納されているファイルの絶対パスを使用して、Document.newにより、XMLファイルを読み込みます。
  3. エレメントにおけるStringエレメントを読み込みます。エレメントでは、アルファベット順に変数が並んでおり、AquaLogic BPM Studioで定義した変数の順番はpositionで表わされています。マイグレーションファイルにおけるテーブルの列名の順番を、変数を定義した設計者の順番にするために、positionをキーとしてcolumn_hashに登録しています。
  4. String型は「名前:String:長さ」の引数としてbpm_migrationに与えます。
  5. エレメントにおけるTimeエレメントを読み込みます。Time型は「名前:Time」の引数としてbpm_migrationに与えます。
  6. bpm_migrationジェネレータに与えるためのaction引数を作成します。
  7. bpm_migrationを起動します。bpm_migrationの起動コードは、例えば下記のように表わされます。
bpm_migrationの起動コードの具体例
./script/generate bpm_migration mst_shain shain_cd:String:10 shain_name:String:20 kaishi_date:Time

bpm_migrationのソースコード

bpm_migrationジェネレータ

 bpm_migrationジェネレータは、下記のコードで表されます。

bpm_migration_generator.rb
class BpmMigrationGenerator < Rails::Generator::NamedBase
  def manifest
    record do |m|
      # (1)
      m.migration_template 'migration.rb', 'db/migrate',
                           :assigns=>{:migrate_columns=>actions}
      
      # (2)
      m.template 'model.rb',
                 File.join('app/models', class_path, "#{file_name}.rb")
    end
  end
end
  1. migration.rbテンプレートを使用して、マイグレーションファイルを生成します。migrate_columns引数にアクション引数を与えます。
  2. model.rbテンプレートを使用して、データアクセスクラスすなわちモデルクラスを生成します。

migrationテンプレート

 migrationテンプレートは、下記のコードで表されます。

migration.rb
class  < ActiveRecord::Migration
  def self.up
    create_table : do |t|
# (1)


# (2)

      t.column :, :string, :limit=>
# (3)

      t.column :, :string
# (4)

      t.column :, :datetime


    end
  end

  def self.down
    drop_table :
  end
end
  1. migrate_columnsからアクション引数を読み込み、それぞれを「:」で分割し、変数の名前やStringなどの型を解析します。
  2. 型がStringでかつ長さがcolumn[2]に格納されているならば、limitに長さを指定した形でt.columnステートメントを生成します。
  3. 型がStringで長さが指定されていない場合、limitを指定しない形で、t.columnステートメントを生成します。
  4. 型がTimeの場合、datetime型のt.columnステートメントを生成します。

マイグレーションの実行

 生成されたマイグレーションファイルを使用して、下記のコマンドによりマイグレーションを実行します。

rakeコマンドの実行
rake db:migrate

ConditionScaffoldによるアプリケーションの自動生成

 図3に示されるようにConditionScaffoldを実行し、図4に示されるようにメンテナンスアプリケーションを自動生成します。ConditionScaffoldの詳細に関しては、記事「Ruby on RailsのScaffoldをカスタマイズして使いやすくする」を参考にして下さい。

図3-ConditionScaffoldの実行
図3-ConditionScaffoldの実行
図4-ConditionScaffoldの実行
図4-ConditionScaffoldの実行

まとめ

 本稿では、AquaLogic BPM StudioのBPM Object変数定義、BPM Scaffold、ConditionScaffoldの順序で連携を行うことにより、BPMで定義した変数に関するマスタメンテナンスアプリケーションを自動生成しました。BPMの記述をRoRなどのアプリケーションへ変換することができれば、設計者とプログラマの連携も取りやすくなるため、生産性も向上すると思います。本稿では、その第一歩として、マスタメンテナンスアプリケーションを自動生成しました。

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
特集記事連載記事一覧

もっと読む

この記事の著者

ryujinseiichi(リュウジンセイイチ)

http://ryujinseiichi.sblo.jp/ RubyやAIRなどの新規技術に興味があり、研究を行っています。 最近、seasar2やBPMの研究も始めました。  

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3190 2008/11/17 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー