oligo のソースコードを調べて、コードをデバッグしました。多くの調査作業の後、Olingo で制限付きアクションを実装することができました。
エンティティ タイプ X にバインドされ、エンティティ Y を返すバインド アクションを実装するとします。
必要な変更は次のとおりです。
メタデータ ドキュメント:
CsdlAbstractEdmProvider を拡張するか、CsdlEdmProvider を実装する Java クラス (カスタム クラス) で、
getActions(...) 関数を実装する
// Action Names
public static final String ACTION_EXECUTE_NAME = "Execute";
// FullyQualified Action Names
public static final FullQualifiedName ACTION_EXECUTE_FQN = new FullQualifiedName("StackOverflow", ACTION_EXECUTE_NAME);
@Override
public List<CsdlAction> getActions(FullQualifiedName actionName) throws ODataException {
if (actionName.equals(ACTION_EXECUTE_FQN)) {
// It is allowed to overload actions, so we have to provide a list
// of Actions for each action name
final List<CsdlAction> actions = new ArrayList<CsdlAction>();
// Create the Csdl Action
final CsdlAction action = new CsdlAction();
action.setName(ACTION_EXECUTE_FQN.getName());
action.setBound(true);
// Creating Parameter the first one being binding parameter
final List<CsdlParameter> parameters = new ArrayList<CsdlParameter>();
final CsdlParameter parameter = new CsdlParameter();
parameter.setName("Parameter1");
parameter.setType(X);
parameter.setNullable(true);
parameter.setCollection(false);
parameters.add(parameter);
action.setParameters(parameters);
action.setReturnType(new CsdlReturnType().setCollection(false).setType(Y));
actions.add(action);
return actions;
}
return null;
}
同じメタデータ プロバイダー クラスの getSchemas(...) で getActions(...) メソッドを呼び出します。
@Override
public List<CsdlSchema> getSchemas() throws ODataException {
// create Schema
CsdlSchema schema = new CsdlSchema();
schema.setNamespace("Stackoverflow");
// add EntityTypes
List<CsdlEntityType> entityTypes = new ArrayList<CsdlEntityType>();
entityTypes.add(getEntityType(X));
entityTypes.add(getEntityType(Y));
schema.setEntityTypes(entityTypes);
// add EntityContainer
schema.setEntityContainer(getEntityContainer());
// add bounded actions
List<CsdlAction> actions = new ArrayList<CsdlAction>();
schema.setActions(actions);
actions.addAll(getActions(ACTION_EXECUTE_FQN));
List<CsdlSchema> schemas = new ArrayList<CsdlSchema>();
schemas.add(schema);
return schemas;
}
私たちが行ったことは、アクションの最初の引数としてパラメーターを持つ ACTION_EXECUTE_FQN という名前のバインドされたアクションを作成したことです。この場合、エンティティ X であり、戻り値の型はエンティティ Y です。
サービスの実装:
現在、サービスの実装も必要です。採用されたユースケースによると、ActionEntityProcessorを実装するクラスを作成する必要があります。
この後、すべて同じです。これが役立つことを願っています。アクションの戻り値の型とアクションがバインドされるパラメーターの型に応じて、他の ActionProcessor があります。