第11章

exteNd DirectorアプリケーションのJavaコードディング

この章では、exteNd Directorサービスにプログラムでアクセスする方法の概要について説明します。この章の節は次のとおりです。

 
Top of page

exteNd DirectorアプリケーションのJavaコーディングについて

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をすぐに理解して使用することができる知識があるといえます。

 
Top of page

Javaの使用

JavaはWebアプリケーションの標準言語であり、exteNd Directorアプリケーションを開発する場合に一般的な方法で使用します。 たとえば、次のような処理を行います。

 
Top of section

Javaプラットフォームサポート

exteNd Directorは、次の内容を含む「Java 2プラットフォーム」をサポートしています。

これらには、コアのJava言語および様々なJava APIが含まれます。

 
Top of section

コア言語について

コアJava言語とは、基本的なプログラミングを実行するために使用する構文です。次のものが含まれます。

この構文の大部分のモデルとなっているのは、C およびC++です。(JavaおよびJavaScriptはその他の点で大部分異なるものの) JavaScriptプログラマもその類似点に気付くでしょう。

 
Top of section

APIについて

APIは、「Application Programming Interface」の略語です。Javaでは、APIは(1つまたは複数のパッケージの)パブリッククラスのコレクションであり、次の機能を果たします。

生産性が特に重要であるビジネスプログラミングの場合、1つまたは複数のAPIに常にアクセスします。 たとえば、Java標準(J2SE) APIでは、アプリケーションに組み込むことが必要となる、基本的な機能のほとんどが提供されます(グラフィカルユーザインタフェース、入力/出力、データタイプの操作、スレッド処理、ネットワーキング、セキュリティ、SQL、各国対応などのサポートなどが提供されます)。 これらの機能を独自に開発する必要はありません。

その他のJavaおよびベンダAPI(exteNd Director APIなど)では、汎用アプリケーションサービスを超えた、より高度なレベルのシステムおよびビジネスニーズへの対応が可能になります。

 
Top of section

Javaを学習するためのリソース

Javaの初心者である場合、または特定のJavaトピックについて調べる必要がある場合は、次の学習リソースを参照してください。

著書   Javaに関する多くの著書が利用できますが、お勧めできる著書を次にご紹介します。

Webサイト   Javaに関する多くのWebサイトが利用できますが、お勧めできるWebサイトを次にご紹介します。

 
Top of page

Java APIの使用

アプリケーションを作成する場合、アプリケーションで必要な機能またはサービスに基づいて特定のJava APIを使用します。必要なAPIを簡単に選択できるように、SunはAPIをJava 2プラットフォームの異なるエディションにグループ分けしています。

エディション

説明

J2SEと標準API

作成するほとんどすべてのJavaアプリケーションの基礎

J2EEといくつかのAPI

次の企業レベルの特定機能およびサービスをJavaアプリケーションに追加

  • EJB (Enterprise JavaBeans)

  • Javaサーブレット

  • JavaServer Pages (JSP)

  • Javaポートレット

  • JDBC Standard Extension

  • JTA (Java Transaction)

  • JavaMail

  • JMS (Java Message Service)

  • JNDI (Java Naming and Directory Interface)

  • RMI-IIOP

  • JAF (JAF)

 
Top of section

J2EEを学習するためのリソース

Javaの基本に精通していれば(コア言語およびJ2SE APIを含む)、J2EEについて学習してそれを次のリソースから使用できます。

リソース

説明

Java 2 SDK, EnterpriseEdition DocumentationBundle

Sunが提供するJ2EE学習のためのインデックスおよび参照マニュアル。多数のドキュメントおよびWebサイトにリンクされています。

API仕様

javadoc形式でのJ2EE APIの参照ガイド。

これらのリソースは両方、java.sun.com.から入手できます。

 
Top of page

exteNd Director APIの使用

 
Top of section

exteNd Director APIパッケージ

次の表を使用して、アプリケーションに必要な主要なexteNd Director機能またはサービスを提供するパッケージを検索してください。

機能領域

パッケージ

コンテンツ管理

com.sssw.cm.api

com.sssw.cm.client

com.sssw.cm.event.api

com.sssw.cm.event.util

com.sssw.cm.factory

com.sssw.cm.task.api

com.sssw.cm.util

ディレクトリ

com.sssw.fw.directory.api

com.sssw.fw.directory.client

フレームワーク

com.sssw.fw.api

com.sssw.fw.cachemgr.api

com.sssw.fw.event.api

com.sssw.fw.event.factory

com.sssw.fw.exception

com.sssw.fw.factory

com.sssw.fw.log

