Uncategorized

VSTO の新機能 : SharePoint ワークフローの作成と配置の自動化

【環境】
Microsoft Office 2007 Enterprise
Visual Studio Codename Orcas (Beta 1)
Microsoft Office SharePoint Server 2007 (または WSS 3.0)

Orcas  でみる VSTO の新機能

  1. リボンのデザインサポート
  2. Word コンテントコントロールのデータバインド
  3. ClickOnce
  4. Outlook フォーム リージョン (ここから Beta 1 を使っています、、、)
  5. VBA との相互運用
  6. SharePoint ワークフローの作成と配置の自動化

こんにちは。今回で、このシリーズは最後とします。

今回は、VSTO の機能群として、唯一、サーバ開発テクノロジーとして追加されたワークフローの作成についてです。

従来、ECM StarterKit などの形で SharePoint のワークフロー開発は可能でしたが、その設定はとても容易なものとは言えない状況でした。SharePoint におけるワークフロー作成を難しくしている1つの理由として、Web パーツの開発などでも同様ですが、ただ dll を作成して呼び出すという形式をとらず、SharePoint 上の設定でアクティベイト (Activate) や
関連付けなどをおこなえるように、いったん SharePoint 上の機能 (フィーチャーと呼ばれるもの) として登録をしておく必要があるという点でした。(Web パーツやリスト/リストイベントの開発などについては、「Windows SharePoint Services 3.0 Tools: Visual Studio 2005 Extensions」というツールがこの煩わしさを解決してくれています。)

従来は、通常の WF 開発のスタイルに加え、登録用に feature.xml や workflow.xml の編集、さらにはこうした編集のためにあらかじめ署名してキーを取得しておく、などなど、数多くの手間がありました。Orcas の SharePoint ワークフロー作成では、こうした点がすべて自動化されます。
内部の基本的な仕組みは変わっていないので (feature.xml や workflow.xml も自動生成されます)、今まで作成したワークフローが使えなくなるというものではありません。ですから、この新機能によって今まで作っていたワークフローが無駄になるというものではありません。(配置の内部的な方法や動きは変わっていません。) 以下の例をみて頂くとわかりますが、面倒であった一連の処理が自動化されるというものになります。

