http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerImpl.java deleted file mode 100644 index a34aa95..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/FixedFormatDeserializerImpl.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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.server.core.deserializer; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; - -import org.apache.olingo.server.api.batch.exception.BatchDeserializerException; -import org.apache.olingo.server.api.deserializer.DeserializerException; -import org.apache.olingo.server.api.deserializer.FixedFormatDeserializer; -import org.apache.olingo.server.api.deserializer.batch.BatchOptions; -import org.apache.olingo.server.api.deserializer.batch.BatchRequestPart; -import org.apache.olingo.server.core.deserializer.batch.BatchParser; - -public class FixedFormatDeserializerImpl implements FixedFormatDeserializer { - - @Override - public byte[] binary(InputStream content) throws DeserializerException { - ByteArrayOutputStream result = new ByteArrayOutputStream(); - byte[] buffer = new byte[128]; - int count = -1; - try { - while ((count = content.read(buffer)) > -1) { - result.write(buffer, 0, count); - } - result.flush(); - } catch (final IOException e) { - throw new DeserializerException("An I/O exception occurred.", e, - DeserializerException.MessageKeys.IO_EXCEPTION); - } - return result.toByteArray(); - } - - // TODO: Deserializer - @Override - public List<BatchRequestPart> parseBatchRequest(InputStream content, String boundary, BatchOptions options) - throws BatchDeserializerException { - final BatchParser parser = new BatchParser(); - - return parser.parseBatchRequest(content, boundary, options); - } -}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchBodyPart.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchBodyPart.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchBodyPart.java deleted file mode 100644 index a11b886..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchBodyPart.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * 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.server.core.deserializer.batch; - -import java.util.LinkedList; -import java.util.List; - -import org.apache.olingo.commons.api.http.HttpHeader; -import org.apache.olingo.server.api.batch.exception.BatchDeserializerException; - -public class BatchBodyPart implements BatchPart { - final private String boundary; - final private boolean isStrict; - final List<Line> remainingMessage = new LinkedList<Line>(); - - private Header headers; - private boolean isChangeSet; - private List<BatchQueryOperation> requests; - - public BatchBodyPart(final List<Line> message, final String boundary, final boolean isStrict) { - this.boundary = boundary; - this.isStrict = isStrict; - remainingMessage.addAll(message); - } - - public BatchBodyPart parse() throws BatchDeserializerException { - headers = BatchParserCommon.consumeHeaders(remainingMessage); - BatchParserCommon.consumeBlankLine(remainingMessage, isStrict); - isChangeSet = isChangeSet(headers); - requests = consumeRequest(remainingMessage); - - return this; - } - - private boolean isChangeSet(final Header header) throws BatchDeserializerException { - final List<String> contentTypes = headers.getHeaders(HttpHeader.CONTENT_TYPE); - boolean isChangeSet = false; - - if (contentTypes.size() == 0) { - throw new BatchDeserializerException("Missing content type", - BatchDeserializerException.MessageKeys.MISSING_CONTENT_TYPE, "" - + headers.getLineNumber()); - } - - for (String contentType : contentTypes) { - if (isContentTypeMultiPartMixed(contentType)) { - isChangeSet = true; - } - } - - return isChangeSet; - } - - private List<BatchQueryOperation> consumeRequest(final List<Line> remainingMessage) - throws BatchDeserializerException { - if (isChangeSet) { - return consumeChangeSet(remainingMessage); - } else { - return consumeQueryOperation(remainingMessage); - } - } - - private List<BatchQueryOperation> consumeChangeSet(final List<Line> remainingMessage2) - throws BatchDeserializerException { - final List<List<Line>> changeRequests = splitChangeSet(remainingMessage); - final List<BatchQueryOperation> requestList = new LinkedList<BatchQueryOperation>(); - - for (List<Line> changeRequest : changeRequests) { - requestList.add(new BatchChangeSetPart(changeRequest, isStrict).parse()); - } - - return requestList; - } - - private List<List<Line>> splitChangeSet(final List<Line> remainingMessage2) throws BatchDeserializerException { - - final HeaderField contentTypeField = headers.getHeaderField(HttpHeader.CONTENT_TYPE); - final String changeSetBoundary = BatchParserCommon.getBoundary(contentTypeField.getValueNotNull(), - contentTypeField.getLineNumber()); - validateChangeSetBoundary(changeSetBoundary, headers); - - return BatchParserCommon.splitMessageByBoundary(remainingMessage, changeSetBoundary); - } - - private void validateChangeSetBoundary(final String changeSetBoundary, final Header header) - throws BatchDeserializerException { - if (changeSetBoundary.equals(boundary)) { - throw new BatchDeserializerException("Change set boundary is equals to batch request boundary", - BatchDeserializerException.MessageKeys.INVALID_BOUNDARY, - "" + header.getHeaderField(HttpHeader.CONTENT_TYPE).getLineNumber()); - } - } - - private List<BatchQueryOperation> consumeQueryOperation(final List<Line> remainingMessage) - throws BatchDeserializerException { - final List<BatchQueryOperation> requestList = new LinkedList<BatchQueryOperation>(); - requestList.add(new BatchQueryOperation(remainingMessage, isStrict).parse()); - - return requestList; - } - - private boolean isContentTypeMultiPartMixed(final String contentType) { - return BatchParserCommon.PATTERN_MULTIPART_BOUNDARY.matcher(contentType).matches(); - } - - @Override - public Header getHeaders() { - return headers; - } - - @Override - public boolean isStrict() { - return isStrict; - } - - public boolean isChangeSet() { - return isChangeSet; - } - - public List<BatchQueryOperation> getRequests() { - return requests; - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchChangeSetPart.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchChangeSetPart.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchChangeSetPart.java deleted file mode 100644 index 47210c3..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchChangeSetPart.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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.server.core.deserializer.batch; - -import java.util.List; - -import org.apache.olingo.server.api.batch.exception.BatchDeserializerException; - -public class BatchChangeSetPart extends BatchQueryOperation { - private BatchQueryOperation request; - - public BatchChangeSetPart(final List<Line> message, final boolean isStrict) throws BatchDeserializerException { - super(message, isStrict); - } - - @Override - public BatchChangeSetPart parse() throws BatchDeserializerException { - headers = BatchParserCommon.consumeHeaders(message); - BatchParserCommon.consumeBlankLine(message, isStrict); - - request = new BatchQueryOperation(message, isStrict).parse(); - - return this; - } - - public BatchQueryOperation getRequest() { - return request; - } - - @Override - public List<Line> getBody() { - return request.getBody(); - } - - @Override - public Line getHttpStatusLine() { - return request.getHttpStatusLine(); - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchParser.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchParser.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchParser.java deleted file mode 100644 index f7a78b8..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchParser.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * 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.server.core.deserializer.batch; - -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.LinkedList; -import java.util.List; - -import org.apache.olingo.commons.api.ODataRuntimeException; -import org.apache.olingo.server.api.batch.exception.BatchDeserializerException; -import org.apache.olingo.server.api.deserializer.batch.BatchOptions; -import org.apache.olingo.server.api.deserializer.batch.BatchRequestPart; - -public class BatchParser { - - private BatchOptions options; - - public List<BatchRequestPart> parseBatchRequest(InputStream content, String boundary, BatchOptions options) - throws BatchDeserializerException { - this.options = options; - - BatchRequestTransformator transformator = new BatchRequestTransformator(options.getRawBaseUri(), - options.getRawServiceResolutionUri()); - return parse(content, boundary, transformator); - } - - private List<BatchRequestPart> parse(final InputStream in, String boundary, - final BatchRequestTransformator transformator) - throws BatchDeserializerException { - try { - return parseBatch(in, boundary, transformator); - } catch (IOException e) { - throw new ODataRuntimeException(e); - } finally { - try { - in.close(); - } catch (IOException e) { - throw new ODataRuntimeException(e); - } - } - } - - private List<BatchRequestPart> parseBatch(final InputStream in, final String boundary, - final BatchRequestTransformator transformator) throws IOException, BatchDeserializerException { - final List<BatchRequestPart> resultList = new LinkedList<BatchRequestPart>(); - final List<List<Line>> bodyPartStrings = splitBodyParts(in, boundary); - - for (List<Line> bodyPartString : bodyPartStrings) { - BatchBodyPart bodyPart = new BatchBodyPart(bodyPartString, boundary, options.isStrict()).parse(); - resultList.addAll(transformator.transform(bodyPart)); - } - - return resultList; - } - - private List<List<Line>> splitBodyParts(final InputStream in, final String boundary) throws IOException, - BatchDeserializerException { - final BufferedReaderIncludingLineEndings reader = new BufferedReaderIncludingLineEndings(new InputStreamReader(in)); - final List<Line> message = reader.toLineList(); - reader.close(); - - return BatchParserCommon.splitMessageByBoundary(message, boundary); - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchParserCommon.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchParserCommon.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchParserCommon.java deleted file mode 100644 index b09f56b..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchParserCommon.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * 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.server.core.deserializer.batch; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Locale; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.olingo.commons.api.http.HttpContentType; -import org.apache.olingo.server.api.batch.exception.BatchDeserializerException; - -public class BatchParserCommon { - - private static final String REG_EX_BOUNDARY = - "([a-zA-Z0-9_\\-\\.'\\+]{1,70})|\"([a-zA-Z0-9_\\-\\.'\\+\\s\\" + - "(\\),/:=\\?]{1,69}[a-zA-Z0-9_\\-\\.'\\+\\(\\),/:=\\?])\""; - private static final Pattern PATTERN_LAST_CRLF = Pattern.compile("(.*)(\r\n){1}( *)", Pattern.DOTALL); - private static final Pattern PATTERN_HEADER_LINE = Pattern.compile("([a-zA-Z\\-]+):\\s?(.*)\\s*"); - private static final String REG_EX_APPLICATION_HTTP = "application/http"; - - public static final Pattern PATTERN_MULTIPART_BOUNDARY = Pattern.compile("multipart/mixed(.*)", - Pattern.CASE_INSENSITIVE); - public static final Pattern PATTERN_CONTENT_TYPE_APPLICATION_HTTP = Pattern.compile(REG_EX_APPLICATION_HTTP, - Pattern.CASE_INSENSITIVE); - public static final String BINARY_ENCODING = "binary"; - public static final String HTTP_CONTENT_ID = "Content-Id"; - public static final String HTTP_CONTENT_TRANSFER_ENCODING = "Content-Transfer-Encoding"; - - public static final String HTTP_EXPECT = "Expect"; - public static final String HTTP_FROM = "From"; - public static final String HTTP_MAX_FORWARDS = "Max-Forwards"; - public static final String HTTP_RANGE = "Range"; - public static final String HTTP_TE = "TE"; - - public static String getBoundary(final String contentType, final int line) throws BatchDeserializerException { - if (contentType == null) { - throw new BatchDeserializerException("Missing content type", - BatchDeserializerException.MessageKeys.MISSING_CONTENT_TYPE, line); - } - - if (contentType.toLowerCase(Locale.ENGLISH).startsWith("multipart/mixed")) { - final String[] parameter = contentType.split(";"); - - for (final String pair : parameter) { - - final String[] attrValue = pair.split("="); - if (attrValue.length == 2 && "boundary".equals(attrValue[0].trim().toLowerCase(Locale.ENGLISH))) { - if (attrValue[1].matches(REG_EX_BOUNDARY)) { - return trimQuota(attrValue[1].trim()); - } else { - throw new BatchDeserializerException("Invalid boundary format", - BatchDeserializerException.MessageKeys.INVALID_BOUNDARY, "" + line); - } - } - - } - } - throw new BatchDeserializerException("Content type is not multipart mixed", - BatchDeserializerException.MessageKeys.INVALID_CONTENT_TYPE, HttpContentType.MULTIPART_MIXED); - } - - public static String removeEndingSlash(String content) { - content = content.trim(); - int lastSlashIndex = content.lastIndexOf('/'); - - return (lastSlashIndex == content.length() - 1) ? content.substring(0, content.length() - 1) : content; - } - - private static String trimQuota(String boundary) { - if (boundary.matches("\".*\"")) { - boundary = boundary.replace("\"", ""); - } - - return boundary; - } - - public static List<List<Line>> splitMessageByBoundary(final List<Line> message, final String boundary) - throws BatchDeserializerException { - final List<List<Line>> messageParts = new LinkedList<List<Line>>(); - List<Line> currentPart = new ArrayList<Line>(); - boolean isEndReached = false; - - final String quotedBoundary = Pattern.quote(boundary); - final Pattern boundaryDelimiterPattern = Pattern.compile("--" + quotedBoundary + "--[\\s ]*"); - final Pattern boundaryPattern = Pattern.compile("--" + quotedBoundary + "[\\s ]*"); - - for (Line currentLine : message) { - if (boundaryDelimiterPattern.matcher(currentLine.toString()).matches()) { - removeEndingCRLFFromList(currentPart); - messageParts.add(currentPart); - isEndReached = true; - } else if (boundaryPattern.matcher(currentLine.toString()).matches()) { - removeEndingCRLFFromList(currentPart); - messageParts.add(currentPart); - currentPart = new LinkedList<Line>(); - } else { - currentPart.add(currentLine); - } - - if (isEndReached) { - break; - } - } - - final int lineNumer = (message.size() > 0) ? message.get(0).getLineNumber() : 0; - // Remove preamble - if (messageParts.size() > 0) { - messageParts.remove(0); - } - - if (!isEndReached) { - throw new BatchDeserializerException("Missing close boundary delimiter", - BatchDeserializerException.MessageKeys.MISSING_CLOSE_DELIMITER, - "" + lineNumer); - } - - return messageParts; - } - - private static void removeEndingCRLFFromList(final List<Line> list) { - if (list.size() > 0) { - Line lastLine = list.remove(list.size() - 1); - list.add(removeEndingCRLF(lastLine)); - } - } - - public static Line removeEndingCRLF(final Line line) { - Pattern pattern = PATTERN_LAST_CRLF; - Matcher matcher = pattern.matcher(line.toString()); - - if (matcher.matches()) { - return new Line(matcher.group(1), line.getLineNumber()); - } else { - return line; - } - } - - public static Header consumeHeaders(final List<Line> remainingMessage) { - final int headerLineNumber = remainingMessage.size() != 0 ? remainingMessage.get(0).getLineNumber() : 0; - final Header headers = new Header(headerLineNumber); - final Iterator<Line> iter = remainingMessage.iterator(); - Line currentLine; - boolean isHeader = true; - - while (iter.hasNext() && isHeader) { - currentLine = iter.next(); - final Matcher headerMatcher = PATTERN_HEADER_LINE.matcher(currentLine.toString()); - - if (headerMatcher.matches() && headerMatcher.groupCount() == 2) { - iter.remove(); - - String headerName = headerMatcher.group(1).trim(); - String headerValue = headerMatcher.group(2).trim(); - - headers.addHeader(headerName, Header.splitValuesByComma(headerValue), currentLine.getLineNumber()); - } else { - isHeader = false; - } - } - - return headers; - } - - public static void consumeBlankLine(final List<Line> remainingMessage, final boolean isStrict) - throws BatchDeserializerException { - // TODO is \r\n to strict? - if (remainingMessage.size() > 0 && remainingMessage.get(0).toString().matches("\\s*(\r\n|\n)\\s*")) { - remainingMessage.remove(0); - } else { - if (isStrict) { - final int lineNumber = (remainingMessage.size() > 0) ? remainingMessage.get(0).getLineNumber() : 0; - throw new BatchDeserializerException("Missing blank line", - BatchDeserializerException.MessageKeys.MISSING_BLANK_LINE, "[None]", "" - + lineNumber); - } - } - } - - public static InputStream convertLineListToInputStream(final List<Line> messageList) { - final String message = lineListToString(messageList); - - return new ByteArrayInputStream(message.getBytes()); - } - - private static String lineListToString(final List<Line> messageList) { - final StringBuilder builder = new StringBuilder(); - - for (Line currentLine : messageList) { - builder.append(currentLine.toString()); - } - - return builder.toString(); - } - - public static String trimLineListToLength(final List<Line> list, final int length) { - final String message = lineListToString(list); - final int lastIndex = Math.min(length, message.length()); - - return (lastIndex > 0) ? message.substring(0, lastIndex) : ""; - } - - public static InputStream convertLineListToInputStream(final List<Line> list, final int length) { - final String message = trimLineListToLength(list, length); - - return new ByteArrayInputStream(message.getBytes()); - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchPart.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchPart.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchPart.java deleted file mode 100644 index 9ee642d..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchPart.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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.server.core.deserializer.batch; - -public interface BatchPart { - public Header getHeaders(); - - public boolean isStrict(); -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchQueryOperation.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchQueryOperation.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchQueryOperation.java deleted file mode 100644 index efc9f32..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchQueryOperation.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * 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.server.core.deserializer.batch; - -import java.util.List; - -import org.apache.olingo.server.api.batch.exception.BatchDeserializerException; - -public class BatchQueryOperation implements BatchPart { - - protected final boolean isStrict; - protected Line httpStatusLine; - protected Header headers; - protected List<Line> body; - protected int bodySize; - protected List<Line> message; - - public BatchQueryOperation(final List<Line> message, final boolean isStrict) { - this.isStrict = isStrict; - this.message = message; - } - - public BatchQueryOperation parse() throws BatchDeserializerException { - httpStatusLine = consumeHttpStatusLine(message); - headers = BatchParserCommon.consumeHeaders(message); - BatchParserCommon.consumeBlankLine(message, isStrict); - body = message; - - return this; - } - - protected Line consumeHttpStatusLine(final List<Line> message) throws BatchDeserializerException { - if (message.size() > 0 && !message.get(0).toString().trim().equals("")) { - final Line method = message.get(0); - message.remove(0); - - return method; - } else { - final int line = (message.size() > 0) ? message.get(0).getLineNumber() : 0; - throw new BatchDeserializerException("Missing http request line", - BatchDeserializerException.MessageKeys.INVALID_STATUS_LINE, "" + line); - } - } - - public Line getHttpStatusLine() { - return httpStatusLine; - } - - public List<Line> getBody() { - return body; - } - - public int getBodySize() { - return bodySize; - } - - @Override - public Header getHeaders() { - return headers; - } - - @Override - public boolean isStrict() { - return isStrict; - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestTransformator.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestTransformator.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestTransformator.java deleted file mode 100644 index 6da8de8..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchRequestTransformator.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * 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.server.core.deserializer.batch; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -import org.apache.olingo.commons.api.http.HttpHeader; -import org.apache.olingo.commons.api.http.HttpMethod; -import org.apache.olingo.server.api.ODataRequest; -import org.apache.olingo.server.api.batch.exception.BatchDeserializerException; -import org.apache.olingo.server.api.batch.exception.BatchDeserializerException.MessageKeys; -import org.apache.olingo.server.api.deserializer.batch.BatchRequestPart; - -public class BatchRequestTransformator { - private final String baseUri; - private final String rawServiceResolutionUri; - - public BatchRequestTransformator(final String baseUri, final String serviceResolutionUri) { - this.baseUri = baseUri; - rawServiceResolutionUri = serviceResolutionUri; - } - - public List<BatchRequestPart> transform(final BatchBodyPart bodyPart) throws BatchDeserializerException { - final List<ODataRequest> requests = new LinkedList<ODataRequest>(); - final List<BatchRequestPart> resultList = new ArrayList<BatchRequestPart>(); - - validateBodyPartHeader(bodyPart); - - for (BatchQueryOperation queryOperation : bodyPart.getRequests()) { - requests.add(processQueryOperation(bodyPart, baseUri, queryOperation)); - } - - resultList.add(new BatchRequestPart(bodyPart.isChangeSet(), requests)); - return resultList; - } - - private ODataRequest processQueryOperation(final BatchBodyPart bodyPart, final String baseUri, - final BatchQueryOperation queryOperation) throws BatchDeserializerException { - if (bodyPart.isChangeSet()) { - BatchQueryOperation encapsulatedQueryOperation = ((BatchChangeSetPart) queryOperation).getRequest(); - handleContentId(queryOperation, encapsulatedQueryOperation); - validateHeader(queryOperation, true); - - return createRequest(encapsulatedQueryOperation, baseUri, bodyPart.isChangeSet()); - } else { - return createRequest(queryOperation, baseUri, bodyPart.isChangeSet()); - } - } - - private void handleContentId(final BatchQueryOperation changeRequestPart, final BatchQueryOperation request) - throws BatchDeserializerException { - final HeaderField contentIdChangeRequestPart = getContentId(changeRequestPart); - final HeaderField contentIdRequest = getContentId(request); - - if (contentIdChangeRequestPart == null && contentIdRequest == null) { - throw new BatchDeserializerException("Missing content id", MessageKeys.MISSING_CONTENT_ID, changeRequestPart - .getHeaders() - .getLineNumber()); - } else if (contentIdChangeRequestPart != null) { - request.getHeaders().replaceHeaderField(contentIdChangeRequestPart); - } - } - - private HeaderField getContentId(final BatchQueryOperation queryOperation) throws BatchDeserializerException { - final HeaderField contentTypeHeader = queryOperation.getHeaders().getHeaderField(BatchParserCommon.HTTP_CONTENT_ID); - - if (contentTypeHeader != null) { - if (contentTypeHeader.getValues().size() == 1) { - return contentTypeHeader; - } else { - throw new BatchDeserializerException("Invalid header", MessageKeys.INVALID_HEADER, contentTypeHeader - .getLineNumber()); - } - } - - return null; - } - - private ODataRequest createRequest(final BatchQueryOperation operation, final String baseUri, - final boolean isChangeSet) - throws BatchDeserializerException { - final HttpRequestStatusLine statusLine = - new HttpRequestStatusLine(operation.getHttpStatusLine(), baseUri, rawServiceResolutionUri); - statusLine.validateHttpMethod(isChangeSet); - - validateBody(statusLine, operation); - InputStream bodyStrean = getBodyStream(operation, statusLine); - - validateForbiddenHeader(operation); - - final ODataRequest request = new ODataRequest(); - request.setBody(bodyStrean); - request.setMethod(statusLine.getMethod()); - request.setRawBaseUri(statusLine.getRawBaseUri()); - request.setRawODataPath(statusLine.getRawODataPath()); - request.setRawQueryPath(statusLine.getRawQueryPath()); - request.setRawRequestUri(statusLine.getRawRequestUri()); - request.setRawServiceResolutionUri(statusLine.getRawServiceResolutionUri()); - - for (final HeaderField field : operation.getHeaders()) { - request.addHeader(field.getFieldName(), field.getValues()); - } - - return request; - } - - private void validateForbiddenHeader(final BatchQueryOperation operation) throws BatchDeserializerException { - final Header header = operation.getHeaders(); - - if (header.exists(HttpHeader.AUTHORIZATION) || header.exists(BatchParserCommon.HTTP_EXPECT) - || header.exists(BatchParserCommon.HTTP_FROM) || header.exists(BatchParserCommon.HTTP_MAX_FORWARDS) - || header.exists(BatchParserCommon.HTTP_RANGE) || header.exists(BatchParserCommon.HTTP_TE)) { - throw new BatchDeserializerException("Forbidden header", MessageKeys.FORBIDDEN_HEADER, header.getLineNumber()); - } - } - - private InputStream getBodyStream(final BatchQueryOperation operation, final HttpRequestStatusLine statusLine) - throws BatchDeserializerException { - if (statusLine.getMethod().equals(HttpMethod.GET)) { - return new ByteArrayInputStream(new byte[0]); - } else { - int contentLength = BatchTransformatorCommon.getContentLength(operation.getHeaders()); - - if (contentLength == -1) { - return BatchParserCommon.convertLineListToInputStream(operation.getBody()); - } else { - return BatchParserCommon.convertLineListToInputStream(operation.getBody(), contentLength); - } - } - } - - private void validateBody(final HttpRequestStatusLine statusLine, final BatchQueryOperation operation) - throws BatchDeserializerException { - if (statusLine.getMethod().equals(HttpMethod.GET) && isUnvalidGetRequestBody(operation)) { - throw new BatchDeserializerException("Invalid request line", MessageKeys.INVALID_CONTENT, statusLine - .getLineNumber()); - } - } - - private boolean isUnvalidGetRequestBody(final BatchQueryOperation operation) { - return (operation.getBody().size() > 1) - || (operation.getBody().size() == 1 && !"".equals(operation.getBody().get(0).toString().trim())); - } - - private void validateHeader(final BatchPart bodyPart, final boolean isChangeSet) throws BatchDeserializerException { - final Header headers = bodyPart.getHeaders(); - - BatchTransformatorCommon.validateContentType(headers, BatchParserCommon.PATTERN_CONTENT_TYPE_APPLICATION_HTTP); - if (isChangeSet) { - BatchTransformatorCommon.validateContentTransferEncoding(headers); - } - } - - private void validateBodyPartHeader(final BatchBodyPart bodyPart) throws BatchDeserializerException { - final Header header = bodyPart.getHeaders(); - - if (bodyPart.isChangeSet()) { - BatchTransformatorCommon.validateContentType(header, BatchParserCommon.PATTERN_MULTIPART_BOUNDARY); - } else { - BatchTransformatorCommon.validateContentTransferEncoding(header); - BatchTransformatorCommon.validateContentType(header, BatchParserCommon.PATTERN_CONTENT_TYPE_APPLICATION_HTTP); - } - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchTransformatorCommon.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchTransformatorCommon.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchTransformatorCommon.java deleted file mode 100644 index 2a55bed..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BatchTransformatorCommon.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * 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.server.core.deserializer.batch; - -import java.util.List; -import java.util.regex.Pattern; - -import org.apache.olingo.commons.api.http.HttpContentType; -import org.apache.olingo.commons.api.http.HttpHeader; -import org.apache.olingo.server.api.batch.exception.BatchDeserializerException; -import org.apache.olingo.server.api.batch.exception.BatchDeserializerException.MessageKeys; - -public class BatchTransformatorCommon { - - public static void validateContentType(final Header headers, final Pattern pattern) - throws BatchDeserializerException { - List<String> contentTypes = headers.getHeaders(HttpHeader.CONTENT_TYPE); - - if (contentTypes.size() == 0) { - throw new BatchDeserializerException("Missing content type", MessageKeys.MISSING_CONTENT_TYPE, headers - .getLineNumber()); - } - if (!headers.isHeaderMatching(HttpHeader.CONTENT_TYPE, pattern)) { - - throw new BatchDeserializerException("Invalid content type", MessageKeys.INVALID_CONTENT_TYPE, - HttpContentType.MULTIPART_MIXED + " or " + HttpContentType.APPLICATION_HTTP); - } - } - - public static void validateContentTransferEncoding(final Header headers) throws BatchDeserializerException { - final HeaderField contentTransferField = headers.getHeaderField(BatchParserCommon.HTTP_CONTENT_TRANSFER_ENCODING); - - if (contentTransferField != null) { - final List<String> contentTransferValues = contentTransferField.getValues(); - if (contentTransferValues.size() == 1) { - String encoding = contentTransferValues.get(0); - - if (!BatchParserCommon.BINARY_ENCODING.equalsIgnoreCase(encoding)) { - throw new BatchDeserializerException("Invalid content transfer encoding", - MessageKeys.INVALID_CONTENT_TRANSFER_ENCODING, - headers.getLineNumber()); - } - } else { - throw new BatchDeserializerException("Invalid header", MessageKeys.INVALID_HEADER, headers.getLineNumber()); - } - } else { - throw new BatchDeserializerException("Missing mandatory content transfer encoding", - MessageKeys.MISSING_CONTENT_TRANSFER_ENCODING, - headers.getLineNumber()); - } - } - - public static int getContentLength(final Header headers) throws BatchDeserializerException { - final HeaderField contentLengthField = headers.getHeaderField(HttpHeader.CONTENT_LENGTH); - - if (contentLengthField != null && contentLengthField.getValues().size() == 1) { - final List<String> contentLengthValues = contentLengthField.getValues(); - - try { - int contentLength = Integer.parseInt(contentLengthValues.get(0)); - - if (contentLength < 0) { - throw new BatchDeserializerException("Invalid content length", MessageKeys.INVALID_CONTENT_LENGTH, - contentLengthField - .getLineNumber()); - } - - return contentLength; - } catch (NumberFormatException e) { - throw new BatchDeserializerException("Invalid header", MessageKeys.INVALID_HEADER, contentLengthField - .getLineNumber()); - } - } - - return -1; - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BufferedReaderIncludingLineEndings.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BufferedReaderIncludingLineEndings.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BufferedReaderIncludingLineEndings.java deleted file mode 100644 index 2268a1d..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/BufferedReaderIncludingLineEndings.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * 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.server.core.deserializer.batch; - -import java.io.IOException; -import java.io.Reader; -import java.util.ArrayList; -import java.util.List; - -public class BufferedReaderIncludingLineEndings extends Reader { - private static final char CR = '\r'; - private static final char LF = '\n'; - private static final int EOF = -1; - private static final int BUFFER_SIZE = 8192; - private Reader reader; - private char[] buffer; - private int offset = 0; - private int limit = 0; - - public BufferedReaderIncludingLineEndings(final Reader reader) { - this(reader, BUFFER_SIZE); - } - - public BufferedReaderIncludingLineEndings(final Reader reader, final int bufferSize) { - if (bufferSize <= 0) { - throw new IllegalArgumentException("Buffer size must be greater than zero."); - } - - this.reader = reader; - buffer = new char[bufferSize]; - } - - @Override - public int read(final char[] charBuffer, final int bufferOffset, final int length) throws IOException { - if ((bufferOffset + length) > charBuffer.length) { - throw new IndexOutOfBoundsException("Buffer is too small"); - } - - if (length < 0 || bufferOffset < 0) { - throw new IndexOutOfBoundsException("Offset and length must be grater than zero"); - } - - // Check if buffer is filled. Return if EOF is reached - // Is buffer refill required - if (limit == offset || isEOF()) { - fillBuffer(); - - if (isEOF()) { - return EOF; - } - } - - int bytesRead = 0; - int bytesToRead = length; - int currentOutputOffset = bufferOffset; - - while (bytesToRead != 0) { - // Is buffer refill required? - if (limit == offset) { - fillBuffer(); - - if (isEOF()) { - bytesToRead = 0; - } - } - - if (bytesToRead > 0) { - int readByte = Math.min(limit - offset, bytesToRead); - bytesRead += readByte; - bytesToRead -= readByte; - - for (int i = 0; i < readByte; i++) { - charBuffer[currentOutputOffset++] = buffer[offset++]; - } - } - } - - return bytesRead; - } - - public List<String> toList() throws IOException { - final List<String> result = new ArrayList<String>(); - String currentLine; - - while ((currentLine = readLine()) != null) { - result.add(currentLine); - } - - return result; - } - - public List<Line> toLineList() throws IOException { - final List<Line> result = new ArrayList<Line>(); - String currentLine; - int counter = 1; - - while ((currentLine = readLine()) != null) { - result.add(new Line(currentLine, counter++)); - } - - return result; - } - - public String readLine() throws IOException { - if (limit == EOF) { - return null; - } - - final StringBuilder stringBuffer = new StringBuilder(); - boolean foundLineEnd = false; // EOF will be considered as line ending - - while (!foundLineEnd) { - // Is buffer refill required? - if (limit == offset) { - if (fillBuffer() == EOF) { - foundLineEnd = true; - } - } - - if (!foundLineEnd) { - char currentChar = buffer[offset++]; - stringBuffer.append(currentChar); - - if (currentChar == LF) { - foundLineEnd = true; - } else if (currentChar == CR) { - foundLineEnd = true; - - // Check next char. Consume \n if available - // Is buffer refill required? - if (limit == offset) { - fillBuffer(); - } - - // Check if there is at least one character - if (limit != EOF && buffer[offset] == LF) { - stringBuffer.append(LF); - offset++; - } - } - } - } - - return (stringBuffer.length() == 0) ? null : stringBuffer.toString(); - } - - @Override - public void close() throws IOException { - reader.close(); - } - - @Override - public boolean ready() throws IOException { - // Not EOF and buffer refill is not required - return !isEOF() && !(limit == offset); - } - - @Override - public void reset() throws IOException { - throw new IOException("Reset is not supported"); - } - - @Override - public void mark(final int readAheadLimit) throws IOException { - throw new IOException("Mark is not supported"); - } - - @Override - public boolean markSupported() { - return false; - } - - @Override - public long skip(final long n) throws IOException { - if (n == 0) { - return 0; - } else if (n < 0) { - throw new IllegalArgumentException("skip value is negative"); - } else { - long charactersToSkip = n; - long charactersSkiped = 0; - - while (charactersToSkip != 0) { - // Is buffer refill required? - if (limit == offset) { - fillBuffer(); - - if (isEOF()) { - charactersToSkip = 0; - } - } - - // Check if more characters are available - if (!isEOF()) { - int skipChars = (int) Math.min(limit - offset, charactersToSkip); - - charactersSkiped += skipChars; - charactersToSkip -= skipChars; - offset += skipChars; - } - } - - return charactersSkiped; - } - } - - private boolean isEOF() { - return limit == EOF; - } - - private int fillBuffer() throws IOException { - limit = reader.read(buffer, 0, buffer.length); - offset = 0; - - return limit; - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/Header.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/Header.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/Header.java deleted file mode 100644 index a9b05b1..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/Header.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * 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.server.core.deserializer.batch; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.regex.Pattern; - -public class Header implements Iterable<HeaderField> { - private final Map<String, HeaderField> headers = new HashMap<String, HeaderField>(); - private int lineNumber; - - public Header(final int lineNumer) { - lineNumber = lineNumer; - } - - public void addHeader(final String name, final String value, final int lineNumber) { - final HeaderField headerField = getHeaderFieldOrDefault(name, lineNumber); - final List<String> headerValues = headerField.getValues(); - - if (!headerValues.contains(value)) { - headerValues.add(value); - } - } - - public void addHeader(final String name, final List<String> values, final int lineNumber) { - final HeaderField headerField = getHeaderFieldOrDefault(name, lineNumber); - final List<String> headerValues = headerField.getValues(); - - for (final String value : values) { - if (!headerValues.contains(value)) { - headerValues.add(value); - } - } - } - - public void replaceHeaderField(final HeaderField headerField) { - headers.put(headerField.getFieldName().toLowerCase(Locale.ENGLISH), headerField); - } - - public boolean exists(final String name) { - final HeaderField field = headers.get(name.toLowerCase(Locale.ENGLISH)); - - return field != null && field.getValues().size() != 0; - } - - public boolean isHeaderMatching(final String name, final Pattern pattern) { - if (getHeaders(name).size() != 1) { - return false; - } else { - return pattern.matcher(getHeaders(name).get(0)).matches(); - } - } - - public void removeHeader(final String name) { - headers.remove(name.toLowerCase(Locale.ENGLISH)); - } - - public String getHeader(final String name) { - final HeaderField headerField = getHeaderField(name); - - return (headerField == null) ? null : headerField.getValue(); - } - - public String getHeaderNotNull(final String name) { - final HeaderField headerField = getHeaderField(name); - - return (headerField == null) ? "" : headerField.getValueNotNull(); - } - - public List<String> getHeaders(final String name) { - final HeaderField headerField = getHeaderField(name); - - return (headerField == null) ? new ArrayList<String>() : headerField.getValues(); - } - - public HeaderField getHeaderField(final String name) { - return headers.get(name.toLowerCase(Locale.ENGLISH)); - } - - public int getLineNumber() { - return lineNumber; - } - - public Map<String, String> toSingleMap() { - final Map<String, String> singleMap = new HashMap<String, String>(); - - for (final String key : headers.keySet()) { - HeaderField field = headers.get(key); - singleMap.put(field.getFieldName(), getHeader(key)); - } - - return singleMap; - } - - public Map<String, List<String>> toMultiMap() { - final Map<String, List<String>> singleMap = new HashMap<String, List<String>>(); - - for (final String key : headers.keySet()) { - HeaderField field = headers.get(key); - singleMap.put(field.getFieldName(), field.getValues()); - } - - return singleMap; - } - - private HeaderField getHeaderFieldOrDefault(final String name, final int lineNumber) { - HeaderField headerField = headers.get(name.toLowerCase(Locale.ENGLISH)); - - if (headerField == null) { - headerField = new HeaderField(name, lineNumber); - headers.put(name.toLowerCase(Locale.ENGLISH), headerField); - } - - return headerField; - } - - @Override - public Header clone() { - final Header newInstance = new Header(lineNumber); - - for (final String key : headers.keySet()) { - newInstance.headers.put(key, headers.get(key).clone()); - } - - return newInstance; - } - - @Override - public Iterator<HeaderField> iterator() { - return new Iterator<HeaderField>() { - Iterator<String> keyIterator = headers.keySet().iterator(); - - @Override - public boolean hasNext() { - return keyIterator.hasNext(); - } - - @Override - public HeaderField next() { - return headers.get(keyIterator.next()); - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - }; - } - - public static List<String> splitValuesByComma(final String headerValue) { - final List<String> singleValues = new ArrayList<String>(); - - String[] parts = headerValue.split(","); - for (final String value : parts) { - singleValues.add(value.trim()); - } - - return singleValues; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/HeaderField.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/HeaderField.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/HeaderField.java deleted file mode 100644 index 870f276..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/HeaderField.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * 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.server.core.deserializer.batch; - -import java.util.ArrayList; -import java.util.List; - -public class HeaderField implements Cloneable { - private final String fieldName; - private final List<String> values; - private final int lineNumber; - - public HeaderField(final String fieldName, final int lineNumber) { - this(fieldName, new ArrayList<String>(), lineNumber); - } - - public HeaderField(final String fieldName, final List<String> values, final int lineNumber) { - this.fieldName = fieldName; - this.values = values; - this.lineNumber = lineNumber; - } - - public String getFieldName() { - return fieldName; - } - - public List<String> getValues() { - return values; - } - - public String getValue() { - final StringBuilder result = new StringBuilder(); - - for (final String value : values) { - result.append(value); - result.append(", "); - } - - if (result.length() > 0) { - result.delete(result.length() - 2, result.length()); - } - - return result.toString(); - } - - public String getValueNotNull() { - final String value = getValue(); - - return (value == null) ? "" : value; - } - - @Override - public HeaderField clone() { - List<String> newValues = new ArrayList<String>(); - newValues.addAll(values); - - return new HeaderField(fieldName, newValues, lineNumber); - } - - public int getLineNumber() { - return lineNumber; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((fieldName == null) ? 0 : fieldName.hashCode()); - result = prime * result + lineNumber; - result = prime * result + ((values == null) ? 0 : values.hashCode()); - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - HeaderField other = (HeaderField) obj; - if (fieldName == null) { - if (other.fieldName != null) { - return false; - } - } else if (!fieldName.equals(other.fieldName)) { - return false; - } - if (lineNumber != other.lineNumber) { - return false; - } - if (values == null) { - if (other.values != null) { - return false; - } - } else if (!values.equals(other.values)) { - return false; - } - return true; - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/HttpRequestStatusLine.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/HttpRequestStatusLine.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/HttpRequestStatusLine.java deleted file mode 100644 index 74b67cb..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/HttpRequestStatusLine.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * 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.server.core.deserializer.batch; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.olingo.commons.api.http.HttpMethod; -import org.apache.olingo.server.api.batch.exception.BatchDeserializerException; -import org.apache.olingo.server.api.batch.exception.BatchDeserializerException.MessageKeys; - -public class HttpRequestStatusLine { - private static final Pattern PATTERN_RELATIVE_URI = Pattern.compile("([^/][^?]*)(?:\\?(.*))?"); - - private static final Set<String> HTTP_BATCH_METHODS = new HashSet<String>(Arrays.asList(new String[] { "GET" })); - private static final Set<String> HTTP_CHANGE_SET_METHODS = new HashSet<String>(Arrays.asList(new String[] { "POST", - "PUT", "DELETE", "PATCH" })); - private static final String HTTP_VERSION = "HTTP/1.1"; - - final private Line statusLine; - final String requestBaseUri; - - private HttpMethod method; - private String httpVersion; - private String rawServiceResolutionUri; - private String rawQueryPath; - private String rawODataPath; - private String rawBaseUri; - private String rawRequestUri; - - public HttpRequestStatusLine(final Line httpStatusLine, final String baseUri, final String serviceResolutionUri) - throws BatchDeserializerException { - statusLine = httpStatusLine; - requestBaseUri = baseUri; - rawServiceResolutionUri = serviceResolutionUri; - - parse(); - } - - private void parse() throws BatchDeserializerException { - final String[] parts = statusLine.toString().split(" "); - - if (parts.length == 3) { - method = parseMethod(parts[0]); - // uri = new ODataURI(parts[1], requestBaseUri, statusLine.getLineNumber(), header.getHeaders(HttpHeader.HOST)); - parseUri(parts[1], requestBaseUri); - httpVersion = parseHttpVersion(parts[2]); - } else { - throw new BatchDeserializerException("Invalid status line", MessageKeys.INVALID_STATUS_LINE, statusLine - .getLineNumber()); - } - } - - private void parseUri(String rawUri, String baseUri) throws BatchDeserializerException { - try { - final URI uri = new URI(rawUri); - - if (uri.isAbsolute()) { - parseAbsoluteUri(rawUri, baseUri); - } else { - parseRelativeUri(rawUri); - } - } catch (URISyntaxException e) { - throw new BatchDeserializerException("Malformed uri", MessageKeys.INVALID_URI, statusLine.getLineNumber()); - } - } - - private void parseAbsoluteUri(String rawUri, String baseUri) throws BatchDeserializerException { - if (rawUri.startsWith(baseUri)) { - final String relativeUri = removeLeadingSlash(rawUri.substring(baseUri.length())); - parseRelativeUri(relativeUri); - } else { - throw new BatchDeserializerException("Base uri do not match", MessageKeys.INVALID_BASE_URI, statusLine - .getLineNumber()); - } - } - - private String removeLeadingSlash(String value) { - return (value.length() > 0 && value.charAt(0) == '/') ? value.substring(1) : value; - } - - private void parseRelativeUri(String rawUri) throws BatchDeserializerException { - final Matcher relativeUriMatcher = PATTERN_RELATIVE_URI.matcher(rawUri); - - if (relativeUriMatcher.matches()) { - buildUri(relativeUriMatcher.group(1), relativeUriMatcher.group(2)); - } else { - throw new BatchDeserializerException("Malformed uri", MessageKeys.INVALID_URI, statusLine.getLineNumber()); - } - } - - private void buildUri(final String oDataPath, final String queryOptions) throws BatchDeserializerException { - rawBaseUri = requestBaseUri; - rawODataPath = "/" + oDataPath; - rawRequestUri = requestBaseUri + rawODataPath; - - if (queryOptions != null) { - rawRequestUri += "?" + queryOptions; - rawQueryPath = queryOptions; - } else { - rawQueryPath = ""; - } - } - - private HttpMethod parseMethod(final String method) throws BatchDeserializerException { - try { - return HttpMethod.valueOf(method.trim()); - } catch (IllegalArgumentException e) { - throw new BatchDeserializerException("Illegal http method", MessageKeys.INVALID_METHOD, statusLine - .getLineNumber()); - } - } - - private String parseHttpVersion(final String httpVersion) throws BatchDeserializerException { - if (!HTTP_VERSION.equals(httpVersion.trim())) { - throw new BatchDeserializerException("Invalid http version", MessageKeys.INVALID_HTTP_VERSION, statusLine - .getLineNumber()); - } else { - return HTTP_VERSION; - } - } - - public void validateHttpMethod(final boolean isChangeSet) throws BatchDeserializerException { - Set<String> validMethods = (isChangeSet) ? HTTP_CHANGE_SET_METHODS : HTTP_BATCH_METHODS; - - if (!validMethods.contains(getMethod().toString())) { - if (isChangeSet) { - throw new BatchDeserializerException("Invalid change set method", MessageKeys.INVALID_CHANGESET_METHOD, - statusLine.getLineNumber()); - } else { - throw new BatchDeserializerException("Invalid query operation method", - MessageKeys.INVALID_QUERY_OPERATION_METHOD, - statusLine.getLineNumber()); - } - } - } - - public HttpMethod getMethod() { - return method; - } - - public String getHttpVersion() { - return httpVersion; - } - - public int getLineNumber() { - return statusLine.getLineNumber(); - } - - public String getRequestBaseUri() { - return requestBaseUri; - } - - public String getRawServiceResolutionUri() { - return rawServiceResolutionUri; - } - - public String getRawQueryPath() { - return rawQueryPath; - } - - public String getRawODataPath() { - return rawODataPath; - } - - public String getRawBaseUri() { - return rawBaseUri; - } - - public String getRawRequestUri() { - return rawRequestUri; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/f7a7b484/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/Line.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/Line.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/Line.java deleted file mode 100644 index 6485a49..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/deserializer/batch/Line.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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.server.core.deserializer.batch; - -public class Line { - private final int lineNumber; - private final String content; - - public Line(final String content, final int lineNumber) { - this.content = content; - this.lineNumber = lineNumber; - } - - public int getLineNumber() { - return lineNumber; - } - - @Override - public String toString() { - return content; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((content == null) ? 0 : content.hashCode()); - result = prime * result + lineNumber; - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - Line other = (Line) obj; - if (content == null) { - if (other.content != null) { - return false; - } - } else if (!content.equals(other.content)) { - return false; - } - if (lineNumber != other.lineNumber) { - return false; - } - return true; - } -} \ No newline at end of file
