ナビゲーション・ヘッダーをスキップ
Oracle ADF UIX開発者ガイド 目次へ
目次
前のページへ戻る
前へ
次のページへ進む
次へ

18. ADF UIXでのイメージの生成

このトピックでは、UIXのイメージ生成テクノロジであるOracle ADF UIX Dynamic Imagesにより提供される、イメージ生成機能について説明します。ここでは、次の項目について説明します。

UIXのイメージ生成の概要

UIX ComponentsおよびUIX XMLによってレンダリングされるHTMLコンテンツには、通常、HTMLの<img>要素を介して指定されるイメージがいくつか含まれています。イメージの使用は一般的ですが、UIXのコア・レンダリング・テクノロジでは、イメージは必要ではありません。つまり、UIX Componentsの特定のRendererの実装では、イメージを使用し、生成される出力の外観を改善するためイメージの使用が選択される場合がありますが、これは必須ではありません。たとえば、UIX Componentsのブラウザ・ルック・アンド・フィールのRendererの実装では、ボタンおよびタブ・バーなどのいくつかのユーザー・インタフェース・コンポーネントの実装にイメージを使用します。これらのユーザー・インタフェース・コンポーネントは、イメージではなく単純なテキスト・リンクを使用して、クライアント・アプリケーション・コードに影響を与えずに別のRendererによって実装できます。

イメージは、グラフィック情報の表示、またはWebページの外観を改善するツールとして広く使用されていますが、イメージの使用には、アプリケーション開発者が考慮する必要のある問題がいくつかあります。たとえば、テキストを含むイメージ(ButtonBeanのブラウザ・ルック・アンド・フィールの実装など)は、翻訳が非常に困難です。このようなイメージは、翻訳に余分な時間およびリソースを割り当てる必要があるため、国際化アプリケーションの開発における障害になります。カスタマイズされたフォント、色またはテキストを含むイメージを手動で作成するのは時間がかかるため、一般に、イメージのカスタマイズも難しくなります。必要なイメージに対してエンド・ユーザーの指定フォントおよび色を使用できない場合があるため、結果的には、イメージはパーソナライズの障害になります。

これらイメージ関連の問題を解決する方法の1つは、単にイメージを使用しないことです。UIX Componentsでは、イメージに依存しないRendererの実装の使用を選択することで、この解決方法を容易に実行できます。しかし、ほとんどのアプリケーションはイメージを利用するため、UIXには、これらのアプリケーションが直面するローカライズ、カスタマイズ、およびパーソナライズの問題に対する解決方法が用意されています。UIXには、これらの問題に対する解決方法は、UIX Dynamic Imagesのイメージ生成フレームワークにより提供されます。

UIX Dynamic Imagesでは、デプロイメント前にイメージを静的に生成する機能、またはWebアプリケーションの実行時に動的に生成する機能を提供しています。UIX Dynamic ImagesのImageGeneratorツールでは、翻訳されるテキストを含むイメージおよびメッセージ・ファイルのXMLの記述に基づいて、ボタンおよびタブ・バーなどのイメージを生成します。静的イメージ生成は、手動によるイメージ作成より効率的ですが、必要なイメージすべてをアプリケーションのデプロイ前に生成する必要があるため、単調で時間を要する方法です。イメージ生成プロセスを単純化するために、UIX Dynamic Imagesでは、ImageProviderインタフェースを介した動的生成もサポートしています。実行時に、アプリケーションからImageProviderの実装にリクエストを送り、必要に応じてImageProviderで新規イメージを生成します。UIX ComponentsまたはUIXベースのアプリケーションでは、UIX Dynamic Images固有のコードを作成せずに、UIX Dynamic Imagesの動的イメージ生成を利用できます。たとえば、UIX Componentsのブラウザ・ルック・アンド・フィールのButtonRendererクラスおよびTabBarRendererクラスでは、UIX Dynamic ImagesのImageProviderに、必要なイメージに対するリクエストを自動的に送ります。UIX Dynamic Imagesが特定のUIX ComponentsのRendererの実装で使用されることは、アプリケーション・コードに対して完全に透過的です。

UIX Dynamic Imagesにより、イメージの使用により生じるローカライズ、カスタマイズ、およびパーソナライズの問題は解決されますが、この方法はコストがかかります。UIX Dynamic Imagesには、JavaのAWTグラフィック・ライブラリで提供されるグラフィック機能が必要です。かわりに、AWTでは、基本プラットフォームにより提供されるグラフィック・サポートを利用します。このように、UIX Dynamic Imagesでは、グラフィック機能が使用可能な環境でのイメージ生成のみを行います。たとえば、UNIX環境では、AWTのグラフィック・ニーズの対応にXサーバーが必要です(JDK 1.4以前の環境の場合)。これは、ほとんどの中間層環境に対する最新の要件であるため、システム管理を行い、実行時環境がAWTのグラフィック要件を満たすよう正しく構成されているかを何度も確認する必要があります。デプロイメント環境がグラフィック操作を想定して構成されているとはかぎらないため、UIX Dynamic Imagesでは、リモート・マシンにイメージ生成をオフロードすることを可能にするUIX Dynamic Imagesサーブレットなど、この要件を軽減するオプションを提供しています。