では、さっそくサンプルを使ってみてみましょう。

  1. [Visual C#] – [Office] – [2007] で、[SharePoint Sequential Workflow] プロジェクトを新規作成します。
  2. この際、ウィザードが表示されます。
    まず、ワークフローの名前と SharePoint Web URL を聞かれますので、設定しましょう。
  3. つぎに、以下の通り、関連付けるリストを聞かれますので、既存のドキュメントライブラリなどに関連付けしておきましょう。
  4. さらに起動方法を聞かれます。
    SharePoint のサイトの設定画面で設定しなくても、ここで、アイテムが追加されたら同時にワークフローを起動するなどの設定をおこなえます。(これらの設定は、後から、プロジェクトのプロパティとして編集することができます。)
  5. これで作成完了です。
    つぎに、プロジェクトが表示され、ワークフローのデザイナーが表示されますが、まだ Beta 版で未完成のため、ツールボックスには、SharePoint 用のアクティビティが表示されていません。ツールボックス上で [Choose Items] を選択して、Microsoft.Sharepoint.WorkflowActions のすべてのアイテムにチェックを付け、SharePoint 用のアイテムを取り込んでおいてください。
  6. では、ワークフローを新規作成します。
    今回は、以下のような簡単なワークフローを作成してみましょう。

    ワークフロー作成を経験されている方には説明は要らないと思いますが (作成経験のある方は読み飛ばしてください)、念のためこのフローの意味を説明しておくと、CreateTask アクティビティは、内部で SharePoint 上の
    タスクを作成してくれます。
    OnTaskChanged アクティビティは、SharePoint 上でタスクを更新すると呼び出されるアクティビティです。
    無論、通常の Windows Workflow Foundation のアクティビティや、カスタムで作成したアクティビティと組み合わせて処理することも可能です。例えば、コードアクティビティやカスタムアクティビティで Microsoft.SharePoint.dll のクラスを使ってドキュメントを登録するなど SharePoint 関連のさまざまな処理を実行したり、Policy アクティビティを使ってルールベースの検証機能を組み込んだり、補正トランザクションアクティビティを使って long-running の補正トランザクションを実装したり、などなど自由自在です。
    但し、ワークフローは SharePoint の SQL Server に保存されますので SharePoint のワークフローやアクティビティは SharePoint のプロセスをホストとして起動される想定で作成されていますので (記述が不正確であるため修正しました: 作成したワークフローのライブラリについては今まで通り GAC に登録されます。2007/06/04 )、WebServiceInput / WebServiceOutput などを使った Web サービスとしてのラッピングなどはできないので注意しましょう。

  7. デザイナーで赤いマークがついている箇所はプロパティの設定などが足りていない箇所です。以下のプロパティを設定してください。(この辺りの内容は、やはりワークフローを作り慣れている方は読み飛ばしてください。特に変わったことはしていません。)
    • [createTask1]
      • Correlation Token
        CreateTask、OnTaskChanged などが複数挿入された場合に、どれがどのタスクに相当するか対応をとるための変数です。
        今回は、「taskToken」という文字列を新規に入れておき、OwnerActivity を「Workflow1」としておいてください。(Workflow1 の中に変数が新規作成されます。)
      • TaskId
        タスクを識別する Guid を指定します。
        まずはその入れ物を作るため、[…] をクリックし、新しいプロパティとして「taskId」というものを作っておきましょう。(後でコードから設定します。)
      • TaskProperties
        ユーザが SharePoint 上で入力した値を含め、この SharePoint タスクのさまざまな属性が入る入れ物です。
        その入れ物を作るため、[…] をクリックし、新しいプロパティとして「taskProperties」というものを作っておきましょう。
    • [onTaskChanged1]
      • Correlation Token
        さきほど作成した「taskToken」を選択してください。
      • TaskId
        さきほど作成した「taskId」を選択してください。
      • AfterProprties
        ユーザがタスク画面で更新した後のタスク情報が入る入れ物です。
        その入れ物を作るため、[…] をクリックし、新しいプロパティとして「afterTaskProperties」というものを作っておきましょう。
  8. ロジックを組み込むために、以下のハンドラを作成していきましょう。
    • [createTask1] をダブルクリックして、Method Invoking のハンドラを新規作成します。
      private void createTask1_MethodInvoking(object sender, EventArgs e){taskId = Guid.NewGuid();taskProperties = new Microsoft.SharePoint.Workflow.SPWorkflowTaskProperties();taskProperties.Title = "Task created by Orcas Workflow !";taskProperties.PercentComplete = 0;taskProperties.AssignedTo = System.Threading.Thread.CurrentPrincipal.Identity.Name;taskProperties.TaskType = 0;taskProperties.DueDate = DateTime.Now.AddDays(7);taskProperties.DueDate = DateTime.Now;}
    • Workflow1.cs のコードに bool 型の taskCompleted (初期値 false) を作成し、[onTaskChanged1] をダブルクリックして、Invoked のハンドラを新規作成します。
      private void onTaskChanged1_Invoked(object sender, ExternalDataEventArgs e){if (afterProperties.PercentComplete == 1)taskCompleted = true;}
    • While アクティビティを選択し、プロパティペインの [Condition] から [Code Condition] を選択し、[Condition] 欄に関数名 (今回は isComplete とします) を入力してクリックし、以下の通りコード条件を記述します。
      private void isComplete(object sender, ConditionalEventArgs e){e.Result = !taskCompleted;}
  9. では、F5 でデバッグ実行してみましょう。ここが、今日の新機能の説明ポイントです!アセンブリの GAC 登録、フィーチャーの登録などのすべてがおこなわれ、IIS が自動的に再起動され、ブラウザがあがってきます。
    また、F9 でブレークポイントを追加してデバッグ実行 (F5) してデバッグなども当然おこなえます。

    タスクの編集画面で、タスクを 100% にするとワークフローは完了します。(尚、初回は大丈夫ですが、何度も変更などをおこなってデバッグ実行すると、ワークフローがよばれない場合があります。これは、ドキュメントライブラリなどに登録されているワークフローの状態が、デバッグの度に [新しいインスタンスの開始を許可しない] となるためで、デバッグ開始時に、まず、ドキュメントライブラリやリストの設定画面で [ワークフロー] を選択し、[削除] リンクなどを押して、[許可] に変更しておいてください。これは、デプロイの際に重複して設定した結果、設定がおかしくなっている模様で、この辺りは、まだベータ版ですのでご辛抱ください。)

このように、フィーチャーやワークフローのマニフェスト (xml) の作成、配置(Deploy)用のバッチファイルの実行、デバッグ時の w3wp.exe へのアタッチなど、ワークフロー作成でノウハウが必要であったこうした難しい部分の処理を自動化してくれています。構築の途中で、いったん F5 でデプロイして確認する、といったことも容易になります。

 

【関連ブログ記事】
Visual Studio で Office SharePoint Server 2007 Workflow を作成するチュートリアル 【Beta2版】

Visual Studio で Office SharePoint Server 2007 Workflow を作成するチュートリアル 【お待たせしました! Beta2TR版】

 

※ ここでは、Visual Studio Codename Orcas の Beta 1 を使用しています。使用されているクラスや機能は予告なく変更されることがありますのでご容赦ください。

 

Categories: Uncategorized

Tagged as: ,

7 replies»

Leave a Reply