Producing Query and Execute output documents
When implementing the Query and Execute operations, you may need to produce one or more output documents from one or more input documents.
Producing multiple output documents from one input document
To produce multiple output documents from a single input document, implement the OperationResponse class (see the Javadocs) with the following methods:
addPartialResult(see the Javadocs) — Adds a single result which is one of multiple results for a group of inputs. This method may be called as many times as necessary for the same inputs until they have been passed to finishPartialResult(Iterable).finishPartialResult(see the Javadocs) — Indicates that a group of inputs has added all partial results.
Code sample: Query operation
Here is a simple implementation of a Query operation producing multiple output documents from a single input document:
Example: Produce multiple output documents from a single input document
import com.boomi.connector.api.FilterData;
import com.boomi.connector.api.OperationResponse;
import com.boomi.connector.api.OperationStatus;
import com.boomi.connector.api.PayloadUtil;
import com.boomi.connector.api.QueryRequest;
import com.boomi.connector.util.BaseConnection;
import com.boomi.connector.util.BaseQueryOperation;
import static com.boomi.connector.api.OperationStatus.APPLICATION_ERROR;
public class QueryOperation extends BaseQueryOperation {
private static final int MAX_OUTPUT_DOCUMENTS = 10;
private static final String STATUS_SUCCESS_CODE = "200";
private static final String STATUS_ERROR_CODE = "400";
private static final String STATUS_DESCRIPTION = "Ok";
private static final String DOCUMENT_ID = "Document id = ";
protected QueryOperation(BaseConnection conn) {
super(conn);
}
@Override
protected void executeQuery(QueryRequest queryRequest, OperationResponse operationResponse) {
FilterData filterData = queryRequest.getFilter();
try {
for (int i = 0; i < MAX_OUTPUT_DOCUMENTS; i++) {
operationResponse.addPartialResult(filterData, OperationStatus.SUCCESS, STATUS_SUCCESS_CODE,
STATUS_DESCRIPTION, PayloadUtil.toPayload(DOCUMENT_ID + i));
}
}
catch (Exception ex) {
operationResponse.addPartialResult(filterData, APPLICATION_ERROR, STATUS_ERROR_CODE, ex.getMessage(), null);
}
finally {
operationResponse.finishPartialResult(filterData);
}
}
}
Process
Follow this process when implementing this functionality:
- Have an input document (TrackedData).
- Use the
OperationResponse.addPartialResultmethod to add the output documents that you want. Use the same input document. - If you need to add an error or failure, you can use the same method
OperationResponse.addPartialResultwith a differentOperationStatusparameter. - Call the method
OperationResponse.finishPartialResultwith the same input document to end the input document process.
You can also use utility methods from the ResponseUtil class (see the Javadocs):
addPartialSuccess(see the Javadocs) — Adds one of the successful results for the given input to the given response.addPartialFailures(see the Javadocs) — Adds failure results for the given inputs to the given response.
Code sample
ResponseUtil.addPartialSuccess(operationResponse, filterData,
STATUS_SUCCESS_CODE,
PayloadUtil.toPayload(DOCUMENT_ID + i));
ResponseUtil.addPartialFailures(operationResponse, filterData,
STATUS_ERROR_CODE, null);
In this example, addPartialSuccess and addPartialFailure are available methods in ResponseUtil and you can use the method addPartialResultWithHttpStatus (see the Javadocs). The appropriate OperationStatus is derived from the specified HTTP status code.
Producing one output document from multiple input documents
To produce one output document from multiple input documents, implement the OperationResponse class (see the Javadocs) with the following method:
addCombinedResult(see the Javadocs) — Adds one result for multiple inputs.
Code sample: Batch Delete operation
Here is a simple implementation of a Batch Delete operation producing one output document from multiple input documents. In this example, you need a list of IDs with a comma separator, for example, 156,655,78,8454:
Example: Produce single output document from multiple input documents
import com.boomi.connector.api.DeleteRequest;
import com.boomi.connector.api.ObjectIdData;
import com.boomi.connector.api.OperationResponse;
import com.boomi.connector.api.OperationStatus;
import com.boomi.connector.api.PayloadUtil;
import com.boomi.connector.api.ResponseUtil;
import com.boomi.connector.util.BaseConnection;
import com.boomi.connector.util.BaseDeleteOperation;
import org.apache.commons.lang.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class DeleteOperation extends BaseDeleteOperation {
private static final String STATUS_SUCCESS_CODE = "200";
private static final String STATUS_ERROR_CODE = "400";
private static final String STATUS_DESCRIPTION = "Ok";
private static final String DOCUMENTS_IDS = "Documents id = ";
private static final String SEPARATOR = ",";
protected DeleteOperation(BaseConnection conn) {
super(conn);
}
@Override
protected void executeDelete(DeleteRequest deleteRequest, OperationResponse operationResponse) {
List<ObjectIdData> objectIdDataList = new ArrayList<>();
for (ObjectIdData objectIdData : deleteRequest) {
objectIdDataList.add(objectIdData);
}
List<String> batch = new ArrayList<>();
try {
for (ObjectIdData objectIdData : objectIdDataList) {
batch.add(objectIdData.getObjectId());
}
ResponseUtil.addCombinedSuccess(operationResponse, objectIdDataList, STATUS_SUCCESS_CODE,
PayloadUtil.toPayload(DOCUMENTS_IDS + StringUtils.join(batch, SEPARATOR)));
operationResponse.addCombinedResult(objectIdDataList, OperationStatus.SUCCESS, STATUS_SUCCESS_CODE,
STATUS_DESCRIPTION, PayloadUtil.toPayload(DOCUMENTS_IDS + StringUtils.join(batch, SEPARATOR)));
}
catch (Exception ex) {
operationResponse.addCombinedResult(objectIdDataList, OperationStatus.FAILURE, STATUS_ERROR_CODE,
ex.getMessage(), null);
ResponseUtil.addCombinedFailure(operationResponse, objectIdDataList, STATUS_ERROR_CODE);
}
}
}
Process
Follow this process when implementing this functionality:
- Have input documents (deleteRequest).
- Use the
OperationResponse.addCombinedResultmethod to combine the input documents with the result that you want. - If you need to add an error or failure, you can use the same method
OperationResponse.addCombinedResultwith a differentOperationStatusparameter. - Process all input documents.
You can also use utility methods from the ResponseUtil class (see the Javadocs):
addCombinedSuccess(see the Javadocs) — Adds a single successful result with an empty payload for the given inputs to the given response.addCombinedFailure(see the Javadocs) — Adds a single failure result with an empty payload for the given inputs to the given response.
Code sample
ResponseUtil.addCombinedSuccess(operationResponse,
objectIdDataList, STATUS_SUCCESS_CODE,
PayloadUtil.toPayload(DOCUMENTS_IDS +
StringUtils.join(batch, SEPARATOR)));
ResponseUtil.addCombinedFailure(operationResponse,
objectIdDataList, STATUS_ERROR_CODE);
In this example, addCombinedSuccess and addCombinedFailure are available methods in ResponseUtil (see the Javadocs).