diff options
author | Rob Daugherty <rd472p@att.com> | 2018-05-15 13:23:01 -0400 |
---|---|---|
committer | Rob Daugherty <rd472p@att.com> | 2018-05-15 13:58:10 -0400 |
commit | d2e69c0d689596033a9c35aa98d37a44e2cc88cb (patch) | |
tree | be29159a319f63c9e5c242da6354c1ef0133363a /mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp | |
parent | b4d4cb8703842aee6df6c9a5d2a0fd6617539233 (diff) |
WorkflowResponse json issues
This commit adds some robustness to the interface between the
API-H and BPMN, specifically, in how the response is handled.
I don't have proof, but there appears to be some randomness to
the json provider behavior when used with the jax-rs. Sometimes,
the serializer is adding the root element, and sometimes it
is not. Maybe there's something wrong with the configuration.
Maybe we have competing json providers. I couldn't pin this
down.
I'm almost certain it is the presence of the root element in
the content that causes the API-H code to fail parsing of the
BPMN response. This doesn't kill the request, as you might
expect, but rather, the API-H passes the BPMN response through
to the client (VID, or policy, or whatever).
The original problem (SO-586) was "fixed" by "removing the
wrapper". This "wrapper" is a needed feature of the interface
between BPMN and the API-H. We shouldn't have removed it.
The fact that the "fix" appeared to work is due to the
behavior I described in the previous paragraph. The API-H
chokes on the message, and it passes it through unchanged.
Not really what we want.
So, I don't know why the jackson/json behavior is flaky and
different now, but I can (and did) modify the API-H so it can
parse a json message whether or not it has a root element.
Note that WorkflowResponse.java (in BPMN) and CamundaResponse.java
(in the API-H) are basically the same bean representing the
message format. Seems less than ideal to have two different
classes.
Also note that I changed the name of the "response" attribute
of the WorkflowResponse and CamundaResponse classes to "content".
Got tired of seeing this nonsense everywhere in the code:
response.getResponse()
Change-Id: Icaf70f8457de99e493cf882170fe778c620308c9
Issue-ID: SO-586
Issue-ID: SO-618
Signed-off-by: Rob Daugherty <rd472p@att.com>
Diffstat (limited to 'mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp')
2 files changed, 84 insertions, 77 deletions
diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/camundabeans/CamundaResponse.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/camundabeans/CamundaResponse.java index 3c5c5ecb1d..64b7d86b59 100644 --- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/camundabeans/CamundaResponse.java +++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/camundabeans/CamundaResponse.java @@ -20,53 +20,41 @@ package org.openecomp.mso.apihandler.camundabeans; +import java.util.Map; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; + +// This class must be 100% JSON-compatible with the BPMN WorkflowResponse class. +// TODO: BPMN and the API-H should use a common class. /** - * JavaBean JSON class for a "variables" which contains the xml payload that - * will be passed to the Camunda process - * + * A synchronous response from a workflow. */ - +@JsonRootName(value = "WorkflowResponse") public class CamundaResponse { - - @JsonProperty("response") - private String response; + + @JsonProperty("processInstanceId") + private String processInstanceId; + @JsonProperty("messageCode") private int messageCode; + @JsonProperty("message") private String message; - @JsonProperty("processInstanceID") - private String processInstanceID; - @JsonProperty("variables") - private String variables; - public String getProcessInstanceID() { - return processInstanceID; - } - - public void setProcessInstanceID(String processInstanceID) { - this.processInstanceID = processInstanceID; - } - - public String getVariables() { - return variables; - } - - public void setVariables(String variables) { - this.variables = variables; - } + @JsonProperty("variables") + private Map<String,String> variables; - public CamundaResponse() { - } + @JsonProperty("content") + private String content; - public String getResponse() { - return response; + public String getProcessInstanceId() { + return processInstanceId; } - public void setResponse(String response) { - this.response = response; + public void setProcessInstanceId(String processInstanceId) { + this.processInstanceId = processInstanceId; } public int getMessageCode() { @@ -85,13 +73,30 @@ public class CamundaResponse { this.message = message; } + public Map<String,String> getVariables() { + return variables; + } + + public void setVariables(Map<String,String> variables) { + this.variables = variables; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + @Override public String toString() { - return "CamundaResponse [response=" + response + ", messageCode=" - + messageCode + ", message=" + message + "]"; + return getClass().getSimpleName() + "[" + + "processInstanceId=" + processInstanceId + + ",messageCode=" + messageCode + + ",message=" + message + + ",variables=" + variables + + ",content=" + content + + "]"; } - - - - -} +}
\ No newline at end of file diff --git a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/ResponseHandler.java b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/ResponseHandler.java index 732b7786b2..a8b8984343 100644 --- a/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/ResponseHandler.java +++ b/mso-api-handlers/mso-api-handler-common/src/main/java/org/openecomp/mso/apihandler/common/ResponseHandler.java @@ -27,21 +27,22 @@ import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.util.EntityUtils; -import com.fasterxml.jackson.databind.ObjectMapper; - import org.openecomp.mso.apihandler.camundabeans.CamundaResponse; -import org.openecomp.mso.logger.MsoLogger; import org.openecomp.mso.logger.MessageEnum; +import org.openecomp.mso.logger.MsoLogger; +import org.openecomp.mso.utils.RootIgnoringObjectMapper; + +import com.fasterxml.jackson.databind.ObjectMapper; public class ResponseHandler { private CamundaResponse response; private int status; - private String responseBody=""; + private String content = ""; private HttpResponse httpResponse; private int type; private static MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.APIH); - private static final String RESPONSE_BODY_MSG = "response body is: "; + private static final String RESPONSE_CONTENT_MSG = "response content is: "; public ResponseHandler(HttpResponse httpResponse, int type) { this.httpResponse = httpResponse; @@ -67,29 +68,31 @@ public class ResponseHandler { + @SuppressWarnings("unchecked") private void parseCamunda(){ try{ - HttpEntity entity = httpResponse.getEntity(); - responseBody = EntityUtils.toString(entity); - } catch (IOException e) { - msoLogger.debug("IOException getting Camunda response body", e); - } - - ObjectMapper mapper = new ObjectMapper(); - try { - response = mapper.readValue(responseBody, CamundaResponse.class); - } catch (IOException e) { - msoLogger.debug("IOException getting Camunda response body", e); - } - msoLogger.debug("json response is: " + responseBody); - if(response!=null){ - responseBody = response.getResponse(); - } - msoLogger.debug(RESPONSE_BODY_MSG + responseBody); - - + HttpEntity entity = httpResponse.getEntity(); + content = EntityUtils.toString(entity); + } catch (IOException e) { + msoLogger.debug("IOException getting Camunda response content", e); + } + + ObjectMapper mapper = new RootIgnoringObjectMapper<CamundaResponse>(CamundaResponse.class); + + try { + response = mapper.readValue(content, CamundaResponse.class); + } catch (IOException e) { + msoLogger.debug("IOException getting Camunda response content", e); + } + msoLogger.debug("json response is: " + content); + if(response!=null){ + content = response.getContent(); + } + msoLogger.debug(RESPONSE_CONTENT_MSG + content); + + if(status!=HttpStatus.SC_ACCEPTED){ - msoLogger.error(MessageEnum.APIH_ERROR_FROM_BPEL_SERVER, "Camunda", String.valueOf(status), responseBody, "Camunda", "parseCamunda", MsoLogger.ErrorCode.BusinessProcesssError, "Error in APIH from Camunda"); + msoLogger.error(MessageEnum.APIH_ERROR_FROM_BPEL_SERVER, "Camunda", String.valueOf(status), content, "Camunda", "parseCamunda", MsoLogger.ErrorCode.BusinessProcesssError, "Error in APIH from Camunda"); } } @@ -99,16 +102,16 @@ public class ResponseHandler { try { if (bpelEntity!=null) { - responseBody = EntityUtils.toString(bpelEntity); - msoLogger.debug(RESPONSE_BODY_MSG + responseBody); + content = EntityUtils.toString(bpelEntity); + msoLogger.debug(RESPONSE_CONTENT_MSG + content); } if(status!=HttpStatus.SC_ACCEPTED){ - msoLogger.error(MessageEnum.APIH_ERROR_FROM_BPEL_SERVER, "BPEL", String.valueOf(status), responseBody, "BPEL", "parseBpel", MsoLogger.ErrorCode.BusinessProcesssError, "Error in APIH from BPEL"); + msoLogger.error(MessageEnum.APIH_ERROR_FROM_BPEL_SERVER, "BPEL", String.valueOf(status), content, "BPEL", "parseBpel", MsoLogger.ErrorCode.BusinessProcesssError, "Error in APIH from BPEL"); } } catch (IOException e) { - msoLogger.debug("IOException getting BPEL response body", e); + msoLogger.debug("IOException getting BPEL response content", e); } } @@ -118,16 +121,16 @@ public class ResponseHandler { try { if (camundataskEntity!=null) { - responseBody = EntityUtils.toString(camundataskEntity); - msoLogger.debug(RESPONSE_BODY_MSG + responseBody); + content = EntityUtils.toString(camundataskEntity); + msoLogger.debug(RESPONSE_CONTENT_MSG + content); } if(status!=HttpStatus.SC_NO_CONTENT && status != HttpStatus.SC_ACCEPTED){ - msoLogger.error(MessageEnum.APIH_ERROR_FROM_BPEL_SERVER, "CAMUNDATASK", String.valueOf(status), responseBody, "CAMUNDATASK", "parseCamundaTask", MsoLogger.ErrorCode.BusinessProcesssError, "Error in APIH from Camunda Task"); + msoLogger.error(MessageEnum.APIH_ERROR_FROM_BPEL_SERVER, "CAMUNDATASK", String.valueOf(status), content, "CAMUNDATASK", "parseCamundaTask", MsoLogger.ErrorCode.BusinessProcesssError, "Error in APIH from Camunda Task"); } } catch (IOException e) { - msoLogger.debug("IOException getting Camunda Task response body", e); + msoLogger.debug("IOException getting Camunda Task response content", e); } } @@ -175,18 +178,17 @@ public class ResponseHandler { } - public String getResponseBody() { - return responseBody; + public String getContent() { + return content; } - public void setResponseBody(String responseBody) { - this.responseBody = responseBody; + public void setContent(String content) { + this.content = content; } public int getStatus() { return status; } - } |