第11章
この章では、exteNd Directorサービスにプログラムでアクセスする方法の概要について説明します。この章の節は次のとおりです。
exteNd DirectorアプリケーションのJavaコードを記述するには、JavaコードでexteNd Director APIを使用して、そのメソッドを呼び出します。exteNd Director APIには、いくつかのパッケージに整理されるパブリッククラス(およびインタフェース)が提供されています。これらは、サブシステムによって整理されます。
exteNd Director APIは、Java 2 API (J2SEおよびJ2EE)に基づいています。これは、この中にはJava 2から継承したクラスが含まれ、Java 2インタフェースを実装することを意味します。 Java 2 APIに精通している場合は、exteNd Director APIをすぐに理解して使用することができる知識があるといえます。
JavaはWebアプリケーションの標準言語であり、exteNd Directorアプリケーションを開発する場合に一般的な方法で使用します。 たとえば、次のような処理を行います。
各オブジェクトデータの「フィールド」(変数)やオブジェクトが実行するアクションの「メソッド」など、アプリケーションのオブジェクトを表す「クラス」を記述します。
パッケージおよびクラスを「JAR」(およびその他のアーカイブファイル)にバンドルします。これは、クライアントがサイズが小さく高速のダウンロードを行えるように、また特定の展開操作を簡潔化するために使用されます。
exteNd Directorは、次の内容を含む「Java 2プラットフォーム」をサポートしています。
これらには、コアのJava言語および様々なJava APIが含まれます。
コアJava言語とは、基本的なプログラミングを実行するために使用する構文です。次のものが含まれます。
この構文の大部分のモデルとなっているのは、C およびC++です。(JavaおよびJavaScriptはその他の点で大部分異なるものの) JavaScriptプログラマもその類似点に気付くでしょう。
APIは、「Application Programming Interface」の略語です。Javaでは、APIは(1つまたは複数のパッケージの)パブリッククラスのコレクションであり、次の機能を果たします。
生産性が特に重要であるビジネスプログラミングの場合、1つまたは複数のAPIに常にアクセスします。 たとえば、Java標準(J2SE) APIでは、アプリケーションに組み込むことが必要となる、基本的な機能のほとんどが提供されます(グラフィカルユーザインタフェース、入力/出力、データタイプの操作、スレッド処理、ネットワーキング、セキュリティ、SQL、各国対応などのサポートなどが提供されます)。 これらの機能を独自に開発する必要はありません。
その他のJavaおよびベンダAPI(exteNd Director APIなど)では、汎用アプリケーションサービスを超えた、より高度なレベルのシステムおよびビジネスニーズへの対応が可能になります。
Javaの初心者である場合、または特定のJavaトピックについて調べる必要がある場合は、次の学習リソースを参照してください。
著書 Javaに関する多くの著書が利用できますが、お勧めできる著書を次にご紹介します。
『Core Java』 - 著者: Cay S. Horstmann and Gary Cornell 発行所: Prentice-Hall
『Java in a Nutshell』 - 著者: David Flanagan 発行所: O\qReilly & Associates
『Teach Yourself Java 2 in 21 Days』 - 著者: Laura Lemay 発行所: Sams
『The Java Programming Language』 - 著者: Ken Arnold and James Gosling 発行所: Addison-Wesley
Webサイト Javaに関する多くのWebサイトが利用できますが、お勧めできるWebサイトを次にご紹介します。
アプリケーションを作成する場合、アプリケーションで必要な機能またはサービスに基づいて特定のJava APIを使用します。必要なAPIを簡単に選択できるように、SunはAPIをJava 2プラットフォームの異なるエディションにグループ分けしています。
エディション |
説明 |
---|---|
J2SEと標準API |
作成するほとんどすべてのJavaアプリケーションの基礎 |
J2EEといくつかのAPI |
次の企業レベルの特定機能およびサービスをJavaアプリケーションに追加 |
Javaの基本に精通していれば(コア言語およびJ2SE APIを含む)、J2EEについて学習してそれを次のリソースから使用できます。
リソース |
説明 |
---|---|
Java 2 SDK, EnterpriseEdition DocumentationBundle |
Sunが提供するJ2EE学習のためのインデックスおよび参照マニュアル。多数のドキュメントおよびWebサイトにリンクされています。 |
API仕様 |
javadoc形式でのJ2EE APIの参照ガイド。 |
これらのリソースは両方、java.sun.com.から入手できます。
次の表を使用して、アプリケーションに必要な主要なexteNd Director機能またはサービスを提供するパッケージを検索してください。
機能領域 |
パッケージ |
---|---|
コンテンツ管理 |
|
ディレクトリ |
|
フレームワーク |
|
ポータル |
|
ルール |
|
検索 |
|
セキュリティ |
|
ユーザ |
|
ユーティリティクラスおよびヘルパクラス |
|
WebDAV |
|
ワークフロー |
|
exteNd Director APIという名前は、すべてのパブリックパッケージを指します。 APIという用語は、これらのパッケージの特定のサブセットにも適用されます。たとえば、通常コンテンツ管理APIという名前は、次のグループのパッケージを参照する場合に使用されます。
その他のAPIは単に、完全なAPIの特定の部分を指す場合に使用されるラベルであることに注意してください。
exteNd Directorでは、完全なAPI仕様がjavadoc形式で提供されています。この仕様では、パブリックexteNd Director APIのすべてのパッケージ、クラス、インタフェース、およびメンバーについての詳細が記載され、Java 2 APIマニュアルへのリンクが含まれています。 これは、Javaで行うすべてのexteNd Directorプログラミングにとって不可欠な参照資料です。
exteNd DirectorAPIに関する詳しい参考情報については、オンラインヘルプの『APIリファレンス』を参照してください。
exteNd Directorサブシステムのサービスにアクセスするには、まず最初にファクトリを使用してサブシステムのマネージャオブジェクトへの参照を取得する必要があります。この処理は、次のいずれかの方法で実行できます。
委任を使用する場合、サービスがローカルマネージャオブジェクトまたはリモートオブジェクトのどちらを使用するのかを把握したり、注意したりする必要はありません。このため、ほとんどの場合では、サブシステムサービスにアクセスするために委任を使用することをお勧めします。
各サブシステムでは、サブシステムのマネージャオブジェクトにアクセスするために適した、EboFactoryと呼ばれる1つまたは複数のファクトリクラスが提供されています。
マネージャオブジェクトへの参照があれば、Javaクラスでの処理と同様にそのオブジェクトでメソッドを呼び出しできます。
いくつかのexteNd Directorサブシステムでは、サブシステムサービスにアクセスするために委任を使用できます。「委任」は、サービスの位置を隠すラッパです。委任モデルは、J2EE Business Delegateパターンに従います。
委任を使用する場合、サービスがローカルマネージャオブジェクトまたはリモートオブジェクトのどちらを使用するのかを把握したり、注意したりする必要はありません。委任は、まず、ローカルマネージャをインスタンス化しようとします。このインスタンス化に失敗すると、代わりにリモートオブジェクトを使用しようとします。この方法により、開発者は、クライアントとサーバで同じコードを使用して、サービスをインスタンス化できます。
exteNd Directorには、マネージャごとに1つまたは複数の委任が提供されています。たとえば、次のとおりです。 Content Managementサブシステムには委任が1つありますが、Userサブシステムには委任が4つあります(ユーザ、グループ、UserMeta、およびUserPersonalization)。
サブシステムサービスにアクセスするために委任を使用するには、使用するサブシステムのカスタムEboFactoryクラスで委任アクセッサを呼び出す必要があります。必要なメソッドを持つEboFactoryクラスは通常、clientと呼ばれるサブパッケージのサブシステムパッケージ階層にあります。
委任モデルは次のサブシステムでサポートされています。
例 たとえば、コンテンツ管理サービスにアクセスするためにコンテンツ管理委任を使用するには、次のコードを実行します。
import com.sssw.cm.api.*; ... EbiContentMgmtDelegate contentMgr = com.sssw.cm.client.EboFactory.getDefaultContentMgmtDelegate(); ...
委任への参照がある場合は、単純に委任でメソッドを呼び出すことができます。 次の例は、この処理方法を示します。
EbiDocument tempdoc = contentMgr.getDocument(context,selectedDoc);
同様に、ユーザサブシステムサービスにアクセスするためにユーザ委任を使用するには、次のコードを実行します。
import com.sssw.fw.usermgr.api.*; ... EbiUserDelegate userMgr = com.sssw.fw.usermgr.client.EboFactory.getUserDelegate(); EbiUserInfo userinfo = userMgr.createUser(context); ...
ローカルマネージャにアクセスするための委任の使用 委任は、まず、ローカルマネージャをインスタンス化しようとします。このインスタンス化に失敗すると、代わりにリモートオブジェクトを使用しようとします。この方法では、ローカルマネージャのみを使用する試みでエラーがマスクされます。ローカルインスタンス化が失敗する状況を簡単に識別できるように、委任コンストラクタでは、インスタンス化が失敗するとログに情報メッセージが表示されます。
パラメータ化された委任ファクトリコンストラクタを使用することによって、委任でローカルマネージャのみが使用されるように強制することもできます。この処理を実行するには、ローカル委任のみが必要であることを示す文字列を渡します。EbiDelegateインタフェースでは、ローカル委任が必要であることを示すために使用できる定数が提供されています。コンストラクタが失敗すると、ローカルマネージャでのインスタンス化エラーは受け入れられません。 以下は、その例です。
import com.sssw.fw.api.*; ... EbiUserDelegate ud = com.sssw.fw.usermgr.client.EboFactory.getUserDelegate(EbiDelegate.SERVICE_LOCAL);
exteNd Directorサブシステムの中には、マネージャオブジェクトを直接取得する方法が提供されているものもあります。たとえば、Portalサブシステム(com.sssw.portal.factory.EboFactory)のEboFactoryクラスには、次に示すように、マネージャオブジェクトの取得に使用できるメソッドがいくつかあります。
たとえば、ポータルマネージャへの参照をポートレットから取得するには、次のコードを使用します。
import javax.portlet.*; ... PortletContext context = getPortletContext(); EbiPortalManager portalMgr = com.sssw.portal.factory.EboFactory.getPortalManager(context); String userUUID = portalMgr.getUserPortalInfo(context).getUserUUID(); ...
委任が提供されているサブシステムの中には、マネージャオブジェクトへの直接サポートが提供されているものもあります。このサポートは、サブシステムがローカルで実行している状況で使用できます。
ルールマネージャへのアクセス Ruleサブシステムでは、異なる方法を使用してマネージャを取得することが要求されます。1つのマネージャインスタンスしか持てないその他のサブシステムとは異なり、Ruleサブシステムでは複数のルールマネージャインスタンスを操作できます。 このため、ルールマネージャを使用するには、次のようにオブジェクトのインスタンスを作成する必要があります。
EbiRuleManager rm = com.sssw.re.factory.EboFactory.createRuleManager("sample" );
exteNd Directorアプリケーションでエラーおよび例外が発生することがあり、多くのソースが原因と考えられます。たとえば、ユーザからの不正な入力、アプリケーションサーバでの問題、データベースエラー、およびexteNd Directorオブジェクトでの不適切な操作などがあります。
アプリケーションを開発する際、エラーおよび例外の処理方法やユーザに対してアプリケーションの状態を通知する方法を計画する必要があります。チームで、エラーメッセージを一貫して表示するためのガイドラインを作成することをお勧めします。 ほとんどのアプリケーションは、次のような一連のエラー処理の目的を達成するように設計されます。
Javaでは、信頼性が高く、一貫した方法でエラーを処理する機会が与えられます。ただし、例外を受け取る方法によってどのようにアプリケーションの流れが影響されるかということに注意する必要があります。実践的なヒントについては、『Practical Java Programming Language Guide』(著者: Peter Haggar、出版: Addison-Wesley)を参照してください。
ここで説明されているエラー処理は、Java アプリケーションで実行する必要のある標準の Java エラー処理の延長です。詳細については、Sun MicrosystemsのJavaマニュアルを参照してください。
com.sssw.fw.exceptionパッケージのベース例外クラスを次の表に示します。 例外は、exteNd Directorアプリケーションのランタイム処理の間に、さまざまな原因で発生します。 これらはすべて、JDKベースクラスExceptionの拡張です。
最も一般的な例外はNullPointerExceptionです。この例外を回避するには、nullの戻り値を必ず確認してください。多くのexteNd Directorメソッドの場合、nullの戻り値は有効な応答であり、目的のオブジェクトが存在しないことを伝えています。
これらの状況では、有効なオブジェクトを常に確認する必要があります。
例外が宣言されたアプリケーションコードでメソッドをコールする場合、Javaアプリケーションで必ず行うのと同様に、try/catch/finallyブロックでメソッドを囲む必要があります。 ランタイム例外の場合、エラーが発生するとアプリケーション状態が無効になる場所では常に、try/catch/finallyブロックを使用できます。
コードで例外が取得された場合は、ユーザに対してその問題に関する情報を表示して、何が機能していないかをユーザに伝える必要があります。ヒントについては、メッセージの表示を参照してください。また、アプリケーションをエラーのない状態に戻すために適切な処置を行う必要があります。 空のcatchブロックをコーディングしたり、単純に例外をログ出力したりしないでください。
実行すべきでないこと 次の例では、アプリケーションまたはユーザが問題を修復することはできません。
try { // code that could throw an exception } catch (Exception e) { } try { // code that could throw an exception } catch (Exception e) { System.err.println("Exception:" + e.toString() ); e.printStackTrace(context.getLocale()); }
望ましい方法 ユーザに対するメッセージを準備して、失敗した内容をクリーンアップするcatchブロックを記述します。 また、catchブロックで例外を再スローして、呼び出しメソッドで処理することもできます。
これらのcatchブロックでは、2つの異なる例外を取得して、セクションにエラーメッセージを保存します。 アプリケーションでエラーキーのセッション内のメッセージが見つかると、そのメッセージがユーザに対して表示されます。定数によって、セッションデータで使用されるキーが識別されます。
catch (EboUnrecoverableSystemException e) { // send trace to server console e.printStackTrace(context.getLocale()); // save error message for later display String errMsg = e.getMessage(context.getLocale()); m_portalSession.setValue( COMP_KEY, ERROR_MESSAGE_KEY, errMsg); } catch (Exception e) { // send trace to server console e.printStackTrace(context.getLocale()); // get the appropriate error message for later display ResourceBundle myResources = ResourceBundle.getBundle("MyResources", context.getLocale()); String errMsg = myResources.getString("ERR_CAT_UNKWN"); m_portalSession.setValue( COMP_KEY, ERROR_MESSAGE_KEY, errMsg); }
ここに表示されているリソースバンドルの詳細については、ユーザ言語でのエラーの表示を参照してください。
ヒント: スタックトレースをサーバコンソールに直接送信する代わりに、有効な方法で出力を 識別するexteNd Directorログ出力機能を使用できます。詳細については、を参照してくださ い。
メッセージについて考える場合に役立つ方法は、ユーザがタスクを完了するための手引きとなるメッセージと、ユーザが処理することのできないエラー条件についてユーザに伝えるメッセージを区別することです。
アプリケーションコード アプリケーションロジックによって、これら2つのタイプのメッセージを表示する方法が異なることがあります。 たとえば、ユーザが入力しているフォーム上に参考メッセージが表示する場合があります。 エラーメッセージを表示するために、フォームをコンテンツとして置換し、フォームを表示できない理由を説明する場合があります。
ページ ページには、エラーを説明するエラーページにブラウザをリダイレクトすることによってエラーを表示できます。JavaServer Pagesには、エラーページを表示するメカニズムが提供されています。 エラーが発生すると、JSPページによってブラウザは作成されたエラーページにリダイレクトされます。JSPページのエラーメッセージを設計する方法の詳細については、Sun Microsystems (java.sun.com)のマニュアルを参照してください。
アプリケーションで例外が連続して再スローされた場合、最新の例外には関連したメッセージが含まれない可能性があります。ペアレント例外を確認すると、発生したすべての例外のメッセージを取得できます。
ペアレント例外を確認する例 この例では、捕捉されている例外のタイプは、何らかのフレームワーク例外クラスと考えられます。 このコードでは、ラップおよび再スローされた例外のすべてのメッセージが連結されます。
catch (EboException e) { StringBuffer msg == ""; java.lang.Throwable parent = e; while (parent != null) { msg.append( parent.getMessage(context.getLocale() + "\n"); parent = EboException.getParentException(parent); } }
exteNd Directorアプリケーションを国際的に利用できるようにするには、ユーザが使用する言語でメッセージを表示する必要があります。 ユーザのロケールは、getLocale()メソッドを使用してEbiContextオブジェクトから取得できます。これを使用して、適切に翻訳されたエラーメッセージを取得できます。
例外の場合は、ロケール引数を使用してgetMessage()を呼び出します。exteNd Directorでは、例外メッセージのローカライズされたバージョンが提供されています。
e.getMessage(context.getLocale())
リソースバンドルを使用してメッセージ文字列を保存し、ユーザのロケールを使用してメッセージ文字列にアクセスします。サポートする各ロケールに対して、翻訳された一連のメッセージをサブクラス化されたバンドルで提供できます。詳細については、java.util.ListResourceBundleおよび下の例を参照してください。
ユーザのロケールは、getLocale()メソッドを使用してEbiContextオブジェクトから取得できます。
MyErrorsResourceクラスには、メッセージアレイに文字列が1つあります。2番目のクラスでは、同じ文字列がフランス語で提供されています。サポートするすべての言語で、ListResourceBundleの追加のサブクラスを提供できます。それぞれの名前には、デフォルトのバンドルおよび言語コードの名前が使用されています。ロケールおよび言語コードの詳細については、java.util.Localeを参照してください。
class MyErrorsResource extends ListResourceBundle { public Object[][] getContents() { return contents; } static final Object[][] contents = { // LOCALIZE THIS {"ERR_CAT_UNKWN", "An unknown error has occurred while attempting to save the category information."}, // unknown error for categories // END OF MATERIAL TO LOCALIZE }; } //==================== class MyErrorsResource_fr extends ListResourceBundle { public Object[][] getContents() { return contents; } static final Object[][] contents = { // LOCALIZE THIS {"ERR_CAT_UNKWN", "Une erreur inconnue a arriv\x81 Een tentant \x81 E\xe9 pargne l\qinformation de cat\xe9 gorie."}, // unknown error for categories // END OF MATERIAL TO LOCALIZE }; }
特定のエラー状況に対する文字列にアクセスするには、その文字列に関連付けたキーを知っておく必要があります。バンドルを取得すると、JDKはロケールを使用して、提供されたバンドルの適切なバージョンを探します。ロケールに一致するバンドルが見つからない場合は、デフォルトのバンドルが使用されます。
ResourceBundle myResources = ResourceBundle.getBundle( "MyErrorsResources",context.getLocale()); String msg = myResources.getString("ERR_CAT_UNKWN");String msg = myResources.getString("ERR_CAT_UNKWN");
Copyright © 2004 Novell, Inc. All rights reserved. Copyright © 1997, 1998, 1999, 2000, 2001, 2002, 2003 SilverStream Software, LLC. All rights reserved. more ...