静的イメージ生成

イメージの翻訳における問題

ソフトウェア・アプリケーションの翻訳における基本作業の1つは、アプリケーション・ユーザー向けのメッセージのローカライズです。この作業を効果的に行うため、アプリケーション開発者は翻訳可能なメッセージすべてをメッセージ・ファイルに保存し、翻訳チームに渡します。アプリケーションに翻訳の必要があるイメージが含まれている場合は、別に処理します。GIFなどのイメージ・ファイル形式では、テキスト・メッセージは、外部化された翻訳可能な形式では格納されていません。イメージを翻訳する際、翻訳者はイメージ操作ツールを使用してイメージを表示し、翻訳対象のテキストを検出する必要があります。テキストの翻訳後、翻訳済テキストを含む新規イメージの作成が必要です。翻訳済イメージの手動作成にはグラフィック・デザイン・スキルが必要で、時間も非常にかかります。したがって、翻訳チームでイメージ・ファイルの翻訳が可能であるにもかかわらず、イメージ翻訳プロセスでは翻訳チームのリソースが非効率的に使用されることになります。

UIX Dynamic ImagesのImageGeneratorを使用したイメージの生成

UIX Dynamic Imagesの目的の1つは、翻訳済イメージの手動作成といった、翻訳プロセスで時間を要するステップを自動化することで、イメージ翻訳プロセスを単純化することにあります。UIX Dynamic ImagesのImageGeneratorツールでは、イメージの記述に基づいて、ボタンおよびタブ・バーのイメージなどのイメージ・ベースのユーザー・インタフェース・コンポーネントを生成します。イメージは、UIX Dynamic Imagesで定義されているXML言語であるImageGenerator XML言語を使用して記述されます。ImageGenerator XML文書は、コマンドライン引数としてImageGeneratorツールに渡されます。ImageGeneratorツールでは、指定されたXML入力ファイルを解析し、文書の各エントリに対するタイプおよびプロパティを判別して、要求された各イメージのGIFイメージ・ファイルを作成します。

次のImageGenerator XMLサンプル文書は、単一イメージの記述です。

<?xml version="1.0"?>
<ImageGenerator>
 <button name="login">
   <text>Login</text>
 </button>
</ImageGenerator>
</pre>

