You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by sk...@apache.org on 2014/05/26 12:09:45 UTC

[1/4] git commit: Fix for (authenticated) batch repeatable request

Repository: olingo-odata4
Updated Branches:
  refs/heads/olingo-266-tecsvc 7dc44812c -> 4cb3b32af


Fix for (authenticated) batch repeatable request


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/5b5ff8ea
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/5b5ff8ea
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/5b5ff8ea

Branch: refs/heads/olingo-266-tecsvc
Commit: 5b5ff8ea2302df9437e6fb54ee374ca41f6ba914
Parents: 696c586
Author: fmartelli <fa...@gmail.com>
Authored: Fri May 23 14:25:08 2014 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Fri May 23 14:25:08 2014 +0200

----------------------------------------------------------------------
 .../ext/proxy/EntityContainerFactory.java       |   2 +-
 .../EntityContainerInvocationHandler.java       |   5 +-
 .../org/apache/olingo/fit/AbstractServices.java |   3 +-
 .../olingo/fit/proxy/v4/AbstractTestITCase.java |   3 +-
 .../proxy/v4/AuthEntityCreateTestITCase.java    |   4 +-
 .../proxy/v4/AuthEntityRetrieveTestITCase.java  |   4 +-
 .../fit/proxy/v4/EntityCreateTestITCase.java    |  10 +-
 .../fit/proxy/v4/EntityRetrieveTestITCase.java  |   8 +-
 .../fit/proxy/v4/KeyAsSegmentTestITCase.java    |  27 +++--
 .../v4/UnauthorizedEntityCreateTestITCase.java  |  57 +++++++++
 .../olingo/fit/v4/AuthBatchTestITCase.java      | 118 +++++++++++++++++++
 .../olingo/fit/v4/ErrorResponseTestITCase.java  |   6 +-
 .../ODataClientErrorException.java              |   4 +-
 .../communication/request/AbstractRequest.java  |  22 +++-
 .../streamed/AbstractODataStreamedRequest.java  |  30 +++--
 .../apache/olingo/client/core/uri/URIUtils.java |  17 +--
 16 files changed, 260 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b5ff8ea/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/EntityContainerFactory.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/EntityContainerFactory.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/EntityContainerFactory.java
index e7bad01..b2ce911 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/EntityContainerFactory.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/EntityContainerFactory.java
@@ -37,7 +37,7 @@ public final class EntityContainerFactory<C extends CommonEdmEnabledODataClient<
   private static final Map<String, EntityContainerFactory<?>> FACTORY_PER_SERVICEROOT =
           new ConcurrentHashMap<String, EntityContainerFactory<?>>();
 
-  private static final Map<Class<?>, Object> ENTITY_CONTAINERS = new ConcurrentHashMap<Class<?>, Object>();
+  private final Map<Class<?>, Object> ENTITY_CONTAINERS = new ConcurrentHashMap<Class<?>, Object>();
 
   @SuppressWarnings("unchecked")
   private static <C extends CommonEdmEnabledODataClient<?>> EntityContainerFactory<C> getInstance(final C client) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b5ff8ea/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityContainerInvocationHandler.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityContainerInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityContainerInvocationHandler.java
index 3bbeae3..5f9433b 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityContainerInvocationHandler.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityContainerInvocationHandler.java
@@ -32,8 +32,6 @@ public final class EntityContainerInvocationHandler extends AbstractInvocationHa
 
   private static final long serialVersionUID = 7379006755693410764L;
 
-  private final EntityContainerFactory<?> factory;
-
   protected final String namespace;
 
   private final String name;
@@ -56,8 +54,7 @@ public final class EntityContainerInvocationHandler extends AbstractInvocationHa
       throw new IllegalArgumentException(
               ref.getName() + " is not annotated as @" + EntityContainer.class.getSimpleName());
     }
-
-    this.factory = factory;
+    
     this.name = ((EntityContainer) annotation).name();
     this.defaultEC = ((EntityContainer) annotation).isDefaultEntityContainer();
     this.namespace = ((EntityContainer) annotation).namespace();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b5ff8ea/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java b/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