com.sssw.fw.persist.jdbc.api

com.sssw.fw.persist.jndi.api

com.sssw.fw.resource

com.sssw.fw.resource.api

com.sssw.fw.resource.factory

com.sssw.fw.resource.search

com.sssw.fw.task.api

com.sssw.fw.task.event

com.sssw.fw.task.factory

com.sssw.fw.timer

ポータル

com.novell.afw.portal.proxy

com.novell.afw.component.api

com.novell.afw.component.factory

com.novell.afw.portlet.api

com.novell.afw.portlet.consumer.factory

com.novell.afw.portlet.factory

com.sssw.portal.api

com.sssw.portal.factory

com.sssw.portal.util

ルール

com.sssw.re.api

com.sssw.re.core

com.sssw.re.exception

com.sssw.re.factory

検索

com.sssw.search.api

com.sssw.search.client

com.sssw.search.factory

セキュリティ

com.sssw.fw.security.api

com.sssw.fw.security.client

ユーザ

com.sssw.fw.usermgr.api

com.sssw.fw.usermgr.client

ユーティリティクラスおよびヘルパクラス

com.novell.afw.util

com.sssw.fw.util

com.sssw.fw.util.crypto

com.sssw.fw.util.http

com.sssw.fw.util.jndi

WebDAV

com.sssw.webdav.client

com.sssw.webdav.common

com.sssw.webdav.event.api

ワークフロー

com.sssw.wf.activity

com.sssw.wf.api

com.sssw.wf.client

com.sssw.wf.exception

com.sssw.wf.factory

com.sssw.wf.link

com.sssw.wf.ui.api

 
Top of section

exteNd Director API用語

exteNd Director APIという名前は、すべてのパブリックパッケージを指します。 APIという用語は、これらのパッケージの特定のサブセットにも適用されます。たとえば、通常コンテンツ管理APIという名前は、次のグループのパッケージを参照する場合に使用されます。

その他のAPIは単に、完全なAPIの特定の部分を指す場合に使用されるラベルであることに注意してください。

 
Top of section

exteNd Director API参照マニュアル

exteNd Directorでは、完全なAPI仕様がjavadoc形式で提供されています。この仕様では、パブリックexteNd Director APIのすべてのパッケージ、クラス、インタフェース、およびメンバーについての詳細が記載され、Java 2 APIマニュアルへのリンクが含まれています。 これは、Javaで行うすべてのexteNd Directorプログラミングにとって不可欠な参照資料です。

For more information    exteNd DirectorAPIに関する詳しい参考情報については、オンラインヘルプの『APIリファレンス』を参照してください。

 
Top of page

サブシステムサービスへのアクセス

exteNd Directorサブシステムのサービスにアクセスするには、まず最初にファクトリを使用してサブシステムのマネージャオブジェクトへの参照を取得する必要があります。この処理は、次のいずれかの方法で実行できます。

委任を使用する場合、サービスがローカルマネージャオブジェクトまたはリモートオブジェクトのどちらを使用するのかを把握したり、注意したりする必要はありません。このため、ほとんどの場合では、サブシステムサービスにアクセスするために委任を使用することをお勧めします。

各サブシステムでは、サブシステムのマネージャオブジェクトにアクセスするために適した、EboFactoryと呼ばれる1つまたは複数のファクトリクラスが提供されています。

マネージャオブジェクトへの参照があれば、Javaクラスでの処理と同様にそのオブジェクトでメソッドを呼び出しできます。

 
Top of section

委任を使用したサブシステムサービスへのアクセス

いくつかの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);

 
Top of section

サブシステムマネージャへの直接参照の取得

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" );

 
Top of page

例外の処理

exteNd Directorアプリケーションでエラーおよび例外が発生することがあり、多くのソースが原因と考えられます。たとえば、ユーザからの不正な入力、アプリケーションサーバでの問題、データベースエラー、およびexteNd Directorオブジェクトでの不適切な操作などがあります。

アプリケーションを開発する際、エラーおよび例外の処理方法やユーザに対してアプリケーションの状態を通知する方法を計画する必要があります。チームで、エラーメッセージを一貫して表示するためのガイドラインを作成することをお勧めします。 ほとんどのアプリケーションは、次のような一連のエラー処理の目的を達成するように設計されます。

目的

情報

システム例外の処理

たとえば、権限のないオブジェクトにユーザがアクセスしようとすると、ユーザに対してその旨を伝えるか、アプリケーションの適切な領域にリダイレクトすることができます。サーバまたはデータベースでエラーが発生したら、次に何が起こるかをユーザに通知します。

アプリケーション例外の処理

