org.apache.olingo.fit.base.MediaEntityTestITCase.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.olingo.fit.base.MediaEntityTestITCase.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.base;

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

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.Calendar;
import java.util.Collection;
import java.util.UUID;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.olingo.client.api.ODataClient;
import org.apache.olingo.client.api.communication.request.cud.ODataEntityUpdateRequest;
import org.apache.olingo.client.api.communication.request.cud.UpdateType;
import org.apache.olingo.client.api.communication.request.retrieve.ODataEntityRequest;
import org.apache.olingo.client.api.communication.request.retrieve.ODataMediaRequest;
import org.apache.olingo.client.api.communication.request.streamed.MediaEntityCreateStreamManager;
import org.apache.olingo.client.api.communication.request.streamed.MediaEntityUpdateStreamManager;
import org.apache.olingo.client.api.communication.request.streamed.ODataMediaEntityCreateRequest;
import org.apache.olingo.client.api.communication.request.streamed.ODataMediaEntityUpdateRequest;
import org.apache.olingo.client.api.communication.response.ODataEntityUpdateResponse;
import org.apache.olingo.client.api.communication.response.ODataMediaEntityCreateResponse;
import org.apache.olingo.client.api.communication.response.ODataMediaEntityUpdateResponse;
import org.apache.olingo.client.api.communication.response.ODataRetrieveResponse;
import org.apache.olingo.client.api.domain.ClientEntity;
import org.apache.olingo.client.api.domain.ClientValuable;
import org.apache.olingo.client.api.uri.URIBuilder;
import org.apache.olingo.client.core.ODataClientFactory;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
import org.apache.olingo.commons.api.edm.FullQualifiedName;
import org.apache.olingo.commons.api.http.HttpHeader;
import org.apache.olingo.commons.api.format.ContentType;
import org.junit.Test;

public class MediaEntityTestITCase extends AbstractTestITCase {

    private void read(final ODataClient client, final ContentType contentType) throws IOException {
        final URIBuilder builder = client.newURIBuilder(testDemoServiceRootURL)
                .appendEntitySetSegment("Advertisements")
                .appendKeySegment(UUID.fromString("f89dee73-af9f-4cd4-b330-db93c25ff3c7"));
        final ODataEntityRequest<ClientEntity> entityReq = client.getRetrieveRequestFactory()
                .getEntityRequest(builder.build());
        entityReq.setFormat(contentType);

        final ClientEntity entity = entityReq.execute().getBody();
        assertNotNull(entity);
        assertTrue(entity.isMediaEntity());
        // cast to workaround JDK 6 bug, fixed in JDK 7
        assertEquals(EdmPrimitiveTypeKind.DateTimeOffset.getFullQualifiedName().toString(),
                ((ClientValuable) entity.getProperty("AirDate")).getValue().getTypeName());

        final ODataMediaRequest streamReq = client.getRetrieveRequestFactory()
                .getMediaRequest(entity.getMediaContentSource());
        final ODataRetrieveResponse<InputStream> streamRes = streamReq.execute();
        assertEquals(200, streamRes.getStatusCode());

        final byte[] actual = new byte[Integer.parseInt(streamRes.getHeader("Content-Length").iterator().next())];
        IOUtils.read(streamRes.getBody(), actual, 0, actual.length);
    }

    @Test
    public void readAsAtom() throws IOException {
        read(client, ContentType.APPLICATION_ATOM_XML);
    }

    @Test
    public void readAsJSON() throws IOException {
        read(ODataClientFactory.getEdmEnabledClient(testDemoServiceRootURL, ContentType.JSON), ContentType.JSON);
    }

    @Test
    public void readAsJSONFull() throws IOException {
        read(client, ContentType.JSON_FULL_METADATA);
    }

