この章の内容は次のとおりです。
サービスとは、Oracle WebCenter Contentシステムで実行される関数またはプロシージャです。クライアントがOracle WebCenter Contentのシステムと通信したりOracle WebCenter Content Serverのデータベースにアクセスするには、Oracle WebCenter Contentのサービスをコールする(サービス・リクエストを行う)ことが唯一の方法です。
この項の内容は次のとおりです。
どのようなサービスでも、外部的に(Oracle WebCenter Contentシステムの外から)でも内部的に(Oracle WebCenter Contentシステム自体の中で)でもコールできます。通常の場合、クライアント・サービスは外部的にコールされ、管理サービスは内部的にコールされます。サービスが要求されたら、該当する任意のパラメータがサービスに渡されます。サービスでは、指定されたパラメータに基づいて、サービスの属性、およびリクエストを実行するアクションを使用します。サービスはこれを受けて、外部的と内部的いずれか適した方法でレスポンスを返します。この項の内容は次のとおりです。
どのようなサービスも内部的にコールできますが、通常の場合、内部的にコールされるのは管理サービスのみです。内部サービス・リクエストは、Oracle WebCenter Content自体の中で行われ、結果はOracle WebCenter Contentのみに返されます。たとえば、START_SEARCH_INDEXサービスを使用すると、バックグラウンド・スレッドで自動的に、検索索引が更新または再構築されます。
どのような外部プログラムでもHTMLページでも、Oracle WebCenter Contentの任意のサービスをコールして、Oracle WebCenter Contentシステムに情報を要求したり、全文検索やメタデータ検索、ライブラリ・サービス、ワークフロー・サービス、サブスクリプション通知、コンテンツ変換機能など、指定した機能を実行できます。通常の場合、クライアント・サービスのみが外部的にコールされます(管理サービスは通常、内部的にコールされます)。たとえば、Content ServerのWebページで「検索」リンクをクリックすると、GET_DOC_PAGEサービスによってWebブラウザに標準的な検索ページが表示されます。このとき、次のURLセグメントが使用されます。
IdcService=GET_DOC_PAGE&Action=GetTemplatePage&Page=STANDARD_QUERY_PAGE
外部リクエストは、数多くのプロトコルのいずれかを使用して、クライアント(たとえばWebブラウザ)からWebサーバーに送信されます。サービス・コールには、サービスで必要とされる任意のパラメータが含まれている必要があります。Webサーバーは、任意の必須パラメータおよびオプション・パラメータとともに、サービス・リクエストをOracle WebCenter Contentシステムにルーティングします。次にOracle WebCenter Contentシステムは、提供されたパラメータを使用してサービスを実行します。検索サービスの場合は、検索リクエストが検索エンジンに送信されます。次にOracle WebCenter Contentシステムは結果をWebサーバーに返し、Webサーバーは結果をWebブラウザ・クライアントに返します。
サービス・リクエストには、サービスで必要とされるあらゆるパラメータが含まれている必要があります。たとえば、コンテンツ・アイテムの情報を取得するためにDOC_INFOサービスをコールするとき、このサービス・コールは、dID (生成されたコンテンツ・アイテムのリビジョンのID)をサービスに提供する必要があります。次のセグメントは、これが永続URLでどのように行われるかを示しています。
http://cs.example.com/cs/idcplg? IdcService=DOC_INFO&dID=194
Content Server用の日付および時刻のデフォルトの書式設定は、「システム・プロパティ」ユーティリティ・インタフェースで「ローカライゼーション」タブを使用して決定されます。日付および時刻の一般的な書式は次のとおりです。
MM/DD/{yy} {hh:mm[:ss] {aa} [zzz]} !mAM,PM!zTimezoneCity
日付の書式はY(年)、D(日)、M(月)をグループにまとめたもの、時刻の書式は、h(時間)、m(分)、s(秒)をグループにまとめたものです。文字の繰返し回数によって、使用される最小桁数が指定されます(たとえば、YY/MM/DD hh:mmだと04/12/09 12:12と指定され、MM/DD/YYYY hh:mm:ssだと09/12/2004 04:12:33になります)。
a
は、午前と午後を示す記号(たとえば、AMまたはPM)を表しています。
m
は分を表しています。
m
は、存在している場合に解析されるが、書式設定に使用されると出力には含まれないことを示します。
中カッコ({ }
)は、このアイテムが、データ入力時には省略可能だが出力には常に表示されることを示しています。
感嘆符(!
)は、日付書式の追加指定を区切るときに使用します。たとえば、!mXXX,YYYとすると、午前と午後を示す記号が指定されます(XXXは「午前中」を意味する記号であり、YYYは「午後」を意味する記号です)。感嘆符の後ろにあるものはすべて、午前と午後を示す記号およびタイムゾーンを示す記号を、日付書式とともに渡します。
大/小文字の区別は、Oracle WebCenter Contentの標準サービスをコールするときに重要です。
パラメータ: パラメータでは、大文字と小文字が区別されます。たとえば、IdcServiceパラメータを指定するときには、IDCSERVICE
でなくIdcService
を使用する必要があります。
パラメータの値: パラメータの値では通常、大文字と小文字が区別されます。IdcServiceパラメータの値では常に、大文字と小文字が区別されます。また、Oracle WebCenter Contentの標準サービスで使用される表記規則はすべて大文字です。たとえば、IdcServiceパラメータの値を指定するときには、Doc_Info
でなくDOC_INFO
を使用する必要があります。
データベース: Oracle WebCenter Contentとともに使用しているデータベースが、パラメータおよびパラメータの値の大/小文字の区別に影響を与える場合があります。たとえば、一部のデータベースには大文字と小文字が区別される列があり、他のデータベースではデフォルトで大文字と小文字が区別されません。したがって、あるデータベースで「DDOCNAME」が格納されていたとしても、Oracle WebCenter Contentシステムで予想される値は引き続き「dDocName」です。また、一部のデータベースでは、値が大文字で格納されますが、大文字と小文字が区別された問合せが実行されます。たとえば、「BouncyCaps」というdDocNameを格納した場合、「bouncycaps」を問い合せるとその行が見つかります。
Oracle WebCenter ContentシステムからWebページが要求されると、次のページ・タイプのいずれかが返されます。
静的ページ: 静的なWebページのコンテンツが事前に書式設定され、あるリクエストから次のリクエストの間に変わることはありません。Oracle WebCenter Contentの通常のWebサイトでは、静的ページはゲスト・ホーム・ページ(たとえば、DomainHome
/ucm/cs/weblayout/portal.htm
)のみです。
動的ページ: 動的なWebページは、Webサーバー・リクエストの時点で構成されます。このとき、コンテンツと書式設定は、Oracle WebCenter Contentのサービスとテンプレートを使用して決定されます。たとえば、各ユーザーのポータル・デザイン・ページは、Oracle WebCenter ContentのGET_PORTAL_PAGEというサービス、およびPNE_PORTAL_DESIGN_PAGEをいうテンプレートを使用して生成されます。
検索リクエストは、Oracle WebCenter Contentの特殊な種類のサービスです。Oracle WebCenter Contentシステムは、検索リクエストを受信すると、検索エンジンのAPIを使用して、そのリクエストを検索エンジンに送信します。これによって、Oracle WebCenter Contentシステムとともに各種の検索エンジンを使用できます。
サービス・リクエストは、多様なプロトコルを使用して、外部プログラムまたはHTMLページで行うことができます。Oracle WebCenter Contentシステムは、多様な統合方法を使用して、他のエンタープライズ・アプリケーションと統合できます。1つの一般的な統合方法は、Oracle WebCenter Contentシステム内で永続URLによって管理されるコンテンツを参照することです。詳細は、「永続URLを使用したサービスのコール」を参照してください。
他に考えられる統合方法は次のとおりです。
WebLogic JAXPとWebLogic SAMLの統合サポートを使用した、Oracle WebLogic ServerのWebサービス(WS)
Content Server向けのOracle WebCenter ContentのWebサービス・コンポーネント、およびクライアント向けのRemote Intradoc Client (RIDC)コンポーネント
IdcCommand Javaコマンド・ユーティリティを使用したJava API (IdcCommand)統合
Oracle WebCenter Contentで稼働しているJSP、Oracle WebCenter Content JavaBeanを通じたJSP、またはJ2EEアプリケーション・サーバーにデプロイされているOracle WebCenter Content Enterprise JavaBean (EJB)を通じたJSPからのJava Server Page (JSP)統合
J2EE準拠のアプリケーション・サーバーにOracle WebCenter Content Enterprise JavaBeanをデプロイすることによるJava 2 Enterprise Edition API (J2EE)統合
Remote Method Invocation (RMI)をトランスポート・プロトコルInternet Inter-ORB Protocol (IIOP)で実装し、Enterprise JavaBeanを参照することによるCommon Object Request Broker Architecture (CORBA)統合
ODMAベースのプラグインを使用するOpen Document Management API (ODMA)統合(11gで非推奨)
SOAPプロトコルを使用したSimple Object Access Protocol (SOAP)統合
Folders_gコンポーネントを使用した仮想フォルダ統合
Web Distributed Authoring and Versioning (WebDAV)コンポーネントを使用したWebDAV統合
ActiveXユーティリティまたはIntradocClient OCXコンポーネントを使用したComponent Object Model (COM)統合
この統合方法では、サービス・コールに必要な情報がすべて、URLを通じてContent Serverに送信されます。次の例は典型的なURLを示しており、この場合はホーム・ページのURLです。
http://cs.example.com/cs/idcplg? IdcService=GET_DOC_PAGE&Action=GetTemplatePage&Page=HOME_PAGE
http://cs.example.com/は、Content ServerインスタンスのWebアドレスです。
cs/idcplgは、Webサーバーのフィルタへのパスです。
IdcService=GET_DOC_PAGEは、Content Serverに対して、GET_DOC_PAGEサービスを実行するように指示します。
Action=GetTemplatePageは、Content Serverに対して、指定したテンプレート・ページを使用して結果を返すように指示します。このパラメータは、GET_DOC_PAGEサービスの例に固有です。
Page=HOME_PAGEは、Content Serverに対して、どのテンプレート・ページを使用するか指示します。このパラメータは、GET_DOC_PAGEサービスの例に固有です。
疑問符(?)は、Webサーバーのパスの終了とContent Serverのパラメータの開始を示しています。
アンパサンド(&)は、Content Serverのパラメータ間の区切り文字として使用されます。
Idocスクリプトの特定の変数をURLに含めて、ページ・リクエストの時点でのページ表示に影響を与えることができます。これは、トラブルシューティングに、またはContent Serverのページのカスタマイズに役立ちます。
トラブルシューティングの例
IsJava=1
ScriptDebugTrace=1
IsPageDebug=1
ScriptErrorTrace=1
カスタマイズの例
StdPageWidth=1000
dDocType=HRForm
例
次の例では、Content Serverに対する動的ページの要求に永続URLが使用される場合に発生するステップについて説明します。
ナビゲーション領域でユーザーが「管理」リンクをクリックすると、GET_ADMIN_PAGEサービスに対するリクエストがWebサーバーに送信されます。「管理」リンクのURLには、次のコマンドが含まれます。
IdcService=GET_ADMIN_PAGE&Action=GetTemplatePage&Page=ADMIN_LINKS
Webサーバーは、このリクエストをContent Serverの関数と認識し、具体的なリクエストをContent Serverに送信します。
Content Serverは、リクエストを処理したら、その結果を元のWebサーバーに渡します。「管理」リンクの場合は、GET_ADMIN_PAGEサービスの内容は次のようになります。
ユーザーが現在ログインしていない場合はログイン・プロンプトを表示します。
ユーザーにadmin権限が付与されていることを検証します。
ADMIN_LINKSテンプレートを使用して「管理」ページを構成します。
構成されたWebページをWebサーバーに返します。
Webサーバーは、Content Serverサービスの結果を、元のWebブラウザ・クライアントに配信します。
例
次の例では、検索リクエストの実行に永続URLが使用される場合に発生するステップについて説明します。
標準的な「検索」ページでユーザーが「検索」ボタンをクリックすると、GET_SEARCH_RESULTSサービスに対するリクエストがWebサーバーに送信されます。検索リクエストのURLでは、次のように、実行するサービス、検索条件、および結果パラメータを指定します。
IdcService=GET_SEARCH_RESULTS&QueryText=oracle&ftx=1 &AdvSearch=True&ResultCount=25&SortField=dInDate&SortOrder=Desc
Webサーバーは、このリクエストをContent Serverの関数と認識し、具体的なリクエストをContent Serverに送信します。
Content Serverは、リクエストを検索エンジンに渡します。
検索エンジンは、検索結果をContent Serverに返します。
Content Serverは、ユーザーのログイン権限およびセキュリティ権限に基づき、検索結果ページを構成してWebサーバーに返します。
Webサーバーは、結果を元のWebブラウザ・クライアントに配信します。
Content Serverをクライアント・サーバー操作モードで使用している場合は、いくつかのパラメータを使用してロケール依存型のデータの処理を向上させ、日付とエンコーディングに不整合の障害が発生しないようにすることができます。
次の説明では、Content Serverに対して、HDA書式設定されたリクエストが、IdcClient、IdcCommandUX、IdcServerBean、カスタム・サーバー通信などの操作を使用して行われていると想定しています。
使用できるパラメータは、次のとおりです。
UserDateFormat
: 受信リクエスト内の日付、およびリクエストに対するレスポンスで生成された日付に対して、日付/時刻の書式を指定します。これを指定しないと、レスポンスの書式は常に、ログイン・ユーザーの日付ロケールを使用します。それが使用できない場合は、Content Serverのロケール日付を使用します。アーカイバのバッチ・ロード・ファイルに対しては、Content Serverで内部的に使用されるODBC日付/時刻書式を使用しないでください。タイムゾーンの多義性エラーが発生する恐れがあります。
UserDateFormat=M/D/YYYY hh:mm[:ss]{aa}!mAM,PM!zUTC
blDateFormat
: 受信リクエストの本文における日付の書式を指定します。レスポンスの書式には影響しません。これを設定すると、UserDateFormat
で設定される値をオーバーライドします。これを指定しないと、受信リクエストの書式は、ログイン・ユーザーのロケール日付書式を使用します。それが使用できない場合は、Content Serverのロケール日付書式を使用します。このパラメータは使用できません。ただし、リクエストの前にあるヘッダーのいずれかが、POST
の値が付いているREQUEST_METHOD
ヘッダーである場合は例外です。GET
スタイルのリクエストでは、このパラメータはサポートされません。
ClientEncoding
: レスポンスで使用される文字エンコーディングを指定します。charsetとjcharsetいずれの指定にもHDAヘッダー行がない場合は、リクエストの本文のデコードに使用されるエンコーディングもこのパラメータで指示されます。
ClientEncoding=cp1252
HEADER_ENCODING
: HDAリクエストの本文の前にあるヘッダーで使用されます。要求する側のエージェントはこれによって、ヘッダーのエンコーディングを指定できます。この機能は、ヘッダーのエンティティであるHTTP_INTERNETUSER
およびREMOTE_USER
のエンコーディングを指示する際に役立ちます。
blFieldTypes
: レスポンスを翻訳する際のフィールド・タイプ(日付またはメッセージ)を指定します。「メッセージ」は、書式設定された文字列(通常はエラー・メッセージ)で、ローカライズされていません。このパラメータを使用すると、ODBC書式設定されたフィールドが解析され、blDateFormat
またはUserDateFormat
で指定された書式で返されて、そのフィールドがリクエストにはなくレスポンスにのみある場合でも適用されます。フィールド・タイプがbiFieldTypes
で指定されていない場合、フィールドは未加工の文字列として扱われ、フィールドに対してローカライズは実行されません。
そのような翻訳を通常必要とするフィールドは、Content Serverの動作をカスタマイズした拡張で作成されたフィールド(たとえば、Idocスクリプトを使用して作成されたフィールド)のみです。これは、POST
スタイルのリクエスト(POST
の値が付いているREQUEST_METHOD
ヘッダー)にのみ使用可能です。これは通常、追加の日付フィールドを指定する場合に使用されます。また、フィールドが日付として特殊な扱いを必要とすることを示すには、UserDateFormat
またはblDateFormat
と組み合せて使用することが最適です。
blFieldTypes=xNewDate date, xComment message
extraFieldTypes
: レスポンスをHDA書式設定されたリクエストに翻訳する際のフィールド・タイプを指定するもので、blFieldTypes
のかわりに使用されます。Content Serverのリクエストに応える際に実行されるIdocスクリプトの式の内側で使用するのが最適です。レスポンスの書式を生成する際にIdocスクリプトで使用することはできません。レスポンスが(HDAなどの)データ形式になっているからです。ただし、HCSPフォームを処理したり、ドキュメント・プロファイルの効果を判別するなど、リクエストのロジックを実行する際に、Idocスクリプトが評価される他の場所で使用することはできます。
extraFieldTypes=xNewDate date, xComment message
convertDatabaseDate
: blFieldTypes
またはextraFieldTypes
が使用され、ODBC日付書式をレスポンスの目的の日付書式に変換していることを確認します。この変数は、blFieldTypes
変数またはextraFieldTypes
変数を使用する際に必要です。
この変数が設定されていない場合は、ODBC日付書式がレスポンスの目的の日付書式に変換されていないことがあります。この変数が設定されていない場合でも、ODBC日付は引き続き変換できます。これは、ある日付書式から別の日付書式への全面強制がレスポンスに必要であるとContent Serverが判定した場合に発生します。これは通常、受信した日付書式と送信する日付書式が異なる場合にのみ発生します。
convertDatabaseDate=1
SuppressResultLocalization
: レスポンスの返信前に実行されるローカライゼーション変換を抑止します。受信データに対する変換は、引き続き実行できます。
このパラメータは、メッセージがローカライズされないようにしたり、日付が全面変換されないようにする際に役立ちます。使用例としては、レスポンスを別のContent Serverインスタンスに転送して処理する場合や、データを永続的に格納し、必要に応じて元のContent Serverインスタンスに対して再実行する場合があります。
SuppressResultLocalization=1
日付とメッセージの処理に影響を与えるパラメータのすべては、このパラメータとともに使用できますが、それ以外のパラメータを使用できるのは、別のContent Serverインスタンスまたは現在のContent Serverインスタンスに対してデータを再実行するときのみです。
注意:
HDAリクエストを行う操作によって、これらのパラメータの値が設定される場合があります。したがって、値を設定したのに予想どおりに動作が変わらないとユーザーが気づく場合があります。
Content Serverサービスなどのアクティビティのためにユーザーを再認証することが必要になる場合があります。たとえば、ワークフロー中に、ワークフロー・プロセスの具体的なステップで、ユーザーのデジタル署名を取得することが必要になる場合が考えられます。これは、isRepromptLogin
構成変数を使用して行うことができます。この変数の詳細は、『Oracle WebCenter Content構成リファレンス』のisRepromptLoginに関する項を参照してください。
任意のサービスの再認証を強制するには、次の手順を実行します。
サービス定義関数としてcheckForRevalidateLoginを追加します。
行われているサービス・コールに対し、ランダムに生成された値とともに、パラメータとしてrevalidateLoginIDを追加します。
これらの2つのアクションを実行すると、revalidateLoginIDに対するパラメータと同じ値でAllowedLoginID Cookieが設定されるまで、Content Serverは現在指定されている資格証明を受け入れることを拒否します。このCookieは、現在の資格証明に対する冗長なチャレンジ中に設定されます。
これによって現在の資格証明がクリアされ、ユーザーがContent Serverのいずれの機能にアクセスする場合でも、ログインが再び必要になることに注意してください。
この例では、アプリケーションは5つのサービスをコールし、6つのプライベート関数を定義しています。
これらのサービスがコールされ、シリアライズされたHDA文字列がそれぞれに構築されます。
CHECKOUT_BY_NAME
CHECKIN_UNIVERSAL
DOC_INFO
GET_FILE
CHECKIN_UNIVERSALに対して定義されるパラメータは次のとおりです。
doFileCopy
dDocName
dDocTitle
dDocType
dSecurityGroup
dDocAuthor
dDocAccount
primaryFile
GET_TABLEサービスがコールされ、次のパラメータが定義されます。
tableName
定義されるプライベート関数は次のとおりです。
getNativeFilePath
checkOutByName
checkinUniversal
getDocInfo
getFile
parseResultSet
このサンプルはVisual Basicで記述されています。
' Defines a private function. Private Function getNativeFilePath() As String Dim idccmd As IdcCommandX Dim str As String Dim res Dim dID As String, dExtension As String, dDocType As String, dDocAccount As String dID = "2" dExtension = "pdf" dDocType = "acc" dDocAccount = "" ' Builds a serialized HDA string. str = "@Properties LocalData" + vbCrLf str = str + "dID=" + dID + vbCrLf str = str + "dExtension=" + dExtension + vbCrLf str = str + "dDocType=" + dDocType + vbCrLf str = str + "dDocAccount=" + dDocAccount + vbCrLf str = str + "@end" + vbCrLf Set idccmd = New IdcCommandX res = idccmd.init("sysadmin", "c:\oracle\bin") res = idccmd.computeNativeFilePath(str) Open "c:\newdoc.txt" For Binary Access Write As #1 Put #1, , str Put #1, , res Close #1 MsgBox (res) End Function ' Defines a private function. Private Function checkOutByName(ByVal dDocName As String) As String Dim idccmd As IdcCommandX Dim idcService As String, str As String Dim res ' Calls a service and builds a serialized HDA string. idcService = "CHECKOUT_BY_NAME" str = "@Properties LocalData" + vbCrLf str = str + "IdcService=" + idcService + vbCrLf str = str + "dDocName=" + dDocName + vbCrLf str = str + "@end" + vbCrLf ' In an actual application the return codes need to be handled. For this example, ' the service is called while there is no content with that specific dDocName. Set idccmd = New IdcCommandX res = idccmd.init("sysadmin", "c:\oracle\bin") res = idccmd.executeCommand(str) End Function ' Defines a private function. Private Function checkinUniversal(ByVal doFileCopy As String, ByVal dDocName As String, ByVal dDocTitle As String, ByVal dDocType As String, ByVal dSecurityGroup As String, ByVal dDocAuthor As String, ByVal dDocAccount As String, ByVal primaryFile As String) As String ' Builds a serialized HDA string. Dim idccmd As IdcCommandX Dim idcService, res, str As String ' Calls a service and builds a serialized HDA string. idcService = "CHECKIN_UNIVERSAL" str = "@Properties LocalData" + vbCrLf str = str + "IdcService=" + idcService + vbCrLf str = str + "doFileCopy=" + doFileCopy + vbCrLf str = str + "dDocName=" + dDocName + vbCrLf str = str + "dDocTitle=" + dDocTitle + vbCrLf str = str + "dDocType=" + dDocType + vbCrLf str = str + "dSecurityGroup=" + dSecurityGroup + vbCrLf str = str + "dDocAuthor=" + dDocAuthor + vbCrLf str = str + "dDocAccount=" + dDocAccount + vbCrLf str = str + "primaryFile=" + primaryFile + vbCrLf str = str + "@end" + vbCrLf ' exec hda... Set idccmd = New IdcCommandX res = idccmd.init("sysadmin", "c:\oracle\bin") res = idccmd.executeCommand(str) MsgBox (CStr(res)) End Function ' Defines a private function. Private Function getDocInfo(ByVal dID As String) As String Dim idccmd As IdcCommandX Dim idcService As String, str As String Dim res ' Calls a service and builds a serialized HDA string. idcService = "DOC_INFO" str = "@Properties LocalData" + vbCrLf str = str + "IdcService=" + idcService + vbCrLf str = str + "dID=" + dID + vbCrLf str = str + "@end" + vbCrLf ' exec hda.... Set idccmd = New IdcCommandX res = idccmd.init("sysadmin", "c:\oracle\bin") res = idccmd.executeCommand(str) MsgBox (res) End Function ' Defines a private function. Private Function getFile(ByVal dID As String, ByVal dDocName As String, ByVal RevisionSelectionMethod As String, ByVal Rendition As String) Dim idccmd As IdcCommandX Dim idcService, str As String Dim res As Variant Dim fileName As String Dim fileSize As Long Dim indexStop As Integer ' Calls a service and builds a serialized HDA string. idcService = "GET_FILE" str = "@Properties LocalData" + vbCrLf str = str + "IdcService=" + idcService + vbCrLf str = str + "dDocName=" + dDocName + vbCrLf str = str + "dID=" + dID + vbCrLf If (RevisionSelectionMethod = "Specific" Or RevisionSelectionMethod = "Latest" Or RevisionSelectionMethod = "LatestReleased") Then ' Ignore dDocName and use dID instead. str = str + "RevisionSelectionMethod=" + RevisionSelectionMethod + vbCrLf End If If (Revision = "Primary" Or Revision = "Web" Or Revision = "Alternate") Then str = str + "Revision=" + Revision + vbCrLf End If str = str + "@end" + vbCrLf ' exec hda... Set idccmd = New IdcCommandX res = idccmd.init("sysadmin", "c:\oracle\bin") res = idccmd.executeCommand(str) Open "c:\newdoc.txt" For Binary Access Write As #1 Put #1, , res Close #1 MsgBox (Len(res)) ' chop at filename= and store fileName indexStop = InStr(res, "filename=") tmpStr = (Mid(res, indexStop)) indexStop = InStr(tmpStr, Chr(13)) fileName = Mid(tmpStr, 10, indexStop - 10) MsgBox (fileName) ' MsgBox (CStr(Asc(Mid(tmpStr, 2, 1)))) ' chop at Content-length: and store fileSize tmpStr = Mid(tmpStr, indexStop) indexStop = InStr(tmpStr, "Content-Length: ") tmpStr = (Mid(tmpStr, indexStop)) indexStop = InStr(tmpStr, Chr(10)) fileSize = CLng(Mid(tmpStr, 17, indexStop - 17)) MsgBox (CStr(fileSize)) MsgBox (Len(res)) End Function Private Sub cmdAddUser_Click() frmAddUser.Show End Sub Private Sub cmdCheckin_Click() Dim idcService As String, doFileCopy As String, dDocName As String Dim dDocTitle As String, dDocType As String, dSecurityGroup As String Dim dDocAuthor As String, dDocAccount As String, primayFile As String ' Calls a service and defined parameters. idcService = "CHECKIN_UNIVERSAL" doFileCopy = "1" dDocName = "myDocNameNewh" dDocTitle = "myDocTitleb" dDocType = "ADACCT" dSecurityGroup = "Public" dDocAuthor = "Jennifer" dDocAccount = "" primaryFile = "c:/junk_b.doc" ' In an actual application check for errors. ' Lock the file in order to upload a new revision. Call checkOutByName(CStr(dDocName)) ' If the dDocName is not in the system, it gets added as first revision ' by the CHECKIN_UNIVERSAL call. Call checkinUniversal(doFileCopy, dDocName, dDocTitle, dDocType, dSecurityGroup, dDocAuthor, dDocAccount, primaryFile) End Sub Private Sub cmdDocInfo_Click() Call getDocInfo("269") End Sub Private Sub cmdDownload_Click() Call ba End Sub Private Sub cmdGetFile_Click() Call getFile("14", "", "", "") End Sub Private Sub cmdGetNativeFile_Click() Call getNativeFilePath End Sub Private Sub Command1_Click() Dim idccmd As IdcCommandX Dim res, str Open "c:\adduser.txt" For Append As #1 Set idccmd = New IdcCommandX res = idccmd.init("sysadmin", "c:\oracle\bin") str = "@Properties LocalData" + vbCrLf + "IdcService=ADD_USER" + vbCrLf + "dName=Jennifer" + vbCrLf + "dFullName=Jennifer Smith" + vbCrLf + "dPassword=password" + vbCrLf + "dEmail=email@example.com" + vbCrLf + "dUserAuthType=LOCAL" + vbCrLf + "@end" + vbCrLf + "@ResultSet UserAttribInfo" + vbCrLf + "2" + vbCrLf + "dUserName" + vbCrLf + "AttributeInfo" + vbCrLf + "Jennifer" + vbCrLf + "role,admin,15" + vbCrLf + "@end" + vbCrLf res = idccmd.executeCommand(str) Print #1, res Close #1 End Sub Private Sub Command2_Click() Dim idccmd As IdcCommandX Dim res, str Dim myRS As String Dim idcService, tableName As String idcService = "GET_TABLE" tableName = "Accounts" Open "c:\a_getsec.txt" For Append As #1 Set idccmd = New IdcCommandX res = idccmd.init("sysadmin", "c:\oracle\bin") str = "@Properties LocalData" + vbCrLf + "IdcService=" + idcService + vbCrLf + "tableName=" + tableName + vbCrLf + "@end" + vbCrLf myRS = idccmd.executeCommand(str) ' Parse out the results set. Call parseResultSet(myRS, tableName) Print #1, res Close #1 End Sub ' Calls a private function. Private Function parseResultSet(strResultsSet As String, strSearchString As String) As String Dim indexStop As Integer Dim tmpStr As String Dim numberOfRows As Integer Dim numberOfElementsInSet As Integer Dim resultElement() MsgBox (strResultsSet) ' Start of results set. indexStop = InStr(strResultsSet, "@ResultSet " & strSearchString) ' Check for error (0 index) before moving on. tmpStr = (Mid(strResultsSet, indexStop)) MsgBox (tmpStr) ' Determine how many data lines are in the HTA file. indexStop = InStr(tmpStr, "@end") For i = 1 To indexStop If (Mid(tmpStr, i, 1) = Chr(10)) Then numberOfRows = numberOfRows + 1 End If Next i numberOfRows = numberOfRows - 2 ' Remove the first line of data. ' Find first line that identifies the ResultsSet indexStop = InStr(tmpStr, Chr(10)) tmpStr = (Mid(tmpStr, indexStop + 1)) ' Get number of elements in record set, chop the line off the record set... indexStop = InStr(tmpStr, Chr(10)) numberOfElementsInSet = CInt((Mid(tmpStr, 1, indexStop))) tmpStr = (Mid(tmpStr, indexStop + 1)) ' Set storage array. ReDim resultElement((numberOfRows / numberOfElementsInSet), numberOfElementsInSet) Dim junk As String ' Populate array from HTA dataset For i = 1 To (numberOfRows / numberOfElementsInSet) For j = 1 To numberOfElementsInSet indexStop = InStr(tmpStr, Chr(10)) resultElement(i, j) = Mid(tmpStr, 1, indexStop - 1) tmpStr = (Mid(tmpStr, indexStop + 1)) junk = junk + resultElement(i, j) Next j Next i MsgBox (junk) parseResultSet = "je" End Function ' Set storage array. Sub ba() Dim b() As Byte 'This byte array will capture the file Dim strURL As String ' URL string Dim strDest As String ' Destination File ' Set the strURL to a valid address. 'strURL = "http://localhost/cs/idcplg?IdcService=GET_FILE&dID=14" 'strDest = "C:\myjunk.html" strURL = "localhost" b() = Inet1.OpenURL(strURL, icByteArray) 'Open strDest For Binary Access Write As #1 'Put #1, , b() 'Close #1 End Sub
場合によっては、CGIリクエスト(GETとPOSTのいずれか)を実行した後で、デフォルト以外のページを表示(レスポンス・テンプレートの配信メカニズムを変更)したほうが好ましいこともあります。たとえば、ログイン後、または検索の実行後に、ページをリダイレクトすることができます。これを行う1つの方法としては、コンポーネント・アーキテクチャを通じてサービス・コールを変更し、別のテンプレート・ページを指定します。必要に応じてこれを行う別の、より柔軟な方法としては、urlTemplateパラメータを指定し、レスポンス・ページをHCSPまたはHCSTにリダイレクトして、結果の書式を好きなように再設定します。
この項の内容は次のとおりです。
この演習に取りかかる前に、Idocスクリプトと動的サーバー・ページ(HCST、HCSP、HCSF)にある程度慣れておいてください。また、Content Serverの機能とコンポーネント・アーキテクチャにも、ある程度慣れておいてください。HTML FORMオブジェクトに慣れておくことも役立ちます。詳細は、『Oracle WebCenter Content構成リファレンス』を参照してください。
例として、URLテンプレートとして使用できるHCSTページを作成して、検索結果の書式を再設定します。HCSPを使用することもできますが、簡略にするためにHCSTを使用します。ファイルにtest_result.hcstという名前を付け、次のテキストを含めます。
<html> <table width=300> <tr bgcolor="#000000" style="color: #ffffff;"> <td><b>Name</b></td> <td><b>Title (Author)</b></td> </tr> <$loop SearchResults$> <tr <$if doShade$>bgcolor="#E5E7D4"<$endif$>> <td><a href="<$URL$>"><$dDocName$></a></td> <td><$dDocTitle$> (<$dDocAuthor$>)</td> </tr> <$if doShade$><$doShade=""$><$else$><$doShade="1"$><$endif$> <$endloop$> </table> </html>
次に、このファイルをContent Serverインスタンスにチェックインします。簡略にするために、パブリック・セキュリティ・グループにチェックインし、コンテンツ・タイプをADACCT、コンテンツIDをtest_resultとします。そのURLは次のようになります。
http://
myhost
/oracle/groups/public/documents/document/test_result.hcst
新規のテンプレートをテストするには、まず検索ページに進みます。いずれかの検索条件に入力して「検索」をクリックします。標準的な検索ページが表示され、そこには結果も含まれます。
ここで、検索結果ページに誘導したURLの最後に、次のテキストを追加します。
&urlTemplate=/oracle/groups/public/documents/adacct/test_result.hcst
同じ検索結果が、最小のHTMLページに書式設定された状態で表示されます。完全URLが使用されるのではなく、ホスト・コンピュータを基準としたURLのみが使用されることに注意してください。
デフォルトの検索ページを、ページの初期設定に際して常にこのテンプレートを使用するようにする場合は、検索ページ上のHTML FORMオブジェクトを変更して、次のフィールドも含むようにすることができます。
<input type=hidden name='urlTemplate' value='/oracle/groups/public/documents/document/test_result.hcst'>
これを行うには、インクルードquery_results_options
を変更したコンポーネントを作成して、サンプルのHTMLを含むようにします。あるいは、urlTemplateの値を、JavaScriptを使用して検索ページで動的に計算し、ユーザーによって入力されたメタデータに基づいて別のページにリダイレクトすることもできます。
結果ページを変更するには、urlTemplate以外に、docTemplateName、docTemplateID、RedirectUrlの各パラメータも使用できます。これらの動作は、次のようにすべて異なります。
urlTemplate: 使用するhcstページの完全な相対URLに設定します。次に例を示します。
IdcService=DOC_INFO&urlTemplate=/idc1/groups/public/documents/adacct/test_result.hcst
RedirectURLはすべてのサービス・コールと連携しているわけではなく、6.0より古いバージョンのContent Serverソフトウェアでは、docTemplateNameとdocTemplateIDに小規模なデータ汚染の不都合があるため、通常の場合、urlTemplateを使用するのが最も安全な方法です。ただし、テンプレートのコンテンツ・タイプまたはセキュリティ・グループを変更すると、そのURLは有効でなくなり、更新することが必要になります。また、このパラメータは、POSTサービスに使用されるテンプレートをオーバーライドする場合にはお薦めしません。
docTemplateName: テンプレートのdDocName(たとえば、test_result)に設定します。このパラメータはurlTemplateのように動作しますが、dDocNameがdocTemplateNameであるドキュメントの、最新リリースのWeb表示可能ファイルの場所を見つけます。
docTemplateID: 特定のリビジョンのテンプレートのdID(たとえば、100)に設定します。docTemplateNameのように動作しますが、特定のdIDリビジョンのWeb表示可能ファイルを見つけます。
RedirectUrl: Content Serverに戻す、CGI URLの最後の部分(たとえば、IdcService=DOC_INFO&dID=<$dID$>
)に設定します。これは、アクションprepareRedirect
を実行する数十個のPOSTサービス(CHECKIN_NEWやSUBMIT_HTML_FORMなど)のみを対象としています。
それぞれのHTML POST後にリダイレクトを使用すると、エンド・ユーザーはポストを再発行しなくても、レスポンス・ページを安全にリフレッシュできます。これらのサービスそれぞれの定義には、3:prepareRedirect:….:0:null
行があります。RedirectUrlは、prepareRedirectメソッドの結果をオーバーライドします。また、リダイレクト先の場所として別のURLを使用できるようにします。RedirectUrlの中には、リダイレクトの発行直前に実行されるIdocスクリプトを組み込むことができます。これによって、Idocスクリプトでのネスティングが複雑なものになる可能性があります。それは、RediretUrlの割当ては通常、リソース・インクルードの中で行われるからです。次に例を示します。
… Standard Idoc form beginning … <input type=edit name=myparam value=''> <input type=hidden name=RedirectUrl value='<$HttpCgiPath$>?<$xml('IdcService=MY_RESPONSE_TEMPLATE&dID=<$dID$>& myparam=<$myparam$>')$>'> … Standard Idoc form closure …
Idocスクリプトの多くは、Idocのリテラル文字列の内側でネストされます。この場合、リダイレクトURLが計算されるまで、スクリプトの実行が遅れます。これにより、myparam
の値をユーザーが選択することが引き続き必要でも、この値はRedirectUrlによって選択できます。
外側には一重引用符、内側には二重引用符を使用します。これで混乱がなくなります。また、HTMLとIdocスクリプトの両方が、引用の際に一重と二重両方の引用符をサポートしているため、コンストラクトをネストする際に、この2つを切り替えることが適切となることがあります。
xml関数の使用に注意してください。これにより、入力フィールドの値は間違いなく、適切に書式設定されたHTMLリテラル文字列コンストラクトになります。具体的に、この場合には不要です。ただし、より複雑なコンストラクトには役立つ場合があります。
EventTriggerフィールドの値はバイナリ形式で設定する必要があります。すなわち、特定のドキュメント/フォルダに対して実行された操作/アクションのイベント通知を無効にするには0、有効にするには1を設定します。
各ビットは独立しているため、これらのビット間に関係はありません。フィールド長の合計は、“N”ビットです(N = X+Y+Z)。左側の最初の“X”ビットは、ドキュメントとフォルダ両方に対して実行された、事前定義された特定の共通操作のイベント生成メカニズムを定義します。次の“Y”ビットと“Z”ビットのセットは、フォルダとドキュメントそれぞれに固有のアイテム(ドキュメント/フォルダ)に対して実行された、事前定義された操作のイベント生成メカニズムを定義します。
注意:
XXX: これらのビットは、新しい機能/操作を通知する場合のために、今後に備えて予約されています。次のトピックで説明するように、Xビット、YビットおよびZビットを構成できます。
Xビット(共通ビット)の構成
NEW
: このビットは、アイテムの作成中にイベントを通知する必要があることを示します(ドキュメントのチェックインまたは新規フォルダの作成)。
UPDATE
: このビットは、ドキュメント/フォルダ・メタデータが更新されたときに、イベントを通知する必要があることを示します。
COPY
: このビットは、ドキュメント/フォルダに対してコピー操作が実行されたときに、イベントを通知する必要があることを示します。
MOVE
: このビットは、ドキュメント/フォルダに対して移動操作が実行されたときに、イベントを通知する必要があることを示します。
DELETE
: このビットは、ドキュメント/フォルダに対して削除操作が実行されたときに、イベントを通知する必要があることを示します。
ADD_SHORTCUT
: このビットは、ドキュメント/フォルダの新しいショートカットが作成されたときに、イベントを通知する必要があることを示します。
フォルダ・アイテム用のYビットの構成
NEW_CHILD_ITEM
: このビットは、フォルダに新しい直下の子アイテム(ドキュメント/サブフォルダ)が追加されたときに、イベントを通知する必要があることを示します。
CHILD_UPDATE
: このビットは、直下の子アイテムのメタデータが更新されたときに、イベントを通知する必要があることを示します。
CHILD_REMOVE
: このビットは、フォルダから直下の子アイテムが削除されたときに(移動または削除によって)、イベントを通知する必要があることを示します。
NEW_CHILD_SHORTCUT
: このビットは、直下の子アイテムの新しいショートカットが作成されたときに、イベントを通知する必要があることを示します。
ドキュメント・アイテム用のZビットの構成
FILE
: このビットは、ドキュメントに対してFILE
操作が実行されたときに、イベントを通知する必要があることを示します。すなわち、ドキュメントがフレームワーク・フォルダの一部になったときにイベントを通知する必要があります。
UNFILE
: このビットは、ドキュメントに対してUNFILE
操作が実行されたときに、イベントを通知する必要があることを示します。すなわち、ドキュメントがフレームワーク・フォルダ外に移動したときにイベントを通知する必要があります。
NEW REVISION
: このビットは、ドキュメントの新しいリビジョンが追加/作成されたときに、イベントを通知する必要があることを示します。
DELETE REVISION
: このビットは、ドキュメントからリビジョンが削除/移動されたときに、イベントを通知する必要があることを示します。
EventTrigger
フィールド値の継承メカニズムは、アイテムのタイプに基づきます。
EventTrigger
フィールドに値が設定されていないアイテム。
FrameworkFolders
コンポーネントに属し、エンタープライズ・ライブラリの一部であるアイテム。
フォルダのフィールド値継承
フォルダがエンタープライズ・ライブラリの一部であり、EventTriggerフィールドの値が明示的に設定されていない場合、値はフォルダが属するエンタープライズ・ライブラリから継承されます。このライブラリを、EventTrigger
フィールドの値として定義する必要があります。親フォルダがEventTrigger
フィールドの値をオーバーライドした場合であっても、直上の親フォルダから継承することはできません。
この図では、LIBRARY_1
に設定されたEventTriggerフィールドの値を、階層内のすべてのサブフォルダに適用/継承できます。ただし、EventTrigger
フィールドの値をオーバーライドしたFOLDER_11
は除きます。
ドキュメントのフィールド値継承
ドキュメントがエンタープライズ・ライブラリの一部であり、EventTrigger
フィールドの値が明示的に設定されていない場合、値は次のいずれかから継承されます。
親フォルダがEventTrigger
フィールドの値をオーバーライドした場合のみ、ドキュメントが属する直上の親フォルダ。これは、次の項目よりも優先されます。
ライブラリにEventTrigger
フィールドの値が定義されている場合のみ、ドキュメント・フォルダが属するエンタープライズ・ライブラリ。
この図では、LIBRARY_1
に設定されたEventTriggerフィールドの値を、階層内のすべてのドキュメントに適用/継承できます。ただし、DOC_11
は除きます。DOC_11
の親フォルダFOLDER_11
はEventTrigger
フィールドの値をオーバーライドしたためです。したがって、FOLDER_11
の値がDOC_11
に適用されます。