index e8c0be5..7fd0b58 100644
--- a/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
+++ b/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
@@ -199,6 +199,7 @@ public abstract class AbstractServices {
   @Consumes(ContentType.MULTIPART_MIXED)
   @Produces(ContentType.APPLICATION_OCTET_STREAM + ";boundary=" + BOUNDARY)
   public Response batch(
+          @HeaderParam("Authorization") @DefaultValue(StringUtils.EMPTY) String authorization,
           @HeaderParam("Prefer") @DefaultValue(StringUtils.EMPTY) String prefer,
           final @Multipart MultipartBody attachment) {
     try {
@@ -294,7 +295,7 @@ public abstract class AbstractServices {
     if (url == null) {
       res = null;
     } else {
-      final WebClient client = WebClient.create(url);
+      final WebClient client = WebClient.create(url, "odatajclient", "odatajclient", null);
       client.headers(headers);
 
       if ("DELETE".equals(method)) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b5ff8ea/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AbstractTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AbstractTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AbstractTestITCase.java
index 9365e44..931fcf4 100644
--- a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AbstractTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AbstractTestITCase.java
@@ -89,7 +89,8 @@ public abstract class AbstractTestITCase {
     return customer;
   }
 
-  protected void createAndDeleteOrder(final InMemoryEntities container) {
+  protected void createAndDeleteOrder(
+          final InMemoryEntities container, final EntityContainerFactory<EdmEnabledODataClient> containerFactory) {
     final Order order = container.getOrders().newOrder();
     order.setOrderID(105);
 

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b5ff8ea/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AuthEntityCreateTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AuthEntityCreateTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AuthEntityCreateTestITCase.java
index 678e714..f447b9f 100644
--- a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AuthEntityCreateTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AuthEntityCreateTestITCase.java
@@ -23,6 +23,7 @@ import org.apache.olingo.commons.api.format.ContentType;
 import org.apache.olingo.ext.proxy.EntityContainerFactory;
 
 import org.apache.olingo.client.api.v4.EdmEnabledODataClient;
+import static org.apache.olingo.fit.proxy.v4.AbstractTestITCase.testAuthServiceRootURL;
 import org.apache.olingo.fit.proxy.v4.staticservice.microsoft.test.odata.services.odatawcfservice.InMemoryEntities;
 
 public class AuthEntityCreateTestITCase extends EntityCreateTestITCase {
@@ -32,7 +33,7 @@ public class AuthEntityCreateTestITCase extends EntityCreateTestITCase {
   private InMemoryEntities ime;
 
   @Override
-  public EntityContainerFactory<EdmEnabledODataClient> getContainerFactory() {
+  protected EntityContainerFactory<EdmEnabledODataClient> getContainerFactory() {
     if (ecf == null) {
       ecf = EntityContainerFactory.getV4(testAuthServiceRootURL);
       ecf.getClient().getConfiguration().setDefaultBatchAcceptFormat(ContentType.APPLICATION_OCTET_STREAM);
@@ -49,4 +50,5 @@ public class AuthEntityCreateTestITCase extends EntityCreateTestITCase {
     }
     return ime;
   }
+  
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b5ff8ea/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AuthEntityRetrieveTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AuthEntityRetrieveTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AuthEntityRetrieveTestITCase.java
index c5391d0..818d3b7 100644
--- a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AuthEntityRetrieveTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/AuthEntityRetrieveTestITCase.java
@@ -29,9 +29,7 @@ public class AuthEntityRetrieveTestITCase extends EntityRetrieveTestITCase {
 
   @Override
   protected InMemoryEntities getContainer() {
-    final EntityContainerFactory<EdmEnabledODataClient> ecf =
-            EntityContainerFactory.getV4(testAuthServiceRootURL);
-    ecf.getClient().getConfiguration().setKeyAsSegment(true);
+    final EntityContainerFactory<EdmEnabledODataClient> ecf = EntityContainerFactory.getV4(testAuthServiceRootURL);
     ecf.getClient().getConfiguration().setDefaultBatchAcceptFormat(ContentType.APPLICATION_OCTET_STREAM);
     ecf.getClient().getConfiguration().
             setHttpClientFactory(new BasicAuthHttpClientFactory("odatajclient", "odatajclient"));

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b5ff8ea/fit/src/test/java/org/apache/olingo/fit/proxy/v4/EntityCreateTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/EntityCreateTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/EntityCreateTestITCase.java
index faea864..3dadd6a 100644
--- a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/EntityCreateTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/EntityCreateTestITCase.java
@@ -56,7 +56,7 @@ import org.junit.Test;
  */
 public class EntityCreateTestITCase extends AbstractTestITCase {
 
-  public EntityContainerFactory<EdmEnabledODataClient> getContainerFactory() {
+  protected EntityContainerFactory<EdmEnabledODataClient> getContainerFactory() {
     return containerFactory;
   }
 
@@ -66,7 +66,7 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
 
   @Test
   public void createAndDelete() {
-    createAndDeleteOrder(getContainer());
+    createAndDeleteOrder(getContainer(), getContainerFactory());
   }
 
   @Test
@@ -137,7 +137,7 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
 
     getContainer().flush();
 
-    Customer actual = readCustomer(container, id);
+    Customer actual = readCustomer(getContainer(), id);
     assertEquals(homeAddress.getCity(), actual.getHomeAddress().getCity());
     assertEquals(1, actual.getOrders().size());
     assertEquals(8, actual.getOrders().iterator().next().getOrderID(), 0);
@@ -201,7 +201,7 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
     assertEquals(id, order.getOrderID());
     assertEquals(id, customer.getPersonID());
 
-    Customer actual = readCustomer(container, id);
+    Customer actual = readCustomer(getContainer(), id);
     assertEquals(homeAddress.getCity(), actual.getHomeAddress().getCity());
     assertEquals(1, actual.getOrders().size());
     assertEquals(id, actual.getOrders().iterator().next().getOrderID());
@@ -216,7 +216,7 @@ public class EntityCreateTestITCase extends AbstractTestITCase {
     order = getContainer().getOrders().get(id);
     assertNull(order);
 
-    actual = readCustomer(container, id);
+    actual = readCustomer(getContainer(), id);
     assertTrue(actual.getOrders().isEmpty());
 
     getContainer().getCustomers().delete(actual.getPersonID());

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b5ff8ea/fit/src/test/java/org/apache/olingo/fit/proxy/v4/EntityRetrieveTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/EntityRetrieveTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/EntityRetrieveTestITCase.java
index 7d79a60..6504fa9 100644
--- a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/EntityRetrieveTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/EntityRetrieveTestITCase.java
@@ -68,7 +68,7 @@ public class EntityRetrieveTestITCase extends AbstractTestITCase {
 
   @Test
   public void get() {
-    readCustomer(container, 1);
+    readCustomer(getContainer(), 1);
   }
 
   @Test
@@ -120,14 +120,14 @@ public class EntityRetrieveTestITCase extends AbstractTestITCase {
 
   @Test
   public void withInlineEntry() {
-    final Customer customer = readCustomer(container, 1);
+    final Customer customer = readCustomer(getContainer(), 1);
     final Company company = customer.getCompany();
     assertEquals(0, company.getCompanyID(), 0);
   }
 
   @Test
   public void withInlineFeed() {
-    final Customer customer = readCustomer(container, 1);
+    final Customer customer = readCustomer(getContainer(), 1);
     final OrderCollection orders = customer.getOrders();
     assertEquals(1, orders.size());
     assertEquals(8, orders.iterator().next().getOrderID(), 0);
@@ -165,7 +165,7 @@ public class EntityRetrieveTestITCase extends AbstractTestITCase {
 
   @Test
   public void contained() {
-    final PaymentInstrument instrument = container.getAccounts().get(101).getMyPaymentInstruments().get(101901);
+    final PaymentInstrument instrument = getContainer().getAccounts().get(101).getMyPaymentInstruments().get(101901);
     assertNotNull(instrument);
     assertEquals(101901, instrument.getPaymentInstrumentID(), 0);
     assertNotNull(instrument.getCreatedDate());

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b5ff8ea/fit/src/test/java/org/apache/olingo/fit/proxy/v4/KeyAsSegmentTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/KeyAsSegmentTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/KeyAsSegmentTestITCase.java
index a992133..54c0390 100644
--- a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/KeyAsSegmentTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/KeyAsSegmentTestITCase.java
@@ -30,12 +30,24 @@ import org.junit.Test;
 
 public class KeyAsSegmentTestITCase extends AbstractTestITCase {
 
-  private InMemoryEntities getContainer() {
-    final EntityContainerFactory<EdmEnabledODataClient> ecf = 
-            EntityContainerFactory.getV4(testKeyAsSegmentServiceRootURL);
-    ecf.getClient().getConfiguration().setKeyAsSegment(true);
-    ecf.getClient().getConfiguration().setDefaultBatchAcceptFormat(ContentType.APPLICATION_OCTET_STREAM);
-    return ecf.getEntityContainer(InMemoryEntities.class);
+  private EntityContainerFactory<EdmEnabledODataClient> ecf;
+
+  private InMemoryEntities ime;
+
+  protected EntityContainerFactory<EdmEnabledODataClient> getContainerFactory() {
+    if (ecf == null) {
+      ecf = EntityContainerFactory.getV4(testKeyAsSegmentServiceRootURL);
+      ecf.getClient().getConfiguration().setKeyAsSegment(true);
+      ecf.getClient().getConfiguration().setDefaultBatchAcceptFormat(ContentType.APPLICATION_OCTET_STREAM);
+    }
+    return ecf;
+  }
+
+  protected InMemoryEntities getContainer() {
+    if (ime == null) {
+      ime = getContainerFactory().getEntityContainer(InMemoryEntities.class);
+    }
+    return ime;
   }
 
   @Test
@@ -45,7 +57,7 @@ public class KeyAsSegmentTestITCase extends AbstractTestITCase {
 
   @Test
   public void createAndDelete() {
-    createAndDeleteOrder(getContainer());
+    createAndDeleteOrder(getContainer(), getContainerFactory());
   }
 
   @Test
@@ -58,5 +70,4 @@ public class KeyAsSegmentTestITCase extends AbstractTestITCase {
     person = getContainer().getPeople().get(5);
     assertEquals("middleN", person.getMiddleName());
   }
-
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b5ff8ea/fit/src/test/java/org/apache/olingo/fit/proxy/v4/UnauthorizedEntityCreateTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v4/UnauthorizedEntityCreateTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/UnauthorizedEntityCreateTestITCase.java
new file mode 100644
index 0000000..188a491
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v4/UnauthorizedEntityCreateTestITCase.java
@@ -0,0 +1,57 @@
+/*
+ * 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.fit.proxy.v4;
+
+import org.apache.olingo.client.api.http.HttpClientException;
+import org.apache.olingo.client.core.http.BasicAuthHttpClientFactory;
+import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.ext.proxy.EntityContainerFactory;
+
+import org.apache.olingo.client.api.v4.EdmEnabledODataClient;
+import org.apache.olingo.fit.proxy.v4.staticservice.microsoft.test.odata.services.odatawcfservice.InMemoryEntities;
+import org.junit.Test;
+
+public class UnauthorizedEntityCreateTestITCase extends AbstractTestITCase {
+
+  private EntityContainerFactory<EdmEnabledODataClient> ecf;
+
+  private InMemoryEntities ime;
+
+  public EntityContainerFactory<EdmEnabledODataClient> getContainerFactory() {
+    if (ecf == null) {
+      ecf = EntityContainerFactory.getV4(testAuthServiceRootURL);
+      ecf.getClient().getConfiguration().setDefaultBatchAcceptFormat(ContentType.APPLICATION_OCTET_STREAM);
+      ecf.getClient().getConfiguration().
+              setHttpClientFactory(new BasicAuthHttpClientFactory("not_auth", "not_auth"));
+    }
+    return ecf;
+  }
+
+  @Test(expected = HttpClientException.class)
+  public void unauthorizedCreate() {
+    createAndDeleteOrder(getContainer(), getContainerFactory());
+  }
+
+  protected InMemoryEntities getContainer() {
+    if (ime == null) {
+      ime = getContainerFactory().getEntityContainer(InMemoryEntities.class);
+    }
+    return ime;
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b5ff8ea/fit/src/test/java/org/apache/olingo/fit/v4/AuthBatchTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/v4/AuthBatchTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/v4/AuthBatchTestITCase.java
new file mode 100644
index 0000000..2b3faea
--- /dev/null
+++ b/fit/src/test/java/org/apache/olingo/fit/v4/AuthBatchTestITCase.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2014 The Apache Software Foundation.
+ *
+ * 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 org.apache.olingo.fit.v4;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import java.net.URI;
+import org.apache.olingo.client.api.communication.header.HeaderName;
+
+import org.apache.olingo.client.api.communication.request.batch.BatchManager;
+import org.apache.olingo.client.api.communication.request.batch.ODataChangeset;
+import org.apache.olingo.client.api.communication.request.batch.v4.ODataBatchRequest;
+import org.apache.olingo.client.api.communication.request.cud.ODataEntityUpdateRequest;
+import org.apache.olingo.client.api.communication.request.cud.v4.UpdateType;
+import org.apache.olingo.client.api.communication.request.retrieve.ODataEntityRequest;
+import org.apache.olingo.client.api.communication.response.ODataBatchResponse;
+import org.apache.olingo.client.api.http.HttpClientException;
+import org.apache.olingo.client.api.uri.v4.URIBuilder;
+import org.apache.olingo.client.api.v4.ODataClient;
+import org.apache.olingo.client.core.ODataClientFactory;
+import org.apache.olingo.client.core.http.BasicAuthHttpClientFactory;
+import org.apache.olingo.commons.api.domain.v4.ODataEntity;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
+import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.commons.api.format.ODataPubFormat;
+
+public class AuthBatchTestITCase extends AbstractTestITCase {
+
+  private final static String ACCEPT = ContentType.APPLICATION_OCTET_STREAM;
+
+  @Test
+  public void clean() throws EdmPrimitiveTypeException {
+    final ODataClient authclient = ODataClientFactory.getV4();
+    batchRequest(authclient, testStaticServiceRootURL);
+  }
+
+  @Test
+  public void authorized() throws EdmPrimitiveTypeException {
+    final ODataClient authclient = ODataClientFactory.getV4();
+    authclient.getConfiguration().setHttpClientFactory(new BasicAuthHttpClientFactory("odatajclient", "odatajclient"));
+    batchRequest(authclient, testAuthServiceRootURL);
+  }
+
+  @Test(expected = HttpClientException.class)
+  public void unauthorized() throws EdmPrimitiveTypeException {
+    final ODataClient unauthclient = ODataClientFactory.getV4();
+    unauthclient.getConfiguration().setHttpClientFactory(new BasicAuthHttpClientFactory("not_auth", "not_auth"));
+    batchRequest(unauthclient, testAuthServiceRootURL);
+  }
+
+  @SuppressWarnings({"unchecked"})
+  private void batchRequest(final ODataClient client, final String baseURL) throws EdmPrimitiveTypeException {
+    // create your request
+    final ODataBatchRequest request = client.getBatchRequestFactory().getBatchRequest(baseURL);
+    request.setAccept(ACCEPT);
+    request.addCustomHeader("User-Agent", "Microsoft ADO.NET Data Client xxx");
+    request.addCustomHeader(HeaderName.acceptCharset, "UTF-8");
+
+    final BatchManager streamManager = request.payloadManager();
+
+    // -------------------------------------------
+    // Add retrieve item
+    // -------------------------------------------
+    // prepare URI
+    URIBuilder targetURI = client.newURIBuilder(baseURL);
+    targetURI.appendEntitySetSegment("Customers").appendKeySegment(1);
+
+    // create new request
+    ODataEntityRequest<ODataEntity> queryReq = client.getRetrieveRequestFactory().getEntityRequest(targetURI.build());
+    queryReq.setFormat(ODataPubFormat.JSON);
+
+    streamManager.addRequest(queryReq);
+    // -------------------------------------------
+
+    // -------------------------------------------
+    // Add changeset item
+    // -------------------------------------------
+    final ODataChangeset changeset = streamManager.addChangeset();
+
+    // Update Customer into the changeset
+    targetURI = client.newURIBuilder(baseURL).appendEntitySetSegment("Customers").appendKeySegment(1);
+    final URI editLink = targetURI.build();
+
+    final ODataEntity patch = client.getObjectFactory().newEntity(
+            new FullQualifiedName("Microsoft.Test.OData.Services.ODataWCFService.Customer"));
+    patch.setEditLink(editLink);
+
+    patch.getProperties().add(client.getObjectFactory().newPrimitiveProperty(
+            "LastName",
+            client.getObjectFactory().newPrimitiveValueBuilder().buildString("new last name")));
+
+    final ODataEntityUpdateRequest<ODataEntity> changeReq =
+            client.getCUDRequestFactory().getEntityUpdateRequest(UpdateType.PATCH, patch);
+    changeReq.setFormat(ODataPubFormat.JSON_FULL_METADATA);
+
+    changeset.addRequest(changeReq);
+    // -------------------------------------------
+
+    final ODataBatchResponse response = streamManager.getResponse();
+    assertEquals(200, response.getStatusCode());
+    assertEquals("OK", response.getStatusMessage());
+  }
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b5ff8ea/fit/src/test/java/org/apache/olingo/fit/v4/ErrorResponseTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/v4/ErrorResponseTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/v4/ErrorResponseTestITCase.java
index 902e731..a48bb49 100644
--- a/fit/src/test/java/org/apache/olingo/fit/v4/ErrorResponseTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/v4/ErrorResponseTestITCase.java
@@ -39,16 +39,14 @@ public class ErrorResponseTestITCase extends AbstractTestITCase {
             appendEntitySetSegment("Customers").appendKeySegment(32).
             build();
 
-    final ODataEntityRequest<ODataEntity> req = getClient().getRetrieveRequestFactory().getEntityRequest(readURI);
     try {
-      final ODataEntity read = read(ODataPubFormat.JSON, readURI);
-
+      read(ODataPubFormat.JSON, readURI);
       fail("should have got exception");
     } catch (Exception ex) {
       final ODataError err = ((ODataClientErrorException) ex).getODataError();
 
       // verify details
-      final ODataErrorDetail detail = (ODataErrorDetail) err.getDetails().get(0);
+      final ODataErrorDetail detail = err.getDetails().get(0);
       assertEquals("Code should be correct", "301", detail.getCode());
       assertEquals("Target should be correct", "$search", detail.getTarget());
       assertEquals("Message should be correct", "$search query option not supported", detail.getMessage());

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b5ff8ea/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/ODataClientErrorException.java
----------------------------------------------------------------------
diff --git a/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/ODataClientErrorException.java b/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/ODataClientErrorException.java
index 6dc2f07..9284d42 100644
--- a/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/ODataClientErrorException.java
+++ b/lib/client-api/src/main/java/org/apache/olingo/client/api/communication/ODataClientErrorException.java
@@ -54,7 +54,9 @@ public class ODataClientErrorException extends RuntimeException {
    * @param error OData error to be wrapped.
    */
   public ODataClientErrorException(final StatusLine statusLine, final ODataError error) {
-    super((StringUtils.isBlank(error.getCode()) ? StringUtils.EMPTY : "(" + error.getCode() + ") ")
+    super(error == null
+            ? statusLine.toString()
+            : (StringUtils.isBlank(error.getCode()) ? StringUtils.EMPTY : "(" + error.getCode() + ") ")
             + error.getMessage() + " [" + statusLine.toString() + "]");
 
     this.statusLine = statusLine;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b5ff8ea/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/AbstractRequest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/AbstractRequest.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/AbstractRequest.java
index 1023618..0632c42 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/AbstractRequest.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/AbstractRequest.java
@@ -16,6 +16,8 @@
 package org.apache.olingo.client.core.communication.request;
 
 import java.io.IOException;
+import java.io.InputStream;
+import org.apache.http.Header;
 
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
@@ -24,6 +26,7 @@ import org.apache.olingo.client.api.CommonEdmEnabledODataClient;
 import org.apache.olingo.client.api.CommonODataClient;
 import org.apache.olingo.client.api.communication.ODataClientErrorException;
 import org.apache.olingo.client.api.communication.ODataServerErrorException;
+import org.apache.olingo.client.api.communication.header.HeaderName;
 import org.apache.olingo.client.api.http.HttpClientException;
 import org.apache.olingo.commons.api.domain.ODataError;
 import org.apache.olingo.commons.core.data.JSONODataErrorImpl;
@@ -57,12 +60,12 @@ public abstract class AbstractRequest {
     // If using and Edm enabled client, checks that the cached service root matches the request URI
     if (odataClient instanceof CommonEdmEnabledODataClient
             && !request.getURI().toASCIIString().startsWith(
-                    ((CommonEdmEnabledODataClient) odataClient).getServiceRoot())) {
+            ((CommonEdmEnabledODataClient) odataClient).getServiceRoot())) {
 
       throw new IllegalArgumentException(
               String.format("The current request URI %s does not match the configured service root %s",
-                      request.getURI().toASCIIString(),
-                      ((CommonEdmEnabledODataClient) odataClient).getServiceRoot()));
+              request.getURI().toASCIIString(),
+              ((CommonEdmEnabledODataClient) odataClient).getServiceRoot()));
     }
   }
 
@@ -75,7 +78,18 @@ public abstract class AbstractRequest {
         if (httpEntity == null) {
           throw new ODataClientErrorException(response.getStatusLine());
         } else {
-          final boolean isXML = !accept.contains("json");
+          boolean isXML;
+          if (!accept.contains("json") && !accept.contains("xml")) {
+            isXML = true;
+            for (Header header : response.getHeaders(HeaderName.contentType.toString())) {
+              if (header.getValue() != null && header.getValue().contains("json")) {
+                isXML = false;
+              }
+            }
+          } else {
+            isXML = !accept.contains("json");
+          }
+
           ODataError error;
           try {
             error = odataClient.getReader().readError(httpEntity.getContent(), isXML);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b5ff8ea/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/AbstractODataStreamedRequest.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/AbstractODataStreamedRequest.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/AbstractODataStreamedRequest.java
index 3d5c0a2..4f3abe9 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/AbstractODataStreamedRequest.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/communication/request/streamed/AbstractODataStreamedRequest.java
@@ -91,15 +91,27 @@ public abstract class AbstractODataStreamedRequest<V extends ODataResponse, T ex
   public T payloadManager() {
     payloadManager = getPayloadManager();
 
-    ((HttpEntityEnclosingRequestBase) request).setEntity(
-            URIUtils.buildInputStreamEntity(odataClient, payloadManager.getBody()));
-
-    futureWrapper.setWrapped(odataClient.getConfiguration().getExecutor().submit(new Callable<HttpResponse>() {
-      @Override
-      public HttpResponse call() throws Exception {
-        return doExecute();
-      }
-    }));
+    if (URIUtils.shouldUseRepeatableHttpBodyEntry(odataClient)) {
+      futureWrapper.setWrapped(odataClient.getConfiguration().getExecutor().submit(new Callable<HttpResponse>() {
+        @Override
+        public HttpResponse call() throws Exception {
+          ((HttpEntityEnclosingRequestBase) request).setEntity(
+                  URIUtils.buildInputStreamEntity(odataClient, payloadManager.getBody()));
+
+          return doExecute();
+        }
+      }));
+    } else {
+      ((HttpEntityEnclosingRequestBase) request).setEntity(
+              URIUtils.buildInputStreamEntity(odataClient, payloadManager.getBody()));
+
+      futureWrapper.setWrapped(odataClient.getConfiguration().getExecutor().submit(new Callable<HttpResponse>() {
+        @Override
+        public HttpResponse call() throws Exception {
+          return doExecute();
+        }
+      }));
+    }
 
     // returns the stream manager object
     return (T) payloadManager;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/5b5ff8ea/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIUtils.java
----------------------------------------------------------------------
diff --git a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIUtils.java b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIUtils.java
index c97e6fd..53ece5f 100644
--- a/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIUtils.java
+++ b/lib/client-core/src/main/java/org/apache/olingo/client/core/uri/URIUtils.java
@@ -373,7 +373,7 @@ public final class URIUtils {
     return value;
   }
 
-  private static boolean shouldUseRepeatableHttpBodyEntry(final CommonODataClient<?> client) {
+  public static boolean shouldUseRepeatableHttpBodyEntry(final CommonODataClient<?> client) {
     // returns true for authentication request in case of http401 which needs retry so requires being repeatable.
     HttpClientFactory httpclientFactory = client.getConfiguration().getHttpClientFactory();
     if (httpclientFactory instanceof BasicAuthHttpClientFactory) {
@@ -391,24 +391,13 @@ public final class URIUtils {
   public static HttpEntity buildInputStreamEntity(final CommonODataClient<?> client, final InputStream input) {
     HttpEntity entity;
 
-    // --------------------------
-    // Check just required by batch requests since their ansynchronous entity specification mechanism
-    // --------------------------
-    boolean contentAvailable;
-    try {
-      contentAvailable = input.available() > 0;
-    } catch (IOException ex) {
-      contentAvailable = false;
-    }
-    // --------------------------
-
-    boolean repeatableRequired = shouldUseRepeatableHttpBodyEntry(client);
-    if (!contentAvailable || !repeatableRequired) {
+    if (!shouldUseRepeatableHttpBodyEntry(client)) {
       entity = new InputStreamEntity(input, -1);
     } else {
       byte[] bytes = new byte[0];
       try {
         bytes = IOUtils.toByteArray(input);
+        IOUtils.closeQuietly(input);
       } catch (IOException e) {
         LOG.error("While reading input for not chunked encoding", e);
       }


[4/4] git commit: [OLINGO-266] Merge remote-tracking branch 'origin/master' into olingo-266-tecsvc

Posted by sk...@apache.org.
[OLINGO-266] Merge remote-tracking branch 'origin/master' into olingo-266-tecsvc


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/4cb3b32a
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/4cb3b32a
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/4cb3b32a

Branch: refs/heads/olingo-266-tecsvc
Commit: 4cb3b32afeafee7e778410fac118252bf2c0ae91
Parents: e57edd7 b913717
Author: Stephan Klevenz <st...@sap.com>
Authored: Mon May 26 10:58:35 2014 +0200
Committer: Stephan Klevenz <st...@sap.com>
Committed: Mon May 26 10:58:35 2014 +0200

----------------------------------------------------------------------
 .../ext/proxy/EntityContainerFactory.java       |   2 +-
 .../EntityContainerInvocationHandler.java       |   5 +-
 .../org/apache/olingo/fit/AbstractServices.java |   3 +-
 .../olingo/fit/proxy/v4/AbstractTestITCase.java |   3 +-
 .../proxy/v4/AuthEntityCreateTestITCase.java    |   4 +-
 .../proxy/v4/AuthEntityRetrieveTestITCase.java  |   4 +-
 .../fit/proxy/v4/EntityCreateTestITCase.java    |  10 +-
 .../fit/proxy/v4/EntityRetrieveTestITCase.java  |   8 +-
 .../fit/proxy/v4/KeyAsSegmentTestITCase.java    |  27 +++--
 .../v4/UnauthorizedEntityCreateTestITCase.java  |  57 +++++++++
 .../olingo/fit/v4/AuthBatchTestITCase.java      | 118 +++++++++++++++++++
 .../olingo/fit/v4/ErrorResponseTestITCase.java  |   6 +-
 .../ODataClientErrorException.java              |   4 +-
 .../communication/request/AbstractRequest.java  |  22 +++-
 .../streamed/AbstractODataStreamedRequest.java  |  30 +++--
 .../apache/olingo/client/core/uri/URIUtils.java |  17 +--
 .../core/edm/primitivetype/EdmBinary.java       |  22 +++-
 .../core/edm/primitivetype/EdmBinaryTest.java   |   2 +
 18 files changed, 279 insertions(+), 65 deletions(-)
----------------------------------------------------------------------



[3/4] git commit: [OLINGO-266] fit metadata and service document

Posted by sk...@apache.org.
[OLINGO-266] fit metadata and service document


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/e57edd71
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/e57edd71
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/e57edd71

Branch: refs/heads/olingo-266-tecsvc
Commit: e57edd71dd9b8d9e3b68b0a856d74d2e4a2051a5
Parents: 7dc4481
Author: Stephan Klevenz <st...@sap.com>
Authored: Mon May 26 10:58:11 2014 +0200
Committer: Stephan Klevenz <st...@sap.com>
Committed: Mon May 26 10:58:11 2014 +0200

----------------------------------------------------------------------
 .../org/apache/olingo/fit/tecsvc/BasicITCase.java |  2 --
 .../olingo/server/core/ODataHttpHandlerImpl.java  |  4 ++--
 .../xml/MetadataDocumentXmlSerializer.java        | 18 +++++++++---------
 pom.xml                                           |  5 -----
 4 files changed, 11 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/e57edd71/fit/src/test/java/org/apache/olingo/fit/tecsvc/BasicITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/tecsvc/BasicITCase.java b/fit/src/test/java/org/apache/olingo/fit/tecsvc/BasicITCase.java
index 8a610b5..462272f 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/BasicITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/BasicITCase.java
@@ -27,7 +27,6 @@ import org.apache.olingo.client.core.ODataClientFactory;
 import org.apache.olingo.commons.api.domain.ODataServiceDocument;
 import org.apache.olingo.commons.api.edm.Edm;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class BasicITCase {
@@ -50,7 +49,6 @@ public class BasicITCase {
   }
 
   @Test
-  @Ignore
   public void readMetadata() {
     EdmMetadataRequest request = odata.getRetrieveRequestFactory().getMetadataRequest(BASE_URI + "/$metadata");
     assertNotNull(request);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/e57edd71/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHttpHandlerImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHttpHandlerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHttpHandlerImpl.java
index 3703e6b..577728c 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHttpHandlerImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataHttpHandlerImpl.java
@@ -49,8 +49,8 @@ public class ODataHttpHandlerImpl implements ODataHttpHandler {
 
   private ODataHandler handler;
 
-  public ODataHttpHandlerImpl(final OData server, final Edm edm) {
-    handler = new ODataHandler(server, edm);
+  public ODataHttpHandlerImpl(final OData odata, final Edm edm) {
+    handler = new ODataHandler(odata, edm);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/e57edd71/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
index a8629d8..999cb36 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/MetadataDocumentXmlSerializer.java
@@ -529,14 +529,14 @@ public class MetadataDocumentXmlSerializer {
   }
 
   private void appendReference(final XMLStreamWriter writer) throws XMLStreamException {
-    writer.writeStartElement(NS_EDMX, "Reference");
-    // TODO: Where is this value comming from?
-    writer.writeAttribute("Uri", "http://docs.oasis-open.org/odata/odata/v4.0/cs02/vocabularies/Org.OData.Core.V1.xml");
-    writer.writeEmptyElement(NS_EDMX, "Include");
-    // TODO: Where is this value comming from?
-    writer.writeAttribute(XML_NAMESPACE, "Org.OData.Core.V1");
-    // TODO: Where is this value comming from?
-    writer.writeAttribute(XML_ALIAS, "Core");
-    writer.writeEndElement();
+//    writer.writeStartElement(NS_EDMX, "Reference");
+//    // TODO: Where is this value comming from?
+// writer.writeAttribute("Uri", "http://docs.oasis-open.org/odata/odata/v4.0/cs02/vocabularies/Org.OData.Core.V1.xml");
+//    writer.writeEmptyElement(NS_EDMX, "Include");
+//    // TODO: Where is this value comming from?
+//    writer.writeAttribute(XML_NAMESPACE, "Org.OData.Core.V1");
+//    // TODO: Where is this value comming from?
+//    writer.writeAttribute(XML_ALIAS, "Core");
+//    writer.writeEndElement();
   }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/e57edd71/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index f98ae4a..d68815e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -374,11 +374,6 @@
           <artifactId>maven-javadoc-plugin</artifactId>
           <version>2.9.1</version>
         </plugin>
-        <plugin>
-          <groupId>com.keyboardsamurais.maven</groupId>
-          <artifactId>maven-timestamp-plugin</artifactId>
-          <version>1.0</version>
-        </plugin>
       </plugins>
     </pluginManagement>
 


[2/4] git commit: [OLINGO-284] Fixed content length calculation

Posted by sk...@apache.org.
[OLINGO-284] Fixed content length calculation


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/b9137177
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/b9137177
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/b9137177

Branch: refs/heads/olingo-266-tecsvc
Commit: b9137177589146a2da01480ef605055d84f9faa5
Parents: 5b5ff8e
Author: Michael Bolz <mi...@sap.com>
Authored: Mon May 26 10:26:00 2014 +0200
Committer: Michael Bolz <mi...@sap.com>
Committed: Mon May 26 10:26:00 2014 +0200

----------------------------------------------------------------------
 .../core/edm/primitivetype/EdmBinary.java       | 22 +++++++++++++++-----
 .../core/edm/primitivetype/EdmBinaryTest.java   |  2 ++
 2 files changed, 19 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/b9137177/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmBinary.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmBinary.java b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmBinary.java
index 7611045..ee85d17 100644
--- a/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmBinary.java
+++ b/lib/commons-core/src/main/java/org/apache/olingo/commons/core/edm/primitivetype/EdmBinary.java
@@ -53,11 +53,23 @@ public class EdmBinary extends SingletonPrimitiveType {
   }
 
   private static boolean validateMaxLength(final String value, final Integer maxLength) {
-    return maxLength == null ? true
-           : // Every three bytes are represented as four base-64 characters.
-            // Additionally, there could be up to two padding "=" characters
-            // if the number of bytes is not a multiple of three.
-            maxLength >= value.length() * 3 / 4 - (value.endsWith("==") ? 2 : value.endsWith("=") ? 1 : 0);
+    return maxLength == null ? true :
+        // Every three bytes are represented as four base-64 characters.
+        // Additionally, there could be up to two padding "=" characters
+        // if the number of bytes is not a multiple of three,
+        // and there could be line feeds, possibly with carriage returns.
+        maxLength >= (value.length() - lineEndingsLength(value)) * 3 / 4
+            - (value.endsWith("==") ? 2 : value.endsWith("=") ? 1 : 0);
+  }
+
+  private static int lineEndingsLength(final String value) {
+    int result = 0;
+    int index = 0;
+    while ((index = value.indexOf('\n', index)) >= 0) {
+      result += index > 0 && value.charAt(index - 1) == '\r' ? 2 : 1;
+      index++;
+    }
+    return result;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/b9137177/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmBinaryTest.java
----------------------------------------------------------------------
diff --git a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmBinaryTest.java b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmBinaryTest.java
index d052674..95c93f8 100644
--- a/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmBinaryTest.java
+++ b/lib/commons-core/src/test/java/org/apache/olingo/commons/core/edm/primitivetype/EdmBinaryTest.java
@@ -97,6 +97,8 @@ public class EdmBinaryTest extends PrimitiveTypeBaseTest {
             byte[].class)));
     assertTrue(Arrays.equals(binary, instance.valueOfString("qrvM3e7_", null, Integer.MAX_VALUE, null, null, null,
             byte[].class)));
+    assertTrue(Arrays.equals(binary, instance.valueOfString("\nqrvM\n3e7_\r\n", null, 6, null, null, null,
+        byte[].class)));
 
     expectFacetsErrorInValueOfString(instance, "qrvM3e7_", null, 3, null, null, null);
     expectContentErrorInValueOfString(instance, "@");