    private void create(final ContentType contentType) throws IOException {
        final String random = RandomStringUtils.random(110);
        final InputStream input = IOUtils.toInputStream(random);

        final URI uri = client.newURIBuilder(testDemoServiceRootURL).appendEntitySetSegment("Advertisements")
                .build();
        final ODataMediaEntityCreateRequest<ClientEntity> createReq = client.getCUDRequestFactory()
                .getMediaEntityCreateRequest(uri, input);
        final MediaEntityCreateStreamManager<ClientEntity> streamManager = createReq.payloadManager();

        final ODataMediaEntityCreateResponse<ClientEntity> createRes = streamManager.getResponse();
        assertEquals(201, createRes.getStatusCode());

        final Collection<String> location = createRes.getHeader(HttpHeader.LOCATION);
        assertNotNull(location);
        final URI createdLocation = URI.create(location.iterator().next());

        final ClientEntity changes = client.getObjectFactory()
                .newEntity(new FullQualifiedName("ODataDemo.Advertisement"));
        changes.getProperties()
                .add(client.getObjectFactory().newPrimitiveProperty("AirDate",
                        getClient().getObjectFactory().newPrimitiveValueBuilder()
                                .setType(EdmPrimitiveTypeKind.DateTimeOffset).setValue(Calendar.getInstance())
                                .build()));

        final ODataEntityUpdateRequest<ClientEntity> updateReq = getClient().getCUDRequestFactory()
                .getEntityUpdateRequest(createdLocation, UpdateType.PATCH, changes);
        updateReq.setFormat(contentType);

        final ODataEntityUpdateResponse<ClientEntity> updateRes = updateReq.execute();
        assertEquals(204, updateRes.getStatusCode());

        final ODataMediaRequest retrieveReq = client.getRetrieveRequestFactory()
                .getMediaEntityRequest(client.newURIBuilder(createdLocation.toASCIIString()).build());
        final ODataRetrieveResponse<InputStream> retrieveRes = retrieveReq.execute();
        assertEquals(200, retrieveRes.getStatusCode());

        final byte[] actual = new byte[Integer.parseInt(retrieveRes.getHeader("Content-Length").iterator().next())];
        IOUtils.read(retrieveRes.getBody(), actual, 0, actual.length);
        assertEquals(random, new String(actual));
    }

    @Test
    public void createAsAtom() throws IOException {
        create(ContentType.APPLICATION_ATOM_XML);
    }

    @Test
    public void createAsJSON() throws IOException {
        create(ContentType.JSON);
    }

    private void update(final ContentType contentType) throws IOException, EdmPrimitiveTypeException {
        final URI uri = client.newURIBuilder(testDemoServiceRootURL).appendEntitySetSegment("Advertisements")
                .appendKeySegment(UUID.fromString("f89dee73-af9f-4cd4-b330-db93c25ff3c7")).build();

        final String random = RandomStringUtils.random(124);

        // 1. update providing media content
        final ODataMediaEntityUpdateRequest<ClientEntity> updateReq = client.getCUDRequestFactory()
                .getMediaEntityUpdateRequest(uri, IOUtils.toInputStream(random));
        updateReq.setFormat(contentType);

        final MediaEntityUpdateStreamManager<ClientEntity> streamManager = updateReq.payloadManager();
        final ODataMediaEntityUpdateResponse<ClientEntity> createRes = streamManager.getResponse();
        assertEquals(204, createRes.getStatusCode());

        // 2. check that media content was effectively uploaded
        final ODataMediaRequest streamReq = client.getRetrieveRequestFactory().getMediaEntityRequest(uri);
        final ODataRetrieveResponse<InputStream> streamRes = streamReq.execute();
        assertEquals(200, streamRes.getStatusCode());

        final byte[] actual = new byte[Integer.parseInt(streamRes.getHeader("Content-Length").iterator().next())];
        IOUtils.read(streamRes.getBody(), actual, 0, actual.length);
        assertEquals(random, new String(actual));
    }

    @Test
    public void updateAsAtom() throws IOException, EdmPrimitiveTypeException {
        update(ContentType.APPLICATION_ATOM_XML);
    }

    @Test
    public void updateAsJSON() throws IOException, EdmPrimitiveTypeException {
        update(ContentType.JSON);
    }
}