use of jp.ossc.nimbus.service.publish.ServerConnection in project nimbus by nimbus-org.
the class ServerConnectionSendActionService method execute.
/**
* リソースの内容を読み込んで、{@link ServerConnection}に{@link Message}を送信する。<p>
* リソースのフォーマットは、以下。<br>
* <pre>
* subject,key
*
* objectId
* objectScript
* </pre>
* subjectは、{@link Message}に設定するサブジェクトを指定する。keyは、{@link Message}に設定するキーを指定する。サブジェクトを複数設定する場合は、改行して指定する。サブジェクト指定の終了には、空行を挿入する。<br>
* objectIdは、{@link Message}に設定するオブジェクトを指定するもので、同一テストケース中に、このTestActionより前に、オブジェクトを戻すテストアクションが存在する場合は、そのアクションIDを指定する。また、同一シナリオ中に、このTestActionより前に、オブジェクトを戻すテストアクションが存在する場合は、テストケースIDとアクションIDをカンマ区切りで指定する。空行を指定した場合は、オブジェクトをTestActionの結果から取得しない。<br>
* objectScriptは、{@link Message}に設定するオブジェクトを生成するスクリプトを指定する。スクリプトは、{@link Interpreter#evaluate(String,Map)}で評価され、引数の変数マップには、"context"で{@link TestContext}、"preResult"でpreResultが渡される。<br>
* objectId、objectScriptの両方が指定されていない場合は、preResultを使用する。<br>
*
* @param context コンテキスト
* @param actionId アクションID
* @param preResult 更新クエリに対する引数オブジェクト
* @param resource リソース
* @return 送信したメッセージ
*/
public Object execute(TestContext context, String actionId, Object preResult, Reader resource) throws Exception {
BufferedReader br = new BufferedReader(resource);
Message message = null;
Object object = preResult;
ServerConnectionFactory scf = serverConnectionFactory;
if (serverConnectionFactory == null && serverConnectionFactoryServiceName != null) {
scf = (ServerConnectionFactory) ServiceManagerFactory.getServiceObject(serverConnectionFactoryServiceName);
}
final ServerConnection con = scf.getServerConnection();
try {
String subjectAndKey = br.readLine();
if (subjectAndKey == null || subjectAndKey.length() == 0) {
throw new Exception("Unexpected EOF on subject and key");
}
do {
String[] subjectAndKeyArray = CSVReader.toArray(subjectAndKey, ',', '\\', null, null, true, false, true, true);
if (subjectAndKeyArray == null || subjectAndKeyArray.length == 0 || subjectAndKeyArray.length > 2) {
throw new Exception("Illegal subject and key format. subjectAndKey=" + subjectAndKey);
}
if (message == null) {
message = con.createMessage(subjectAndKeyArray[0], subjectAndKeyArray.length == 2 ? subjectAndKeyArray[1] : null);
} else {
message.setSubject(subjectAndKeyArray[0], subjectAndKeyArray.length == 2 ? subjectAndKeyArray[1] : null);
}
} while ((subjectAndKey = br.readLine()) != null && subjectAndKey.length() != 0);
final String objectId = br.readLine();
if (objectId != null && objectId.length() != 0) {
Object actionResult = null;
if (objectId.indexOf(",") == -1) {
actionResult = context.getTestActionResult(objectId);
} else {
String[] ids = objectId.split(",");
if (ids.length != 2) {
throw new Exception("Illegal objectId format. id=" + objectId);
}
actionResult = context.getTestActionResult(ids[0], ids[1]);
}
if (actionResult == null) {
throw new Exception("TestActionResult not found. id=" + objectId);
}
object = actionResult;
}
String objectScript = null;
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
try {
String line = null;
while ((line = br.readLine()) != null) {
pw.println(line);
}
pw.flush();
objectScript = sw.toString();
if (objectScript.length() == 0) {
objectScript = null;
}
} finally {
sw.close();
pw.close();
}
if (objectScript != null) {
if (interpreter == null) {
throw new UnsupportedOperationException("Interpreter is null.");
}
final Map params = new HashMap();
params.put("context", context);
params.put("preResult", preResult);
object = interpreter.evaluate(objectScript, params);
}
if (object != null) {
message.setObject(object);
}
con.send(message);
} finally {
br.close();
br = null;
}
return message;
}
Aggregations