たとえば、アプリケーションで、exteNd Directorが意図としなかった方法でのオブジェクト処理の試行、または不正なユーザ入力や保存されたデータからの不正な引数値を処理する必要があります。

ユーザへのフィードバックの提供

ユーザは、要求された操作が成功したか失敗したかを知る必要があります。 ユーザの不正な入力によって何らかのエラーが発生した場合は、メッセージをユーザに提示して、正しい入力を行う方法を詳細に指示する必要があります。

例外が発生した後でオブジェクトおよびデータを一貫した状態で残す

ビジネスデータの操作をトランザクション的に処理します。部分的に実行された操作をロールバックすることによって、ユーザが期待した処理がシステムで正しく反映されるようにします。 たとえば、注文データの大部分を保存した後に、ユーザが注文をキャンセルしたりシステムエラーが発生したりする場合、注文全体の状態を訂正できるように準備します。

Javaでは、信頼性が高く、一貫した方法でエラーを処理する機会が与えられます。ただし、例外を受け取る方法によってどのようにアプリケーションの流れが影響されるかということに注意する必要があります。実践的なヒントについては、『Practical Java Programming Language Guide』(著者: Peter Haggar、出版: Addison-Wesley)を参照してください。

ここで説明されているエラー処理は、Java アプリケーションで実行する必要のある標準の Java エラー処理の延長です。詳細については、Sun MicrosystemsのJavaマニュアルを参照してください。

 
Top of section

exteNd Director APIによってスローされたエラー

com.sssw.fw.exceptionパッケージのベース例外クラスを次の表に示します。 例外は、exteNd Directorアプリケーションのランタイム処理の間に、さまざまな原因で発生します。 これらはすべて、JDKベースクラスExceptionの拡張です。

例外クラス

説明

EboException

exteNd Directorフレームワークに対するベース例外クラスです。 サブシステム処理に関連するサブクラスを含みます。

EboRuntimeException

java.lang.RuntimeExceptionのラッパです。実行時にメソッドの署名のthrows句にアクセスできなかったときに、予期しない失敗およびインスタンスに対して使用します。

EboApplicationException

アプリケーションのエラーを示します。 通常、APIメソッドの間違った使用や不正な引数値などのプログラマーエラーを示します。

 
Top of section

エラーの回避

最も一般的な例外はNullPointerExceptionです。この例外を回避するには、nullの戻り値を必ず確認してください。多くのexteNd Directorメソッドの場合、nullの戻り値は有効な応答であり、目的のオブジェクトが存在しないことを伝えています。

これらの状況では、有効なオブジェクトを常に確認する必要があります。

状況

確認する内容

ホワイトボードセッションから値を取得する

指定のキーに対して値が実際に存在しますか?

フォームから入力データを取得する

取得しようとしたパラメータは存在しますか?存在しない場合、見つからないデータについてユーザに通知するか、デフォルト値を提供する必要がありますか?ユーザが入力した値は適切ですか?適切でない場合は、ユーザに正しい内容を伝える必要があります。

キャッシュされたオブジェクト

目的のオブジェクトはパージされていますか?この場合、再構成する必要があります。

制限されたオブジェクト

現在のユーザに要求されたオブジェクトに対する権利がありますか? 権利がない場合、操作を続行できない理由をユーザに伝える必要があります。

ユーザプロファイルおよび初期設定データ

プロファイルキーに対して値が存在しますか?存在しない場合、次のアクセス用に記述する必要がありますか?

 
Top of section

エラーの取得

例外が宣言されたアプリケーションコードでメソッドをコールする場合、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);
    }

For more information    ここに表示されているリソースバンドルの詳細については、ユーザ言語でのエラーの表示を参照してください。

ヒント:   スタックトレースをサーバコンソールに直接送信する代わりに、有効な方法で出力を 識別するexteNd Directorログ出力機能を使用できます。詳細については、を参照してくださ い。

 
Top of section

メッセージの表示

メッセージについて考える場合に役立つ方法は、ユーザがタスクを完了するための手引きとなるメッセージと、ユーザが処理することのできないエラー条件についてユーザに伝えるメッセージを区別することです。

アプリケーションコード   アプリケーションロジックによって、これら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);
    }
  }

 
Top of section

ユーザ言語でのエラーの表示

exteNd Directorアプリケーションを国際的に利用できるようにするには、ユーザが使用する言語でメッセージを表示する必要があります。 ユーザのロケールは、getLocale()メソッドを使用してEbiContextオブジェクトから取得できます。これを使用して、適切に翻訳されたエラーメッセージを取得できます。

ユーザのロケールは、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 ...