この章では、Microsoft OfficeテンプレートとWebサービスを使用して、エンタープライズ・アプリケーションにデータを入力するためのフォームを作成する方法について説明します。
この章の内容は次のとおりです。
Microsoft Office 2003 Professionalは、多くのユーザーに使い慣れたユーザー・インタフェースを提供します。エンタープライズ・アプリケーションは、一般に、独自の専用ユーザー・インタフェースを備えています。エンタープライズ情報に断続的にしかアクセスしないユーザーに対して、Microsoft Officeは、エンタープライズ情報を操作するMicrosoft Officeアプリケーションの開発を可能にするスマート・ドキュメント関連の機能セット(特に、テンプレート、フォーム・フィールド、およびWebサービス統合)を提供します。スマート・ドキュメントは、データの自動入力が可能なので、フォームへのデータの入力やテンプレートを使用した作業が容易です。また、スマート・ドキュメントは、外部データに自動的にアクセスしてドキュメント内の適切な場所にそのデータを挿入したり、ドキュメントの準備においてコンテキスト・ヘルプを提供してユーザーを支援したりすることもできます。
Oracle Application Serverは、Java、Enterprise JavaBeans(EJB)、またはPL/SQLに基づくJAX-RPC Webサービスをデプロイおよび実行できる機能を提供します。Oracle JDeveloperは、J2EEおよびWebサービス・アプリケーションを開発するための設計時環境を提供します。
この章で示される一連のガイドラインに従うことにより、開発者は、Oracle JDeveloperを使用して、Microsoft Officeアプリケーション(具体的には、Microsoft Word、Microsoft Excel、およびMicrosoft InfoPath)から起動できるエンタープライズWebサービスを作成できます(図5-1を参照)。開発者は、これらのアプリケーションに含まれているVisual Basic Editorを使用して、これらのWebサービスに対するプロキシ・クラスを起動することができます。このプロキシ・クラスは、Microsoft Office 2003 Webサービス・ツールキット(5.2項「前提条件」を参照)を使用して生成できます。
この章では、Oracle JDeveloper、Microsoft Office 2003 Webサービス・ツールキット、およびMicrosoft Office 2003 Professionalを使用してエンタープライズ・アプリケーションにアクセスする方法を説明します。
この章で説明する手順を実行するには、まず、次のソフトウェアをインストールします。
Oracle JDeveloper 10gリリース3(10.1.3.1.0)。
Oracle JDeveloperには、この章で説明する統合を開発およびテストするために十分な機能を持つ埋込みOracle Containers for J2EEが含まれています。ユーザー・テストおよび試作品デプロイには、Oracle Application Server 10gリリース3(10.1.3.1.0)が必要です。
Microsoft Office 2003 Professional、具体的にはMicrosoft Word 2003。
Microsoft Office 2003 Webサービス・ツールキット2.01。1.3.3項「Microsoftのソフトウェア開発キット、ユーティリティおよびリファレンス」を参照してください。
Microsoft Internet Explorer 6.0、Mozilla Firefox 1.0または同等のブラウザ。
fillingforms
デモ・フォルダ内のサポート・ファイル。デモ・サポート・ファイルの詳細は、「はじめに」の「デモ・サポート・ファイルへのアクセス」を参照してください。fillingforms
デモ・フォルダ内のサポート・ファイルとその説明を表5-1に示します。
この項では、Microsoft OfficeとOracle Application Server上で動作するWebサービスの相互運用を実現する方法を示す次の2つの手順を説明します。
この項の例は、JDeveloperでWebサービスを開発する方法と、このWebサービスを、Visual Basic for Applicationsコードと(Microsoft Office 2003 Webサービス・ツールキットによって生成される)ラッパー・クラスを使用してMicrosoft Wordと統合する方法を示します。この例は、単純なJavaクラスから構築されるWebサービスに対応しています。
この例は、Union Loanによって使用されるカスタムの人事エンタープライズ・アプリケーションに基づいています。このアプリケーションは、人事部や管理職社員によって使用されます。近年、他のユーザーが従業員の住所を表示および更新できることへのニーズが高まっています。(非常に複雑な)人事システムへのアクセスを提供するよりも、会社は、JDeveloperを使用して、図5-2に示すようなMicrosoft Word 2003 Professionalアプリケーションを迅速に開発し、既存のJava実装を、従業員の住所へのアクセスを提供するWebサービスとして公開することを決断します。このWebサービスは、そのインタフェースでGetAddress
およびSetAddress
という2つの操作を提供します。
注意: この項の例は、Webサービスを使用してパブリック・データにアクセスします。そのため、セキュリティは不要です。Webサービスに対するより安全な接続が必要な場合は、第6章「スマート・ドキュメントおよびWebサービスのセキュリティ保護」を参照してください。 |
Webサービスと通信するフォームを開発するには、次の項の手順を実行してください。
また、次の項では、オプションの5番目の手順が示されています。
Oracle JDeveloper 10gリリース3(10.1.3.1.0)でMicrosoft Office互換Webサービスを作成するには、次の手順を実行します。
JDeveloperを起動します。
「ファイル」メニューから、「新規」→「一般」→「アプリケーション」を選択します。
ヒント: 「フィルタ方法」リストから「すべての項目」を選択していることを確認する必要がある場合があります。 |
「OK」をクリックします。
「アプリケーション名」フィールドにMSOffice
と入力します。
ヒント: 「アプリケーション・テンプレート」リストから「テンプレートなし[すべてのテクノロジ]」を選択する必要がある場合があります。 |
「OK」をクリックします。
「プロジェクト名」フィールドにRpc-enc
と入力します。
「OK」をクリックします。
アプリケーション・ナビゲータで、Rpc-encプロジェクトを右クリックして、ショートカット・メニューから「新規」を選択します。
「一般」→「Javaクラス」を選択します。
「OK」をクリックします。
「名前」フィールドにEmpService
と入力します(図5-3を参照)。
「OK」をクリックします。
クラスがコード・エディタに表示されるようになりました。
既存のコードを、例5-1に示すコードと置き換えます。
例5-1 EmpService Javaクラス
package rpcenc; public class EmpService { private String adr = null; public EmpService() { } public void setAddress (String address) { adr = address; return; } public String getAddress (String empno) { if (adr == null) { return empno + " Address"; } else return adr; } }
このJavaクラスは、従業員の住所データを保持する内部変数(adr
)を宣言します。setAddress
操作は、入力文字列を取得し、それをこの変数に割り当てます。getAddress
操作は、従業員番号を入力として取得し、従業員番号と住所文字列で構成される連結文字列を出力として返します。この非常に単純な例を除くどのような場合でも、このクラスは、通常、データベースまたはエンタープライズ・アプリケーションAPIをコールしてデータを取得します。
アプリケーションを保存します。
「ファイル」メニューから、「新規」を選択します。
ビジネス層ノードを開き、「Webサービス」→「Java Webサービス」を選択します。
「OK」をクリックします。
「J2EE 1.4 (JAX-RPC) Webサービス」が選択されていることを確認して、「OK」をクリックします。
必要に応じて、「次へ」をクリックして、ウィザードの初期ページを通過します。
「公開するコンポーネント」リストから、EmpServiceクラスを選択します(図5-4を参照)。
「次へ」をクリックします。
「SOAPメッセージ形式」リストから、「RPC/エンコード」を選択します(図5-5を参照)。
SOAPメッセージ形式には、RPC/Literalも使用できます。ドキュメント・スタイルを使用することもできます。
「次へ」をクリックします。
この例では、マッピング・ファイルを指定する必要がないため、もう一度「次へ」をクリックします。
「使用可能なメソッド」リストで、getAddressとsetAddressの両方のメソッドを選択します。
「次へ」をクリックします。
もう一度「次へ」をクリックします。
「ステートフル・サービス」チェック・ボックスを選択します。
注意: Microsoft Office 2003からコールされるWebサービスは、ステートフルの場合もステートレスの場合もあります。この例のWebサービスは、ステートフルです。 |
「状態スコープ」リストから、「セッション」を選択します。
「セッション・タイムアウト」フィールドに1000
と入力します。
「終了」をクリックします。
注意: JAX-RPC Webサービスの詳細をさらに定義することができますが、これらはオプションで、この例では不要です。 |
ウィザードによって生成されるWeb Services Description Language(WSDL)ドキュメントを表示できるようになりました(図5-6を参照)。アプリケーション・ナビゲータに、MyWebService1という名前のWebサービス・ノードとMyWebService1.java
という名前のJavaエンドポイント・インタフェースが追加されました。このファイルはJAX-RPCに必要ですが、この例のために編集する必要はありません。
アプリケーション・ナビゲータで、MyWebService1ノードを右クリックして、メニューから「実行」を選択します。
JDeveloperは、サービスを自動的に埋込みOC4Jコンテナにデプロイし、図5-7に示すようなメッセージをログ・ウィンドウに表示します。
ログ・ウィンドウのURLをクリックします。
動作しているWebサービスを示すページが表示されます(図5-8を参照)。
5.3.1.1項「Oracle JDeveloperでのWebサービスの開発」で開発したWebサービスを起動するテンプレート・ドキュメントをMicrosoft Word 2003 Professionalで定義するには、次の手順を実行します。
Microsoft Wordを起動します。
「Insert」メニューから、「Picture」→「From File」を選択します。5.2項「前提条件」でダウンロードしたunionloan_banner.gif
イメージを選択します。
Employee Information
というタイトルをサイズが18ポイントの太字フォントで追加します。
従業員の住所の検索方法を示す次のテキストを入力します。
In the Name field, enter the name of the employee, then press the Tab key to retrieve the employee's address details.
「Table」メニューから、「Insert」→「Table」を選択します。2行2列の表を作成します。
最初の行の最初の列に、NAME
と入力します。
2番目の行の最初の列に、ADDRESS
と入力します(図5-9を参照)。
従業員の住所の更新方法を示す次のテキストを入力します。
You can update the address information by entering the new employee address below.
「Table」メニューから、「Insert」→「Table」を選択します。1行2列の表を作成します。
最初の列にNEW ADDRESS
と入力します(図5-10を参照)。
ドキュメントは図5-11のようになりました。
「View」メニューから、「Toolbars」→「Forms」を選択します。
値として従業員名を入力する予定の表のセル内にカーソルを移動します。
Formsツールバーの「Text Form Field」ボタンをクリックします(図5-12を参照)。
これにより、セルに、フォーム・フィールドの位置を示す灰色の領域が挿入されます。
値として従業員名を入力する予定の表のセル内にカーソルを移動し、「Text Form Field」ボタンをクリックします。
従業員の新住所を入力する予定の表のセル内にカーソルを移動し、「Text Form Field」ボタンをクリックします。
ドキュメントを保存する前に、テンプレート定義を制御し、ユーザーのフォーム補完プロセスを有効にするために、ドキュメントを保護します。
「Tools」メニューから、「Protect Document」を選択します。
表示される作業ウィンドウで、次の手順を実行します。
「Editing Restrictions」セクションで、「Allow only this type of editing in the document」チェック・ボックスを選択します。
リストから、「Filling in forms」を選択します。
「Yes, Start Enforcing Protection」をクリックします。
ドキュメントを保護するためのパスワードを入力します。
「File」メニューから、「Save As」を選択します。
「Save as type」リストから、「Document Template (*.dot)」を選択します。
デフォルトのファイル名を使用します。
「Save」をクリックします。
このドキュメントは、VBAコードを使用してフィールドを実際に動作するWebサービスに接続するために、5.3.1.4項「Webサービス・パラメータへのテンプレート・フィールドのマッピング」で編集します。
デプロイしたWebサービスを起動するVBAコードを作成するために、Microsoft Office 2003 Webサービス・ツールキット(5.2項「前提条件」を参照)を使用して、プロキシとして使用できるクラスまたはラッパー(Webサービスへのクラス)を生成する必要があります。5.3.1.4項「Webサービス・パラメータへのテンプレート・フィールドのマッピング」で開発されるVBAコードは、この項で生成されるプロキシ・クラスをコールします。
プロキシ・クラスを生成するには、次の手順を実行します。
Microsoft Wordを起動し、5.3.1.2項「Microsoft Wordでのテンプレート・ドキュメントの定義」で生成したテンプレートを開きます。
Project NavigatorでEmployee Informationプロジェクトが選択されていることを確認します。
Visual Basic Editorの「Tools」メニューから、「Web Service References」を選択してMicrosoft Office 2003 Webサービス・ツールキットを起動します。
「Microsoft Office 2003 Web Services Toolkit」ダイアログ・ボックスで、「Web Services URL」ラジオ・ボタンを選択します。
「URL」フィールドで、動作しているWebサービスのURLを入力します。
URLの最後に?wsdl
を追加します。URLは、次のようなものになります。
http://mymachine:8988/MSOffice-Rpc-enc-context-root/MyWebService1SoapHttpPort?wsdl
「Search」をクリックします。これにより、Webサービスが右上のペインに追加されます(図5-13を参照)。
MyWebService1を選択して、「Add」をクリックします。
「Toolkit」ダイアログ・ボックスが閉じて、clsws_mywebservice1
という名前で生成されたクラスが、Project ExplorerのClass Modulesノードの下に追加されます。
「Insert」メニューから、「Module」を選択します。
「Properties」ウィンドウで、名前をGetEmployeeInfo
に変更します。
エディタ・ウィンドウで、例5-2に示すコードを入力してモジュールに追加します。
例5-2 GetEmployeeInfoモジュール
Public Sub GetEmployeeInfo() Dim ename As String ename = ActiveDocument.Fields(1).Result.Text Dim employeeWS As clsws_MyWebService1 Set employeeWS = New clsws_MyWebService1 'Send the service the employee name Dim eadr As String eadr = employeeWS.wsm_getAddress(ename) ActiveDocument.Fields(2).Result.Text = eadr End Sub
GetEmployeeInfo
サブルーチンは、従業員名文字列(ename
)を宣言し、ドキュメントの「Name」フィールドの値をこの変数に割り当てます(ename = ActiveDocument.Fields(1).Result.Text
)。その後、Webサービスへの参照が作成され、コールされます。サービスの出力がドキュメントの「Address」フィールドに割り当てられます(ActiveDocument.Fields(2).Result.Text=eadr
)。
RESTを使用している場合、コードは例5-3に示すようになります。
例5-3 RESTサービスのGetEmployeeInfoモジュール
Public Sub GetEmployeeInfo() Dim eid As String eid = ActiveDocument.Fields(1).Result.Text Dim query As String query = "http://mymachine:8988/MSOffice-Rpc-enc-context-root/MyWebService1SoapHttpPort/getAddress?empno=" + eid 'define xml and http components Dim queryResult As New MSXML2.DOMDocument Dim employeeService As New MSXML2.XMLHTTP 'create HTTP request employeeService.Open "GET", query, False 'send the request employeeService.send 'parse result queryResult.LoadXml(employeeService.responseText) ActiveDocument.Fields(2).Result.Text = queryResult.SelectSingleNode("//ns0:result").Text End Sub
SetEmployeeInfo
という名前の別のサブルーチンを追加して、例5-4に示すコードを入力します。
例5-4 SetEmployeeInfoモジュール
Public Sub SetEmployeeInfo() Dim eadr As String eadr = ActiveDocument.Fields(3).Result.Text Dim employeeWS As clsws_MyWebService1 Set employeeWS = New clsws_MyWebService1 'Send the service the new emp address employeeWS.wsm_setAddress(eadr) End Sub
SetEmployeeInfo
サブルーチンは、変数(eadr
)を宣言し、ドキュメントの「Address」フィールドの値を割り当てます。その後、Webサービスが初期化され、setAddress
操作がこの値でコールされます。
RESTを使用している場合、コードは例5-5に示すようになります。
例5-5 RESTサービスのSetEmployeeInfoモジュール
Public Sub SetEmployeeInfo() Dim address As String address = ActiveDocument.Fields(3).Result.Text Dim query As String query = "http://mymachine:8988/MSOffice-Rpc-enc-context-root/MyWebService1SoapHttpPort/setAddress?address=" + address 'define xml and http components Dim queryResult As New MSXML2.DOMDocument Dim employeeService As New MSXML2.XMLHTTP 'create HTTP request employeeService.Open "GET", query, False 'sent the request employeeService.send End Sub
プロジェクトを保存します。
Visual Basic Editorを終了して、Microsoft Wordに戻ります。
5.3.1.3項「Microsoft Office 2003 Webサービス・ツールキットによるプロキシ・クラスの生成」で開発したVBAコードを5.3.1.2項「Microsoft Wordでのテンプレート・ドキュメントの定義」で作成したテンプレート・ドキュメントにリンクするには、次の手順を実行します。
Microsoft Wordを起動します。
5.3.1.2項「Microsoft Wordでのテンプレート・ドキュメントの定義」で生成したテンプレートを開きます。
「Tools」メニューから、「Unprotect Document」を選択し、メッセージが表示されたらパスワードを入力します。
ユーザーが従業員名の値を入力するフォーム・フィールドを右クリックして、ショートカット・メニューから「Properties」を選択します。
「Default text」フィールドにTYPE A NAME HERE
と入力します。
「Text format」リストから、「First capital」を選択します。
「Exit」リストから、GetEmployeeInfoを選択します(図5-14を参照)。これにより、ユーザーがフィールドに値を入力してフィールドから移動する(一般に、[Tab]キーを押す)と、5.3.1.4項「Webサービス・パラメータへのテンプレート・フィールドのマッピング」で作成したVBAコードが起動されます。
ユーザーが従業員の住所を更新するフォーム・フィールドの同様のプロパティを入力します。ただし、この場合は、SetEmployeeInfo
サブルーチンを起動します(図5-15を参照)。
5.3.1.2項「Microsoft Wordでのテンプレート・ドキュメントの定義」の最後で説明した方法で、ドキュメントを保護します。
ドキュメントを保存して閉じます。
Windowsエクスプローラで、テンプレートをダブルクリックしてテンプレートに基づくドキュメントを作成します。
最初のフォーム・フィールドにカーソルが表示されるので、従業員名(James Cooper
など)を入力します。
[Tab]キーを押して次のフィールドに移動します。
2番目のフィールドには、James Cooperの住所の値が挿入されます。
もう一度[Tab]キーを押して、新住所を指定できるフィールドに移動します。
従業員の新住所を入力します。
もう一度[Tab]キーを押して最初のフィールドに移動します。
従業員の住所に新住所が反映されます。
ドキュメントのデータを自動的にロードおよび保存できます。Microsoft Wordでこれを実現するには、次の手順を実行します。
Microsoft Wordを起動します。
5.3.1.2項「Microsoft Wordでのテンプレート・ドキュメントの定義」で生成したテンプレートを開きます。
「Tools」メニューから、「Unprotect Document」を選択し、メッセージが表示されたらパスワードを入力します。
「Tools」メニューから、「Macro」→「Visual Basic Editor」を選択します。
Project Explorerのテンプレート・プロジェクトの下で、「ThisDocument」をダブルクリックします。
「Object」リストから、「Document」を選択します。
「Procedure」リストから、「Open」を選択します。
空のサブルーチンがクラス・モジュールに追加されます。
getAddress
Webサービスを起動するため、例5-6に示すVisual Basic命令を追加します。
例5-6 getAddress Webサービスの起動
Private Sub Document_Open() Dim ename As String ename = ActiveDocument.Fields(1).Result.Text Dim employeeWS As clsws_MyWebService1 Set employeeWS = New clsws_MyWebService1 'Send the service the employee name Dim eadr As String eadr = employeeWS.wsm_getAddress(ename) ActiveDocument.Fields(2).Result.Text = eadr End Sub
このコードは、5.3.1.3項「Microsoft Office 2003 Webサービス・ツールキットによるプロキシ・クラスの生成」で作成したGetAddressInfo
サブルーチンと同じです。つまり、このコードは、指定された従業員のアドレスを取得するgetAddress
Webサービスをコールします。このコードがドキュメントのonOpen
プロシージャとして宣言されるので、ドキュメントが開かれたときに自動的に実行されます。「NAME」フィールドのデフォルト値は、Webサービスに渡されます。その結果、名前にAddressという文字列が追加されることによって得られるデフォルトの住所値が表示されます。実際のアプリケーションでは、デフォルト値に渡さない場合があります。この例では、デフォルト値は、テンプレート・ドキュメントを開いたときの自動Webサービス呼び出しのデモの目的でのみ使用されます。
プロジェクトを保存します。
Visual Basic Editorを終了して、Microsoft Wordに戻ります。
5.3.1.2項「Microsoft Wordでのテンプレート・ドキュメントの定義」の最後で説明した方法で、ドキュメントを保護します。
ドキュメントを保存して閉じます。
ドキュメントを実行するには、Microsoft Wordでファイルを開きます。
ファイルを開くと、「NAME」フィールドのデフォルト値のTYPE A NAME HERE
を渡すことによって、Webサービスが起動されます。この例では、このため、返されるデフォルト値はTYPE A NAME HERE Address
です。
Microsoft InfoPathを使用すると、フォーム設計者は、フィールドを、Webサービス呼び出しにマッピングされるフォームに迅速に追加できます。
Webサービスと通信するフォームを開発するには、次のタスクを実行してください。
JDeveloperでMicrosoft InfoPathとともに使用するWebサービスを作成するには、次の手順を実行します。
5.3.1.1項「Oracle JDeveloperでのWebサービスの開発」で示されている手順に従います。
Microsoft Visual Studio .NETを使用していない場合は、次の変更を加えます。
Java J2EE 1.4 Webサービスの作成ウィザードの「メッセージの書式」手順(手順2)で、「SOAPメッセージ形式」が「ドキュメント/ラップ」に設定されていることを確認します。
Microsoft InfoPathでOracle Webサービスをコールするフォームを定義するには、次の手順を実行します。
Microsoft InfoPathを起動します。
ダイアログ・ボックスの左側で、「Design a Form」を選択します。
図5-16に示すようなInfoPathのメイン・ウィンドウが表示されます。
「Design a new form」の下で、「New from Data Connection」をクリックします。
Data Connection Wizardの最初の手順で、接続タイプとして「Web Service」を選択します。
「Next」をクリックします。
「Receive data」を選択します(図5-17を参照)。
「Next」をクリックします。
デプロイされているWebサービスのURLを、最後に?WSDL
を追加して入力します。
「Next」をクリックします。
「Select an operation」リストから、getAddressを選択します(図5-18を参照)。
「Next」をクリックします。
データ接続の名前としてGet Address
と入力します(図5-19を参照)。
「Finish」をクリックします。
図5-20に示すように、Microsoft InfoPathによってデフォルトのフォームが生成されます。
「Data Source」パネルで、queryFieldsノードを開きます。
ns1:getAddressElement
要素を「Drag query fields here」というラベルの付いているフォームの領域にドラッグして、「Section with Controls」を選択します。
dataFieldsノードを開きます。
ns1:getAddressResponse
要素を「Drag data fields here」というラベルの付いているフォームの領域にドラッグします。
フォームは図5-21のようになりました。
カーソルをフォームの上部に移動します。
「Insert」メニューから、「Picture」→「From File」を選択します。5.2項「前提条件」でダウンロードしたイメージを選択します。
フォームのタイトルをEmployee Informationに変更します。
「Click to add form content」というラベルの付いている領域に次の説明文を入力します。
Enter the name of the employee and click the Get Address button to retrieve the employee address.
入力フィールドのラベル(Get Address Element)をEnter Employee Name
に変更します。
出力フィールドのラベル(Get Address Response Element)をEmployee Address
に変更します。
「Run Query」ボタンをダブルクリックして、ラベルをGet Address
に変更します。
入力および出力フィールドのフォームの枠をマウスで選択し、ドラッグして、フォームの領域を小さくします。
フォームは図5-22のようになりました。
テンプレート・フォームを保存し、Microsoft InfoPathを閉じます。
Microsoft InfoPathを開き、「Fill out a Form」ダイアログ・ボックスで新しいテンプレート・フォームを選択します。
「Enter Employee Name」フィールドにJames Cooper
と入力します。
「Get Address」をクリックします。
「Employee Address」フィールドには、James Cooperの住所の値が挿入されます。
この項では、発生する可能性のある潜在的な問題を解決するためのヒントを示します。
WSDLのエンドポイントURLが適切なサービスをポイントしていることの確認
JDeveloperは、スタンドアロン・サーバーとともに動作するデフォルトのエンドポイントURLを生成します。リリース10.1.3以上では、サービスがデプロイされるアプリケーション・サーバーは、このURLを更新します。このため、Microsoft Office 2003 Webサービス・ツールキットおよびMicrosoft InfoPathのData Connection Wizardで、動作しているサービスへのWSDL参照を挿入することが重要です。ログ・ウィンドウで、JDeveloperは、常に、デプロイされているサービスのURLをレポートします。このURLをダイアログ・ボックスにコピーして貼り付け、エンドポイントに?wsdl
を追加します。これは、WSDLを取得するブラウザでも実行できます。
テンプレートを使用するには、最初に、そのテンプレートがパスワードで保護されている必要があります(「Tools」メニューの「Protect Document」オプション)。ドキュメントを開く際は、定義を編集する前に、まず、ドキュメントの保護を解除してください(「Tools」メニューの「Unprotect Document」オプション)。保護を解除しないで編集すると、予期しない結果になります。
『Oracle Application Server Web Services開発者ガイド』