org.infinispan.test.hibernate.cache.commons.timestamp.TimestampsRegionImplTest.java Source code

Java tutorial

Introduction

Here is the source code for org.infinispan.test.hibernate.cache.commons.timestamp.TimestampsRegionImplTest.java

Source

/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.infinispan.test.hibernate.cache.commons.timestamp;

import java.util.Properties;
import java.util.concurrent.CompletionStage;
import java.util.function.Function;

import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.infinispan.commons.test.categories.Smoke;
import org.infinispan.hibernate.cache.commons.InfinispanBaseRegion;

import org.infinispan.test.hibernate.cache.commons.AbstractGeneralDataRegionTest;
import org.infinispan.test.hibernate.cache.commons.util.TestRegionFactory;
import org.infinispan.test.hibernate.cache.commons.functional.entities.Account;
import org.infinispan.test.hibernate.cache.commons.functional.entities.AccountHolder;
import org.infinispan.test.hibernate.cache.commons.functional.classloader.SelectedClassnameClassLoader;
import org.infinispan.test.hibernate.cache.commons.util.CacheTestUtil;
import org.infinispan.test.hibernate.cache.commons.util.ClassLoaderAwareCache;

import org.infinispan.AdvancedCache;
import org.infinispan.context.Flag;
import org.infinispan.notifications.Listener;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryActivated;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryCreated;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryInvalidated;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryLoaded;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryModified;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryPassivated;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryRemoved;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryVisited;
import org.infinispan.notifications.cachelistener.event.Event;
import org.junit.Test;
import org.junit.experimental.categories.Category;

/**
 * Tests of TimestampsRegionImpl.
 *
 * @author Galder Zamarreo
 * @since 3.5
 */
@Category(Smoke.class)
public class TimestampsRegionImplTest extends AbstractGeneralDataRegionTest {

    @Override
    protected InfinispanBaseRegion createRegion(TestRegionFactory regionFactory, String regionName) {
        return regionFactory.buildTimestampsRegion(regionName);
    }

    @Test
    public void testClearTimestampsRegionInIsolated() throws Exception {
        StandardServiceRegistryBuilder ssrb = createStandardServiceRegistryBuilder();
        final StandardServiceRegistry registry = ssrb.build();
        final StandardServiceRegistry registry2 = ssrb.build();

        try {
            final Properties properties = CacheTestUtil.toProperties(ssrb.getSettings());

            TestRegionFactory regionFactory = CacheTestUtil.startRegionFactory(registry, getCacheTestSupport());

            TestRegionFactory regionFactory2 = CacheTestUtil.startRegionFactory(registry2, getCacheTestSupport());

            InfinispanBaseRegion region = regionFactory.buildTimestampsRegion(REGION_PREFIX + "/timestamps");
            InfinispanBaseRegion region2 = regionFactory2.buildTimestampsRegion(REGION_PREFIX + "/timestamps");

            Account acct = new Account();
            acct.setAccountHolder(new AccountHolder());
            region.getCache().withFlags(Flag.FORCE_SYNCHRONOUS).put(acct, "boo");
        } finally {
            StandardServiceRegistryBuilder.destroy(registry);
            StandardServiceRegistryBuilder.destroy(registry2);
        }
    }

    @Override
    protected StandardServiceRegistryBuilder createStandardServiceRegistryBuilder() {
        StandardServiceRegistryBuilder ssrb = super.createStandardServiceRegistryBuilder();
        ssrb.applySetting(TestRegionFactory.WRAP_CACHE,
                (Function<AdvancedCache, AdvancedCache>) cache -> new ClassLoaderAwareCache(cache,
                        Thread.currentThread().getContextClassLoader()) {
                    @Override
                    public void addListener(Object listener) {
                        super.addListener(new MockClassLoaderAwareListener(listener, this));
                    }

                    @Override
                    public CompletionStage<Void> addListenerAsync(Object listener) {
                        return super.addListenerAsync(new MockClassLoaderAwareListener(listener, this));
                    }
                });
        return ssrb;
    }

    @Listener
    public static class MockClassLoaderAwareListener extends ClassLoaderAwareCache.ClassLoaderAwareListener {
        MockClassLoaderAwareListener(Object listener, ClassLoaderAwareCache cache) {
            super(listener, cache);
        }

        @CacheEntryActivated
        @CacheEntryCreated
        @CacheEntryInvalidated
        @CacheEntryLoaded
        @CacheEntryModified
        @CacheEntryPassivated
        @CacheEntryRemoved
        @CacheEntryVisited
        public void event(Event event) throws Throwable {
            ClassLoader cl = Thread.currentThread().getContextClassLoader();
            String notFoundPackage = "org.infinispan.test.hibernate.cache.functional.entities";
            String[] notFoundClasses = { notFoundPackage + ".Account", notFoundPackage + ".AccountHolder" };
            SelectedClassnameClassLoader visible = new SelectedClassnameClassLoader(null, null, notFoundClasses,
                    cl);
            Thread.currentThread().setContextClassLoader(visible);
            super.event(event);
            Thread.currentThread().setContextClassLoader(cl);
        }
    }
}