org.apache.olingo.fit.proxy.ChangeDetectionTestITCase.java Source code

Java tutorial

Introduction

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

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.lang.reflect.Proxy;
import java.sql.Timestamp;
import java.util.Calendar;

import org.apache.commons.lang3.RandomUtils;
import org.apache.olingo.ext.proxy.api.ComplexType;
import org.apache.olingo.ext.proxy.api.EntityCollection;
import org.apache.olingo.ext.proxy.api.EntityType;
import org.apache.olingo.ext.proxy.commons.ComplexInvocationHandler;
import org.apache.olingo.ext.proxy.commons.EntityCollectionInvocationHandler;
import org.apache.olingo.ext.proxy.commons.EntityInvocationHandler;
// CHECKSTYLE:OFF (Maven checkstyle)
import org.apache.olingo.fit.proxy.staticservice.microsoft.test.odata.services.odatawcfservice.InMemoryEntities;
import org.apache.olingo.fit.proxy.staticservice.microsoft.test.odata.services.odatawcfservice.types.Account;
import org.apache.olingo.fit.proxy.staticservice.microsoft.test.odata.services.odatawcfservice.types.Address;
import org.apache.olingo.fit.proxy.staticservice.microsoft.test.odata.services.odatawcfservice.types.Customer;
import org.apache.olingo.fit.proxy.staticservice.microsoft.test.odata.services.odatawcfservice.types.Order;
import org.apache.olingo.fit.proxy.staticservice.microsoft.test.odata.services.odatawcfservice.types.OrderCollection;
import org.apache.olingo.fit.proxy.staticservice.microsoft.test.odata.services.odatawcfservice.types.PaymentInstrument;
import org.apache.olingo.fit.proxy.staticservice.microsoft.test.odata.services.odatawcfservice.types.PaymentInstrumentCollection;
// CHECKSTYLE:ON (Maven checkstyle)
import org.junit.Test;

public class ChangeDetectionTestITCase extends AbstractTestITCase {

    @Test
    public void entityUnchangedOnGetProperty() {
        final Customer customer = getContainer().getCustomers().getByKey(1).load();
        assertFalse(isChanged(customer));

        customer.getLastName();

        assertFalse(isChanged(customer));
    }

    @Test
    public void entityChangedOnSetProperty() {
        final Customer customer = getContainer().getCustomers().getByKey(1).load();
        assertFalse(isChanged(customer));

        customer.setLastName("Test");

        assertTrue(isChanged(customer));

        getContainer().flush();
        assertFalse(isChanged(customer));
    }

    @Test
    public void entityUnchangedOnGetComplexProperty() {
        final Customer customer = getContainer().getCustomers().getByKey(1).load();
        assertFalse(isChanged(customer));

        final Address homeAddress = customer.getHomeAddress();
        assertFalse(isChanged(customer));

        homeAddress.getCity();
        assertFalse(isChanged(homeAddress));
        assertFalse(isChanged(customer));
    }

    @Test
    public void entityChangedOnSetComplexProperty() {
        final Customer customer = getContainer().getCustomers().getByKey(2).load();
        assertFalse(isChanged(customer));

        final Address newAdress = getContainer().newComplexInstance(Address.class);
        customer.setHomeAddress(newAdress);

        assertTrue(isChanged(customer));

        getContainer().flush();
        assertFalse(isChanged(customer));
    }

    @Test
    public void entityChangedOnSetPropertyOfComplexProperty() {
        final Customer customer = getContainer().getCustomers().getByKey(1).load();
        assertFalse(isChanged(customer));

        final Address homeAddress = customer.getHomeAddress();
        homeAddress.setCity("Test");

        assertTrue(isChanged(customer));

        getContainer().flush();
        assertFalse(isChanged(customer));
    }

    @Test
    public void entityUnchangedOnGetNavigationProperty() {
        final Customer customer = getContainer().getCustomers().getByKey(1).load();
        assertFalse(isChanged(customer));

        customer.getOrders();

        assertFalse(isChanged(customer));
    }

    @Test
    public void entityChangedOnAddNavigationProperty() {
        final Account account = getContainer().getAccounts().getByKey(101).load();
        assertFalse(isChanged(account));

        final PaymentInstrumentCollection instruments = account.getMyPaymentInstruments().execute();
        assertFalse(isChanged(account));

        final PaymentInstrument instrument = getContainer().newEntityInstance(PaymentInstrument.class);
        final int id = RandomUtils.nextInt(101999, 105000);
        instrument.setPaymentInstrumentID(id);
        instrument.setFriendlyName("New one");
        instrument.setCreatedDate(new Timestamp(Calendar.getInstance().getTimeInMillis()));
        instruments.add(instrument);

        assertTrue(isChanged(instrument));
        assertFalse(isChanged(account));

        getContainer().flush();
        assertFalse(isChanged(instrument));
    }

    @Test
    public void entityCollectionUnchangedOnGet() {
        final Customer customer = getContainer().getCustomers().getByKey(1).load();
        assertFalse(isChanged(customer));

        final OrderCollection orders = customer.getOrders().execute();
        assertFalse(isChanged(customer));

        for (Order order : orders) {
            assertFalse(isChanged(order));
            order.getOrderDate();
            assertFalse(isChanged(order));
        }

        assertFalse(isChanged(customer));
    }

    protected InMemoryEntities getContainer() {
        return container;
    }

    protected boolean isChanged(final EntityType<?> entity) {
        EntityInvocationHandler invocationHandler = getInvocationHandler(entity);
        return invocationHandler.isChanged();
    }

    protected boolean isChanged(final ComplexType<?> complex) {
        ComplexInvocationHandler invocationHandler = getInvocationHandler(complex);
        return invocationHandler.isChanged();
    }

    protected EntityInvocationHandler getInvocationHandler(final EntityType<?> entity) {
        return (EntityInvocationHandler) Proxy.getInvocationHandler(entity);
    }

    protected ComplexInvocationHandler getInvocationHandler(final ComplexType<?> complex) {
        return (ComplexInvocationHandler) Proxy.getInvocationHandler(complex);
    }

    protected EntityCollectionInvocationHandler<?> getInvocationHandler(final EntityCollection<?, ?, ?> complex) {
        return (EntityCollectionInvocationHandler<?>) Proxy.getInvocationHandler(complex);
    }
}