/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
******************************************************************************/
package org.apache.olingo.odata2.core.batch.v2;
import java.util.ArrayList;
import java.util.List;
import org.apache.olingo.odata2.api.batch.BatchException;
import org.apache.olingo.odata2.api.batch.BatchParserResult;
import org.apache.olingo.odata2.api.client.batch.BatchSingleResponse;
import org.apache.olingo.odata2.api.uri.PathInfo;
import org.apache.olingo.odata2.core.batch.BatchHelper;
import org.apache.olingo.odata2.core.batch.BatchSingleResponseImpl;
import org.apache.olingo.odata2.core.batch.v2.BatchTransformatorCommon.HttpResponsetStatusLine;
public class BatchResponseTransformator implements BatchTransformator {
public BatchResponseTransformator() {}
@Override
public List<BatchParserResult> transform(final BatchBodyPart bodyPart, final PathInfo pathInfo, final String baseUri)
throws BatchException {
return processQueryOperation(bodyPart, pathInfo, baseUri);
}
private List<BatchParserResult> processQueryOperation(final BatchBodyPart bodyPart,
final PathInfo pathInfo,
final String baseUri) throws BatchException {
List<BatchParserResult> resultList = new ArrayList<BatchParserResult>();
BatchTransformatorCommon.validateContentType(bodyPart.getHeaders());
resultList.addAll(handleBodyPart(bodyPart));
return resultList;
}
private List<BatchParserResult> handleBodyPart(final BatchBodyPart bodyPart) throws BatchException {
List<BatchParserResult> bodyPartResult = new ArrayList<BatchParserResult>();
if (bodyPart.isChangeSet()) {
for (BatchQueryOperation operation : bodyPart.getRequests()) {
bodyPartResult.add(transformChangeSet((BatchChangeSetPart) operation));
}
} else {
final String contentId = bodyPart.getHeaders().getHeader(BatchHelper.HTTP_CONTENT_ID);
bodyPartResult.add(transformQueryOperation(bodyPart.getRequests().get(0), contentId));
}
return bodyPartResult;
}
private BatchSingleResponse transformChangeSet(final BatchChangeSetPart changeSet) throws BatchException {
BatchTransformatorCommon.validateContentTransferEncoding(changeSet.getHeaders(), true);
final String contentId = changeSet.getHeaders().getHeader(BatchHelper.HTTP_CONTENT_ID);
return transformQueryOperation(changeSet.getRequest(), contentId);
}
private BatchSingleResponse transformQueryOperation(final BatchQueryOperation operation, final String contentId)
throws BatchException {
final HttpResponsetStatusLine statusLine = new HttpResponsetStatusLine(operation.getHttpStatusLine());
BatchSingleResponseImpl response = new BatchSingleResponseImpl();
response.setContentId(contentId);
response.setHeaders(operation.getHeaders().toSingleMap());
response.setStatusCode(statusLine.getStatusCode());
response.setStatusInfo(statusLine.getStatusInfo());
response.setBody(getBody(operation));
return response;
}
private String getBody(final BatchQueryOperation operation) throws BatchException {
int contentLength = BatchTransformatorCommon.getContentLength(operation.getHeaders());
if (contentLength == -1) {
return BatchParserCommon.lineListToString(operation.getBody());
} else {
return BatchParserCommon.trimLineListToLength(operation.getBody(), contentLength);
}
}
}