Menu Close

37.3.2. checkWidgets 操作

概要

checkWidgetsは、置換グループの先頭メンバーであるパラメーターを持つ簡単な操作です。この操作は、置換グループのメンバーである個別のパラメーターを扱う方法を示しています。コンシューマーは、パラメーターが置換グループのメンバーであることを確認する必要があります。サービスは、リクエストで送信された置換グループのメンバーを適切に決定する必要があります。

コンシューマー実装

生成されたメソッド署名は、置換グループの先頭要素の型をサポートする Java クラスを使用します。置換グループのメンバー要素は、先頭要素と同じ型、または先頭要素の型から派生する型なので、置換グループのメンバーをサポートするために生成された Java クラスは先頭要素をサポートするために生成された Java クラスから継承されます。Java の型階層は、親クラスの代わりのサブクラスの使用をネイティブでサポートします。

Apache CXF が置換グループの型および Java の型階層を生成する方法が原因で、クライアントは特別なコードを使用せずに checkWidgets() を呼び出すことができます。checkWidgets() を呼び出すロジックを開発する場合は、ウィジェットの置換グループに対応するために生成されたクラスのいずれかのオブジェクトを渡すことができます。

例37.14「checkWidgets() を呼び出すコンシューマー」に、checkWidgets() を呼び出すコンシューマーを示します。

例37.14 checkWidgets() を呼び出すコンシューマー

System.out.println("What type of widgets do you want to order?");
System.out.println("1 - Normal");
System.out.println("2 - Wood");
System.out.println("3 - Plastic");
System.out.println("Selection [1-3]");
String selection = reader.readLine();
String trimmed = selection.trim();
char widgetType = trimmed.charAt(0);
switch (widgetType)
{
  case '1':
  {
    WidgetType widget = new WidgetType();
    ...
    break;
  }
  case '2':
  {
    WoodWidgetType widget = new WoodWidgetType();
    ...
    break;
  }
  case '3':
  {
    PlasticWidgetType widget = new PlasticWidgetType();
    ...
    break;
  }
  default :
    System.out.println("Invaid Widget Selection!!");
}

proxy.checkWidgets(widgets);

サービス実装

checkWidgets() のサービスの実装は、ウィジェットの記述を WidgetType オブジェクトとして取得し、ウィジェットのインベントリーを確認し、ストックされているウィジェットの数を返します。置換グループの実装に使用されるクラスはすべて同じベースクラスから継承されるため、JAXB 固有の API を使用せずに checkWidgets() を実装することができます。

widget の置換グループのメンバーをサポートするために生成されたクラスはすべて WidgetType クラスを拡張します。このため、instanceof を使用して、渡されたウィジェットの型を決定し、単純に widgetPart オブジェクトをより制限のある型にキャストできます (適切であれば)。適切な型のオブジェクトを把握したら、適切な種類のウィジェットのインベントリーを確認できます。

例37.15「checkWidgets() のサービス実装」に、可能な実装を示します。

例37.15 checkWidgets() のサービス実装

public int checkWidgets(WidgetType widgetPart)
{
  if (widgetPart instanceof WidgetType)
  {
    return checkWidgetInventory(widgetType);
  }
  else if (widgetPart instanceof WoodWidgetType)
  {
    WoodWidgetType widget = (WoodWidgetType)widgetPart;
    return checkWoodWidgetInventory(widget);
  }
  else if (widgetPart instanceof PlasticWidgetType)
  {
    PlasticWidgetType widget = (PlasticWidgetType)widgetPart;
    return checkPlasticWidgetInventory(widget);
  }
}