/******************************************************************************* * Copyright 2013 SAP AG * * Licensed 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 com.sap.core.odata.core; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import com.sap.core.odata.api.commons.ODataHttpMethod; import com.sap.core.odata.api.processor.ODataRequest; import com.sap.core.odata.api.uri.PathInfo; import com.sap.core.odata.core.commons.ContentType; /** * @author SAP AG */ public class ODataRequestImpl extends ODataRequest { private ODataHttpMethod method; private Map<String, List<String>> requestHeaders = new HashMap<String, List<String>>(); private InputStream body; private PathInfo pathInfo; private Map<String, String> queryParameters; private List<String> acceptHeaders; private ContentType contentType; private List<Locale> acceptableLanguages; @Override public Map<String, String> getQueryParameters() { return queryParameters; } @Override public List<String> getAcceptHeaders() { return acceptHeaders; } @Override public String getContentType() { return contentType == null ? null : contentType.toContentTypeString(); } @Override public List<Locale> getAcceptableLanguages() { return acceptableLanguages; } @Override public String getRequestHeaderValue(final String name) { final List<String> headerList = requestHeaders.get(name); return headerList == null || headerList.isEmpty() ? null : headerList.get(0); } @Override public Map<String, List<String>> getRequestHeaders() { return Collections.unmodifiableMap(requestHeaders); } @Override public InputStream getBody() { return body; } @Override public ODataHttpMethod getMethod() { return method; } @Override public PathInfo getPathInfo() { return pathInfo; } public class ODataRequestBuilderImpl extends ODataRequestBuilder { private ODataHttpMethod method; private Map<String, List<String>> requestHeaders = new HashMap<String, List<String>>(); private InputStream body; private PathInfo pathInfo; private Map<String, String> queryParameters; private List<String> acceptHeaders; private ContentType contentType; private List<Locale> acceptableLanguages; @Override public ODataRequest build() { ODataRequestImpl.this.method = method; ODataRequestImpl.this.requestHeaders = requestHeaders; ODataRequestImpl.this.body = body; ODataRequestImpl.this.pathInfo = pathInfo; ODataRequestImpl.this.queryParameters = queryParameters; ODataRequestImpl.this.acceptHeaders = acceptHeaders; ODataRequestImpl.this.contentType = contentType; ODataRequestImpl.this.acceptableLanguages = acceptableLanguages; return ODataRequestImpl.this; } @Override public ODataRequestBuilder requestHeaders(final Map<String, List<String>> headers) { requestHeaders = headers; return this; } @Override public ODataRequestBuilder body(final InputStream body) { this.body = body; return this; } @Override public ODataRequestBuilder pathInfo(final PathInfo pathInfo) { this.pathInfo = pathInfo; return this; } @Override public ODataRequestBuilder method(final ODataHttpMethod method) { this.method = method; return this; } @Override public ODataRequestBuilder acceptableLanguages(final List<Locale> acceptableLanguages) { this.acceptableLanguages = acceptableLanguages; return this; } @Override public ODataRequestBuilder acceptHeaders(final List<String> acceptHeaders) { this.acceptHeaders = acceptHeaders; return this; } @Override public ODataRequestBuilder queryParameters(final Map<String, String> queryParameters) { this.queryParameters = queryParameters; return this; } @Override public ODataRequestBuilder contentType(final String contentType) { this.contentType = ContentType.create(contentType); return this; } @Override public ODataRequestBuilder fromRequest(final ODataRequest request) { pathInfo = request.getPathInfo(); method = request.getMethod(); body = request.getBody(); if (request.getContentType() != null) { contentType = ContentType.create(request.getContentType()); } requestHeaders = request.getRequestHeaders(); if (request.getAcceptHeaders() != null) { acceptHeaders = new ArrayList<String>(); for (String acceptHeader : request.getAcceptHeaders()) { acceptHeaders.add(acceptHeader); } } if (request.getAcceptableLanguages() != null) { acceptableLanguages = new ArrayList<Locale>(); for (Locale acceptLanguage : request.getAcceptableLanguages()) { acceptableLanguages.add(acceptLanguage); } } if (request.getQueryParameters() != null) { queryParameters = new HashMap<String, String>(); for (Map.Entry<String, String> queryParameter : request.getQueryParameters().entrySet()) { String queryParameterName = queryParameter.getKey(); queryParameters.put(queryParameterName, queryParameter.getValue()); } } return this; } } }