<button>要素は、ボタンを含むイメージが生成されることを示します。(ボタンのラベル「Login」は、<button>要素の<text>子要素を介して指定します。ボタン・イメージは次のコマンドラインで生成されます(記述はsample.xmlという名前のファイルに格納されています)。

java oracle.cabo.image.tools.ImageGenerator sample.xml

その結果、login.gifという名前の次のボタンが作成されます。

      ログイン・ボタン

UIX Dynamic ImagesのImageGeneratorツールでイメージを作成すると、イメージをWebサーバーにインストールし、HTMLの<img>要素を介してアプリケーションからアクセスできます。

サポートされるイメージ・タイプ

ボタン以外に、UIX Dynamic Imagesにはグローバル・ボタン、色付きアイコンおよびタブ・バーという3つのイメージ・タイプを生成するビルトイン・サポートが含まれています。

グローバル・ボタン

グローバル・ボタンとは円形のアイコン・ボタンで、通常はWebページの最上部に配置され、グローバル・アプリケーション機能へのアクセスを提供します。たとえば、グローバル・ボタンは、一般的にはヘルプ・システムまたはログイン・サービスなどのサービスへのアクセスを提供するために使用されます。UIX Dynamic Imagesでは、グローバル・ボタンを境界線のないグレー・スケールのソース・アイコンから生成します。イメージの生成中に、ソース・アイコンに円形の境界線が付けられ、グローバル・ボタンの使用不可状態および選択済状態に基づいて色付けされます。次のImageGenerator XMLファイルの記述には、使用可グローバル・ボタン、使用不可グローバル・ボタン、および選択済グローバル・ボタンの3つのエントリが存在します。

<?xml version="1.0"?>
<ImageGenerator>
 <!-- An enabled help button -->
 <globalButton name="help-enabled" source="help.gif"/>

 <!-- A disabled help button -->
 <globalButton name="help-disabled" source="help.gif" disabled="true"/>

 <!-- A selected help button -->
 <globalButton name="help-selected" source="help.gif" selected="true"/>
</ImageGenerator>

ソース・アイコン(Help.gif)は次のようになります。

        ボタンのソース・アイコン

次に、ソース・アイコンから生成されたグローバル・アイコンを示します。

    使用可ボタン  使用可ボタン

    使用不可ボタン  使用不可ボタン

    選択済ボタン  選択済ボタン

色付きアイコン

色付きアイコンの生成は、ソース・アイコンに単純な変換が適用されるという点で、グローバル・ボタンの生成に似ています。色付きアイコンの場合、変換は単純で、ソース・アイコンの色がカラー・スキームに従って変更されます。一般的に、色付けは、アプリケーションのユーザー・インタフェースの部品の実装に使用されるイメージに適用されます。たとえば、Oracle Browser Look and Feelでは、UIX ComponentsのFooterBeanのレンダリングの際に、次の3つのイメージを使用します。

      左フッター・アイコンspacer   左フッター・アイコン

      中央フッター・アイコン   中央フッター・アイコン

      右フッター・アイコン   右フッター・アイコン

デフォルトのカラー・スキームでは、フッターやグローバル・ヘッダーなどのページ・レベルのコンポーネントは、青の背景色で描画されます。これらのコンポーネントの色を変更するには、コンポーネントの実装に使用されているイメージを再度色付けする必要があります。次のImageGenerator XML文書には、3つのフッター・アイコンに対する色付きアイコンのエントリが含まれています。

<?xml version="1.0"?>
<ImageGenerator>
 <colorizedIcon name="footr" source="footr.gif"/>
 <colorizedIcon name="footm" source="footm.gif"/>
 <colorizedIcon name="footl" source="footl.gif"/>
</ImageGenerator>

この文書を使用してImageGeneratorを実行すると、異なるカラー・スキームに色が調整された新規バージョンのアイコンを作成できます。次に例を示します。

    赤色の左フッター・アイコン   赤色の中央フッター・アイコン   赤色の右フッター・アイコン  

    緑色の左フッター・アイコン   緑色の中央フッター・アイコン   緑色の右フッター・アイコン  

    紫色の左フッター・アイコン   紫色の中央フッター・アイコン   紫色の右フッター・アイコン  

タブ・バー

タブ・バーは主要なナビゲーション・コンポーネントで、一般的に、Webページの最上部に配置されます。次のイメージは、3つのタブを含むタブ・バーを示しています。

   3つのタブを含むタブ・バー

タブ・バー・イメージは、UIX Dynamic ImagesのImageGeneratorでImageGenerator XML要素の<tabBar>を使用して生成されます。次のサンプルXMLコードは、上に示したタブ・バーの記述です。

<?xml version="1.0"?>
<ImageGenerator>
 <tabBar name="tabs" selectedIndex="1">
   <tab>
     <text>First Tab</text>
   </tab>
   <tab>
     <text>Second Tab</text>
   </tab>
   <tab>
     <text>Third Tab</text>
   </tab>
 </tabBar>
</ImageGenerator>

タブ・バー・イメージの生成に加えて、ImageGeneratorでは、タブ・バーのHTMLイメージ・マップも生成します。イメージ・マップは、生成されるイメージと同じ名前で .mapファイルに格納されます。タブ・バーの各リンクのURLは、ImageGenerator XML文書で各<tab>要素のdestination属性を介して指定します。

翻訳済イメージの生成

4つの事前定義済イメージ・タイプのうち、ボタン・イメージおよびタブ・バー・イメージのみが翻訳対象として考えられます。色付きアイコンが翻訳されることはありません。グローバル・ボタンのソース・アイコンは別のロケールに合せてカスタマイズされますが、グローバル・ボタンには翻訳可能なテキストは存在せず、メッセージ翻訳プロセスには含まれません。

UIX Dynamic ImagesのImageGeneratorツールを使用してボタン・イメージおよびタブ・バー・イメージの翻訳済バージョンを生成するには、すべてのボタンおよびタブ・バーのエントリを含むImageGenerator XML文書を作成する必要があります。通常、ImageGenerator XML文書の作成はアプリケーション開発チームの作業であり、翻訳チームの作業ではありません。ImageGenerator XML文書が作成されると、ローカライズのため、翻訳チームに渡されます。翻訳チームは、各<text>要素がターゲット・ロケールに合せて翻訳された、ImageGenerator XML文書のロケール固有の新規翻訳を作成します。例として、次に、日本語に翻訳された後の「Login」ボタンのサンプル文書を示します。

<?xml version="1.0"?>
<ImageGenerator>
 <button name="login">
   <text>&#x4e89;&#x4e8a;&#x4e8b;</text>
 </button>
</ImageGenerator>

<text>要素が、「Login」から、エスケープUnicode文字列としてエンコードされた日本語の文字列に翻訳されています。ImageGeneratorが翻訳済文書で実行されると、次の翻訳済イメージが作成されます。

   日本語のテキストが含まれるログイン・ボタン

ImageGenerator XML文書は翻訳が非常に容易ですが、ImageGenerator XMLは標準のメッセージ・ファイル形式ではありません。そのため、翻訳チームはこの新規XML言語の処理を必ずしも得意としない場合があります。理想的には、イメージ関連の翻訳であることを翻訳チームに意識させない必要があります。つまり、翻訳者の視点からは、イメージの翻訳メッセージと、他のアプリケーション・コンテンツの翻訳メッセージに違いがないようにします。UIX Dynamic Imagesでは、最も一般的に使用されているJavaメッセージ・ファイル形式のJava ResourceBundleを使用することにより、この解決方法を実行します。

翻訳を容易にするため、アプリケーション・コードから翻訳対象メッセージを分離する場合と同様に、ImageGenerator XML文書からも翻訳対象メッセージを分離できます。<text>要素のかわりに<translatedText>要素を使用し、実際のテキスト文字列をJava ResourceBundleから取得することを示します。次のサンプルでは、<translatedText>要素を使用するよう変更された「Login」ボタン文書の新規バージョンを示します。

<?xml version="1.0"?>
<ImageGenerator>
 <defaults>
   <!-- The ResourceBundle name -->
   <bundle>SampleBundle</bundle>

   <!-- The locales to generate: English, French and Japanese -->
   <locale language="en"/>
   <locale language="fr"/>
   <locale language="ja"/>
 </defaults>

 <button name="login">
   <translatedText key="LOGIN"/>
 </button>
</ImageGenerator>

文書は次の3つの点について変更されています。まず、<text>要素が、ResourceBundleの翻訳済メッセージの検索に使用するキーを指定する<translatedText>要素に置き換えられています。次に、<bundle>要素が<defaults>セクションに追加されています。この要素では、使用するResourceBundleの完全修飾Javaクラス名を指定します。最後に、いくつかの<locale>要素が<defaults>セクションに追加されています。ロケール固有のResourceBundleを使用して、各<locale>要素についてイメージのセットが生成されます。生成されたイメージの各セットは、個別のロケール固有の出力ディレクトリに配置されます。

文書でImageGeneratorを実行する前に、各ロケールのResourceBundleを作成し、コンパイルする必要があります。アプリケーション開発チームが、ベース・ロケール(英語)のResourceBundleを作成します。次の例では、ResourceBundleにはLOGINキーに対応する単一メッセージのみが必要です。これは、標準のJava ListResourceBundleとして実装できます。

import java.util.ListResourceBundle;

public class SampleBundle extends ListResourceBundle
{
  public Object[][] getContents()
  {
    return contents;
  }

  static final Object[][] contents =
  {
    {"LOGIN", "Login"},
  };
}

ベースのResourceBundleは翻訳チームに渡され、そこで、各ロケールにローカライズしたバンドルを作成します。バンドルが翻訳されコンパイルされると、イメージの翻訳済バージョンがImageGeneratorで生成されます。

動的イメージ生成

UIX Dynamic ImagesのImageGeneratorによる静的イメージ生成は、手動による翻訳済イメージの作成を不要にすることにより、イメージ翻訳プロセスを単純化します。しかし、この新規アプローチにはいくつかの障害があります。次に例を示します。

このような障害の回避策として、UIX Dynamic Imagesでは、動的イメージ生成をサポートしています。動的イメージ生成により、アプリケーションでは、必要なイメージを実行時に要求できます。必要なイメージが使用可能でない場合は、UIX Dynamic Imagesにより生成されます。これは、アプリケーションで使用するイメージのセットをあらかじめ定義しておく必要がないことを意味します。イメージを生成するステップが1つも存在しないため、ImageGenerator XML文書は必要ありません。必要に応じてイメージが作成されるため、ローカライズされたメッセージや、カスタマイズまたはパーソナライズされた色およびフォントで、イメージが動的に生成されます。

ImageProvider API

動的イメージ生成リクエストは、ImageProvider APIを介してUIX Dynamic Imagesに送られます。ImageProviderインタフェースは、1つのメソッドgetImage()を定義します。getImage()メソッドを介して、リクエストされたイメージの情報がアプリケーションからImageProviderに渡されます。ImageProviderでは、要件を満たすイメージが使用可能であるかどうかを判断して、リクエストに応答します。そのようなイメージが存在しない場合、要件を満たす新規イメージがImageProviderにより作成されます。その後、ImageProviderでは、URLで使用するイメージの位置など、生成されたイメージについての情報を返します。

ImageProvider.getImage()メソッドは、次のように定義されます。

 public ImageProviderResponse getImage(
    ImageContext         context,
    ImageProviderRequest request
    );

ImageContextは、UIX ComponentsのRenderingContextに類似しています。ImageProviderImageContextを使用して、エンド・ユーザーのロケールなど、エンド・ユーザーの環境に関する情報を取得します。ImageContextでは、ErrorLogオブジェクトおよびConfigurationオブジェクトなどのグローバル・コンテキスト・オブジェクトへのアクセスも提供します。UIX Dynamic Imagesでは、1つのImageContextの実装のImageContextImplを提供します。UIX ComponentsのRenderingContextインスタンスのように、UIX Dynamic ImagesのImageContextインスタンスは、1つのHTTPリクエストについての情報をカプセル化します。そのため、UIX Dynamic Imagesクライアントは、1つのHTTPリクエストの処理中に、1つのImageContextインスタンスをgetImage()へのすべてのコールに使用できます。ただし、ImageContextインスタンスは、複数のHTTPリクエストにまたがって再利用することはできません。

ImageProviderRequestでは、必要な特定のイメージを定義するタイプ固有のプロパティ・セットと、生成するイメージのタイプ(ボタン、タブ・バーなど)の両方を指定します。イメージ・タイプは、ネームスペースおよびローカル名の両方で指定されます。イメージ・タイプはネームスペースによってパーティション化されるため、クライアントでは、事前定義済イメージ・タイプ名と競合せずに、カスタム・イメージ・タイプを定義できます。事前定義済イメージ・タイプの1つであるイメージをリクエストする場合、ImageConstants.TECATE_NAMESPACEで定義されるUIX Dynamic Imagesのネームスペースを使用します。UIX Dynamic Imagesの4つの組込みイメージ・タイプに対する名前定数は、ImageConstantsインタフェースのBUTTON_NAMEGLOBAL_BUTTON_NAMECOLORIZED_ICON_NAMEおよびTAB_BAR_NAMEによって定義されます。

ImageProviderRequestsは、getRenderProperites()メソッドを介して、要求されたイメージのプロパティの情報を提供します。このメソッドでは、要求されたイメージのプロパティを含むjava.util.Dictionaryオブジェクトを返します。要求されたプロパティのキーは、ImageConstantsインタフェースで定義されます。プロパティ値は、タイプ固有です。たとえば、ImageConstants.TEXT_KEYを使用して、ボタン・イメージのStringテキスト・ラベルを指定します。ImageConstants.FOREGROUND_KEYでは、ボタンのテキスト・ラベルのレンダリングに使用するjava.awt.Color前景色の値を定義します。ImageProviderRequestImplは、イメージ・プロパティの任意のDictionaryをラップするImageProviderRequestの汎用実装です。

次のサンプル・コードでは、ImageProviderから「Login」ボタンを要求する方法を示します。

// Create the ImageContextImpl with the end user's locale, direction
// and the current ErrorLog.
ImageContextImpl context = new ImageContextImpl(localeContext,
                                                agent,
                                                colorScheme,
                                                errorLog,
                                                config);

// Create the dictionary of request properties.  Since we only need
// a very small dictionary, we use oracle.bali.share.collection.ArrayMap
// instead of java.util.Hashtable.
ArrayMap properties = new ArrayMap(1);
properties.put(ImageConstants.TEXT_KEY, "Login");

// Create the ImageProviderRequest
ImageProviderRequest request = new ImageProviderRequestImpl(
                                     ImageConstants.TECATE_NAMESPACE,
                                     ImageConstants.BUTTON_NAME,
                                     properties);

// Make the request to the ImageProvider
ImageProviderResponse response = imageProvider.getImage(context, request);

if (response != null)
{
  // Render an img element using the location in the ImageProviderResponse
}

ImageProvider.getImage()から返されるImageProviderResponseオブジェクトには、要求されたイメージに対するHTMLの<img>要素をアプリケーションで生成するために必要な情報がすべて含まれています。ImageProviderResponse.getImageURI()はイメージの位置を返し、返された位置は、ベースURIを付加した後に、<img>要素のsrc属性の値として使用できます。生成されたイメージの幅および高さも、ImageProviderResponseを介してレポートされます。次に、この値は<img>要素のwidth属性およびheight属性として指定され、ブラウザによる効率的なページ・レイアウトに利用されます。最後に、タブ・バーなどのコンポジット・コンポーネントに対して、ImageProviderResponseで個々のコンポーネント・リージョンの位置およびサイズについての情報を提供できます。この情報は、イメージのHTMLイメージ・マップを生成するために、アプリケーションで使用できます。

FileSystemImageCache

UIX Dynamic Imagesでは、1つのImageProviderの実装のFileSystemImageCacheを提供します。FileSystemImageCacheではその名のとおり、生成するイメージの格納メカニズムとしてファイル・システムを使用します。イメージのキャッシュのルート・ディレクトリは、FileSystemImageCacheインスタンスの作成時に指定されます。FileSystemImageCacheによって生成されるすべてのイメージは、このディレクトリの下に格納されます。

URLを介してイメージにアクセスするには、イメージ・キャッシュのルート・ディレクトリをWebサーバーを介してアクセスできる場所にする必要があります。たとえば、イメージ・キャッシュをWebサーバーのドキュメント・ルートの下、またはWebサーバーでアクセスできる他の別名ディレクトリの下に配置します。FileSystemImageCacheによって返されるURIは、常にキャッシュのルート・ディレクトリに対して相対的です。そのため、HTMLの<img>要素のソースとして使用する完全なURLを生成するには、返されたURIにベースURIを付加します。たとえば、Webサーバーのドキュメント・ルートがD:\Apache\htdocsにあり、イメージ・キャッシュのルート・ディレクトリがD:\Apache\htdocs\images\cacheである場合、アプリケーションでは、ベースURIの/images/cache/FileSystemImageCacheから返されたURIを付加します。

イメージ・キャッシュは著しい量のメモリー・リソースおよびディスク・リソースを使用するため、FileSystemImageCacheインスタンスは、同じJava Virtual Machineで実行されているすべてのアプリケーション間で共有されます。共有されているFileSystemImageCacheインスタンスは、イメージ・キャッシュのルート・ディレクトリを唯一の引数とするFileSystemImageCache.getSharedCache()メソッドを介して取得できます。FileSystemImageCacheの1つの共有インスタンスは、一意のルート・ディレクトリごとに作成されます。次のサンプルでは、FileSystemImageCacheの取得方法を示します。

 FileSystemImageCache cache = FileSystemImageCache.getSharedCache(
                                 "D:\Apache\htdocs\images\cache");

実際のアプリケーションでは、ハードコードされたルート・ディレクトリは使用しないので注意してください。使用する実際のディレクトリは、アプリケーションがインストールされているマシンのディレクトリ構造に完全に依存します。たとえば、URI /images/cacheに対応するディレクトリは、/private/tomcat/webapps/root/images/cacheであったり、他のディレクトリである場合もあります。イメージ・キャッシュのルート・ディレクトリに固定値を使用するかわりに、ユーザーがアプリケーションのインストール時にこの情報を指定できるようにするか、アプリケーションのインストール後に値を構成できるようにする必要があります。また、ディレクトリはサーブレットAPIを使用して動的に導出することもできます。ServletRequest.getRealPath()メソッドを使用して、URLをファイル・システムでのパスに変換します。したがって、前述の例は、次のように実装するとより効率的です。

FileSystemImageCache cache = FileSystemImageCache.getSharedCache(
                               request.getRealPath("/images/cache"));

このようにgetRealPath()を使用すると、ディレクトリが特定のターゲット・マシンのどこに配置されるかにかかわらず、URLの/images/cacheに対応するWebサーバー・ディレクトリにイメージ・キャッシュが作成されます。

FileSystemImageCacheインスタンスが初めて作成される際に、既存のイメージがルート・キャッシュ・ディレクトリで検索されます。FileSystemImageCacheにより、イメージ・タイプ、位置およびプロパティなどの各イメージの情報がメモリー内キャッシュにロードされます。特定のイメージがFileSystemImageCacheに要求されると、FileSystemImageCacheでは、まず、イメージの情報がメモリー内キャッシュで使用可能であるかどうかを調べます。メモリー内キャッシュで一致が検出された場合、イメージ情報とともにImageProviderResponseが返されます。

FileSystemImageCacheで要求を満たすイメージを検出できない場合は、いくつかのステップが実行されます。まず、要求されたイメージが、ImageRendererインタフェースのインスタンスを使用して、メモリーに作成されます。ImageRendererにより、ImageProviderRequestで指定した要求されたプロパティのDictionaryに基づいて、java.awt.Imageインスタンスが生成されます。AWT Imageが作成されると、データが取得され、キャッシュ・ディレクトリの下にあるイメージ・ファイルに保存されます。エントリがメモリー内キャッシュに追加されるため、同じイメージの要求は早く処理されます。イメージ・データをファイル・システムに保存するのみでなく、関連するメタデータ・ファイルが各イメージに対して作成されます。メタデータ・ファイルには対応するイメージの完全な記述が格納され、特定のイメージ・インスタンス(ボタンのラベル、色、フォントなど)を定義するすべてのプロパティと同様に、イメージのタイプ(ボタン、タブ・バーなど)が含まれます。

次の例では、「Login」ボタン・イメージに対応するメタデータ・ファイルの内容を示します。


<?xml version="1.0" encoding="UTF-8"?>
<ImageMetadata version="0.1">
<button width="59" height="26" direction="ltr" renderer="oracle.cabo.image.laf.browser.ButtonImageRenderer">
<foreground red="0" green="0" blue="0"/>
<background red="247" green="247" blue="231"/>
<font>
<name>dialog</name>
<size>12</size>
<style>plain</style>
</font>
<colorScheme namespace="http://www.example.org/myColorSchemeNS" name="default"/>
<text>Login</text>
</button>
</ImageMetadata>

イメージ・メタデータに使用するXML言語は、ImageGenerator XML言語とほぼ同じです。イメージ・メタデータ・ファイルは、対応するイメージと同じファイル名を共有します。拡張子 .imx(ImageMetadata XMLの短縮形)が、イメージ・メタデータ・ファイルに使用されます。

イメージおよびそのメタデータは、作成されキャッシュされると、FileSystemImageCacheに永久に保持されます。つまり、イメージがキャッシュされると、イメージは、サーブレット・エンジン・セッション間で永続します。サーブレット・エンジンが停止した後でも、すべてのイメージおよび対応するメタデータが、ファイル・システムにキャッシュされた状態で保持されます。サーブレット・エンジンの再起動時には、ファイル・システムに格納されているイメージ・ファイルおよびメタデータ・ファイルに基づいて、FileSystemImageCacheによりメモリー内キャッシュが再度初期化されます。

動的イメージのローカライズ、カスタマイズ、およびパーソナライズ

イメージ生成は、当初、イメージ翻訳の問題を解決するために立案されました。静的イメージ生成により、負荷が翻訳チームからアプリケーション開発チームに移り、開発チームでImageGenerator XMLファイルをメンテナンスし、生成および統合作業を実行します。動的イメージ生成では、UIX Dynamic ImagesのImageProvider APIに対してコーディングすることで、アプリケーション開発チームをこれらの作業から解放します。その結果、イメージ翻訳の問題はすべて解消されます。

UIX Dynamic Imagesベースのアプリケーションで、ボタン・イメージまたはタブ・バー・イメージがImageProviderに要求されると、アプリケーションでは翻訳済メッセージをImageProviderに渡す必要があります。たとえば、ボタン・イメージが要求された場合、ボタンのラベルは、ImageConstants.TEXT_KEYを使用してアプリケーションで指定されます。イメージの翻訳済バージョンが自動的に生成およびキャッシュされ、翻訳済イメージの場所がアプリケーションに返されます。UIX Dynamic Imagesでは、アプリケーションで翻訳済メッセージを取得する方法に制限はありません。ImageGenerator XML文書は不要です。任意のメッセージ・ファイル形式または翻訳リポジトリを使用できます。翻訳後の生成または統合作業は必要ありません。その結果、イメージ翻訳プロセスは、アプリケーションの残りの内容に対する翻訳プロセスと同じになり、場合によっては統合できます。

イメージ翻訳は、ロケール固有のメッセージをImageProviderに渡すという単純な処理になります。同じように、カスタマイズまたはパーソナライズした色およびフォントをイメージの要求時に指定するのみで、イメージをカスタマイズおよびパーソナライズできます。UIX Dynamic ImagesのImageConstantsインタフェースでは、生成されたイメージの外観を制御するために使用するいくつかのプロパティ(FONT_KEYBACKGROUND_KEYおよびFOREGROUND_KEYを含む)を定義します。メッセージ翻訳の場合と同様に、ImageProviderでは、アプリケーションでフォントおよび色を決定する方法に制限はありません。アプリケーションでは、適合するカスタマイズ方法およびパーソナライズ方法を実行できます。

UIX ComponentsおよびUIX XMLのイメージ生成

動的イメージ生成では、最小限の操作で、アプリケーションにローカライズ済イメージ、カスタマイズ済イメージ、およびパーソナライズ済イメージを取り込むことができます。ただし、UIXではさらに容易な解決方法が用意されています。UIX Dynamic ImagesのAPIに対してコーディングするかわりに、アプリケーションでは、イメージ生成をUIXのHTMLレンダリング・テクノロジであるUIX ComponentsおよびUIX XMLに依存できます。

次のUIXコードでは、ボタン・イメージがHTMLの<img>要素として生成およびレンダリングされます。

<button xmlns="http://xmlns.oracle.com/uix/ui" text="Login"/>

同様に、UIX ComponentsのAPIに対して直接コーディングされているクライアントは、次のコードを使用して、イメージ・ベースのボタンをレンダリングできます。

ButtonBean button = new ButtonBean("Login");
button.render(renderingContext);

ButtonBeanのブラウザ・ルック・アンド・フィールのButtonRendererの実装では、動的イメージ生成を利用してボタンをレンダリングします。ButtonRendererでは、レンダリングのためにコールされると、次のステップを実行します。まず、ImageProviderがUIX ComponentsのRenderingContextから取得されます。デフォルトでは、FileSystemImageCacheインスタンスが使用されます。ImageConstants.IMAGE_PROVIDER_PROPERTYをUIX ComponentsのRenderingContextに設定することにより、アプリケーションでは固有のImageProviderを提供できます。デフォルトでは、イメージ・キャッシュがURIの"/cabo/images/cache"に対応するディレクトリに作成されます。イメージ・キャッシュのルート・ディレクトリの位置は、UIX Share Configuration APIのConfiguration.IMAGES_CACHE_DIRECTORYプロパティを介して構成できます。

次に、ButtonRendererでは、ButtonBeanの属性値に基づいて要求されたイメージ・プロパティのDictionaryを作成することで、ImageProviderRequestを準備します。続いてRenderingContext.getImageContext()メソッドから取得されるImageContextを使用して、イメージがImageProviderから要求されます。ImageProviderへの要求が正常に行われた場合、ButtonRendererでは、イメージの幅、高さ、代替テキストなどのレンダリング属性も含め、ボタン・イメージの適切なHTMLが生成されます。タブ・バーの場合は、UIX Componentsでは、タブ・バー・リンクの実装に使用されるイメージ・マップもレンダリングします。

ButtonRendererでは、動的イメージ生成の失敗も処理します。要求されたイメージを生成できない場合、ButtonRendererは、リンク、<input>要素、または<button>要素などの、イメージ以外のコンテンツを生成します。

イメージ生成の要件

UIX Dynamic Imagesのイメージ生成フレームワークでは、Webページでのイメージ使用に関連するローカライズ、カスタマイズ、およびパーソナライズの問題に対する解決方法を提供しています。UIX Dynamic Imagesは、静的イメージ翻訳に関連する余分なオーバーヘッドを削減します。動的イメージ生成の使用がアプリケーション開発者には意識されないような、UIX ComponentsまたはUIXなどの高水準のレンダリング・テクノロジを使用することで、開発コストを最小限に抑えられます。しかし、これらを利用するには、いくつかの新規要件を満たしている必要があります。

Java 2 Runtime Environment

UIX Dynamic Imagesでは、生成されたイメージのコンテンツのレンダリングに、Java 2DグラフィックAPIを使用します。Java 2Dは、グラフィック・プリミティブとテキストの両方のエイリアシング除去など、拡張グラフィック機能を提供します。また、Java 2では、多言語アプリケーションでのイメージ生成において重要となるフォント処理のサポートが改善されています。Java 2D APIはJava 2 Platformの一部であるため、UIX Dynamic Imagesのイメージ生成は、JDK 1.1環境では機能しません。Java 2 Runtime Environmentが必要です。

AWT

AWTでは、イメージの作成にUIX Dynamic Imagesで必要な低レベルのグラフィック機能を提供します。AWTは、JDK 1.0以上、コアJavaプラットフォームの一部です。UIX Dynamic Imagesは、AWTをサポートしない実行時環境では実行できません。

ヘッドレスJava

Java 2 v1.4より前のリリースでは、UNIXのAWT実装でグラフィック操作を行うにはXサーバーへのアクセスが必要でした。Java 2 v1.4では、新しくヘッドレスJava機能が導入されました。この機能を使用すると、Xサーバーへのアクセスを必要とすることなく、(イメージ生成などの)AWT操作を実行できます。UIXベースのアプリケーションをUNIX環境にデプロイする場合、UIXユーザーは、Xサーバーの構成に関する問題を回避するため、Javaのヘッドレス・サポートを利用することをお薦めします。ヘッドレス操作を使用可にするには、JVMの起動時に次のシステム・プロパティを指定します。


  -Djava.awt.headless=true

Java 2 v1.4を使用できない環境では、イメージ生成にはXサーバーが必要です。このような環境では、AWTがXサーバーの検索およびXサーバーへの接続を行えるようにDISPLAY環境変数を設定する必要があります。

フォント

ボタンおよびタブ・バーなどのテキストを含むイメージの生成では、テキストのラスター化にフォントを使用する必要があります。オラクル社では、多言語イメージ生成に使用できるOracle9iAS製品で国際化フォントを提供しています。

Webサーバーのファイル・システムへの書込みアクセス

生成されたイメージをURLを介して参照できる場所に保存するため、FileSystemImageCacheにはWebサーバーのディレクトリに対する書込みアクセスが必要です。このディレクトリには、アプリケーションで生成されるイメージすべてを十分格納できるディスク領域が必要です。