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, "@");