org.apache.olingo.fit.tecsvc.http.BasicBoundActionsITCase.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.olingo.fit.tecsvc.http.BasicBoundActionsITCase.java

Source

/*
 * 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.tecsvc.http;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.commons.io.IOUtils;
import org.apache.olingo.client.api.ODataClient;
import org.apache.olingo.client.api.communication.request.invoke.ODataInvokeRequest;
import org.apache.olingo.client.api.domain.ClientCollectionValue;
import org.apache.olingo.client.api.domain.ClientComplexValue;
import org.apache.olingo.client.api.domain.ClientEntity;
import org.apache.olingo.client.api.domain.ClientPrimitiveValue;
import org.apache.olingo.client.api.domain.ClientProperty;
import org.apache.olingo.client.api.domain.ClientValue;
import org.apache.olingo.client.api.uri.URIBuilder;
import org.apache.olingo.client.core.ODataClientFactory;
import org.apache.olingo.commons.api.format.ContentType;
import org.apache.olingo.commons.api.http.HttpHeader;
import org.apache.olingo.commons.api.http.HttpMethod;
import org.apache.olingo.commons.api.http.HttpStatusCode;
import org.apache.olingo.fit.tecsvc.TecSvcConst;
import org.junit.Test;

public class BasicBoundActionsITCase {

    private static final String SERVICE_URI = TecSvcConst.BASE_URI + "/";;
    protected static final ODataClient client = ODataClientFactory.getClient();

    @Test
    public void boundActionReturningBaseType() throws Exception {
        URL url = new URL(SERVICE_URI + "ESTwoBaseTwoKeyNav(PropertyInt16=1,PropertyString='1')/"
                + "olingo.odata.test1.BAETTwoBaseTwoKeyNavRTETBaseTwoKeyNav");

        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod(HttpMethod.POST.name());
        connection.setRequestProperty(HttpHeader.ACCEPT, "application/json");
        connection.setRequestProperty(HttpHeader.CONTENT_TYPE, "application/json");
        connection.connect();

        assertEquals(HttpStatusCode.CREATED.getStatusCode(), connection.getResponseCode());

        final String content = IOUtils.toString(connection.getInputStream());
        final String expected = "\"PropertyInt16\":1,\"PropertyString\":\"1\","
                + "\"PropertyComp\":{\"PropertyInt16\":11,"
                + "\"PropertyComp\":{\"PropertyString\":\"StringValue\","
                + "\"PropertyBinary\":\"ASNFZ4mrze8=\",\"PropertyBoolean\":true,"
                + "\"PropertyByte\":255,\"PropertyDate\":\"2012-12-03\","
                + "\"PropertyDateTimeOffset\":null,\"PropertyDecimal\":34,"
                + "\"PropertySingle\":1.79E20,\"PropertyDouble\":-1.79E20,"
                + "\"PropertyDuration\":\"PT6S\",\"PropertyGuid\":\"01234567-89ab-cdef-0123-456789abcdef\","
                + "\"PropertyInt16\":32767,\"PropertyInt32\":2147483647,\"PropertyInt64\":9223372036854775807,"
                + "\"PropertySByte\":127,\"PropertyTimeOfDay\":\"21:05:59\"}},"
                + "\"PropertyCompNav\":{\"PropertyInt16\":1,\"PropertyComp\":"
                + "{\"PropertyString\":\"First Resource - positive values\","
                + "\"PropertyBinary\":\"ASNFZ4mrze8=\",\"PropertyBoolean\":true,"
                + "\"PropertyByte\":255,\"PropertyDate\":\"2012-12-03\","
                + "\"PropertyDateTimeOffset\":\"2012-12-03T07:16:23Z\","
                + "\"PropertyDecimal\":34,\"PropertySingle\":1.79E20,"
                + "\"PropertyDouble\":-1.79E20,\"PropertyDuration\":\"PT6S\","
                + "\"PropertyGuid\":\"01234567-89ab-cdef-0123-456789abcdef\","
                + "\"PropertyInt16\":32767,\"PropertyInt32\":2147483647,"
                + "\"PropertyInt64\":9223372036854775807,\"PropertySByte\":127,"
                + "\"PropertyTimeOfDay\":\"21:05:59\"}},\"CollPropertyComp\":[],"
                + "\"CollPropertyCompNav\":[{\"PropertyInt16\":1}],"
                + "\"CollPropertyString\":[\"1\",\"2\"],\"PropertyCompTwoPrim\":"
                + "{\"PropertyInt16\":11,\"PropertyString\":\"11\"},\"PropertyDate\":\"2013-12-12\"}";
        assertTrue(content.contains(expected));
    }

    @Test
    public void boundActionReturningEntityWithNavigationSegInAction() throws Exception {
        URL url = new URL(SERVICE_URI + "ESTwoKeyNav(PropertyInt16=1,PropertyString='1')/"
                + "NavPropertyETTwoKeyNavOne/olingo.odata.test1.BAETTwoKeyNavRTETTwoKeyNavParam");

        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod(HttpMethod.POST.name());
        connection.setRequestProperty(HttpHeader.ACCEPT, "application/json");
        connection.setRequestProperty(HttpHeader.CONTENT_TYPE, "application/json");
        connection.setDoOutput(true);
        final OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
        writer.append("{\"PropertyComp\" : {\"PropertyInt16\" : 30}}");
        writer.close();
        connection.connect();

        assertEquals(HttpStatusCode.OK.getStatusCode(), connection.getResponseCode());

        final String content = IOUtils.toString(connection.getInputStream());
        final String expected = "\"PropertyInt16\":1,\"PropertyString\":\"1\","
                + "\"PropertyComp\":{\"PropertyInt16\":30,\"PropertyComp\":"
                + "{\"PropertyString\":\"StringValue\",\"PropertyBinary\":\"ASNFZ4mrze8=\","
                + "\"PropertyBoolean\":true,\"PropertyByte\":255,\"PropertyDate\":\"2012-12-03\","
                + "\"PropertyDateTimeOffset\":null,\"PropertyDecimal\":34,\"PropertySingle\":1.79E20,"
                + "\"PropertyDouble\":-1.79E20,\"PropertyDuration\":\"PT6S\","
                + "\"PropertyGuid\":\"01234567-89ab-cdef-0123-456789abcdef\",\"PropertyInt16\":32767,"
                + "\"PropertyInt32\":2147483647,\"PropertyInt64\":9223372036854775807,"
                + "\"PropertySByte\":127,\"PropertyTimeOfDay\":\"21:05:59\"}},"
                + "\"PropertyCompNav\":{\"PropertyInt16\":1,\"PropertyComp\":"
                + "{\"PropertyString\":\"First Resource - positive values\","
                + "\"PropertyBinary\":\"ASNFZ4mrze8=\",\"PropertyBoolean\":true,"
                + "\"PropertyByte\":255,\"PropertyDate\":\"2012-12-03\","
                + "\"PropertyDateTimeOffset\":\"2012-12-03T07:16:23Z\","
                + "\"PropertyDecimal\":34,\"PropertySingle\":1.79E20,\"PropertyDouble\":-1.79E20,"
                + "\"PropertyDuration\":\"PT6S\",\"PropertyGuid\":"
                + "\"01234567-89ab-cdef-0123-456789abcdef\",\"PropertyInt16\":32767,"
                + "\"PropertyInt32\":2147483647,\"PropertyInt64\":9223372036854775807,"
                + "\"PropertySByte\":127,\"PropertyTimeOfDay\":\"21:05:59\"}},\"CollPropertyComp\":[],"
                + "\"CollPropertyCompNav\":[{\"PropertyInt16\":1}],\"CollPropertyString\":[\"1\",\"2\"],"
                + "\"PropertyCompTwoPrim\":{\"PropertyInt16\":11,\"PropertyString\":\"11\"}}";
        assertTrue(content.contains(expected));
    }

    @Test
    public void boundActionReturningDerivedTypeWithTypeCastSegInAction() throws Exception {
        URIBuilder builder = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESBase")
                .appendKeySegment(111).appendDerivedEntityTypeSegment("olingo.odata.test1.ETTwoBase")
                .appendActionCallSegment("olingo.odata.test1.BAETBaseETTwoBaseRTETTwoBase");
        Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
        final ClientPrimitiveValue propStrValue = client.getObjectFactory().newPrimitiveValueBuilder()
                .buildString("NewStrValue");
        parameters.put("PropertyString", propStrValue);

        final ClientPrimitiveValue addPropStr1 = client.getObjectFactory().newPrimitiveValueBuilder()
                .buildString("AddStrProp_5");
        parameters.put("AdditionalPropertyString_5", addPropStr1);

        final ClientPrimitiveValue addPropStr2 = client.getObjectFactory().newPrimitiveValueBuilder()
                .buildString("AddStrProp_6");
        parameters.put("AdditionalPropertyString_6", addPropStr2);

        final ODataInvokeRequest<ClientEntity> req = client.getInvokeRequestFactory()
                .getActionInvokeRequest(builder.build(), ClientEntity.class, parameters);
        req.setFormat(ContentType.JSON_FULL_METADATA);
        req.setContentType(ContentType.APPLICATION_JSON.toContentTypeString() + ";odata.metadata=full");
        ClientEntity entity = req.execute().getBody();
        assertNotNull(entity);
        assertEquals(entity.getProperties().size(), 4);
        assertEquals(entity.getTypeName().getFullQualifiedNameAsString(), "olingo.odata.test1.ETTwoBase");
    }

    @Test
    public void boundActionReturningColComplexTypeWithComplexTypeSegInAction() throws Exception {
        URIBuilder builder = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESMixPrimCollComp")
                .appendKeySegment(32767).appendPropertySegment("CollPropertyComp")
                .appendActionCallSegment("olingo.odata.test1.BAETMixPrimCollCompCTTWOPrimCompRTCollCTTwoPrim");
        final ClientComplexValue propertyComp = client.getObjectFactory()
                .newComplexValue("olingo.odata.test1.CTTwoPrim");
        propertyComp.add(client.getObjectFactory().newPrimitiveProperty("PropertyInt16",
                client.getObjectFactory().newPrimitiveValueBuilder().buildInt16((short) 111)));
        propertyComp.add(client.getObjectFactory().newPrimitiveProperty("PropertyString",
                client.getObjectFactory().newPrimitiveValueBuilder().buildString("ABC")));

        Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
        parameters.put("PropertyComp", propertyComp);

        final ODataInvokeRequest<ClientProperty> req = client.getInvokeRequestFactory()
                .getActionInvokeRequest(builder.build(), ClientProperty.class, parameters);
        req.setFormat(ContentType.JSON_FULL_METADATA);
        req.setContentType(ContentType.APPLICATION_JSON.toContentTypeString() + ";odata.metadata=full");
        ClientProperty prop = req.execute().getBody();
        assertNotNull(prop);
        assertNotNull(prop.getCollectionValue());
        assertEquals(prop.getCollectionValue().asCollection().size(), 1);
        assertEquals(prop.getCollectionValue().getTypeName(), "Collection(olingo.odata.test1.CTTwoPrim)");
    }

    @Test
    public void boundActionReturningComplexDerivedTypeWithComplexTypeSegInAction() throws Exception {
        Map<String, Object> segmentValues = new HashMap<String, Object>();
        segmentValues.put("PropertyInt16", 1);
        segmentValues.put("PropertyString", "1");
        URIBuilder builder = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESTwoKeyNav")
                .appendKeySegment(segmentValues).appendPropertySegment("PropertyCompNav")
                .appendDerivedEntityTypeSegment("olingo.odata.test1.CTTwoBasePrimCompNav")
                .appendActionCallSegment("olingo.odata.test1."
                        + "BAETTwoKeyNavCTBasePrimCompNavCTTwoBasePrimCompNavRTCTTwoBasePrimCompNav");

        Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();

        final ODataInvokeRequest<ClientEntity> req = client.getInvokeRequestFactory()
                .getActionInvokeRequest(builder.build(), ClientEntity.class, parameters);
        req.setFormat(ContentType.JSON_FULL_METADATA);
        req.setContentType(ContentType.APPLICATION_JSON.toContentTypeString() + ";odata.metadata=full");
        ClientEntity entity = req.execute().getBody();
        assertNotNull(entity);
        assertEquals(entity.getProperties().size(), 2);
        assertEquals(entity.getTypeName().getFullQualifiedNameAsString(),
                "olingo.odata.test1.CTTwoBasePrimCompNav");
    }

    @Test
    public void boundActionReturningCollComplexTypeWithMixedTypes() throws Exception {
        URIBuilder builder = client.newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESMixPrimCollComp")
                .appendKeySegment(32767)
                .appendActionCallSegment("olingo.odata.test1.BAETMixPrimCollCompRTCTTwoPrim");

        final ClientCollectionValue<ClientValue> colPropertyComp = client.getObjectFactory()
                .newCollectionValue("Collection(olingo.odata.test1.CTTwoPrim)");

        final ClientComplexValue property1 = client.getObjectFactory()
                .newComplexValue("olingo.odata.test1.CTTwoPrim");
        property1.add(client.getObjectFactory().newPrimitiveProperty("PropertyInt16",
                client.getObjectFactory().newPrimitiveValueBuilder().buildInt16((short) 111)));
        property1.add(client.getObjectFactory().newPrimitiveProperty("PropertyString",
                client.getObjectFactory().newPrimitiveValueBuilder().buildString("ABC")));
        colPropertyComp.add(property1);

        final ClientComplexValue property2 = client.getObjectFactory()
                .newComplexValue("olingo.odata.test1.CTTwoPrim");
        property2.add(client.getObjectFactory().newPrimitiveProperty("PropertyInt16",
                client.getObjectFactory().newPrimitiveValueBuilder().buildInt16((short) 222)));
        property2.add(client.getObjectFactory().newPrimitiveProperty("PropertyString",
                client.getObjectFactory().newPrimitiveValueBuilder().buildString("DEF")));
        colPropertyComp.add(property2);

        final ClientComplexValue property3 = client.getObjectFactory().newComplexValue("olingo.odata.test1.CTBase");
        property3.add(client.getObjectFactory().newPrimitiveProperty("PropertyInt16",
                client.getObjectFactory().newPrimitiveValueBuilder().buildInt16((short) 333)));
        property3.add(client.getObjectFactory().newPrimitiveProperty("PropertyString",
                client.getObjectFactory().newPrimitiveValueBuilder().buildString("GHI")));
        colPropertyComp.add(property3);

        Map<String, ClientValue> parameters = new HashMap<String, ClientValue>();
        parameters.put("CollPropertyComp", colPropertyComp);

        final ODataInvokeRequest<ClientProperty> req = client.getInvokeRequestFactory()
                .getActionInvokeRequest(builder.build(), ClientProperty.class, parameters);
        req.setFormat(ContentType.JSON_FULL_METADATA);
        req.setContentType(ContentType.APPLICATION_JSON.toContentTypeString() + ";odata.metadata=full");
        ClientProperty prop = req.execute().getBody();
        assertNotNull(prop);
        assertEquals(prop.getCollectionValue().getTypeName(), "Collection(olingo.odata.test1.CTTwoPrim)");
        assertEquals(prop.getCollectionValue().asCollection().size(), 3);
        Iterator<ClientValue> itr = prop.getCollectionValue().asCollection().iterator();
        int i = 0;
        while (itr.hasNext()) {
            ClientValue value = itr.next();
            if (i == 2) {
                assertEquals(value.asComplex().getTypeName(), "#olingo.odata.test1.CTBase");
            } else {
                assertEquals(value.asComplex().getTypeName(), "#olingo.odata.test1.CTTwoPrim");
            }
            i++;
        }
    }
}