You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ay...@apache.org on 2015/07/30 15:23:44 UTC
[1/2] camel git commit: CAMEL-9038: Make the existing tests of
camle-olingo2 automatically executable
Repository: camel
Updated Branches:
refs/heads/master f7f53a477 -> c285fbf88
http://git-wip-us.apache.org/repos/asf/camel/blob/c285fbf8/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2SampleServer.java
----------------------------------------------------------------------
diff --git a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2SampleServer.java b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2SampleServer.java
new file mode 100644
index 0000000..2125be1
--- /dev/null
+++ b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2SampleServer.java
@@ -0,0 +1,89 @@
+/**
+ * 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.camel.component.olingo2;
+
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.net.URISyntaxException;
+
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.handler.DefaultHandler;
+import org.eclipse.jetty.server.handler.HandlerCollection;
+import org.eclipse.jetty.webapp.WebAppContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The embedded server for hosting the olingo2 sample service during the tests
+ */
+public class Olingo2SampleServer {
+ private static final Logger LOG = LoggerFactory.getLogger(Olingo2SampleServer.class);
+
+ private org.eclipse.jetty.server.Server server;
+ private int port;
+
+ /**
+ *
+ * @param port
+ * @param resourcePath
+ */
+ public Olingo2SampleServer(int port, String resourcePath) {
+ this.port = port;
+ server = new org.eclipse.jetty.server.Server(port);
+
+ WebAppContext webappcontext = new WebAppContext();
+ String contextPath = null;
+ try {
+ contextPath = Olingo2SampleServer.class.getResource(resourcePath).toURI().getPath();
+ } catch (URISyntaxException e) {
+ LOG.error("Unable to read the resource at {}", resourcePath, e);
+ }
+ webappcontext.setContextPath("/");
+
+ webappcontext.setWar(contextPath);
+
+ HandlerCollection handlers = new HandlerCollection();
+ handlers.setHandlers(new Handler[] {webappcontext, new DefaultHandler()});
+ server.setHandler(handlers);
+ }
+
+ public void start() throws Exception {
+ server.start();
+ LOG.debug("Olingo sample server started at port {}", port);
+ }
+
+ public void stop() throws Exception {
+ server.stop();
+ }
+
+ public void destroy() {
+ server.destroy();
+ }
+
+ static void generateSampleData(String serviceUrl) throws IOException {
+ try {
+ // need to use reflection to avoid a build error even when the sample source is not available
+ Class<?> clz = Class.forName("org.apache.olingo.sample.annotation.util.AnnotationSampleDataGenerator");
+ Method m = clz.getMethod("generateData", String.class);
+ m.invoke(null, serviceUrl);
+ } catch (Throwable t) {
+ LOG.error("Unable to load the required sample class", t);
+ throw new IOException("unable to load the required sample class");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/c285fbf8/components/camel-olingo2/camel-olingo2-component/src/test/resources/olingo2_ref/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/components/camel-olingo2/camel-olingo2-component/src/test/resources/olingo2_ref/WEB-INF/web.xml b/components/camel-olingo2/camel-olingo2-component/src/test/resources/olingo2_ref/WEB-INF/web.xml
new file mode 100644
index 0000000..951f9b8
--- /dev/null
+++ b/components/camel-olingo2/camel-olingo2-component/src/test/resources/olingo2_ref/WEB-INF/web.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+ -->
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="http://java.sun.com/xml/ns/javaee"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+ id="WebApp_ID" version="3.0">
+ <display-name>org.apache.olingo.sample.annotation</display-name>
+
+ <servlet>
+ <servlet-name>CarServiceServlet</servlet-name>
+ <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
+ <init-param>
+ <param-name>javax.ws.rs.Application</param-name>
+ <param-value>org.apache.olingo.odata2.core.rest.app.ODataApplication</param-value>
+ </init-param>
+ <init-param>
+ <param-name>org.apache.olingo.odata2.service.factory</param-name>
+ <param-value>org.apache.olingo.sample.annotation.processor.AnnotationSampleServiceFactory</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>CarServiceServlet</servlet-name>
+ <url-pattern>/MyFormula.svc/*</url-pattern>
+ </servlet-mapping>
+
+</web-app>
http://git-wip-us.apache.org/repos/asf/camel/blob/c285fbf8/components/camel-olingo2/camel-olingo2-component/src/test/resources/test-options.properties
----------------------------------------------------------------------
diff --git a/components/camel-olingo2/camel-olingo2-component/src/test/resources/test-options.properties b/components/camel-olingo2/camel-olingo2-component/src/test/resources/test-options.properties
index 97e37bb..0c4e992 100644
--- a/components/camel-olingo2/camel-olingo2-component/src/test/resources/test-options.properties
+++ b/components/camel-olingo2/camel-olingo2-component/src/test/resources/test-options.properties
@@ -15,5 +15,5 @@
# limitations under the License.
#
# Test values for Olingo configuration properties
-serviceUri=http://localhost:8080/MyFormula.svc
+#serviceUri=http://localhost:8080/MyFormula.svc
contentType=application/json;charset=utf-8
\ No newline at end of file
[2/2] camel git commit: CAMEL-9038: Make the existing tests of
camle-olingo2 automatically executable
Posted by ay...@apache.org.
CAMEL-9038: Make the existing tests of camle-olingo2 automatically executable
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/c285fbf8
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/c285fbf8
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/c285fbf8
Branch: refs/heads/master
Commit: c285fbf889a7f02122a45a5c287392dc47a3f7e8
Parents: f7f53a4
Author: Akitoshi Yoshida <ay...@apache.org>
Authored: Thu Jul 30 15:17:27 2015 +0200
Committer: Akitoshi Yoshida <ay...@apache.org>
Committed: Thu Jul 30 15:22:51 2015 +0200
----------------------------------------------------------------------
.../olingo2/api/Olingo2AppIntegrationTest.java | 615 -------------------
.../camel-olingo2-component/pom.xml | 123 ++++
.../olingo2/AbstractOlingo2TestSupport.java | 6 +-
.../component/olingo2/Olingo2AppAPITest.java | 596 ++++++++++++++++++
.../olingo2/Olingo2AppIntegrationTest.java | 269 --------
.../component/olingo2/Olingo2ComponentTest.java | 295 +++++++++
.../component/olingo2/Olingo2SampleServer.java | 89 +++
.../test/resources/olingo2_ref/WEB-INF/web.xml | 45 ++
.../src/test/resources/test-options.properties | 2 +-
9 files changed, 1154 insertions(+), 886 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/c285fbf8/components/camel-olingo2/camel-olingo2-api/src/test/java/org/apache/camel/component/olingo2/api/Olingo2AppIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-olingo2/camel-olingo2-api/src/test/java/org/apache/camel/component/olingo2/api/Olingo2AppIntegrationTest.java b/components/camel-olingo2/camel-olingo2-api/src/test/java/org/apache/camel/component/olingo2/api/Olingo2AppIntegrationTest.java
deleted file mode 100644
index 9c361ef..0000000
--- a/components/camel-olingo2/camel-olingo2-api/src/test/java/org/apache/camel/component/olingo2/api/Olingo2AppIntegrationTest.java
+++ /dev/null
@@ -1,615 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.olingo2.api;
-
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Pattern;
-
-import org.apache.camel.component.olingo2.api.batch.Olingo2BatchChangeRequest;
-import org.apache.camel.component.olingo2.api.batch.Olingo2BatchQueryRequest;
-import org.apache.camel.component.olingo2.api.batch.Olingo2BatchRequest;
-import org.apache.camel.component.olingo2.api.batch.Olingo2BatchResponse;
-import org.apache.camel.component.olingo2.api.batch.Operation;
-import org.apache.camel.component.olingo2.api.impl.AbstractFutureCallback;
-import org.apache.camel.component.olingo2.api.impl.Olingo2AppImpl;
-import org.apache.camel.component.olingo2.api.impl.SystemQueryOption;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.concurrent.FutureCallback;
-import org.apache.http.entity.ByteArrayEntity;
-import org.apache.http.entity.ContentType;
-import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
-import org.apache.olingo.odata2.api.edm.Edm;
-import org.apache.olingo.odata2.api.edm.EdmEntitySetInfo;
-import org.apache.olingo.odata2.api.ep.entry.ODataEntry;
-import org.apache.olingo.odata2.api.ep.feed.ODataDeltaFeed;
-import org.apache.olingo.odata2.api.ep.feed.ODataFeed;
-import org.apache.olingo.odata2.api.exception.ODataApplicationException;
-import org.apache.olingo.odata2.api.servicedocument.Collection;
-import org.apache.olingo.odata2.api.servicedocument.ServiceDocument;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-/**
- * Integration test for {@link org.apache.camel.component.olingo2.api.impl.Olingo2AppImpl}.
- * To test run the sample Olingo2 Server as outlined at
- * http://olingo.apache.org/doc/tutorials/Olingo2V2BasicClientSample.html
- */
-public class Olingo2AppIntegrationTest {
-
- private static final Logger LOG = LoggerFactory.getLogger(Olingo2AppIntegrationTest.class);
- private static final long TIMEOUT = 10;
-
- private static final String MANUFACTURERS = "Manufacturers";
- private static final String FQN_MANUFACTURERS = "DefaultContainer.Manufacturers";
- private static final String ADDRESS = "Address";
- private static final String CARS = "Cars";
-
- private static final String TEST_KEY = "'1'";
- private static final String TEST_CREATE_KEY = "'123'";
- private static final String TEST_MANUFACTURER = FQN_MANUFACTURERS + "(" + TEST_KEY + ")";
- private static final String TEST_CREATE_MANUFACTURER = MANUFACTURERS + "(" + TEST_CREATE_KEY + ")";
-
- private static final String TEST_RESOURCE_CONTENT_ID = "1";
- private static final String TEST_RESOURCE = "$" + TEST_RESOURCE_CONTENT_ID;
-
- private static final char NEW_LINE = '\n';
- private static final String TEST_CAR = "Manufacturers('1')/Cars('1')";
- private static final String TEST_MANUFACTURER_FOUNDED_PROPERTY = "Manufacturers('1')/Founded";
- private static final String TEST_MANUFACTURER_FOUNDED_VALUE = "Manufacturers('1')/Founded/$value";
- private static final String FOUNDED_PROPERTY = "Founded";
- private static final String TEST_MANUFACTURER_ADDRESS_PROPERTY = "Manufacturers('1')/Address";
- private static final String TEST_MANUFACTURER_LINKS_CARS = "Manufacturers('1')/$links/Cars";
- private static final String TEST_CAR_LINK_MANUFACTURER = "Cars('1')/$links/Manufacturer";
- private static final String COUNT_OPTION = "/$count";
-
- private static final String TEST_SERVICE_URL = "http://localhost:8080/MyFormula.svc";
- // private static final String TEST_SERVICE_URL = "http://localhost:8080/cars-annotations-sample/MyFormula.svc";
-// private static final ContentType TEST_FORMAT = ContentType.APPLICATION_XML_CS_UTF_8;
- private static final ContentType TEST_FORMAT = ContentType.APPLICATION_JSON;
- private static final String INDEX = "/index.jsp";
- private static final Pattern LINK_PATTERN = Pattern.compile("[^(]+\\('([^']+)'\\)");
- private static final String ID_PROPERTY = "Id";
-
- private static Olingo2App olingoApp;
- private static final String GEN_SAMPLE_DATA = "genSampleData=true";
- private static Edm edm;
-
- @BeforeClass
- public static void beforeClass() throws Exception {
-
- olingoApp = new Olingo2AppImpl(TEST_SERVICE_URL + "/");
- olingoApp.setContentType(TEST_FORMAT.toString());
-
- LOG.info("Generate sample data ");
- generateSampleData(TEST_SERVICE_URL);
-
- LOG.info("Read Edm ");
- final TestOlingo2ResponseHandler<Edm> responseHandler = new TestOlingo2ResponseHandler<Edm>();
-
- olingoApp.read(null, Olingo2AppImpl.METADATA, null, responseHandler);
-
- edm = responseHandler.await();
- LOG.info("Read default EntityContainer: {}", responseHandler.await().getDefaultEntityContainer().getName());
-
- // wait for generated data to be registered in server
- Thread.sleep(2000);
- }
-
- @AfterClass
- public static void afterClass() {
- olingoApp.close();
- }
-
- @Test
- public void testServiceDocument() throws Exception {
- final TestOlingo2ResponseHandler<ServiceDocument> responseHandler =
- new TestOlingo2ResponseHandler<ServiceDocument>();
-
- olingoApp.read(null, "", null, responseHandler);
-
- final ServiceDocument serviceDocument = responseHandler.await();
- final List<Collection> collections = serviceDocument.getAtomInfo().getWorkspaces().get(0).getCollections();
- assertEquals("Service Atom Collections", 3, collections.size());
- LOG.info("Service Atom Collections: {}", collections);
-
- final List<EdmEntitySetInfo> entitySetsInfo = serviceDocument.getEntitySetsInfo();
- assertEquals("Service Entity Sets", 3, entitySetsInfo.size());
- LOG.info("Service Document Entries: {}", entitySetsInfo);
- }
-
- @Test
- public void testReadFeed() throws Exception {
- final TestOlingo2ResponseHandler<ODataFeed> responseHandler = new TestOlingo2ResponseHandler<ODataFeed>();
-
- olingoApp.read(edm, MANUFACTURERS, null, responseHandler);
-
- final ODataFeed dataFeed = responseHandler.await();
- assertNotNull("Data feed", dataFeed);
- LOG.info("Entries: {}", prettyPrint(dataFeed));
- }
-
- @Test
- public void testReadEntry() throws Exception {
- final TestOlingo2ResponseHandler<ODataEntry> responseHandler = new TestOlingo2ResponseHandler<ODataEntry>();
-
- olingoApp.read(edm, TEST_MANUFACTURER, null, responseHandler);
- ODataEntry entry = responseHandler.await();
- LOG.info("Single Entry: {}", prettyPrint(entry));
-
- responseHandler.reset();
-
- olingoApp.read(edm, TEST_CAR, null, responseHandler);
- entry = responseHandler.await();
- LOG.info("Single Entry: {}", prettyPrint(entry));
-
- responseHandler.reset();
- final Map<String, String> queryParams = new HashMap<String, String>();
- queryParams.put(SystemQueryOption.$expand.toString(), CARS);
-
- olingoApp.read(edm, TEST_MANUFACTURER, queryParams, responseHandler);
-
- ODataEntry entryExpanded = responseHandler.await();
- LOG.info("Single Entry with expanded Cars relation: {}", prettyPrint(entryExpanded));
- }
-
- @Test
- public void testReadUpdateProperties() throws Exception {
- // test simple property Manufacturer.Founded
- final TestOlingo2ResponseHandler<Map<String, Object>> propertyHandler =
- new TestOlingo2ResponseHandler<Map<String, Object>>();
-
- olingoApp.read(edm, TEST_MANUFACTURER_FOUNDED_PROPERTY, null, propertyHandler);
-
- Calendar founded = (Calendar) propertyHandler.await().get(FOUNDED_PROPERTY);
- LOG.info("Founded property {}", founded.toString());
-
- final TestOlingo2ResponseHandler<Calendar> valueHandler = new TestOlingo2ResponseHandler<Calendar>();
-
- olingoApp.read(edm, TEST_MANUFACTURER_FOUNDED_VALUE, null, valueHandler);
-
- founded = valueHandler.await();
- LOG.info("Founded property {}", founded.toString());
-
- final TestOlingo2ResponseHandler<HttpStatusCodes> statusHandler =
- new TestOlingo2ResponseHandler<HttpStatusCodes>();
- final HashMap<String, Object> properties = new HashMap<String, Object>();
- properties.put(FOUNDED_PROPERTY, new Date());
-
-// olingoApp.update(edm, TEST_MANUFACTURER_FOUNDED_PROPERTY, properties, statusHandler);
- // requires a plain Date for XML
- olingoApp.update(edm, TEST_MANUFACTURER_FOUNDED_PROPERTY, new Date(), statusHandler);
-
- LOG.info("Founded property updated with status {}", statusHandler.await().getStatusCode());
-
- statusHandler.reset();
-
- olingoApp.update(edm, TEST_MANUFACTURER_FOUNDED_VALUE, new Date(), statusHandler);
-
- LOG.info("Founded property updated with status {}", statusHandler.await().getStatusCode());
-
- // test complex property Manufacturer.Address
- propertyHandler.reset();
-
- olingoApp.read(edm, TEST_MANUFACTURER_ADDRESS_PROPERTY, null, propertyHandler);
-
- final Map<String, Object> address = propertyHandler.await();
- LOG.info("Address property {}", prettyPrint(address, 0));
-
- statusHandler.reset();
-
- address.clear();
- // Olingo2 sample server MERGE/PATCH behaves like PUT!!!
-// address.put("Street", "Main Street");
- address.put("Street", "Star Street 137");
- address.put("City", "Stuttgart");
- address.put("ZipCode", "70173");
- address.put("Country", "Germany");
-
-// olingoApp.patch(edm, TEST_MANUFACTURER_ADDRESS_PROPERTY, address, statusHandler);
- olingoApp.merge(edm, TEST_MANUFACTURER_ADDRESS_PROPERTY, address, statusHandler);
-
- LOG.info("Address property updated with status {}", statusHandler.await().getStatusCode());
- }
-
- @Test
- public void testReadDeleteCreateLinks() throws Exception {
- final TestOlingo2ResponseHandler<List<String>> linksHandler = new TestOlingo2ResponseHandler<List<String>>();
-
- olingoApp.read(edm, TEST_MANUFACTURER_LINKS_CARS, null, linksHandler);
-
- final List<String> links = linksHandler.await();
- assertFalse(links.isEmpty());
- LOG.info("Read links: {}", links);
-
- final TestOlingo2ResponseHandler<String> linkHandler = new TestOlingo2ResponseHandler<String>();
-
- olingoApp.read(edm, TEST_CAR_LINK_MANUFACTURER, null, linkHandler);
-
- final String link = linkHandler.await();
- LOG.info("Read link: {}", link);
-
-//Deleting relationships through links is not supported in Olingo2 at the time of writing this test
-/*
- final TestOlingo2ResponseHandler<HttpStatusCodes> statusHandler =
- new TestOlingo2ResponseHandler<HttpStatusCodes>();
-
- final ArrayList<Map<String, Object>> carKeys = new ArrayList<Map<String, Object>>();
- for (String carLink : links) {
- final Matcher matcher = LINK_PATTERN.matcher(carLink);
- assertTrue("Link pattern " + carLink, matcher.matches());
- final String carId = matcher.group(1);
-
- final HashMap<String, Object> keys = new HashMap<String, Object>();
- keys.put(ID_PROPERTY, carId);
- carKeys.add(keys);
-
- // delete manufacturer->car link
- statusHandler.reset();
- final String resourcePath = TEST_MANUFACTURER_LINKS_CARS + "('" + carId + "')";
- olingoApp.delete(resourcePath, statusHandler);
-
- assertEquals("Delete car link " + resourcePath, HttpStatusCodes.OK.getStatusCode(),
- statusHandler.await().getStatusCode());
- }
-
- // add links to all Cars
- statusHandler.reset();
- olingoApp.create(edm, TEST_MANUFACTURER_LINKS_CARS, carKeys, statusHandler);
-
- assertEquals("Links update", HttpStatusCodes.ACCEPTED.getStatusCode(), statusHandler.await().getStatusCode());
-
- // delete car->manufacturer link
- statusHandler.reset();
- olingoApp.delete(TEST_CAR_LINK_MANUFACTURER, statusHandler);
-
- assertEquals("Delete manufacturer link " + TEST_CAR_LINK_MANUFACTURER, HttpStatusCodes.OK.getStatusCode(),
- statusHandler.await().getStatusCode());
-
- // add link to Manufacturer
- statusHandler.reset();
- final HashMap<String, Object> manufacturerKey = new HashMap<String, Object>();
- manufacturerKey.put(ID_PROPERTY, "1");
-
- olingoApp.create(edm, TEST_CAR_LINK_MANUFACTURER, manufacturerKey, statusHandler);
-
- assertEquals("Link update", HttpStatusCodes.ACCEPTED.getStatusCode(), statusHandler.await().getStatusCode());
-*/
- }
-
- @Test
- public void testReadCount() throws Exception {
- final TestOlingo2ResponseHandler<Long> countHandler = new TestOlingo2ResponseHandler<Long>();
-
- olingoApp.read(edm, MANUFACTURERS + COUNT_OPTION, null, countHandler);
-
- LOG.info("Manufacturers count: {}", countHandler.await());
-
- countHandler.reset();
- olingoApp.read(edm, TEST_MANUFACTURER + COUNT_OPTION, null, countHandler);
-
- LOG.info("Manufacturer count: {}", countHandler.await());
-
- countHandler.reset();
- olingoApp.read(edm, TEST_MANUFACTURER_LINKS_CARS + COUNT_OPTION, null, countHandler);
-
- LOG.info("Manufacturers links count: {}", countHandler.await());
-
- countHandler.reset();
- olingoApp.read(edm, TEST_CAR_LINK_MANUFACTURER + COUNT_OPTION, null, countHandler);
-
- LOG.info("Manufacturer link count: {}", countHandler.await());
- }
-
- @Test
- public void testCreateUpdateDeleteEntry() throws Exception {
-
- // create entry to update
- final TestOlingo2ResponseHandler<ODataEntry> entryHandler = new TestOlingo2ResponseHandler<ODataEntry>();
-
- olingoApp.create(edm, MANUFACTURERS, getEntityData(), entryHandler);
-
- ODataEntry createdEntry = entryHandler.await();
- LOG.info("Created Entry: {}", prettyPrint(createdEntry));
-
- Map<String, Object> data = getEntityData();
- @SuppressWarnings("unchecked")
- Map<String, Object> address = (Map<String, Object>) data.get(ADDRESS);
-
- data.put("Name", "MyCarManufacturer Renamed");
- address.put("Street", "Main Street");
- final TestOlingo2ResponseHandler<HttpStatusCodes> statusHandler =
- new TestOlingo2ResponseHandler<HttpStatusCodes>();
-
- olingoApp.update(edm, TEST_CREATE_MANUFACTURER, data, statusHandler);
- statusHandler.await();
-
- statusHandler.reset();
- data.put("Name", "MyCarManufacturer Patched");
- olingoApp.patch(edm, TEST_CREATE_MANUFACTURER, data, statusHandler);
- statusHandler.await();
-
- entryHandler.reset();
- olingoApp.read(edm, TEST_CREATE_MANUFACTURER, null, entryHandler);
-
- ODataEntry updatedEntry = entryHandler.await();
- LOG.info("Updated Entry successfully: {}", prettyPrint(updatedEntry));
-
- statusHandler.reset();
- olingoApp.delete(TEST_CREATE_MANUFACTURER, statusHandler);
-
- HttpStatusCodes statusCode = statusHandler.await();
- LOG.info("Deletion of Entry was successful: {}: {}", statusCode.getStatusCode(), statusCode.getInfo());
-
- try {
- LOG.info("Verify Delete Entry");
-
- entryHandler.reset();
- olingoApp.read(edm, TEST_CREATE_MANUFACTURER, null, entryHandler);
-
- entryHandler.await();
- fail("Entry not deleted!");
- } catch (Exception e) {
- LOG.info("Deleted entry not found: {}", e.getMessage());
- }
- }
-
- @Test
- public void testBatchRequest() throws Exception {
-
- final List<Olingo2BatchRequest> batchParts = new ArrayList<Olingo2BatchRequest>();
-
- // Edm query
- batchParts.add(Olingo2BatchQueryRequest.resourcePath(Olingo2AppImpl.METADATA).build());
-
- // feed query
- batchParts.add(Olingo2BatchQueryRequest.resourcePath(MANUFACTURERS).build());
-
- // read
- batchParts.add(Olingo2BatchQueryRequest.resourcePath(TEST_MANUFACTURER).build());
-
- // read with expand
- final HashMap<String, String> queryParams = new HashMap<String, String>();
- queryParams.put(SystemQueryOption.$expand.toString(), CARS);
- batchParts.add(Olingo2BatchQueryRequest.resourcePath(TEST_MANUFACTURER).queryParams(queryParams).build());
-
- // create
- final Map<String, Object> data = getEntityData();
- batchParts.add(Olingo2BatchChangeRequest.resourcePath(MANUFACTURERS).
- contentId(TEST_RESOURCE_CONTENT_ID).operation(Operation.CREATE).body(data).build());
-
- // update
- final Map<String, Object> updateData = new HashMap<String, Object>(data);
- @SuppressWarnings("unchecked")
- Map<String, Object> address = (Map<String, Object>) updateData.get(ADDRESS);
- updateData.put("Name", "MyCarManufacturer Renamed");
- address.put("Street", "Main Street");
-
- batchParts.add(Olingo2BatchChangeRequest.resourcePath(TEST_RESOURCE).operation(Operation.UPDATE)
- .body(updateData).build());
-
- // delete
- batchParts.add(Olingo2BatchChangeRequest.resourcePath(TEST_RESOURCE).operation(Operation.DELETE).build());
-
- final TestOlingo2ResponseHandler<List<Olingo2BatchResponse>> responseHandler =
- new TestOlingo2ResponseHandler<List<Olingo2BatchResponse>>();
-
- // read to verify delete
- batchParts.add(Olingo2BatchQueryRequest.resourcePath(TEST_CREATE_MANUFACTURER).build());
-
- olingoApp.batch(edm, batchParts, responseHandler);
-
- final List<Olingo2BatchResponse> responseParts = responseHandler.await(15, TimeUnit.MINUTES);
- assertEquals("Batch responses expected", 8, responseParts.size());
-
- assertNotNull(responseParts.get(0).getBody());
- final ODataFeed feed = (ODataFeed) responseParts.get(1).getBody();
- assertNotNull(feed);
- LOG.info("Batch feed: {}", prettyPrint(feed));
-
- ODataEntry dataEntry = (ODataEntry) responseParts.get(2).getBody();
- assertNotNull(dataEntry);
- LOG.info("Batch read entry: {}", prettyPrint(dataEntry));
-
- dataEntry = (ODataEntry) responseParts.get(3).getBody();
- assertNotNull(dataEntry);
- LOG.info("Batch read entry with expand: {}", prettyPrint(dataEntry));
-
- dataEntry = (ODataEntry) responseParts.get(4).getBody();
- assertNotNull(dataEntry);
- LOG.info("Batch create entry: {}", prettyPrint(dataEntry));
-
- assertEquals(HttpStatusCodes.NO_CONTENT.getStatusCode(), responseParts.get(5).getStatusCode());
- assertEquals(HttpStatusCodes.NO_CONTENT.getStatusCode(), responseParts.get(6).getStatusCode());
-
- assertEquals(HttpStatusCodes.NOT_FOUND.getStatusCode(), responseParts.get(7).getStatusCode());
- final Exception exception = (Exception) responseParts.get(7).getBody();
- assertNotNull(exception);
- LOG.info("Batch retrieve deleted entry: {}", exception);
- }
-
- private Map<String, Object> getEntityData() {
- Map<String, Object> data = new HashMap<String, Object>();
- data.put(ID_PROPERTY, "123");
- data.put("Name", "MyCarManufacturer");
- data.put(FOUNDED_PROPERTY, new Date());
- Map<String, Object> address = new HashMap<String, Object>();
- address.put("Street", "Main");
- address.put("ZipCode", "42421");
- address.put("City", "Fairy City");
- address.put("Country", "FarFarAway");
- data.put(ADDRESS, address);
- return data;
- }
-
- private static String prettyPrint(ODataFeed dataFeed) {
- StringBuilder builder = new StringBuilder();
- builder.append("[\n");
- for (ODataEntry entry : dataFeed.getEntries()) {
- builder.append(prettyPrint(entry.getProperties(), 1)).append('\n');
- }
- builder.append("]\n");
- return builder.toString();
- }
-
- private static String prettyPrint(ODataEntry createdEntry) {
- return prettyPrint(createdEntry.getProperties(), 0);
- }
-
- private static String prettyPrint(Map<String, Object> properties, int level) {
- StringBuilder b = new StringBuilder();
- Set<Map.Entry<String, Object>> entries = properties.entrySet();
-
- for (Map.Entry<String, Object> entry : entries) {
- indent(b, level);
- b.append(entry.getKey()).append(": ");
- Object value = entry.getValue();
- if (value instanceof Map) {
- @SuppressWarnings("unchecked")
- final Map<String, Object> objectMap = (Map<String, Object>) value;
- value = prettyPrint(objectMap, level + 1);
- b.append(value).append(NEW_LINE);
- } else if (value instanceof Calendar) {
- Calendar cal = (Calendar) value;
- value = SimpleDateFormat.getInstance().format(cal.getTime());
- b.append(value).append(NEW_LINE);
- } else if (value instanceof ODataDeltaFeed) {
- ODataDeltaFeed feed = (ODataDeltaFeed) value;
- List<ODataEntry> inlineEntries = feed.getEntries();
- b.append("{");
- for (ODataEntry oDataEntry : inlineEntries) {
- value = prettyPrint(oDataEntry.getProperties(), level + 1);
- b.append("\n[\n").append(value).append("\n],");
- }
- b.deleteCharAt(b.length() - 1);
- indent(b, level);
- b.append("}\n");
- } else {
- b.append(value).append(NEW_LINE);
- }
- }
- // remove last line break
- b.deleteCharAt(b.length() - 1);
- return b.toString();
- }
-
- private static void indent(StringBuilder builder, int indentLevel) {
- for (int i = 0; i < indentLevel; i++) {
- builder.append(" ");
- }
- }
-
- private static void generateSampleData(String serviceUrl) throws IOException {
- final HttpPost httpUriRequest = new HttpPost(serviceUrl.substring(0, serviceUrl.lastIndexOf('/')) + INDEX);
- httpUriRequest.setEntity(new ByteArrayEntity(GEN_SAMPLE_DATA.getBytes()));
- ((Olingo2AppImpl)olingoApp).execute(httpUriRequest, ContentType.APPLICATION_FORM_URLENCODED,
- new FutureCallback<HttpResponse>() {
- @Override
- public void completed(HttpResponse result) {
- try {
- AbstractFutureCallback.checkStatus(result);
- LOG.info("Sample data generated {}", result.getStatusLine());
- } catch (ODataApplicationException e) {
- LOG.error("Sample data generation error: " + e.getMessage(), e);
- }
- }
-
- @Override
- public void failed(Exception ex) {
- LOG.error("Error generating sample data " + ex.getMessage(), ex);
- }
-
- @Override
- public void cancelled() {
- LOG.error("Sample data generation canceled!");
- }
- });
- }
-
- private static final class TestOlingo2ResponseHandler<T> implements Olingo2ResponseHandler<T> {
-
- private T response;
- private Exception error;
- private CountDownLatch latch = new CountDownLatch(1);
-
- @Override
- public void onResponse(T response) {
- this.response = response;
- if (LOG.isDebugEnabled()) {
- if (response instanceof ODataFeed) {
- LOG.debug("Received response: {}", prettyPrint((ODataFeed) response));
- } else if (response instanceof ODataEntry) {
- LOG.debug("Received response: {}", prettyPrint((ODataEntry) response));
- } else {
- LOG.debug("Received response: {}", response);
- }
- }
- latch.countDown();
- }
-
- @Override
- public void onException(Exception ex) {
- error = ex;
- latch.countDown();
- }
-
- @Override
- public void onCanceled() {
- error = new IllegalStateException("Request Canceled");
- latch.countDown();
- }
-
- public T await() throws Exception {
- return await(TIMEOUT, TimeUnit.SECONDS);
- }
-
- public T await(long timeout, TimeUnit unit) throws Exception {
- assertTrue("Timeout waiting for response", latch.await(timeout, unit));
- if (error != null) {
- throw error;
- }
- assertNotNull("Response", response);
- return response;
- }
-
- public void reset() {
- latch.countDown();
- latch = new CountDownLatch(1);
- response = null;
- error = null;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/camel/blob/c285fbf8/components/camel-olingo2/camel-olingo2-component/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-olingo2/camel-olingo2-component/pom.xml b/components/camel-olingo2/camel-olingo2-component/pom.xml
index ed37f55..34e3f1d 100644
--- a/components/camel-olingo2/camel-olingo2-component/pom.xml
+++ b/components/camel-olingo2/camel-olingo2-component/pom.xml
@@ -102,10 +102,59 @@
</exclusions>
</dependency>
<dependency>
+ <groupId>org.apache.olingo</groupId>
+ <artifactId>olingo-odata2-api-annotation</artifactId>
+ <version>${olingo2-version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.olingo</groupId>
+ <artifactId>olingo-odata2-annotation-processor-api</artifactId>
+ <version>${olingo2-version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.olingo</groupId>
+ <artifactId>olingo-odata2-annotation-processor-core</artifactId>
+ <version>${olingo2-version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-test</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-frontend-jaxrs</artifactId>
+ <version>${cxf-version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-servlet</artifactId>
+ <version>${jetty9-version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-server</artifactId>
+ <version>${jetty9-version}</version>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>org.eclipse.jetty.orbit</groupId>
+ <artifactId>javax.servlet</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-webapp</artifactId>
+ <version>${jetty9-version}</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
@@ -176,6 +225,26 @@
</executions>
</plugin>
+ <!-- add the olingo odata2 sample service source. See profile get-olingo2-sample below -->
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>add-test-source</id>
+ <phase>generate-test-sources</phase>
+ <goals>
+ <goal>add-test-source</goal>
+ </goals>
+ <configuration>
+ <sources>
+ <source>${basedir}/target/olingo2-my-car-service/src/main/java</source>
+ </sources>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
</plugins>
<pluginManagement>
@@ -212,4 +281,58 @@
</plugins>
</reporting>
+ <profiles>
+ <profile>
+ <!-- REVISIT as of now, the olingo odata2 sample service that is used in the tests
+ is not available in nexus and needs to be generated and built using its architype plugin.
+ If the sample service jar becomes available, we can use it directly -->
+ <id>get-olingo2-sample</id>
+ <activation>
+ <file>
+ <missing>${basedir}/target/olingo2-my-car-service</missing>
+ </file>
+ <!-- the above condition is evaluated prior to the mvn execution and consequently
+ it evaluates to false when "mvn clean install" is invoked while the folder exists,
+ which is correct, yet unfortunate, as the clean phase will remove the folder and
+ subsequently the source folder is not created.
+ So, we need activate this profle by default and set -fn option to the mvn below to
+ ignore the duplicate error ;-((
+ -->
+ <activeByDefault>true</activeByDefault>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>generate-sources</id>
+ <phase>generate-test-sources</phase>
+ <goals>
+ <goal>exec</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <executable>mvn</executable>
+ <workingDirectory>${basedir}/target</workingDirectory>
+ <arguments>
+ <argument>archetype:generate</argument>
+ <argument>-q</argument>
+ <argument>-fn</argument>
+ <argument>-DinteractiveMode=false</argument>
+ <argument>-Dversion=${project.version}</argument>
+ <argument>-DgroupId=org.apache.camel</argument>
+ <argument>-DartifactId=olingo2-my-car-service</argument>
+ <argument>-DarchetypeGroupId=org.apache.olingo</argument>
+ <argument>-DarchetypeArtifactId=olingo-odata2-sample-cars-annotation-archetype</argument>
+ <argument>-DarchetypeVersion=${olingo2-version}</argument>
+ </arguments>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
</project>
http://git-wip-us.apache.org/repos/asf/camel/blob/c285fbf8/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/AbstractOlingo2TestSupport.java
----------------------------------------------------------------------
diff --git a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/AbstractOlingo2TestSupport.java b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/AbstractOlingo2TestSupport.java
index 094f0b1..c85c31a 100644
--- a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/AbstractOlingo2TestSupport.java
+++ b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/AbstractOlingo2TestSupport.java
@@ -32,6 +32,11 @@ import org.apache.camel.util.IntrospectionSupport;
public class AbstractOlingo2TestSupport extends CamelTestSupport {
private static final String TEST_OPTIONS_PROPERTIES = "/test-options.properties";
+ private Properties properties = new Properties();
+
+ protected void setDefaultTestProperty(String key, String value) {
+ properties.setProperty(key, value);
+ }
@Override
protected CamelContext createCamelContext() throws Exception {
@@ -39,7 +44,6 @@ public class AbstractOlingo2TestSupport extends CamelTestSupport {
final CamelContext context = super.createCamelContext();
// read Olingo component configuration from TEST_OPTIONS_PROPERTIES
- final Properties properties = new Properties();
try {
properties.load(getClass().getResourceAsStream(TEST_OPTIONS_PROPERTIES));
} catch (Exception e) {
http://git-wip-us.apache.org/repos/asf/camel/blob/c285fbf8/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppAPITest.java
----------------------------------------------------------------------
diff --git a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppAPITest.java b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppAPITest.java
new file mode 100644
index 0000000..e502c6a
--- /dev/null
+++ b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppAPITest.java
@@ -0,0 +1,596 @@
+/**
+ * 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.camel.component.olingo2;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.component.olingo2.api.Olingo2App;
+import org.apache.camel.component.olingo2.api.Olingo2ResponseHandler;
+import org.apache.camel.component.olingo2.api.batch.Olingo2BatchChangeRequest;
+import org.apache.camel.component.olingo2.api.batch.Olingo2BatchQueryRequest;
+import org.apache.camel.component.olingo2.api.batch.Olingo2BatchRequest;
+import org.apache.camel.component.olingo2.api.batch.Olingo2BatchResponse;
+import org.apache.camel.component.olingo2.api.batch.Operation;
+import org.apache.camel.component.olingo2.api.impl.Olingo2AppImpl;
+import org.apache.camel.component.olingo2.api.impl.SystemQueryOption;
+import org.apache.camel.test.AvailablePortFinder;
+import org.apache.http.entity.ContentType;
+import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
+import org.apache.olingo.odata2.api.edm.Edm;
+import org.apache.olingo.odata2.api.edm.EdmEntitySetInfo;
+import org.apache.olingo.odata2.api.ep.entry.ODataEntry;
+import org.apache.olingo.odata2.api.ep.feed.ODataDeltaFeed;
+import org.apache.olingo.odata2.api.ep.feed.ODataFeed;
+import org.apache.olingo.odata2.api.servicedocument.Collection;
+import org.apache.olingo.odata2.api.servicedocument.ServiceDocument;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * Integration test for {@link org.apache.camel.component.olingo2.api.impl.Olingo2AppImpl}
+ * using the sample Olingo2 Server dynamically downloaded and started during the test.
+ */
+public class Olingo2AppAPITest {
+
+ private static final Logger LOG = LoggerFactory.getLogger(Olingo2AppAPITest.class);
+ private static final int PORT = AvailablePortFinder.getNextAvailable();
+
+ private static final long TIMEOUT = 10;
+
+ private static final String MANUFACTURERS = "Manufacturers";
+ private static final String FQN_MANUFACTURERS = "DefaultContainer.Manufacturers";
+ private static final String ADDRESS = "Address";
+ private static final String CARS = "Cars";
+
+ private static final String TEST_KEY = "'1'";
+ private static final String TEST_CREATE_KEY = "'123'";
+ private static final String TEST_MANUFACTURER = FQN_MANUFACTURERS + "(" + TEST_KEY + ")";
+ private static final String TEST_CREATE_MANUFACTURER = MANUFACTURERS + "(" + TEST_CREATE_KEY + ")";
+
+ private static final String TEST_RESOURCE_CONTENT_ID = "1";
+ private static final String TEST_RESOURCE = "$" + TEST_RESOURCE_CONTENT_ID;
+
+ private static final char NEW_LINE = '\n';
+ private static final String TEST_CAR = "Manufacturers('1')/Cars('1')";
+ private static final String TEST_MANUFACTURER_FOUNDED_PROPERTY = "Manufacturers('1')/Founded";
+ private static final String TEST_MANUFACTURER_FOUNDED_VALUE = "Manufacturers('1')/Founded/$value";
+ private static final String FOUNDED_PROPERTY = "Founded";
+ private static final String TEST_MANUFACTURER_ADDRESS_PROPERTY = "Manufacturers('1')/Address";
+ private static final String TEST_MANUFACTURER_LINKS_CARS = "Manufacturers('1')/$links/Cars";
+ private static final String TEST_CAR_LINK_MANUFACTURER = "Cars('1')/$links/Manufacturer";
+ private static final String COUNT_OPTION = "/$count";
+
+ private static final String TEST_SERVICE_URL = "http://localhost:" + PORT + "/MyFormula.svc";
+ // private static final String TEST_SERVICE_URL = "http://localhost:8080/cars-annotations-sample/MyFormula.svc";
+// private static final ContentType TEST_FORMAT = ContentType.APPLICATION_XML_CS_UTF_8;
+ private static final ContentType TEST_FORMAT = ContentType.APPLICATION_JSON;
+// private static final Pattern LINK_PATTERN = Pattern.compile("[^(]+\\('([^']+)'\\)");
+ private static final String ID_PROPERTY = "Id";
+
+ private static Olingo2App olingoApp;
+ private static Edm edm;
+
+ private static Olingo2SampleServer server;
+
+ @BeforeClass
+ public static void beforeClass() throws Exception {
+ startServers(PORT);
+ Olingo2SampleServer.generateSampleData(TEST_SERVICE_URL);
+ setupClient();
+ }
+
+ @AfterClass
+ public static void afterClass() throws Exception {
+ if (olingoApp != null) {
+ olingoApp.close();
+ }
+ if (server != null) {
+ server.stop();
+ server.destroy();
+ }
+ }
+
+ protected static void startServers(int port) throws Exception {
+ server = new Olingo2SampleServer(port, "/olingo2_ref");
+ server.start();
+ }
+
+ protected static void setupClient() throws Exception {
+ olingoApp = new Olingo2AppImpl(TEST_SERVICE_URL + "/");
+ olingoApp.setContentType(TEST_FORMAT.toString());
+
+ LOG.info("Read Edm ");
+ final TestOlingo2ResponseHandler<Edm> responseHandler = new TestOlingo2ResponseHandler<Edm>();
+
+ olingoApp.read(null, Olingo2AppImpl.METADATA, null, responseHandler);
+
+ edm = responseHandler.await();
+ LOG.info("Read default EntityContainer: {}", responseHandler.await().getDefaultEntityContainer().getName());
+
+ // wait for generated data to be registered in server
+ Thread.sleep(2000);
+ }
+
+ @Test
+ public void testServiceDocument() throws Exception {
+ final TestOlingo2ResponseHandler<ServiceDocument> responseHandler =
+ new TestOlingo2ResponseHandler<ServiceDocument>();
+
+ olingoApp.read(null, "", null, responseHandler);
+
+ final ServiceDocument serviceDocument = responseHandler.await();
+ final List<Collection> collections = serviceDocument.getAtomInfo().getWorkspaces().get(0).getCollections();
+ assertEquals("Service Atom Collections", 3, collections.size());
+ LOG.info("Service Atom Collections: {}", collections);
+
+ final List<EdmEntitySetInfo> entitySetsInfo = serviceDocument.getEntitySetsInfo();
+ assertEquals("Service Entity Sets", 3, entitySetsInfo.size());
+ LOG.info("Service Document Entries: {}", entitySetsInfo);
+ }
+
+ @Test
+ public void testReadFeed() throws Exception {
+ final TestOlingo2ResponseHandler<ODataFeed> responseHandler = new TestOlingo2ResponseHandler<ODataFeed>();
+
+ olingoApp.read(edm, MANUFACTURERS, null, responseHandler);
+
+ final ODataFeed dataFeed = responseHandler.await();
+ assertNotNull("Data feed", dataFeed);
+ LOG.info("Entries: {}", prettyPrint(dataFeed));
+ }
+
+ @Test
+ public void testReadEntry() throws Exception {
+ final TestOlingo2ResponseHandler<ODataEntry> responseHandler = new TestOlingo2ResponseHandler<ODataEntry>();
+
+ olingoApp.read(edm, TEST_MANUFACTURER, null, responseHandler);
+ ODataEntry entry = responseHandler.await();
+ LOG.info("Single Entry: {}", prettyPrint(entry));
+
+ responseHandler.reset();
+
+ olingoApp.read(edm, TEST_CAR, null, responseHandler);
+ entry = responseHandler.await();
+ LOG.info("Single Entry: {}", prettyPrint(entry));
+
+ responseHandler.reset();
+ final Map<String, String> queryParams = new HashMap<String, String>();
+ queryParams.put(SystemQueryOption.$expand.toString(), CARS);
+
+ olingoApp.read(edm, TEST_MANUFACTURER, queryParams, responseHandler);
+
+ ODataEntry entryExpanded = responseHandler.await();
+ LOG.info("Single Entry with expanded Cars relation: {}", prettyPrint(entryExpanded));
+ }
+
+ @Test
+ public void testReadUpdateProperties() throws Exception {
+ // test simple property Manufacturer.Founded
+ final TestOlingo2ResponseHandler<Map<String, Object>> propertyHandler =
+ new TestOlingo2ResponseHandler<Map<String, Object>>();
+
+ olingoApp.read(edm, TEST_MANUFACTURER_FOUNDED_PROPERTY, null, propertyHandler);
+
+ Calendar founded = (Calendar) propertyHandler.await().get(FOUNDED_PROPERTY);
+ LOG.info("Founded property {}", founded.toString());
+
+ final TestOlingo2ResponseHandler<Calendar> valueHandler = new TestOlingo2ResponseHandler<Calendar>();
+
+ olingoApp.read(edm, TEST_MANUFACTURER_FOUNDED_VALUE, null, valueHandler);
+
+ founded = valueHandler.await();
+ LOG.info("Founded property {}", founded.toString());
+
+ final TestOlingo2ResponseHandler<HttpStatusCodes> statusHandler =
+ new TestOlingo2ResponseHandler<HttpStatusCodes>();
+ final HashMap<String, Object> properties = new HashMap<String, Object>();
+ properties.put(FOUNDED_PROPERTY, new Date());
+
+// olingoApp.update(edm, TEST_MANUFACTURER_FOUNDED_PROPERTY, properties, statusHandler);
+ // requires a plain Date for XML
+ olingoApp.update(edm, TEST_MANUFACTURER_FOUNDED_PROPERTY, new Date(), statusHandler);
+
+ LOG.info("Founded property updated with status {}", statusHandler.await().getStatusCode());
+
+ statusHandler.reset();
+
+ olingoApp.update(edm, TEST_MANUFACTURER_FOUNDED_VALUE, new Date(), statusHandler);
+
+ LOG.info("Founded property updated with status {}", statusHandler.await().getStatusCode());
+
+ // test complex property Manufacturer.Address
+ propertyHandler.reset();
+
+ olingoApp.read(edm, TEST_MANUFACTURER_ADDRESS_PROPERTY, null, propertyHandler);
+
+ final Map<String, Object> address = propertyHandler.await();
+ LOG.info("Address property {}", prettyPrint(address, 0));
+
+ statusHandler.reset();
+
+ address.clear();
+ // Olingo2 sample server MERGE/PATCH behaves like PUT!!!
+// address.put("Street", "Main Street");
+ address.put("Street", "Star Street 137");
+ address.put("City", "Stuttgart");
+ address.put("ZipCode", "70173");
+ address.put("Country", "Germany");
+
+// olingoApp.patch(edm, TEST_MANUFACTURER_ADDRESS_PROPERTY, address, statusHandler);
+ olingoApp.merge(edm, TEST_MANUFACTURER_ADDRESS_PROPERTY, address, statusHandler);
+
+ LOG.info("Address property updated with status {}", statusHandler.await().getStatusCode());
+ }
+
+ @Test
+ public void testReadDeleteCreateLinks() throws Exception {
+ final TestOlingo2ResponseHandler<List<String>> linksHandler = new TestOlingo2ResponseHandler<List<String>>();
+
+ olingoApp.read(edm, TEST_MANUFACTURER_LINKS_CARS, null, linksHandler);
+
+ final List<String> links = linksHandler.await();
+ assertFalse(links.isEmpty());
+ LOG.info("Read links: {}", links);
+
+ final TestOlingo2ResponseHandler<String> linkHandler = new TestOlingo2ResponseHandler<String>();
+
+ olingoApp.read(edm, TEST_CAR_LINK_MANUFACTURER, null, linkHandler);
+
+ final String link = linkHandler.await();
+ LOG.info("Read link: {}", link);
+
+//Deleting relationships through links is not supported in Olingo2 at the time of writing this test
+/*
+ final TestOlingo2ResponseHandler<HttpStatusCodes> statusHandler =
+ new TestOlingo2ResponseHandler<HttpStatusCodes>();
+
+ final ArrayList<Map<String, Object>> carKeys = new ArrayList<Map<String, Object>>();
+ for (String carLink : links) {
+ final Matcher matcher = LINK_PATTERN.matcher(carLink);
+ assertTrue("Link pattern " + carLink, matcher.matches());
+ final String carId = matcher.group(1);
+
+ final HashMap<String, Object> keys = new HashMap<String, Object>();
+ keys.put(ID_PROPERTY, carId);
+ carKeys.add(keys);
+
+ // delete manufacturer->car link
+ statusHandler.reset();
+ final String resourcePath = TEST_MANUFACTURER_LINKS_CARS + "('" + carId + "')";
+ olingoApp.delete(resourcePath, statusHandler);
+
+ assertEquals("Delete car link " + resourcePath, HttpStatusCodes.OK.getStatusCode(),
+ statusHandler.await().getStatusCode());
+ }
+
+ // add links to all Cars
+ statusHandler.reset();
+ olingoApp.create(edm, TEST_MANUFACTURER_LINKS_CARS, carKeys, statusHandler);
+
+ assertEquals("Links update", HttpStatusCodes.ACCEPTED.getStatusCode(), statusHandler.await().getStatusCode());
+
+ // delete car->manufacturer link
+ statusHandler.reset();
+ olingoApp.delete(TEST_CAR_LINK_MANUFACTURER, statusHandler);
+
+ assertEquals("Delete manufacturer link " + TEST_CAR_LINK_MANUFACTURER, HttpStatusCodes.OK.getStatusCode(),
+ statusHandler.await().getStatusCode());
+
+ // add link to Manufacturer
+ statusHandler.reset();
+ final HashMap<String, Object> manufacturerKey = new HashMap<String, Object>();
+ manufacturerKey.put(ID_PROPERTY, "1");
+
+ olingoApp.create(edm, TEST_CAR_LINK_MANUFACTURER, manufacturerKey, statusHandler);
+
+ assertEquals("Link update", HttpStatusCodes.ACCEPTED.getStatusCode(), statusHandler.await().getStatusCode());
+*/
+ }
+
+ @Test
+ public void testReadCount() throws Exception {
+ final TestOlingo2ResponseHandler<Long> countHandler = new TestOlingo2ResponseHandler<Long>();
+
+ olingoApp.read(edm, MANUFACTURERS + COUNT_OPTION, null, countHandler);
+
+ LOG.info("Manufacturers count: {}", countHandler.await());
+
+ countHandler.reset();
+ olingoApp.read(edm, TEST_MANUFACTURER + COUNT_OPTION, null, countHandler);
+
+ LOG.info("Manufacturer count: {}", countHandler.await());
+
+ countHandler.reset();
+ olingoApp.read(edm, TEST_MANUFACTURER_LINKS_CARS + COUNT_OPTION, null, countHandler);
+
+ LOG.info("Manufacturers links count: {}", countHandler.await());
+
+ countHandler.reset();
+ olingoApp.read(edm, TEST_CAR_LINK_MANUFACTURER + COUNT_OPTION, null, countHandler);
+
+ LOG.info("Manufacturer link count: {}", countHandler.await());
+ }
+
+ @Test
+ public void testCreateUpdateDeleteEntry() throws Exception {
+
+ // create entry to update
+ final TestOlingo2ResponseHandler<ODataEntry> entryHandler = new TestOlingo2ResponseHandler<ODataEntry>();
+
+ olingoApp.create(edm, MANUFACTURERS, getEntityData(), entryHandler);
+
+ ODataEntry createdEntry = entryHandler.await();
+ LOG.info("Created Entry: {}", prettyPrint(createdEntry));
+
+ Map<String, Object> data = getEntityData();
+ @SuppressWarnings("unchecked")
+ Map<String, Object> address = (Map<String, Object>) data.get(ADDRESS);
+
+ data.put("Name", "MyCarManufacturer Renamed");
+ address.put("Street", "Main Street");
+ final TestOlingo2ResponseHandler<HttpStatusCodes> statusHandler =
+ new TestOlingo2ResponseHandler<HttpStatusCodes>();
+
+ olingoApp.update(edm, TEST_CREATE_MANUFACTURER, data, statusHandler);
+ statusHandler.await();
+
+ statusHandler.reset();
+ data.put("Name", "MyCarManufacturer Patched");
+ olingoApp.patch(edm, TEST_CREATE_MANUFACTURER, data, statusHandler);
+ statusHandler.await();
+
+ entryHandler.reset();
+ olingoApp.read(edm, TEST_CREATE_MANUFACTURER, null, entryHandler);
+
+ ODataEntry updatedEntry = entryHandler.await();
+ LOG.info("Updated Entry successfully: {}", prettyPrint(updatedEntry));
+
+ statusHandler.reset();
+ olingoApp.delete(TEST_CREATE_MANUFACTURER, statusHandler);
+
+ HttpStatusCodes statusCode = statusHandler.await();
+ LOG.info("Deletion of Entry was successful: {}: {}", statusCode.getStatusCode(), statusCode.getInfo());
+
+ try {
+ LOG.info("Verify Delete Entry");
+
+ entryHandler.reset();
+ olingoApp.read(edm, TEST_CREATE_MANUFACTURER, null, entryHandler);
+
+ entryHandler.await();
+ fail("Entry not deleted!");
+ } catch (Exception e) {
+ LOG.info("Deleted entry not found: {}", e.getMessage());
+ }
+ }
+
+ @Test
+ public void testBatchRequest() throws Exception {
+
+ final List<Olingo2BatchRequest> batchParts = new ArrayList<Olingo2BatchRequest>();
+
+ // Edm query
+ batchParts.add(Olingo2BatchQueryRequest.resourcePath(Olingo2AppImpl.METADATA).build());
+
+ // feed query
+ batchParts.add(Olingo2BatchQueryRequest.resourcePath(MANUFACTURERS).build());
+
+ // read
+ batchParts.add(Olingo2BatchQueryRequest.resourcePath(TEST_MANUFACTURER).build());
+
+ // read with expand
+ final HashMap<String, String> queryParams = new HashMap<String, String>();
+ queryParams.put(SystemQueryOption.$expand.toString(), CARS);
+ batchParts.add(Olingo2BatchQueryRequest.resourcePath(TEST_MANUFACTURER).queryParams(queryParams).build());
+
+ // create
+ final Map<String, Object> data = getEntityData();
+ batchParts.add(Olingo2BatchChangeRequest.resourcePath(MANUFACTURERS).
+ contentId(TEST_RESOURCE_CONTENT_ID).operation(Operation.CREATE).body(data).build());
+
+ // update
+ final Map<String, Object> updateData = new HashMap<String, Object>(data);
+ @SuppressWarnings("unchecked")
+ Map<String, Object> address = (Map<String, Object>) updateData.get(ADDRESS);
+ updateData.put("Name", "MyCarManufacturer Renamed");
+ address.put("Street", "Main Street");
+
+ batchParts.add(Olingo2BatchChangeRequest.resourcePath(TEST_RESOURCE).operation(Operation.UPDATE)
+ .body(updateData).build());
+
+ // delete
+ batchParts.add(Olingo2BatchChangeRequest.resourcePath(TEST_RESOURCE).operation(Operation.DELETE).build());
+
+ final TestOlingo2ResponseHandler<List<Olingo2BatchResponse>> responseHandler =
+ new TestOlingo2ResponseHandler<List<Olingo2BatchResponse>>();
+
+ // read to verify delete
+ batchParts.add(Olingo2BatchQueryRequest.resourcePath(TEST_CREATE_MANUFACTURER).build());
+
+ olingoApp.batch(edm, batchParts, responseHandler);
+
+ final List<Olingo2BatchResponse> responseParts = responseHandler.await(15, TimeUnit.MINUTES);
+ assertEquals("Batch responses expected", 8, responseParts.size());
+
+ assertNotNull(responseParts.get(0).getBody());
+ final ODataFeed feed = (ODataFeed) responseParts.get(1).getBody();
+ assertNotNull(feed);
+ LOG.info("Batch feed: {}", prettyPrint(feed));
+
+ ODataEntry dataEntry = (ODataEntry) responseParts.get(2).getBody();
+ assertNotNull(dataEntry);
+ LOG.info("Batch read entry: {}", prettyPrint(dataEntry));
+
+ dataEntry = (ODataEntry) responseParts.get(3).getBody();
+ assertNotNull(dataEntry);
+ LOG.info("Batch read entry with expand: {}", prettyPrint(dataEntry));
+
+ dataEntry = (ODataEntry) responseParts.get(4).getBody();
+ assertNotNull(dataEntry);
+ LOG.info("Batch create entry: {}", prettyPrint(dataEntry));
+
+ assertEquals(HttpStatusCodes.NO_CONTENT.getStatusCode(), responseParts.get(5).getStatusCode());
+ assertEquals(HttpStatusCodes.NO_CONTENT.getStatusCode(), responseParts.get(6).getStatusCode());
+
+ assertEquals(HttpStatusCodes.NOT_FOUND.getStatusCode(), responseParts.get(7).getStatusCode());
+ final Exception exception = (Exception) responseParts.get(7).getBody();
+ assertNotNull(exception);
+ LOG.info("Batch retrieve deleted entry: {}", exception);
+ }
+
+ private Map<String, Object> getEntityData() {
+ Map<String, Object> data = new HashMap<String, Object>();
+ data.put(ID_PROPERTY, "123");
+ data.put("Name", "MyCarManufacturer");
+ data.put(FOUNDED_PROPERTY, new Date());
+ Map<String, Object> address = new HashMap<String, Object>();
+ address.put("Street", "Main");
+ address.put("ZipCode", "42421");
+ address.put("City", "Fairy City");
+ address.put("Country", "FarFarAway");
+ data.put(ADDRESS, address);
+ return data;
+ }
+
+ private static String prettyPrint(ODataFeed dataFeed) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("[\n");
+ for (ODataEntry entry : dataFeed.getEntries()) {
+ builder.append(prettyPrint(entry.getProperties(), 1)).append('\n');
+ }
+ builder.append("]\n");
+ return builder.toString();
+ }
+
+ private static String prettyPrint(ODataEntry createdEntry) {
+ return prettyPrint(createdEntry.getProperties(), 0);
+ }
+
+ private static String prettyPrint(Map<String, Object> properties, int level) {
+ StringBuilder b = new StringBuilder();
+ Set<Map.Entry<String, Object>> entries = properties.entrySet();
+
+ for (Map.Entry<String, Object> entry : entries) {
+ indent(b, level);
+ b.append(entry.getKey()).append(": ");
+ Object value = entry.getValue();
+ if (value instanceof Map) {
+ @SuppressWarnings("unchecked")
+ final Map<String, Object> objectMap = (Map<String, Object>) value;
+ value = prettyPrint(objectMap, level + 1);
+ b.append(value).append(NEW_LINE);
+ } else if (value instanceof Calendar) {
+ Calendar cal = (Calendar) value;
+ value = SimpleDateFormat.getInstance().format(cal.getTime());
+ b.append(value).append(NEW_LINE);
+ } else if (value instanceof ODataDeltaFeed) {
+ ODataDeltaFeed feed = (ODataDeltaFeed) value;
+ List<ODataEntry> inlineEntries = feed.getEntries();
+ b.append("{");
+ for (ODataEntry oDataEntry : inlineEntries) {
+ value = prettyPrint(oDataEntry.getProperties(), level + 1);
+ b.append("\n[\n").append(value).append("\n],");
+ }
+ b.deleteCharAt(b.length() - 1);
+ indent(b, level);
+ b.append("}\n");
+ } else {
+ b.append(value).append(NEW_LINE);
+ }
+ }
+ // remove last line break
+ b.deleteCharAt(b.length() - 1);
+ return b.toString();
+ }
+
+ private static void indent(StringBuilder builder, int indentLevel) {
+ for (int i = 0; i < indentLevel; i++) {
+ builder.append(" ");
+ }
+ }
+
+ private static final class TestOlingo2ResponseHandler<T> implements Olingo2ResponseHandler<T> {
+
+ private T response;
+ private Exception error;
+ private CountDownLatch latch = new CountDownLatch(1);
+
+ @Override
+ public void onResponse(T response) {
+ this.response = response;
+ if (LOG.isDebugEnabled()) {
+ if (response instanceof ODataFeed) {
+ LOG.debug("Received response: {}", prettyPrint((ODataFeed) response));
+ } else if (response instanceof ODataEntry) {
+ LOG.debug("Received response: {}", prettyPrint((ODataEntry) response));
+ } else {
+ LOG.debug("Received response: {}", response);
+ }
+ }
+ latch.countDown();
+ }
+
+ @Override
+ public void onException(Exception ex) {
+ error = ex;
+ latch.countDown();
+ }
+
+ @Override
+ public void onCanceled() {
+ error = new IllegalStateException("Request Canceled");
+ latch.countDown();
+ }
+
+ public T await() throws Exception {
+ return await(TIMEOUT, TimeUnit.SECONDS);
+ }
+
+ public T await(long timeout, TimeUnit unit) throws Exception {
+ assertTrue("Timeout waiting for response", latch.await(timeout, unit));
+ if (error != null) {
+ throw error;
+ }
+ assertNotNull("Response", response);
+ return response;
+ }
+
+ public void reset() {
+ latch.countDown();
+ latch = new CountDownLatch(1);
+ response = null;
+ error = null;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/c285fbf8/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppIntegrationTest.java
----------------------------------------------------------------------
diff --git a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppIntegrationTest.java b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppIntegrationTest.java
deleted file mode 100644
index 9015807..0000000
--- a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2AppIntegrationTest.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.olingo2;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.olingo2.api.batch.Olingo2BatchChangeRequest;
-import org.apache.camel.component.olingo2.api.batch.Olingo2BatchQueryRequest;
-import org.apache.camel.component.olingo2.api.batch.Olingo2BatchRequest;
-import org.apache.camel.component.olingo2.api.batch.Olingo2BatchResponse;
-import org.apache.camel.component.olingo2.api.batch.Operation;
-import org.apache.camel.component.olingo2.api.impl.Olingo2AppImpl;
-import org.apache.camel.component.olingo2.api.impl.SystemQueryOption;
-import org.apache.camel.component.olingo2.internal.Olingo2Constants;
-import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
-import org.apache.olingo.odata2.api.edm.Edm;
-import org.apache.olingo.odata2.api.ep.entry.ODataEntry;
-import org.apache.olingo.odata2.api.ep.feed.ODataFeed;
-import org.apache.olingo.odata2.api.servicedocument.ServiceDocument;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Test class for {@link org.apache.camel.component.olingo2.api.Olingo2App} APIs.
- * <p>
- * The integration test runs against Apache Olingo 2.0 sample server
- * described at http://olingo.apache.org/doc/sample-setup.html
- * </p>
- * <p>
- * Sample data must be first generated by using the sample client described with the server,
- * or by running test <code>Olingo2AppIntegrationTest</code> in camel-olingo2-api module.
- * </p>
- */
-public class Olingo2AppIntegrationTest extends AbstractOlingo2TestSupport {
-
- private static final Logger LOG = LoggerFactory.getLogger(Olingo2AppIntegrationTest.class);
- private static final String ID_PROPERTY = "Id";
- private static final String MANUFACTURERS = "Manufacturers";
- private static final String TEST_MANUFACTURER = "Manufacturers('1')";
- private static final String CARS = "Cars";
- private static final String TEST_RESOURCE_CONTENT_ID = "1";
- private static final String ADDRESS = "Address";
- private static final String TEST_RESOURCE = "$1";
- private static final String TEST_RESOURCE_ADDRESS = TEST_RESOURCE + "/Address";
- private static final String TEST_CREATE_MANUFACTURER = "DefaultContainer.Manufacturers('123')";
-
- @Test
- public void testRead() throws Exception {
- final Map<String, Object> headers = new HashMap<String, Object>();
-
- // read ServiceDocument
- final ServiceDocument document = requestBodyAndHeaders("direct://READSERVICEDOC", null, headers);
- assertNotNull(document);
- assertFalse("ServiceDocument entity sets", document.getEntitySetsInfo().isEmpty());
- LOG.info("Service document has {} entity sets", document.getEntitySetsInfo().size());
-
- // parameter type is java.util.Map
- final HashMap<String, String> queryParams = new HashMap<String, String>();
- queryParams.put(SystemQueryOption.$top.name(), "5");
- headers.put("CamelOlingo2.queryParams", queryParams);
-
- // read ODataFeed
- final ODataFeed manufacturers = requestBodyAndHeaders("direct://READFEED", null, headers);
- assertNotNull(manufacturers);
- final List<ODataEntry> manufacturersEntries = manufacturers.getEntries();
- assertFalse("Manufacturers empty entries", manufacturersEntries.isEmpty());
- LOG.info("Manufacturers feed has {} entries", manufacturersEntries.size());
-
- // read ODataEntry
- headers.clear();
- headers.put(Olingo2Constants.PROPERTY_PREFIX + "keyPredicate", "'1'");
- final ODataEntry manufacturer = requestBodyAndHeaders("direct://READENTRY", null, headers);
- assertNotNull(manufacturer);
- final Map<String, Object> properties = manufacturer.getProperties();
- assertEquals("Manufacturer Id", "1", properties.get(ID_PROPERTY));
- LOG.info("Manufacturer: {}", properties.toString());
- }
-
- @Test
- public void testCreateUpdateDelete() throws Exception {
- final Map<String, Object> data = getEntityData();
- Map<String, Object> address;
-
- final ODataEntry manufacturer = requestBody("direct://CREATE", data);
- assertNotNull("Created Manufacturer", manufacturer);
- final Map<String, Object> properties = manufacturer.getProperties();
- assertEquals("Created Manufacturer Id", "123", properties.get(ID_PROPERTY));
- LOG.info("Created Manufacturer: {}", properties);
-
- // update
- data.put("Name", "MyCarManufacturer Renamed");
- address = (Map<String, Object>)data.get("Address");
- address.put("Street", "Main Street");
-
- HttpStatusCodes status = requestBody("direct://UPDATE", data);
- assertNotNull("Update status", status);
- assertEquals("Update status", HttpStatusCodes.NO_CONTENT.getStatusCode(), status.getStatusCode());
- LOG.info("Update status: {}", status);
-
- // delete
- status = requestBody("direct://DELETE", null);
- assertNotNull("Delete status", status);
- assertEquals("Delete status", HttpStatusCodes.NO_CONTENT.getStatusCode(), status.getStatusCode());
- LOG.info("Delete status: {}", status);
- }
-
- private Map<String, Object> getEntityData() {
- final Map<String, Object> data = new HashMap<String, Object>();
- data.put("Id", "123");
- data.put("Name", "MyCarManufacturer");
- data.put("Founded", new Date());
- Map<String, Object> address = new HashMap<String, Object>();
- address.put("Street", "Main");
- address.put("ZipCode", "42421");
- address.put("City", "Fairy City");
- address.put("Country", "FarFarAway");
- data.put("Address", address);
- return data;
- }
-
- @Test
- public void testBatch() throws Exception {
- final List<Olingo2BatchRequest> batchParts = new ArrayList<Olingo2BatchRequest>();
-
- // 1. Edm query
- batchParts.add(Olingo2BatchQueryRequest.resourcePath(Olingo2AppImpl.METADATA).build());
-
- // 2. feed query
- batchParts.add(Olingo2BatchQueryRequest.resourcePath(MANUFACTURERS).build());
-
- // 3. read
- batchParts.add(Olingo2BatchQueryRequest.resourcePath(TEST_MANUFACTURER).build());
-
- // 4. read with expand
- final HashMap<String, String> queryParams = new HashMap<String, String>();
- queryParams.put(SystemQueryOption.$expand.toString(), CARS);
- batchParts.add(Olingo2BatchQueryRequest.resourcePath(TEST_MANUFACTURER).queryParams(queryParams).build());
-
- // 5. create
- final Map<String, Object> data = getEntityData();
- batchParts.add(Olingo2BatchChangeRequest.resourcePath(MANUFACTURERS).
- contentId(TEST_RESOURCE_CONTENT_ID).operation(Operation.CREATE).body(data).build());
-
- // 6. update address in created entry
- @SuppressWarnings("unchecked")
- final Map<String, Object> updateData = new HashMap<String, Object>(data);
- Map<String, Object> address = (Map<String, Object>) updateData.get(ADDRESS);
- address.put("Street", "Main Street");
- batchParts.add(
- Olingo2BatchChangeRequest.resourcePath(TEST_RESOURCE_ADDRESS).operation(Operation.UPDATE).body(address).build());
-
- // 7. update
- updateData.put("Name", "MyCarManufacturer Renamed");
- batchParts.add(Olingo2BatchChangeRequest.resourcePath(TEST_RESOURCE).operation(Operation.UPDATE)
- .body(updateData).build());
-
- // 8. delete
- batchParts.add(Olingo2BatchChangeRequest.resourcePath(TEST_RESOURCE).operation(Operation.DELETE).build());
-
- // 9. read to verify delete
- batchParts.add(Olingo2BatchQueryRequest.resourcePath(TEST_CREATE_MANUFACTURER).build());
-
- // execute batch request
- final List<Olingo2BatchResponse> responseParts = requestBody("direct://BATCH", batchParts);
- assertNotNull("Batch response", responseParts);
- assertEquals("Batch responses expected", 9, responseParts.size());
-
- final Edm edm = (Edm) responseParts.get(0).getBody();
- assertNotNull(edm);
- LOG.info("Edm entity sets: {}", edm.getEntitySets());
-
- final ODataFeed feed = (ODataFeed) responseParts.get(1).getBody();
- assertNotNull(feed);
- LOG.info("Read feed: {}", feed.getEntries());
-
- ODataEntry dataEntry = (ODataEntry) responseParts.get(2).getBody();
- assertNotNull(dataEntry);
- LOG.info("Read entry: {}", dataEntry.getProperties());
-
- dataEntry = (ODataEntry) responseParts.get(3).getBody();
- assertNotNull(dataEntry);
- LOG.info("Read entry with $expand: {}", dataEntry.getProperties());
-
- dataEntry = (ODataEntry) responseParts.get(4).getBody();
- assertNotNull(dataEntry);
- LOG.info("Created entry: {}", dataEntry.getProperties());
-
- int statusCode = responseParts.get(5).getStatusCode();
- assertEquals(HttpStatusCodes.NO_CONTENT.getStatusCode(), statusCode);
- LOG.info("Update address status: {}", statusCode);
-
- statusCode = responseParts.get(6).getStatusCode();
- assertEquals(HttpStatusCodes.NO_CONTENT.getStatusCode(), statusCode);
- LOG.info("Update entry status: {}", statusCode);
-
- statusCode = responseParts.get(7).getStatusCode();
- assertEquals(HttpStatusCodes.NO_CONTENT.getStatusCode(), statusCode);
- LOG.info("Delete status: {}", statusCode);
-
- assertEquals(HttpStatusCodes.NOT_FOUND.getStatusCode(), responseParts.get(8).getStatusCode());
- final Exception exception = (Exception) responseParts.get(8).getBody();
- assertNotNull(exception);
- LOG.info("Read deleted entry exception: {}", exception);
- }
-
- @Override
- protected RouteBuilder createRouteBuilder() throws Exception {
- return new RouteBuilder() {
- public void configure() {
- // test routes for read
- from("direct://READSERVICEDOC")
- .to("olingo2://read/");
-
- from("direct://READFEED")
- .to("olingo2://read/Manufacturers?$orderBy=Name%20asc");
-
- from("direct://READENTRY")
- .to("olingo2://read/DefaultContainer.Manufacturers");
-
- // test route for create
- from("direct://CREATE")
- .to("olingo2://create/Manufacturers");
-
- // test route for update
- from("direct://UPDATE")
- .to("olingo2://update/Manufacturers('123')");
-
- // test route for delete
- from("direct://DELETE")
- .to("olingo2://delete/Manufacturers('123')");
-
-/*
- // test route for merge
- from("direct://MERGE")
- .to("olingo2://merge");
-
- // test route for patch
- from("direct://PATCH")
- .to("olingo2://patch");
-*/
-
- // test route for batch
- from("direct://BATCH")
- .to("olingo2://batch");
-
- }
- };
- }
-}
http://git-wip-us.apache.org/repos/asf/camel/blob/c285fbf8/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2ComponentTest.java
----------------------------------------------------------------------
diff --git a/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2ComponentTest.java b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2ComponentTest.java
new file mode 100644
index 0000000..b1f981c
--- /dev/null
+++ b/components/camel-olingo2/camel-olingo2-component/src/test/java/org/apache/camel/component/olingo2/Olingo2ComponentTest.java
@@ -0,0 +1,295 @@
+/**
+ * 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.camel.component.olingo2;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.olingo2.api.batch.Olingo2BatchChangeRequest;
+import org.apache.camel.component.olingo2.api.batch.Olingo2BatchQueryRequest;
+import org.apache.camel.component.olingo2.api.batch.Olingo2BatchRequest;
+import org.apache.camel.component.olingo2.api.batch.Olingo2BatchResponse;
+import org.apache.camel.component.olingo2.api.batch.Operation;
+import org.apache.camel.component.olingo2.api.impl.Olingo2AppImpl;
+import org.apache.camel.component.olingo2.api.impl.SystemQueryOption;
+import org.apache.camel.component.olingo2.internal.Olingo2Constants;
+import org.apache.camel.test.AvailablePortFinder;
+import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
+import org.apache.olingo.odata2.api.edm.Edm;
+import org.apache.olingo.odata2.api.ep.entry.ODataEntry;
+import org.apache.olingo.odata2.api.ep.feed.ODataFeed;
+import org.apache.olingo.odata2.api.servicedocument.ServiceDocument;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Test class for {@link org.apache.camel.component.olingo2.api.Olingo2App} APIs.
+ * <p>
+ * The integration test runs against Apache Olingo 2.0 sample server
+ * which is dynamically installed and started during the test.
+ * </p>
+ */
+public class Olingo2ComponentTest extends AbstractOlingo2TestSupport {
+
+ private static final Logger LOG = LoggerFactory.getLogger(Olingo2ComponentTest.class);
+ private static final int PORT = AvailablePortFinder.getNextAvailable();
+ private static final String ID_PROPERTY = "Id";
+ private static final String MANUFACTURERS = "Manufacturers";
+ private static final String TEST_MANUFACTURER = "Manufacturers('1')";
+ private static final String CARS = "Cars";
+ private static final String TEST_RESOURCE_CONTENT_ID = "1";
+ private static final String ADDRESS = "Address";
+ private static final String TEST_RESOURCE = "$1";
+ private static final String TEST_RESOURCE_ADDRESS = TEST_RESOURCE + "/Address";
+ private static final String TEST_CREATE_MANUFACTURER = "DefaultContainer.Manufacturers('123')";
+ private static final String TEST_SERVICE_URL = "http://localhost:" + PORT + "/MyFormula.svc";
+
+ private static Olingo2SampleServer server;
+
+ public Olingo2ComponentTest() {
+ setDefaultTestProperty("serviceUri", "http://localhost:" + PORT + "/MyFormula.svc");
+ }
+
+ @BeforeClass
+ public static void beforeClass() throws Exception {
+ startServers(PORT);
+ Olingo2SampleServer.generateSampleData(TEST_SERVICE_URL);
+ }
+
+ @AfterClass
+ public static void afterClass() throws Exception {
+ if (server != null) {
+ server.stop();
+ server.destroy();
+ }
+ }
+
+ protected static void startServers(int port) throws Exception {
+ server = new Olingo2SampleServer(port, "/olingo2_ref");
+ server.start();
+ }
+
+ @Test
+ public void testRead() throws Exception {
+ final Map<String, Object> headers = new HashMap<String, Object>();
+
+ // read ServiceDocument
+ final ServiceDocument document = requestBodyAndHeaders("direct://READSERVICEDOC", null, headers);
+ assertNotNull(document);
+ assertFalse("ServiceDocument entity sets", document.getEntitySetsInfo().isEmpty());
+ LOG.info("Service document has {} entity sets", document.getEntitySetsInfo().size());
+
+ // parameter type is java.util.Map
+ final HashMap<String, String> queryParams = new HashMap<String, String>();
+ queryParams.put(SystemQueryOption.$top.name(), "5");
+ headers.put("CamelOlingo2.queryParams", queryParams);
+
+ // read ODataFeed
+ final ODataFeed manufacturers = requestBodyAndHeaders("direct://READFEED", null, headers);
+ assertNotNull(manufacturers);
+ final List<ODataEntry> manufacturersEntries = manufacturers.getEntries();
+ assertFalse("Manufacturers empty entries", manufacturersEntries.isEmpty());
+ LOG.info("Manufacturers feed has {} entries", manufacturersEntries.size());
+
+ // read ODataEntry
+ headers.clear();
+ headers.put(Olingo2Constants.PROPERTY_PREFIX + "keyPredicate", "'1'");
+ final ODataEntry manufacturer = requestBodyAndHeaders("direct://READENTRY", null, headers);
+ assertNotNull(manufacturer);
+ final Map<String, Object> properties = manufacturer.getProperties();
+ assertEquals("Manufacturer Id", "1", properties.get(ID_PROPERTY));
+ LOG.info("Manufacturer: {}", properties.toString());
+ }
+
+ @Test
+ public void testCreateUpdateDelete() throws Exception {
+ final Map<String, Object> data = getEntityData();
+ Map<String, Object> address;
+
+ final ODataEntry manufacturer = requestBody("direct://CREATE", data);
+ assertNotNull("Created Manufacturer", manufacturer);
+ final Map<String, Object> properties = manufacturer.getProperties();
+ assertEquals("Created Manufacturer Id", "123", properties.get(ID_PROPERTY));
+ LOG.info("Created Manufacturer: {}", properties);
+
+ // update
+ data.put("Name", "MyCarManufacturer Renamed");
+ address = (Map<String, Object>)data.get("Address");
+ address.put("Street", "Main Street");
+
+ HttpStatusCodes status = requestBody("direct://UPDATE", data);
+ assertNotNull("Update status", status);
+ assertEquals("Update status", HttpStatusCodes.NO_CONTENT.getStatusCode(), status.getStatusCode());
+ LOG.info("Update status: {}", status);
+
+ // delete
+ status = requestBody("direct://DELETE", null);
+ assertNotNull("Delete status", status);
+ assertEquals("Delete status", HttpStatusCodes.NO_CONTENT.getStatusCode(), status.getStatusCode());
+ LOG.info("Delete status: {}", status);
+ }
+
+ private Map<String, Object> getEntityData() {
+ final Map<String, Object> data = new HashMap<String, Object>();
+ data.put("Id", "123");
+ data.put("Name", "MyCarManufacturer");
+ data.put("Founded", new Date());
+ Map<String, Object> address = new HashMap<String, Object>();
+ address.put("Street", "Main");
+ address.put("ZipCode", "42421");
+ address.put("City", "Fairy City");
+ address.put("Country", "FarFarAway");
+ data.put("Address", address);
+ return data;
+ }
+
+ @Test
+ public void testBatch() throws Exception {
+ final List<Olingo2BatchRequest> batchParts = new ArrayList<Olingo2BatchRequest>();
+
+ // 1. Edm query
+ batchParts.add(Olingo2BatchQueryRequest.resourcePath(Olingo2AppImpl.METADATA).build());
+
+ // 2. feed query
+ batchParts.add(Olingo2BatchQueryRequest.resourcePath(MANUFACTURERS).build());
+
+ // 3. read
+ batchParts.add(Olingo2BatchQueryRequest.resourcePath(TEST_MANUFACTURER).build());
+
+ // 4. read with expand
+ final HashMap<String, String> queryParams = new HashMap<String, String>();
+ queryParams.put(SystemQueryOption.$expand.toString(), CARS);
+ batchParts.add(Olingo2BatchQueryRequest.resourcePath(TEST_MANUFACTURER).queryParams(queryParams).build());
+
+ // 5. create
+ final Map<String, Object> data = getEntityData();
+ batchParts.add(Olingo2BatchChangeRequest.resourcePath(MANUFACTURERS).
+ contentId(TEST_RESOURCE_CONTENT_ID).operation(Operation.CREATE).body(data).build());
+
+ // 6. update address in created entry
+ @SuppressWarnings("unchecked")
+ final Map<String, Object> updateData = new HashMap<String, Object>(data);
+ Map<String, Object> address = (Map<String, Object>) updateData.get(ADDRESS);
+ address.put("Street", "Main Street");
+ batchParts.add(
+ Olingo2BatchChangeRequest.resourcePath(TEST_RESOURCE_ADDRESS).operation(Operation.UPDATE).body(address).build());
+
+ // 7. update
+ updateData.put("Name", "MyCarManufacturer Renamed");
+ batchParts.add(Olingo2BatchChangeRequest.resourcePath(TEST_RESOURCE).operation(Operation.UPDATE)
+ .body(updateData).build());
+
+ // 8. delete
+ batchParts.add(Olingo2BatchChangeRequest.resourcePath(TEST_RESOURCE).operation(Operation.DELETE).build());
+
+ // 9. read to verify delete
+ batchParts.add(Olingo2BatchQueryRequest.resourcePath(TEST_CREATE_MANUFACTURER).build());
+
+ // execute batch request
+ final List<Olingo2BatchResponse> responseParts = requestBody("direct://BATCH", batchParts);
+ assertNotNull("Batch response", responseParts);
+ assertEquals("Batch responses expected", 9, responseParts.size());
+
+ final Edm edm = (Edm) responseParts.get(0).getBody();
+ assertNotNull(edm);
+ LOG.info("Edm entity sets: {}", edm.getEntitySets());
+
+ final ODataFeed feed = (ODataFeed) responseParts.get(1).getBody();
+ assertNotNull(feed);
+ LOG.info("Read feed: {}", feed.getEntries());
+
+ ODataEntry dataEntry = (ODataEntry) responseParts.get(2).getBody();
+ assertNotNull(dataEntry);
+ LOG.info("Read entry: {}", dataEntry.getProperties());
+
+ dataEntry = (ODataEntry) responseParts.get(3).getBody();
+ assertNotNull(dataEntry);
+ LOG.info("Read entry with $expand: {}", dataEntry.getProperties());
+
+ dataEntry = (ODataEntry) responseParts.get(4).getBody();
+ assertNotNull(dataEntry);
+ LOG.info("Created entry: {}", dataEntry.getProperties());
+
+ int statusCode = responseParts.get(5).getStatusCode();
+ assertEquals(HttpStatusCodes.NO_CONTENT.getStatusCode(), statusCode);
+ LOG.info("Update address status: {}", statusCode);
+
+ statusCode = responseParts.get(6).getStatusCode();
+ assertEquals(HttpStatusCodes.NO_CONTENT.getStatusCode(), statusCode);
+ LOG.info("Update entry status: {}", statusCode);
+
+ statusCode = responseParts.get(7).getStatusCode();
+ assertEquals(HttpStatusCodes.NO_CONTENT.getStatusCode(), statusCode);
+ LOG.info("Delete status: {}", statusCode);
+
+ assertEquals(HttpStatusCodes.NOT_FOUND.getStatusCode(), responseParts.get(8).getStatusCode());
+ final Exception exception = (Exception) responseParts.get(8).getBody();
+ assertNotNull(exception);
+ LOG.info("Read deleted entry exception: {}", exception);
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ public void configure() {
+ // test routes for read
+ from("direct://READSERVICEDOC")
+ .to("olingo2://read/");
+
+ from("direct://READFEED")
+ .to("olingo2://read/Manufacturers?$orderBy=Name%20asc");
+
+ from("direct://READENTRY")
+ .to("olingo2://read/DefaultContainer.Manufacturers");
+
+ // test route for create
+ from("direct://CREATE")
+ .to("olingo2://create/Manufacturers");
+
+ // test route for update
+ from("direct://UPDATE")
+ .to("olingo2://update/Manufacturers('123')");
+
+ // test route for delete
+ from("direct://DELETE")
+ .to("olingo2://delete/Manufacturers('123')");
+
+/*
+ // test route for merge
+ from("direct://MERGE")
+ .to("olingo2://merge");
+
+ // test route for patch
+ from("direct://PATCH")
+ .to("olingo2://patch");
+*/
+
+ // test route for batch
+ from("direct://BATCH")
+ .to("olingo2://batch");
+
+ }
+ };
+ }
+}