@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.ee.infinispan;
package org.wildfly.clustering.ee.cache.tx;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@@ -40,20 +40,20 @@
* Unit test for {@link InfinispanBatcher}.
* @author Paul Ferraro
*/
public class InfinispanBatcherTestCase {
public class TransactionalBatcherTestCase {
private final TransactionManager tm = mock(TransactionManager.class);
private final Batcher<TransactionBatch> batcher = new InfinispanBatcher(this.tm);
private final Batcher<TransactionBatch> batcher = new TransactionalBatcher<>(this.tm, RuntimeException::new);

@After
public void destroy() {
InfinispanBatcher.setCurrentBatch(null);
TransactionalBatcher.setCurrentBatch(null);
}

@Test
public void createExistingActiveBatch() throws Exception {
TransactionBatch existingBatch = mock(TransactionBatch.class);

InfinispanBatcher.setCurrentBatch(existingBatch);
TransactionalBatcher.setCurrentBatch(existingBatch);
when(existingBatch.getState()).thenReturn(Batch.State.ACTIVE);
when(existingBatch.interpose()).thenReturn(existingBatch);

@@ -71,7 +71,7 @@ public void createExistingClosedBatch() throws Exception {
Transaction tx = mock(Transaction.class);
ArgumentCaptor<Synchronization> capturedSync = ArgumentCaptor.forClass(Synchronization.class);

InfinispanBatcher.setCurrentBatch(existingBatch);
TransactionalBatcher.setCurrentBatch(existingBatch);
when(existingBatch.getState()).thenReturn(Batch.State.CLOSED);

when(this.tm.getTransaction()).thenReturn(tx);
@@ -81,14 +81,14 @@ public void createExistingClosedBatch() throws Exception {
verify(tx).registerSynchronization(capturedSync.capture());

assertSame(tx, batch.getTransaction());
assertSame(batch, InfinispanBatcher.getCurrentBatch());
assertSame(batch, TransactionalBatcher.getCurrentBatch());
} finally {
capturedSync.getValue().afterCompletion(Status.STATUS_COMMITTED);
}

verify(tx).commit();

assertNull(InfinispanBatcher.getCurrentBatch());
assertNull(TransactionalBatcher.getCurrentBatch());
}


@@ -110,7 +110,7 @@ public void createBatchClose() throws Exception {

verify(tx).commit();

assertNull(InfinispanBatcher.getCurrentBatch());
assertNull(TransactionalBatcher.getCurrentBatch());
}

@Test
@@ -134,7 +134,7 @@ public void createBatchDiscard() throws Exception {
verify(tx, never()).commit();
verify(tx).rollback();

assertNull(InfinispanBatcher.getCurrentBatch());
assertNull(TransactionalBatcher.getCurrentBatch());
}

@Test
@@ -167,7 +167,7 @@ public void createNestedBatchClose() throws Exception {
verify(tx, never()).rollback();
verify(tx).commit();

assertNull(InfinispanBatcher.getCurrentBatch());
assertNull(TransactionalBatcher.getCurrentBatch());
}

@Test
@@ -202,7 +202,7 @@ public void createNestedBatchDiscard() throws Exception {
verify(tx).rollback();
verify(tx, never()).commit();

assertNull(InfinispanBatcher.getCurrentBatch());
assertNull(TransactionalBatcher.getCurrentBatch());
}

@SuppressWarnings("resource")
@@ -240,7 +240,7 @@ public void createOverlappingBatchClose() throws Exception {
verify(tx, never()).rollback();
verify(tx).commit();

assertNull(InfinispanBatcher.getCurrentBatch());
assertNull(TransactionalBatcher.getCurrentBatch());
}

@SuppressWarnings("resource")
@@ -280,34 +280,34 @@ public void createOverlappingBatchDiscard() throws Exception {
verify(tx).rollback();
verify(tx, never()).commit();

assertNull(InfinispanBatcher.getCurrentBatch());
assertNull(TransactionalBatcher.getCurrentBatch());
}

@Test
public void resumeNullBatch() throws Exception {
TransactionBatch batch = mock(TransactionBatch.class);
InfinispanBatcher.setCurrentBatch(batch);
TransactionalBatcher.setCurrentBatch(batch);

try (BatchContext context = this.batcher.resumeBatch(null)) {
verifyZeroInteractions(this.tm);
assertNull(InfinispanBatcher.getCurrentBatch());
assertNull(TransactionalBatcher.getCurrentBatch());
}
verifyZeroInteractions(this.tm);
assertSame(batch, InfinispanBatcher.getCurrentBatch());
assertSame(batch, TransactionalBatcher.getCurrentBatch());
}

@Test
public void resumeNonTxBatch() throws Exception {
TransactionBatch existingBatch = mock(TransactionBatch.class);
InfinispanBatcher.setCurrentBatch(existingBatch);
TransactionalBatcher.setCurrentBatch(existingBatch);
TransactionBatch batch = mock(TransactionBatch.class);

try (BatchContext context = this.batcher.resumeBatch(batch)) {
verifyZeroInteractions(this.tm);
assertSame(batch, InfinispanBatcher.getCurrentBatch());
assertSame(batch, TransactionalBatcher.getCurrentBatch());
}
verifyZeroInteractions(this.tm);
assertSame(existingBatch, InfinispanBatcher.getCurrentBatch());
assertSame(existingBatch, TransactionalBatcher.getCurrentBatch());
}

@Test
@@ -322,20 +322,20 @@ public void resumeBatch() throws Exception {
verify(this.tm).resume(tx);
reset(this.tm);

assertSame(batch, InfinispanBatcher.getCurrentBatch());
assertSame(batch, TransactionalBatcher.getCurrentBatch());
}

verify(this.tm).suspend();
verify(this.tm, never()).resume(any());

assertNull(InfinispanBatcher.getCurrentBatch());
assertNull(TransactionalBatcher.getCurrentBatch());
}

@Test
public void resumeBatchExisting() throws Exception {
TransactionBatch existingBatch = mock(TransactionBatch.class);
Transaction existingTx = mock(Transaction.class);
InfinispanBatcher.setCurrentBatch(existingBatch);
TransactionalBatcher.setCurrentBatch(existingBatch);
TransactionBatch batch = mock(TransactionBatch.class);
Transaction tx = mock(Transaction.class);

@@ -347,27 +347,27 @@ public void resumeBatchExisting() throws Exception {
verify(this.tm).resume(tx);
reset(this.tm);

assertSame(batch, InfinispanBatcher.getCurrentBatch());
assertSame(batch, TransactionalBatcher.getCurrentBatch());

when(this.tm.suspend()).thenReturn(tx);
}

verify(this.tm).resume(existingTx);

assertSame(existingBatch, InfinispanBatcher.getCurrentBatch());
assertSame(existingBatch, TransactionalBatcher.getCurrentBatch());
}

@Test
public void suspendBatch() throws Exception {
TransactionBatch batch = mock(TransactionBatch.class);
InfinispanBatcher.setCurrentBatch(batch);
TransactionalBatcher.setCurrentBatch(batch);

TransactionBatch result = this.batcher.suspendBatch();

verify(this.tm).suspend();

assertSame(batch, result);
assertNull(InfinispanBatcher.getCurrentBatch());
assertNull(TransactionalBatcher.getCurrentBatch());
}

@Test
@@ -44,7 +44,7 @@
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-ee-spi</artifactId>
<artifactId>wildfly-clustering-ee-cache</artifactId>
</dependency>
<dependency>
<groupId>org.infinispan</groupId>
@@ -25,6 +25,7 @@
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.transaction.LockingMode;
import org.infinispan.util.concurrent.IsolationLevel;
import org.wildfly.clustering.ee.cache.CacheProperties;

/**
* Eagerly calculates the properties of a cache configuration.

This file was deleted.

@@ -33,7 +33,7 @@
* Retrying invoker whose retry intervals are auto-generated based an Infinispan cache configuration.
* @author Paul Ferraro
*/
public class RetryingInvoker extends org.wildfly.clustering.ee.retry.RetryingInvoker {
public class RetryingInvoker extends org.wildfly.clustering.ee.cache.retry.RetryingInvoker {

public RetryingInvoker(Cache<?, ?> cache) {
super(calculateRetryIntervals(cache.getCacheConfiguration()));
@@ -0,0 +1,37 @@
/*
* JBoss, Home of Professional Open Source.
* Copyright 2018, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.ee.infinispan.tx;

import org.infinispan.Cache;
import org.infinispan.commons.CacheException;
import org.wildfly.clustering.ee.cache.tx.TransactionalBatcher;

/**
* @author Paul Ferraro
*/
public class InfinispanBatcher extends TransactionalBatcher<CacheException> {

public InfinispanBatcher(Cache<?, ?> cache) {
super(cache.getAdvancedCache().getTransactionManager(), CacheException::new);
}
}
@@ -32,6 +32,7 @@
import org.infinispan.util.concurrent.IsolationLevel;
import org.junit.Assert;
import org.junit.Test;
import org.wildfly.clustering.ee.cache.CacheProperties;

/**
* @author Paul Ferraro
@@ -43,6 +43,7 @@

<modules>
<module>spi</module>
<module>cache</module>
<module>infinispan</module>
</modules>

@@ -46,10 +46,6 @@
<groupId>net.jcip</groupId>
<artifactId>jcip-annotations</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.common</groupId>
<artifactId>wildfly-common</artifactId>
@@ -76,7 +76,7 @@
*
* @author Paul Ferraro
*/
public class ImmutabilityTestCase {
public class DefaultImmutabilityTestCase {

@Test
public void test() throws Exception {
@@ -30,7 +30,7 @@

import org.wildfly.clustering.ee.Batch;
import org.wildfly.clustering.ee.Batcher;
import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.ee.cache.tx.TransactionBatch;
import org.wildfly.clustering.ejb.infinispan.logging.InfinispanEjbLogger;
import org.wildfly.clustering.infinispan.spi.distribution.Locality;

@@ -58,10 +58,10 @@
import org.wildfly.clustering.dispatcher.CommandDispatcherFactory;
import org.wildfly.clustering.ee.Batcher;
import org.wildfly.clustering.ee.Invoker;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.ee.infinispan.InfinispanBatcher;
import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.ee.retry.RetryingInvoker;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.ee.cache.retry.RetryingInvoker;
import org.wildfly.clustering.ee.cache.tx.TransactionBatch;
import org.wildfly.clustering.ee.infinispan.tx.InfinispanBatcher;
import org.wildfly.clustering.ejb.Bean;
import org.wildfly.clustering.ejb.BeanManager;
import org.wildfly.clustering.ejb.IdentifierFactory;
@@ -26,7 +26,7 @@

import org.infinispan.remoting.transport.Address;
import org.wildfly.clustering.dispatcher.CommandDispatcherFactory;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.infinispan.spi.affinity.KeyAffinityServiceFactory;
import org.wildfly.clustering.registry.Registry;
import org.wildfly.clustering.spi.NodeFactory;
@@ -29,14 +29,14 @@
import org.infinispan.Cache;
import org.infinispan.remoting.transport.Address;
import org.wildfly.clustering.dispatcher.CommandDispatcherFactory;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.ee.cache.tx.TransactionBatch;
import org.wildfly.clustering.ee.infinispan.InfinispanCacheProperties;
import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.ejb.BeanManager;
import org.wildfly.clustering.ejb.BeanManagerFactory;
import org.wildfly.clustering.ejb.BeanPassivationConfiguration;
import org.wildfly.clustering.ejb.PassivationListener;
import org.wildfly.clustering.ejb.IdentifierFactory;
import org.wildfly.clustering.ejb.PassivationListener;
import org.wildfly.clustering.ejb.RemoveListener;
import org.wildfly.clustering.ejb.infinispan.bean.InfinispanBeanFactory;
import org.wildfly.clustering.ejb.infinispan.group.InfinispanBeanGroupFactory;
@@ -35,7 +35,7 @@
import org.jboss.msc.service.ServiceName;
import org.jboss.msc.service.ServiceTarget;
import org.wildfly.clustering.dispatcher.CommandDispatcherFactory;
import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.ee.cache.tx.TransactionBatch;
import org.wildfly.clustering.ejb.BeanContext;
import org.wildfly.clustering.ejb.BeanManagerFactory;
import org.wildfly.clustering.ejb.BeanManagerFactoryServiceConfiguratorConfiguration;
@@ -26,8 +26,8 @@
import org.infinispan.Cache;
import org.infinispan.context.Flag;
import org.wildfly.clustering.ee.Mutator;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.ee.infinispan.CacheEntryMutator;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.ejb.Bean;
import org.wildfly.clustering.ejb.PassivationListener;
import org.wildfly.clustering.ejb.RemoveListener;
@@ -38,8 +38,8 @@
import org.infinispan.notifications.cachelistener.event.CacheEntryActivatedEvent;
import org.infinispan.notifications.cachelistener.event.CacheEntryPassivatedEvent;
import org.wildfly.clustering.ee.Mutator;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.ee.infinispan.CacheEntryMutator;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.ejb.PassivationListener;
import org.wildfly.clustering.ejb.infinispan.BeanEntry;
import org.wildfly.clustering.ejb.infinispan.BeanGroup;
@@ -31,7 +31,7 @@

import org.junit.Test;
import org.wildfly.clustering.ee.Batcher;
import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.ee.cache.tx.TransactionBatch;
import org.wildfly.clustering.ejb.RemoveListener;

public class BeanExpirationSchedulerTestCase {
@@ -59,4 +59,4 @@ public String getName() {
public UnaryServiceNameFactory getServiceNameFactory() {
return this.factory;
}
}
}
@@ -42,10 +42,6 @@
<name>WildFly: Infinispan SPI</name>

<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-api</artifactId>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-common</artifactId>
@@ -56,7 +56,7 @@
import org.wildfly.clustering.ee.Batch;
import org.wildfly.clustering.ee.Batcher;
import org.wildfly.clustering.ee.Invoker;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.ee.infinispan.InfinispanCacheProperties;
import org.wildfly.clustering.ee.infinispan.retry.RetryingInvoker;
import org.wildfly.clustering.group.GroupListener;
@@ -39,7 +39,7 @@
import org.wildfly.clustering.dispatcher.CommandDispatcherFactory;
import org.wildfly.clustering.ee.Batch;
import org.wildfly.clustering.ee.Batcher;
import org.wildfly.clustering.ee.infinispan.InfinispanBatcher;
import org.wildfly.clustering.ee.infinispan.tx.InfinispanBatcher;
import org.wildfly.clustering.infinispan.spi.InfinispanCacheRequirement;
import org.wildfly.clustering.provider.ServiceProviderRegistry;
import org.wildfly.clustering.server.group.Group;
@@ -30,7 +30,7 @@
import org.jboss.msc.service.ServiceName;
import org.wildfly.clustering.ee.Batch;
import org.wildfly.clustering.ee.Batcher;
import org.wildfly.clustering.ee.infinispan.InfinispanBatcher;
import org.wildfly.clustering.ee.infinispan.tx.InfinispanBatcher;
import org.wildfly.clustering.infinispan.spi.InfinispanCacheRequirement;
import org.wildfly.clustering.registry.Registry;
import org.wildfly.clustering.registry.RegistryFactory;
@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ JBoss, Home of Professional Open Source.
~ Copyright 2010, Red Hat, Inc., and individual contributors
~ as indicated by the @author tags. See the copyright.txt file in the
~ distribution for a full listing of individual contributors.
~
~ This is free software; you can redistribute it and/or modify it
~ under the terms of the GNU Lesser General Public License as
~ published by the Free Software Foundation; either version 2.1 of
~ the License, or (at your option) any later version.
~
~ This software is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
~ Lesser General Public License for more details.
~
~ You should have received a copy of the GNU Lesser General Public
~ License along with this software; if not, write to the Free
~ Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-->

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>org.wildfly</groupId>
<artifactId>wildfly-clustering-web</artifactId>
<!--
Maintain separation between the artifact id and the version to help prevent
merge conflicts between commits changing the GA and those changing the V.
-->
<version>17.0.0.Beta1-SNAPSHOT</version>
</parent>

<artifactId>wildfly-clustering-web-cache</artifactId>
<packaging>jar</packaging>

<name>WildFly: Common abstractions for cache-based session manager implementations.</name>

<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-ee-cache</artifactId>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-web-spi</artifactId>
</dependency>
<dependency>
<groupId>org.kohsuke.metainf-services</groupId>
<artifactId>metainf-services</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-marshalling-api</artifactId>
<version>${project.version}</version>
<scope>test</scope>
<classifier>tests</classifier>
</dependency>
</dependencies>

</project>
@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan;
package org.wildfly.clustering.web.cache;

import java.io.DataInput;
import java.io.DataOutput;
@@ -20,15 +20,15 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.time.Duration;
import java.time.Instant;

import org.wildfly.clustering.web.session.ImmutableSessionMetaData;

/**
* Implements just the function methods of {@link ImmutableSessionMetaData}.
* Implements just the functional methods of {@link ImmutableSessionMetaData}.
* @author Paul Ferraro
*/
public abstract class AbstractImmutableSessionMetaData implements ImmutableSessionMetaData {
@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import org.wildfly.clustering.web.session.ImmutableSession;
import org.wildfly.clustering.web.session.ImmutableSessionAttributes;
@@ -29,13 +29,13 @@
* Generic immutable session implementation - independent of cache mapping strategy.
* @author Paul Ferraro
*/
public class InfinispanImmutableSession implements ImmutableSession {
public class CompositeImmutableSession implements ImmutableSession {

private final String id;
private final ImmutableSessionMetaData metaData;
private final ImmutableSessionAttributes attributes;

public InfinispanImmutableSession(String id, ImmutableSessionMetaData metaData, ImmutableSessionAttributes attributes) {
public CompositeImmutableSession(String id, ImmutableSessionMetaData metaData, ImmutableSessionAttributes attributes) {
this.id = id;
this.metaData = metaData;
this.attributes = attributes;
@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.time.Instant;
import java.util.concurrent.atomic.AtomicReference;
@@ -33,15 +33,15 @@
* Generic session implementation - independent of cache mapping strategy.
* @author Paul Ferraro
*/
public class InfinispanSession<L> extends InfinispanImmutableSession implements Session<L> {
public class CompositeSession<L> extends CompositeImmutableSession implements Session<L> {

private final InvalidatableSessionMetaData metaData;
private final SessionAttributes attributes;
private final AtomicReference<L> localContext;
private final LocalContextFactory<L> localContextFactory;
private final Remover<String> remover;

public InfinispanSession(String id, InvalidatableSessionMetaData metaData, SessionAttributes attributes, AtomicReference<L> localContext, LocalContextFactory<L> localContextFactory, Remover<String> remover) {
public CompositeSession(String id, InvalidatableSessionMetaData metaData, SessionAttributes attributes, AtomicReference<L> localContext, LocalContextFactory<L> localContextFactory, Remover<String> remover) {
super(id, metaData, attributes);
this.metaData = metaData;
this.attributes = attributes;
@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.Map;
@@ -34,29 +34,29 @@
/**
* @author Paul Ferraro
*/
public class InfinispanSessionFactory<V, L> implements SessionFactory<InfinispanSessionMetaData<L>, V, L> {
public class CompositeSessionFactory<V, L> implements SessionFactory<CompositeSessionMetaDataEntry<L>, V, L> {

private final SessionMetaDataFactory<InfinispanSessionMetaData<L>, L> metaDataFactory;
private final SessionMetaDataFactory<CompositeSessionMetaDataEntry<L>, L> metaDataFactory;
private final SessionAttributesFactory<V> attributesFactory;
private final LocalContextFactory<L> localContextFactory;

public InfinispanSessionFactory(SessionMetaDataFactory<InfinispanSessionMetaData<L>, L> metaDataFactory, SessionAttributesFactory<V> attributesFactory, LocalContextFactory<L> localContextFactory) {
public CompositeSessionFactory(SessionMetaDataFactory<CompositeSessionMetaDataEntry<L>, L> metaDataFactory, SessionAttributesFactory<V> attributesFactory, LocalContextFactory<L> localContextFactory) {
this.metaDataFactory = metaDataFactory;
this.attributesFactory = attributesFactory;
this.localContextFactory = localContextFactory;
}

@Override
public Map.Entry<InfinispanSessionMetaData<L>, V> createValue(String id, Void context) {
InfinispanSessionMetaData<L> metaDataValue = this.metaDataFactory.createValue(id, context);
public Map.Entry<CompositeSessionMetaDataEntry<L>, V> createValue(String id, Void context) {
CompositeSessionMetaDataEntry<L> metaDataValue = this.metaDataFactory.createValue(id, context);
if (metaDataValue == null) return null;
V attributesValue = this.attributesFactory.createValue(id, context);
return new SimpleImmutableEntry<>(metaDataValue, attributesValue);
}

@Override
public Map.Entry<InfinispanSessionMetaData<L>, V> findValue(String id) {
InfinispanSessionMetaData<L> metaDataValue = this.metaDataFactory.findValue(id);
public Map.Entry<CompositeSessionMetaDataEntry<L>, V> findValue(String id) {
CompositeSessionMetaDataEntry<L> metaDataValue = this.metaDataFactory.findValue(id);
if (metaDataValue != null) {
V attributesValue = this.attributesFactory.findValue(id);
if (attributesValue != null) {
@@ -69,8 +69,8 @@ public InfinispanSessionFactory(SessionMetaDataFactory<InfinispanSessionMetaData
}

@Override
public Map.Entry<InfinispanSessionMetaData<L>, V> tryValue(String id) {
InfinispanSessionMetaData<L> metaDataValue = this.metaDataFactory.tryValue(id);
public Map.Entry<CompositeSessionMetaDataEntry<L>, V> tryValue(String id) {
CompositeSessionMetaDataEntry<L> metaDataValue = this.metaDataFactory.tryValue(id);
if (metaDataValue != null) {
V attributesValue = this.attributesFactory.tryValue(id);
if (attributesValue != null) {
@@ -92,7 +92,7 @@ public boolean remove(String id) {
}

@Override
public SessionMetaDataFactory<InfinispanSessionMetaData<L>, L> getMetaDataFactory() {
public SessionMetaDataFactory<CompositeSessionMetaDataEntry<L>, L> getMetaDataFactory() {
return this.metaDataFactory;
}

@@ -102,15 +102,15 @@ public boolean remove(String id) {
}

@Override
public Session<L> createSession(String id, Map.Entry<InfinispanSessionMetaData<L>, V> entry) {
InfinispanSessionMetaData<L> key = entry.getKey();
public Session<L> createSession(String id, Map.Entry<CompositeSessionMetaDataEntry<L>, V> entry) {
CompositeSessionMetaDataEntry<L> key = entry.getKey();
InvalidatableSessionMetaData metaData = this.metaDataFactory.createSessionMetaData(id, key);
SessionAttributes attributes = this.attributesFactory.createSessionAttributes(id, entry.getValue());
return new InfinispanSession<>(id, metaData, attributes, key.getLocalContext(), this.localContextFactory, this);
return new CompositeSession<>(id, metaData, attributes, key.getLocalContext(), this.localContextFactory, this);
}

@Override
public ImmutableSession createImmutableSession(String id, ImmutableSessionMetaData metaData, ImmutableSessionAttributes attributes) {
return new InfinispanImmutableSession(id, metaData, attributes);
return new CompositeImmutableSession(id, metaData, attributes);
}
}
@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.time.Duration;
import java.time.Instant;
@@ -28,12 +28,12 @@
* Composite view of the meta data of a session, combining volatile and static aspects.
* @author Paul Ferraro
*/
public class SimpleSessionMetaData extends AbstractImmutableSessionMetaData implements InvalidatableSessionMetaData {
public class CompositeSessionMetaData extends AbstractImmutableSessionMetaData implements InvalidatableSessionMetaData {

private final SessionCreationMetaData creationMetaData;
private final SessionAccessMetaData accessMetaData;

public SimpleSessionMetaData(SessionCreationMetaData creationMetaData, SessionAccessMetaData accessMetaData) {
public CompositeSessionMetaData(SessionCreationMetaData creationMetaData, SessionAccessMetaData accessMetaData) {
this.creationMetaData = creationMetaData;
this.accessMetaData = accessMetaData;
}
@@ -20,20 +20,20 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.util.concurrent.atomic.AtomicReference;

/**
* Wrapper for the components of a sessions's meta-data,
* @author Paul Ferraro
*/
public class InfinispanSessionMetaData<L> {
public class CompositeSessionMetaDataEntry<L> {
private final SessionCreationMetaData creationMetaData;
private final SessionAccessMetaData accessMetaData;
private final AtomicReference<L> localContext;

public InfinispanSessionMetaData(SessionCreationMetaData creationMetaData, SessionAccessMetaData accessMetaData, AtomicReference<L> localContext) {
public CompositeSessionMetaDataEntry(SessionCreationMetaData creationMetaData, SessionAccessMetaData accessMetaData, AtomicReference<L> localContext) {
this.creationMetaData = creationMetaData;
this.accessMetaData = accessMetaData;
this.localContext = localContext;
@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.time.Duration;

@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.time.Duration;
import java.time.Instant;
@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import org.wildfly.clustering.web.session.SessionMetaData;

@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.time.Duration;

@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.time.Duration;
import java.time.Instant;
@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.time.Duration;

@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.io.IOException;
import java.io.ObjectInput;
@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

/**
* @author Paul Ferraro
@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import org.wildfly.clustering.ee.Creator;
import org.wildfly.clustering.ee.Locator;
@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.time.Duration;

@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.util.concurrent.atomic.AtomicReference;

@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.io.IOException;
import java.io.ObjectInput;
@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.util.Map;

@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import org.wildfly.clustering.ee.Creator;
import org.wildfly.clustering.ee.Locator;
@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import org.wildfly.clustering.web.session.ImmutableSession;
import org.wildfly.clustering.web.session.ImmutableSessionAttributes;
@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.util.Collections;
import java.util.HashMap;
@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.time.Duration;
import java.time.Instant;
@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.time.Duration;

@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.time.Duration;
import java.time.Instant;
@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.session.coarse;
package org.wildfly.clustering.web.cache.session.coarse;

import java.util.Map;
import java.util.Set;
@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.session.coarse;
package org.wildfly.clustering.web.cache.session.coarse;

import java.io.NotSerializableException;
import java.util.Map;
@@ -28,9 +28,9 @@

import org.wildfly.clustering.ee.Immutability;
import org.wildfly.clustering.ee.Mutator;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.marshalling.spi.Marshallability;
import org.wildfly.clustering.web.infinispan.session.SessionAttributes;
import org.wildfly.clustering.web.cache.session.SessionAttributes;

/**
* Exposes session attributes for a coarse granularity session.
@@ -19,31 +19,31 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.session.fine;
package org.wildfly.clustering.web.cache.session.fine;

import java.util.Collections;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.function.Function;

import org.wildfly.clustering.marshalling.spi.InvalidSerializedFormException;
import org.wildfly.clustering.marshalling.spi.Marshaller;
import org.wildfly.clustering.web.infinispan.logging.InfinispanWebLogger;
import org.wildfly.clustering.web.session.ImmutableSessionAttributes;

/**
* Exposes session attributes for fine granularity sessions.
* @author Paul Ferraro
*/
public class FineImmutableSessionAttributes<V> implements ImmutableSessionAttributes {
private final String id;
public class FineImmutableSessionAttributes<K, V> implements ImmutableSessionAttributes {
private final Map<String, UUID> names;
private final Map<SessionAttributeKey, V> attributeCache;
private final Function<UUID, K> keyFactory;
private final Map<K, V> attributeCache;
private final Marshaller<Object, V> marshaller;

public FineImmutableSessionAttributes(String id, Map<String, UUID> names, Map<SessionAttributeKey, V> attributeCache, Marshaller<Object, V> marshaller) {
this.id = id;
public FineImmutableSessionAttributes(Map<String, UUID> names, Function<UUID, K> keyFactory, Map<K, V> attributeCache, Marshaller<Object, V> marshaller) {
this.names = Collections.unmodifiableMap(names);
this.keyFactory = keyFactory;
this.attributeCache = attributeCache;
this.marshaller = marshaller;
}
@@ -56,15 +56,17 @@ public FineImmutableSessionAttributes(String id, Map<String, UUID> names, Map<Se
@Override
public Object getAttribute(String name) {
UUID attributeId = this.names.get(name);
return (attributeId != null) ? this.read(name, this.attributeCache.get(new SessionAttributeKey(this.id, attributeId))) : null;
if (attributeId == null) return null;
K key = this.keyFactory.apply(attributeId);
return this.read(this.attributeCache.get(key));
}

private Object read(String name, V value) {
private Object read(V value) {
try {
return this.marshaller.read(value);
} catch (InvalidSerializedFormException e) {
// This should not happen here, since attributes were pre-activated during FineSessionFactory.findValue(...)
throw InfinispanWebLogger.ROOT_LOGGER.failedToReadSessionAttribute(e, this.id, name);
// This should not happen here, since attributes were pre-activated when session was constructed
throw new IllegalStateException(e);
}
}
}
@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.sso;
package org.wildfly.clustering.web.cache.sso;

import java.util.concurrent.atomic.AtomicReference;

@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.sso;
package org.wildfly.clustering.web.cache.sso;

import java.io.IOException;
import java.io.ObjectInput;
@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.sso;
package org.wildfly.clustering.web.cache.sso;

import java.util.concurrent.atomic.AtomicReference;

@@ -28,15 +28,15 @@
import org.wildfly.clustering.web.sso.SSO;
import org.wildfly.clustering.web.sso.Sessions;

public class InfinispanSSO<A, D, S, L> implements SSO<A, D, S, L> {
public class CompositeSSO<A, D, S, L> implements SSO<A, D, S, L> {
private final String id;
private final A authentication;
private final Sessions<D, S> sessions;
private final AtomicReference<L> localContext;
private final LocalContextFactory<L> localContextFactory;
private final Remover<String> remover;

public InfinispanSSO(String id, A authentication, Sessions<D, S> sessions, AtomicReference<L> localContext, LocalContextFactory<L> localContextFactory, Remover<String> remover) {
public CompositeSSO(String id, A authentication, Sessions<D, S> sessions, AtomicReference<L> localContext, LocalContextFactory<L> localContextFactory, Remover<String> remover) {
this.id = id;
this.authentication = authentication;
this.sessions = sessions;
@@ -19,24 +19,24 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.sso;
package org.wildfly.clustering.web.cache.sso;

import java.util.Map;

import org.wildfly.clustering.ee.Batcher;
import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.ee.cache.tx.TransactionBatch;
import org.wildfly.clustering.web.IdentifierFactory;
import org.wildfly.clustering.web.sso.SSO;
import org.wildfly.clustering.web.sso.SSOManager;
import org.wildfly.clustering.web.sso.Sessions;

public class InfinispanSSOManager<AV, SV, A, D, S, L> implements SSOManager<A, D, S, L, TransactionBatch> {
public class CompositeSSOManager<AV, SV, A, D, S, L> implements SSOManager<A, D, S, L, TransactionBatch> {

private final SSOFactory<AV, SV, A, D, S, L> factory;
private final Batcher<TransactionBatch> batcher;
private final IdentifierFactory<String> identifierFactory;

public InfinispanSSOManager(SSOFactory<AV, SV, A, D, S, L> factory, IdentifierFactory<String> identifierFactory, Batcher<TransactionBatch> batcher) {
public CompositeSSOManager(SSOFactory<AV, SV, A, D, S, L> factory, IdentifierFactory<String> identifierFactory, Batcher<TransactionBatch> batcher) {
this.factory = factory;
this.batcher = batcher;
this.identifierFactory = identifierFactory;
@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.sso;
package org.wildfly.clustering.web.cache.sso;

import java.util.Map;

@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.sso;
package org.wildfly.clustering.web.cache.sso;

import java.util.Map;

@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.sso.coarse;
package org.wildfly.clustering.web.cache.sso.coarse;

import java.util.Collections;
import java.util.Map;
@@ -20,17 +20,19 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.sso.coarse;
package org.wildfly.clustering.web.cache.sso.coarse;

import java.util.Map;
import java.util.function.Predicate;

/**
* Selects SSO sessions entries containing the specified session.
* @author Paul Ferraro
* @param <K> the cache key type
* @param <D> the deployment type
* @param <S> the session type
*/
public class SessionFilter<D, S> implements Predicate<Map.Entry<CoarseSessionsKey, Map<D, S>>> {
public class SessionFilter<K, D, S> implements Predicate<Map.Entry<K, Map<D, S>>> {

private final S session;

@@ -43,7 +45,7 @@ public S getSession() {
}

@Override
public boolean test(Map.Entry<CoarseSessionsKey, Map<D, S>> entry) {
public boolean test(Map.Entry<K, Map<D, S>> entry) {
return entry.getValue().values().contains(this.session);
}
}
@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.sso.coarse;
package org.wildfly.clustering.web.cache.sso.coarse;

import java.io.IOException;
import java.io.ObjectInput;
@@ -33,22 +33,22 @@
* @author Paul Ferraro
*/
@MetaInfServices(Externalizer.class)
public class SessionFilterExternalizer<D, S> implements Externalizer<SessionFilter<D, S>> {
public class SessionFilterExternalizer<K, D, S> implements Externalizer<SessionFilter<K, D, S>> {

@Override
public void writeObject(ObjectOutput output, SessionFilter<D, S> filter) throws IOException {
public void writeObject(ObjectOutput output, SessionFilter<K, D, S> filter) throws IOException {
output.writeObject(filter.getSession());
}

@SuppressWarnings("unchecked")
@Override
public SessionFilter<D, S> readObject(ObjectInput input) throws IOException, ClassNotFoundException {
public SessionFilter<K, D, S> readObject(ObjectInput input) throws IOException, ClassNotFoundException {
return new SessionFilter<>((S) input.readObject());
}

@SuppressWarnings("unchecked")
@Override
public Class<SessionFilter<D, S>> getTargetClass() {
return (Class<SessionFilter<D, S>>) (Class<?>) SessionFilter.class;
public Class<SessionFilter<K, D, S>> getTargetClass() {
return (Class<SessionFilter<K, D, S>>) (Class<?>) SessionFilter.class;
}
}
@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@@ -36,30 +36,30 @@
import org.wildfly.clustering.web.session.Session;

/**
* Unit test for {@link InfinispanSessionFactory}.
* Unit test for {@link CompositeSessionFactory}.
*
* @author Paul Ferraro
*/
public class InfinispanSessionFactoryTestCase {
private final SessionMetaDataFactory<InfinispanSessionMetaData<Object>, Object> metaDataFactory = mock(SessionMetaDataFactory.class);
public class CompositeSessionFactoryTestCase {
private final SessionMetaDataFactory<CompositeSessionMetaDataEntry<Object>, Object> metaDataFactory = mock(SessionMetaDataFactory.class);
private final SessionAttributesFactory<Object> attributesFactory = mock(SessionAttributesFactory.class);
private final LocalContextFactory<Object> localContextFactory = mock(LocalContextFactory.class);

private final SessionFactory<InfinispanSessionMetaData<Object>, Object, Object> factory = new InfinispanSessionFactory<>(this.metaDataFactory, this.attributesFactory, this.localContextFactory);
private final SessionFactory<CompositeSessionMetaDataEntry<Object>, Object, Object> factory = new CompositeSessionFactory<>(this.metaDataFactory, this.attributesFactory, this.localContextFactory);

@Test
public void createValue() {
SessionCreationMetaData creationMetaData = mock(SessionCreationMetaData.class);
SessionAccessMetaData accessMetaData = mock(SessionAccessMetaData.class);
AtomicReference<Object> localContext = new AtomicReference<>();
InfinispanSessionMetaData<Object> metaData = new InfinispanSessionMetaData<>(creationMetaData, accessMetaData, localContext);
CompositeSessionMetaDataEntry<Object> metaData = new CompositeSessionMetaDataEntry<>(creationMetaData, accessMetaData, localContext);
Object attributes = new Object();
String id = "id";

when(this.metaDataFactory.createValue(id, null)).thenReturn(metaData);
when(this.attributesFactory.createValue(id, null)).thenReturn(attributes);

Map.Entry<InfinispanSessionMetaData<Object>, Object> result = this.factory.createValue(id, null);
Map.Entry<CompositeSessionMetaDataEntry<Object>, Object> result = this.factory.createValue(id, null);

assertNotNull(result);
assertSame(metaData, result.getKey());
@@ -74,7 +74,7 @@ public void findValue() {
SessionCreationMetaData creationMetaData = mock(SessionCreationMetaData.class);
SessionAccessMetaData accessMetaData = mock(SessionAccessMetaData.class);
AtomicReference<Object> localContext = new AtomicReference<>();
InfinispanSessionMetaData<Object> metaData = new InfinispanSessionMetaData<>(creationMetaData, accessMetaData, localContext);
CompositeSessionMetaDataEntry<Object> metaData = new CompositeSessionMetaDataEntry<>(creationMetaData, accessMetaData, localContext);
Object attributes = new Object();

when(this.metaDataFactory.findValue(missingMetaDataSessionId)).thenReturn(null);
@@ -83,9 +83,9 @@ public void findValue() {
when(this.attributesFactory.findValue(missingAttributesSessionId)).thenReturn(null);
when(this.attributesFactory.findValue(existingSessionId)).thenReturn(attributes);

Map.Entry<InfinispanSessionMetaData<Object>, Object> missingMetaDataResult = this.factory.findValue(missingMetaDataSessionId);
Map.Entry<InfinispanSessionMetaData<Object>, Object> missingAttributesResult = this.factory.findValue(missingAttributesSessionId);
Map.Entry<InfinispanSessionMetaData<Object>, Object> existingSessionResult = this.factory.findValue(existingSessionId);
Map.Entry<CompositeSessionMetaDataEntry<Object>, Object> missingMetaDataResult = this.factory.findValue(missingMetaDataSessionId);
Map.Entry<CompositeSessionMetaDataEntry<Object>, Object> missingAttributesResult = this.factory.findValue(missingAttributesSessionId);
Map.Entry<CompositeSessionMetaDataEntry<Object>, Object> existingSessionResult = this.factory.findValue(existingSessionId);

assertNull(missingMetaDataResult);
assertNull(missingAttributesResult);
@@ -118,11 +118,11 @@ public void getMetaDataFactory() {

@Test
public void createSession() {
Map.Entry<InfinispanSessionMetaData<Object>, Object> entry = mock(Map.Entry.class);
Map.Entry<CompositeSessionMetaDataEntry<Object>, Object> entry = mock(Map.Entry.class);
SessionCreationMetaData creationMetaData = mock(SessionCreationMetaData.class);
SessionAccessMetaData accessMetaData = mock(SessionAccessMetaData.class);
Object localContext = new Object();
InfinispanSessionMetaData<Object> metaDataValue = new InfinispanSessionMetaData<>(creationMetaData, accessMetaData, new AtomicReference<>(localContext));
CompositeSessionMetaDataEntry<Object> metaDataValue = new CompositeSessionMetaDataEntry<>(creationMetaData, accessMetaData, new AtomicReference<>(localContext));
Object attributesValue = new Object();
InvalidatableSessionMetaData metaData = mock(InvalidatableSessionMetaData.class);
SessionAttributes attributes = mock(SessionAttributes.class);
@@ -143,10 +143,10 @@ public void createSession() {

@Test
public void createImmutableSession() {
Map.Entry<InfinispanSessionMetaData<Object>, Object> entry = mock(Map.Entry.class);
Map.Entry<CompositeSessionMetaDataEntry<Object>, Object> entry = mock(Map.Entry.class);
SessionCreationMetaData creationMetaData = mock(SessionCreationMetaData.class);
SessionAccessMetaData accessMetaData = mock(SessionAccessMetaData.class);
InfinispanSessionMetaData<Object> metaDataValue = new InfinispanSessionMetaData<>(creationMetaData, accessMetaData, null);
CompositeSessionMetaDataEntry<Object> metaDataValue = new CompositeSessionMetaDataEntry<>(creationMetaData, accessMetaData, null);
Object attributesValue = new Object();
ImmutableSessionMetaData metaData = mock(ImmutableSessionMetaData.class);
ImmutableSessionAttributes attributes = mock(ImmutableSessionAttributes.class);
@@ -19,23 +19,27 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import static org.mockito.Mockito.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.time.Duration;
import java.time.Instant;

import org.junit.Test;
import org.wildfly.clustering.web.session.SessionMetaData;

import static org.junit.Assert.*;

public class SimpleSessionMetaDataTestCase {
public class CompositeSessionMetaDataTestCase {
private final SessionCreationMetaData creationMetaData = mock(SessionCreationMetaData.class);
private final SessionAccessMetaData accessMetaData = mock(SessionAccessMetaData.class);

private final SessionMetaData metaData = new SimpleSessionMetaData(this.creationMetaData, this.accessMetaData);
private final SessionMetaData metaData = new CompositeSessionMetaData(this.creationMetaData, this.accessMetaData);

@Test
public void isNew() {
@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@@ -33,19 +33,19 @@
import org.wildfly.clustering.web.session.Session;

/**
* Unit test for {@link InfinispanSession}.
* Unit test for {@link CompositeSession}.
*
* @author paul
*/
public class InfinispanSessionTestCase {
public class CompositeSessionTestCase {
private final String id = "session";
private final InvalidatableSessionMetaData metaData = mock(InvalidatableSessionMetaData.class);
private final SessionAttributes attributes = mock(SessionAttributes.class);
private final Remover<String> remover = mock(Remover.class);
private final LocalContextFactory<Object> localContextFactory = mock(LocalContextFactory.class);
private final AtomicReference<Object> localContextRef = new AtomicReference<>();

private final Session<Object> session = new InfinispanSession<>(this.id, this.metaData, this.attributes, this.localContextRef, this.localContextFactory, this.remover);
private final Session<Object> session = new CompositeSession<>(this.id, this.metaData, this.attributes, this.localContextRef, this.localContextFactory, this.remover);

@Test
public void getId() {
@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.io.IOException;
import java.time.Duration;
@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.session;
package org.wildfly.clustering.web.cache.session;

import java.io.IOException;
import java.time.Duration;
@@ -20,7 +20,7 @@
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.wildfly.clustering.web.infinispan.sso;
package org.wildfly.clustering.web.cache.sso;

import java.io.IOException;

@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.sso;
package org.wildfly.clustering.web.cache.sso;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@@ -32,15 +32,15 @@
import org.wildfly.clustering.web.sso.SSO;
import org.wildfly.clustering.web.sso.Sessions;

public class InfinispanSSOTestCase {
public class CompositeSSOTestCase {
private final String id = "id";
private final String authentication = "auth";
private final Sessions<String, String> sessions = mock(Sessions.class);
private final AtomicReference<Object> localContext = new AtomicReference<>();
private final LocalContextFactory<Object> localContextFactory = mock(LocalContextFactory.class);
private final Remover<String> remover = mock(Remover.class);

private final SSO<String, String, String, Object> sso = new InfinispanSSO<>(this.id, this.authentication, this.sessions, this.localContext, this.localContextFactory, this.remover);
private final SSO<String, String, String, Object> sso = new CompositeSSO<>(this.id, this.authentication, this.sessions, this.localContext, this.localContextFactory, this.remover);

@Test
public void getId() {
@@ -19,7 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.wildfly.clustering.web.infinispan.sso.coarse;
package org.wildfly.clustering.web.cache.sso.coarse;

import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
@@ -64,11 +64,11 @@
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-web-container</artifactId>
<artifactId>wildfly-clustering-web-cache</artifactId>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-web-spi</artifactId>
<artifactId>wildfly-clustering-web-container</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly.security</groupId>
@@ -29,6 +29,7 @@

import org.wildfly.clustering.infinispan.spi.distribution.Key;
import org.wildfly.clustering.marshalling.Externalizer;
import org.wildfly.clustering.web.cache.SessionIdentifierSerializer;

/**
* Base externalizer for cache keys containing session identifiers.
@@ -27,6 +27,7 @@
import org.wildfly.clustering.Registrar;
import org.wildfly.clustering.Registration;
import org.wildfly.clustering.ee.Remover;
import org.wildfly.clustering.web.cache.session.SessionFactory;
import org.wildfly.clustering.web.infinispan.logging.InfinispanWebLogger;
import org.wildfly.clustering.web.session.ImmutableSession;
import org.wildfly.clustering.web.session.ImmutableSessionAttributes;
@@ -58,9 +58,9 @@
import org.wildfly.clustering.ee.Batcher;
import org.wildfly.clustering.ee.Invoker;
import org.wildfly.clustering.ee.Recordable;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.ee.retry.RetryingInvoker;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.ee.cache.retry.RetryingInvoker;
import org.wildfly.clustering.ee.cache.tx.TransactionBatch;
import org.wildfly.clustering.group.Group;
import org.wildfly.clustering.group.Node;
import org.wildfly.clustering.infinispan.spi.PredicateKeyFilter;
@@ -69,6 +69,8 @@
import org.wildfly.clustering.infinispan.spi.distribution.Locality;
import org.wildfly.clustering.spi.NodeFactory;
import org.wildfly.clustering.web.IdentifierFactory;
import org.wildfly.clustering.web.cache.session.SessionFactory;
import org.wildfly.clustering.web.cache.session.SimpleImmutableSession;
import org.wildfly.clustering.web.infinispan.logging.InfinispanWebLogger;
import org.wildfly.clustering.web.session.ImmutableHttpSessionAdapter;
import org.wildfly.clustering.web.session.ImmutableSession;
@@ -29,8 +29,8 @@
import org.wildfly.clustering.dispatcher.CommandDispatcher;
import org.wildfly.clustering.ee.Batcher;
import org.wildfly.clustering.ee.Recordable;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.ee.cache.tx.TransactionBatch;
import org.wildfly.clustering.group.Group;
import org.wildfly.clustering.infinispan.spi.distribution.Key;
import org.wildfly.clustering.spi.NodeFactory;
@@ -49,10 +49,10 @@
import org.wildfly.clustering.ee.Batcher;
import org.wildfly.clustering.ee.Immutability;
import org.wildfly.clustering.ee.Recordable;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.ee.infinispan.InfinispanBatcher;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.ee.cache.tx.TransactionBatch;
import org.wildfly.clustering.ee.infinispan.InfinispanCacheProperties;
import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.ee.infinispan.tx.InfinispanBatcher;
import org.wildfly.clustering.group.Group;
import org.wildfly.clustering.infinispan.spi.affinity.KeyAffinityServiceFactory;
import org.wildfly.clustering.infinispan.spi.distribution.CacheLocality;
@@ -65,6 +65,11 @@
import org.wildfly.clustering.marshalling.spi.MarshalledValueMarshaller;
import org.wildfly.clustering.spi.NodeFactory;
import org.wildfly.clustering.web.IdentifierFactory;
import org.wildfly.clustering.web.cache.session.CompositeSessionFactory;
import org.wildfly.clustering.web.cache.session.CompositeSessionMetaDataEntry;
import org.wildfly.clustering.web.cache.session.SessionAttributesFactory;
import org.wildfly.clustering.web.cache.session.SessionFactory;
import org.wildfly.clustering.web.cache.session.SessionMetaDataFactory;
import org.wildfly.clustering.web.infinispan.AffinityIdentifierFactory;
import org.wildfly.clustering.web.infinispan.session.coarse.CoarseSessionAttributesFactory;
import org.wildfly.clustering.web.infinispan.session.fine.FineSessionAttributesFactory;
@@ -96,7 +101,7 @@ private static ThreadFactory createThreadFactory() {
final Group group;

private final KeyAffinityServiceFactory affinityFactory;
private final SessionFactory<InfinispanSessionMetaData<L>, ?, L> factory;
private final SessionFactory<CompositeSessionMetaDataEntry<L>, ?, L> factory;
private final Scheduler scheduler;
private final SessionCreationMetaDataKeyFilter filter = new SessionCreationMetaDataKeyFilter();
private final ExecutorService executor = Executors.newSingleThreadExecutor(createThreadFactory());
@@ -108,8 +113,8 @@ public InfinispanSessionManagerFactory(InfinispanSessionManagerFactoryConfigurat
this.memberFactory = config.getMemberFactory();
this.batcher = new InfinispanBatcher(this.cache);
this.properties = new InfinispanCacheProperties(this.cache.getCacheConfiguration());
SessionMetaDataFactory<InfinispanSessionMetaData<L>, L> metaDataFactory = new InfinispanSessionMetaDataFactory<>(config.getCache(), this.properties);
this.factory = new InfinispanSessionFactory<>(metaDataFactory, this.createSessionAttributesFactory(config), config.getLocalContextFactory());
SessionMetaDataFactory<CompositeSessionMetaDataEntry<L>, L> metaDataFactory = new InfinispanSessionMetaDataFactory<>(config.getCache(), this.properties);
this.factory = new CompositeSessionFactory<>(metaDataFactory, this.createSessionAttributesFactory(config), config.getLocalContextFactory());
CommandDispatcherFactory dispatcherFactory = config.getCommandDispatcherFactory();
ExpiredSessionRemover<?, ?, L> remover = new ExpiredSessionRemover<>(this.factory);
this.expirationRegistrar = remover;
@@ -240,7 +245,7 @@ public void dataRehashed(DataRehashedEvent<SessionCreationMetaDataKey, ?> event)
}

private void schedule(Locality oldLocality, Locality newLocality) {
SessionMetaDataFactory<InfinispanSessionMetaData<L>, L> metaDataFactory = this.factory.getMetaDataFactory();
SessionMetaDataFactory<CompositeSessionMetaDataEntry<L>, L> metaDataFactory = this.factory.getMetaDataFactory();
// Iterate over sessions in memory
try (CloseableIterator<Key<String>> keys = this.cache.getAdvancedCache().withFlags(Flag.CACHE_MODE_LOCAL, Flag.SKIP_CACHE_LOAD).keySet().iterator()) {
while (keys.hasNext()) {
@@ -252,7 +257,7 @@ private void schedule(Locality oldLocality, Locality newLocality) {
try (Batch batch = this.batcher.createBatch()) {
try {
// We need to lookup the session to obtain its meta data
InfinispanSessionMetaData<L> value = metaDataFactory.tryValue(id);
CompositeSessionMetaDataEntry<L> value = metaDataFactory.tryValue(id);
if (value != null) {
this.scheduler.schedule(id, metaDataFactory.createImmutableSessionMetaData(id, value));
}
@@ -42,7 +42,7 @@
import org.jboss.msc.service.ServiceTarget;
import org.wildfly.clustering.dispatcher.CommandDispatcherFactory;
import org.wildfly.clustering.ee.Immutability;
import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.ee.cache.tx.TransactionBatch;
import org.wildfly.clustering.infinispan.spi.EvictableDataContainer;
import org.wildfly.clustering.infinispan.spi.InfinispanCacheRequirement;
import org.wildfly.clustering.infinispan.spi.InfinispanRequirement;
@@ -30,17 +30,28 @@
import org.infinispan.notifications.Listener;
import org.infinispan.notifications.cachelistener.annotation.CacheEntriesEvicted;
import org.infinispan.notifications.cachelistener.event.CacheEntriesEvictedEvent;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.ee.Mutator;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.ee.infinispan.CacheEntryMutator;
import org.wildfly.clustering.infinispan.spi.distribution.Key;
import org.wildfly.clustering.web.cache.session.CompositeSessionMetaData;
import org.wildfly.clustering.web.cache.session.CompositeSessionMetaDataEntry;
import org.wildfly.clustering.web.cache.session.InvalidatableSessionMetaData;
import org.wildfly.clustering.web.cache.session.MutableSessionAccessMetaData;
import org.wildfly.clustering.web.cache.session.MutableSessionCreationMetaData;
import org.wildfly.clustering.web.cache.session.SessionAccessMetaData;
import org.wildfly.clustering.web.cache.session.SessionCreationMetaData;
import org.wildfly.clustering.web.cache.session.SessionCreationMetaDataEntry;
import org.wildfly.clustering.web.cache.session.SessionMetaDataFactory;
import org.wildfly.clustering.web.cache.session.SimpleSessionAccessMetaData;
import org.wildfly.clustering.web.cache.session.SimpleSessionCreationMetaData;
import org.wildfly.clustering.web.session.ImmutableSessionMetaData;

/**
* @author Paul Ferraro
*/
@Listener(sync = false)
public class InfinispanSessionMetaDataFactory<L> implements SessionMetaDataFactory<InfinispanSessionMetaData<L>, L> {
public class InfinispanSessionMetaDataFactory<L> implements SessionMetaDataFactory<CompositeSessionMetaDataEntry<L>, L> {

private final Cache<SessionCreationMetaDataKey, SessionCreationMetaDataEntry<L>> creationMetaDataCache;
private final Cache<SessionCreationMetaDataKey, SessionCreationMetaDataEntry<L>> findCreationMetaDataCache;
@@ -56,33 +67,33 @@ public InfinispanSessionMetaDataFactory(Cache<? extends Key<String>, ?> cache, C
}

@Override
public InfinispanSessionMetaData<L> createValue(String id, Void context) {
public CompositeSessionMetaDataEntry<L> createValue(String id, Void context) {
SessionCreationMetaDataEntry<L> creationMetaDataEntry = new SessionCreationMetaDataEntry<>(new SimpleSessionCreationMetaData());
if (this.creationMetaDataCache.getAdvancedCache().withFlags(Flag.FORCE_SYNCHRONOUS).putIfAbsent(new SessionCreationMetaDataKey(id), creationMetaDataEntry) != null) {
return null;
}
SessionAccessMetaData accessMetaData = new SimpleSessionAccessMetaData();
this.accessMetaDataCache.getAdvancedCache().withFlags(Flag.IGNORE_RETURN_VALUES).put(new SessionAccessMetaDataKey(id), accessMetaData);
return new InfinispanSessionMetaData<>(creationMetaDataEntry.getMetaData(), accessMetaData, creationMetaDataEntry.getLocalContext());
return new CompositeSessionMetaDataEntry<>(creationMetaDataEntry.getMetaData(), accessMetaData, creationMetaDataEntry.getLocalContext());
}

@Override
public InfinispanSessionMetaData<L> findValue(String id) {
public CompositeSessionMetaDataEntry<L> findValue(String id) {
return this.getValue(id, this.findCreationMetaDataCache);
}

@Override
public InfinispanSessionMetaData<L> tryValue(String id) {
public CompositeSessionMetaDataEntry<L> tryValue(String id) {
return this.getValue(id, this.findCreationMetaDataCache.getAdvancedCache().withFlags(Flag.ZERO_LOCK_ACQUISITION_TIMEOUT, Flag.FAIL_SILENTLY));
}

private InfinispanSessionMetaData<L> getValue(String id, Cache<SessionCreationMetaDataKey, SessionCreationMetaDataEntry<L>> creationMetaDataCache) {
private CompositeSessionMetaDataEntry<L> getValue(String id, Cache<SessionCreationMetaDataKey, SessionCreationMetaDataEntry<L>> creationMetaDataCache) {
SessionCreationMetaDataKey key = new SessionCreationMetaDataKey(id);
SessionCreationMetaDataEntry<L> creationMetaDataEntry = creationMetaDataCache.get(key);
if (creationMetaDataEntry != null) {
SessionAccessMetaData accessMetaData = this.accessMetaDataCache.get(new SessionAccessMetaDataKey(id));
if (accessMetaData != null) {
return new InfinispanSessionMetaData<>(creationMetaDataEntry.getMetaData(), accessMetaData, creationMetaDataEntry.getLocalContext());
return new CompositeSessionMetaDataEntry<>(creationMetaDataEntry.getMetaData(), accessMetaData, creationMetaDataEntry.getLocalContext());
}
// Purge orphaned entry, making sure not to trigger cache listener
creationMetaDataCache.getAdvancedCache().withFlags(Flag.IGNORE_RETURN_VALUES, Flag.SKIP_LISTENER_NOTIFICATION).remove(key);
@@ -91,7 +102,7 @@ public InfinispanSessionMetaDataFactory(Cache<? extends Key<String>, ?> cache, C
}

@Override
public InvalidatableSessionMetaData createSessionMetaData(String id, InfinispanSessionMetaData<L> entry) {
public InvalidatableSessionMetaData createSessionMetaData(String id, CompositeSessionMetaDataEntry<L> entry) {
SessionCreationMetaDataKey creationMetaDataKey = new SessionCreationMetaDataKey(id);
Mutator creationMutator = this.properties.isTransactional() && this.creationMetaDataCache.getAdvancedCache().getCacheEntry(creationMetaDataKey).isCreated() ? Mutator.PASSIVE : new CacheEntryMutator<>(this.creationMetaDataCache, creationMetaDataKey, new SessionCreationMetaDataEntry<>(entry.getCreationMetaData(), entry.getLocalContext()));
SessionCreationMetaData creationMetaData = new MutableSessionCreationMetaData(entry.getCreationMetaData(), creationMutator);
@@ -100,12 +111,12 @@ public InvalidatableSessionMetaData createSessionMetaData(String id, InfinispanS
Mutator accessMutator = this.properties.isTransactional() && this.accessMetaDataCache.getAdvancedCache().getCacheEntry(accessMetaDataKey).isCreated() ? Mutator.PASSIVE : new CacheEntryMutator<>(this.accessMetaDataCache, accessMetaDataKey, entry.getAccessMetaData());
SessionAccessMetaData accessMetaData = new MutableSessionAccessMetaData(entry.getAccessMetaData(), accessMutator);

return new SimpleSessionMetaData(creationMetaData, accessMetaData);
return new CompositeSessionMetaData(creationMetaData, accessMetaData);
}

@Override
public ImmutableSessionMetaData createImmutableSessionMetaData(String id, InfinispanSessionMetaData<L> entry) {
return new SimpleSessionMetaData(entry.getCreationMetaData(), entry.getAccessMetaData());
public ImmutableSessionMetaData createImmutableSessionMetaData(String id, CompositeSessionMetaDataEntry<L> entry) {
return new CompositeSessionMetaData(entry.getCreationMetaData(), entry.getAccessMetaData());
}

@Override
@@ -27,6 +27,11 @@

import org.wildfly.clustering.dispatcher.Command;
import org.wildfly.clustering.marshalling.spi.DefaultExternalizer;
import org.wildfly.clustering.web.cache.session.CompositeSessionMetaData;
import org.wildfly.clustering.web.cache.session.SessionAccessMetaData;
import org.wildfly.clustering.web.cache.session.SessionCreationMetaData;
import org.wildfly.clustering.web.cache.session.SimpleSessionAccessMetaData;
import org.wildfly.clustering.web.cache.session.SimpleSessionCreationMetaData;
import org.wildfly.clustering.web.session.ImmutableSessionMetaData;

/**
@@ -69,6 +74,6 @@ private void readObject(java.io.ObjectInputStream in) throws IOException, ClassN
creationMetaData.setMaxInactiveInterval(maxInactiveInterval);
SessionAccessMetaData accessMetaData = new SimpleSessionAccessMetaData();
accessMetaData.setLastAccessedDuration(lastAccessedDuration);
this.metaData = new SimpleSessionMetaData(creationMetaData, accessMetaData);
this.metaData = new CompositeSessionMetaData(creationMetaData, accessMetaData);
}
}
@@ -38,7 +38,7 @@
import org.wildfly.clustering.ee.Batch;
import org.wildfly.clustering.ee.Batcher;
import org.wildfly.clustering.ee.Remover;
import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.ee.cache.tx.TransactionBatch;
import org.wildfly.clustering.infinispan.spi.distribution.Locality;
import org.wildfly.clustering.web.infinispan.logging.InfinispanWebLogger;
import org.wildfly.clustering.web.session.ImmutableSessionMetaData;
@@ -32,16 +32,18 @@
import org.infinispan.notifications.Listener;
import org.infinispan.notifications.cachelistener.annotation.CacheEntriesEvicted;
import org.infinispan.notifications.cachelistener.event.CacheEntriesEvictedEvent;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.infinispan.spi.distribution.Key;
import org.wildfly.clustering.ee.Immutability;
import org.wildfly.clustering.ee.Mutator;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.ee.infinispan.CacheEntryMutator;
import org.wildfly.clustering.marshalling.spi.InvalidSerializedFormException;
import org.wildfly.clustering.marshalling.spi.Marshaller;
import org.wildfly.clustering.web.cache.session.SessionAttributes;
import org.wildfly.clustering.web.cache.session.SessionAttributesFactory;
import org.wildfly.clustering.web.cache.session.coarse.CoarseImmutableSessionAttributes;
import org.wildfly.clustering.web.cache.session.coarse.CoarseSessionAttributes;
import org.wildfly.clustering.web.infinispan.logging.InfinispanWebLogger;
import org.wildfly.clustering.web.infinispan.session.SessionAttributes;
import org.wildfly.clustering.web.infinispan.session.SessionAttributesFactory;
import org.wildfly.clustering.web.infinispan.session.SessionCreationMetaDataKey;
import org.wildfly.clustering.web.session.ImmutableSessionAttributes;

@@ -32,16 +32,16 @@
import org.infinispan.context.Flag;
import org.wildfly.clustering.ee.Immutability;
import org.wildfly.clustering.ee.Mutator;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.ee.infinispan.CacheEntryMutator;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.infinispan.spi.function.ConcurrentMapPutFunction;
import org.wildfly.clustering.infinispan.spi.function.ConcurrentMapRemoveFunction;
import org.wildfly.clustering.infinispan.spi.function.CopyOnWriteMapPutFunction;
import org.wildfly.clustering.infinispan.spi.function.CopyOnWriteMapRemoveFunction;
import org.wildfly.clustering.marshalling.spi.InvalidSerializedFormException;
import org.wildfly.clustering.marshalling.spi.Marshaller;
import org.wildfly.clustering.web.cache.session.SessionAttributes;
import org.wildfly.clustering.web.infinispan.logging.InfinispanWebLogger;
import org.wildfly.clustering.web.infinispan.session.SessionAttributes;

/**
* Exposes session attributes for fine granularity sessions.
@@ -27,20 +27,22 @@
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.function.Function;

import org.infinispan.Cache;
import org.infinispan.context.Flag;
import org.infinispan.notifications.Listener;
import org.infinispan.notifications.cachelistener.annotation.CacheEntriesEvicted;
import org.infinispan.notifications.cachelistener.event.CacheEntriesEvictedEvent;
import org.wildfly.clustering.ee.Immutability;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.infinispan.spi.distribution.Key;
import org.wildfly.clustering.marshalling.spi.InvalidSerializedFormException;
import org.wildfly.clustering.marshalling.spi.Marshaller;
import org.wildfly.clustering.web.cache.session.SessionAttributes;
import org.wildfly.clustering.web.cache.session.SessionAttributesFactory;
import org.wildfly.clustering.web.cache.session.fine.FineImmutableSessionAttributes;
import org.wildfly.clustering.web.infinispan.logging.InfinispanWebLogger;
import org.wildfly.clustering.web.infinispan.session.SessionAttributes;
import org.wildfly.clustering.web.infinispan.session.SessionAttributesFactory;
import org.wildfly.clustering.web.infinispan.session.SessionCreationMetaDataKey;
import org.wildfly.clustering.web.session.ImmutableSessionAttributes;

@@ -114,7 +116,16 @@ public SessionAttributes createSessionAttributes(String id, Map<String, UUID> na

@Override
public ImmutableSessionAttributes createImmutableSessionAttributes(String id, Map<String, UUID> names) {
return new FineImmutableSessionAttributes<>(id, names, this.attributeCache, this.marshaller);
return new FineImmutableSessionAttributes<>(names, getKeyFactory(id), this.attributeCache, this.marshaller);
}

private static Function<UUID, SessionAttributeKey> getKeyFactory(String id) {
return new Function<UUID, SessionAttributeKey>() {
@Override
public SessionAttributeKey apply(UUID attributeId) {
return new SessionAttributeKey(id, attributeId);
}
};
}

@CacheEntriesEvicted
@@ -30,7 +30,7 @@
import org.kohsuke.MetaInfServices;
import org.wildfly.clustering.marshalling.Externalizer;
import org.wildfly.clustering.marshalling.spi.DefaultExternalizer;
import org.wildfly.clustering.web.infinispan.SessionIdentifierSerializer;
import org.wildfly.clustering.web.cache.SessionIdentifierSerializer;

@MetaInfServices(Externalizer.class)
public class SessionAttributeKeyExternalizer implements Externalizer<SessionAttributeKey> {
@@ -28,10 +28,14 @@

import org.infinispan.Cache;
import org.infinispan.context.Flag;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.marshalling.spi.InvalidSerializedFormException;
import org.wildfly.clustering.marshalling.spi.Marshaller;
import org.wildfly.clustering.web.LocalContextFactory;
import org.wildfly.clustering.web.cache.sso.AuthenticationEntry;
import org.wildfly.clustering.web.cache.sso.CompositeSSO;
import org.wildfly.clustering.web.cache.sso.SSOFactory;
import org.wildfly.clustering.web.cache.sso.SessionsFactory;
import org.wildfly.clustering.web.infinispan.logging.InfinispanWebLogger;
import org.wildfly.clustering.web.sso.SSO;
import org.wildfly.clustering.web.sso.Sessions;
@@ -59,7 +63,7 @@ public InfinispanSSOFactory(Cache<AuthenticationKey, AuthenticationEntry<AV, L>>
public SSO<A, D, S, L> createSSO(String id, Map.Entry<Map.Entry<A, AtomicReference<L>>, SV> value) {
Map.Entry<A, AtomicReference<L>> authenticationEntry = value.getKey();
Sessions<D, S> sessions = this.sessionsFactory.createSessions(id, value.getValue());
return new InfinispanSSO<>(id, authenticationEntry.getKey(), sessions, authenticationEntry.getValue(), this.localContextFactory, this);
return new CompositeSSO<>(id, authenticationEntry.getKey(), sessions, authenticationEntry.getValue(), this.localContextFactory, this);
}

@Override
@@ -26,14 +26,17 @@

import org.infinispan.Cache;
import org.wildfly.clustering.ee.Batcher;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.ee.infinispan.InfinispanBatcher;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.ee.cache.tx.TransactionBatch;
import org.wildfly.clustering.ee.infinispan.InfinispanCacheProperties;
import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.ee.infinispan.tx.InfinispanBatcher;
import org.wildfly.clustering.infinispan.spi.distribution.Key;
import org.wildfly.clustering.marshalling.spi.Marshallability;
import org.wildfly.clustering.marshalling.spi.MarshalledValueMarshaller;
import org.wildfly.clustering.web.IdentifierFactory;
import org.wildfly.clustering.web.cache.sso.CompositeSSOManager;
import org.wildfly.clustering.web.cache.sso.SSOFactory;
import org.wildfly.clustering.web.cache.sso.SessionsFactory;
import org.wildfly.clustering.web.infinispan.AffinityIdentifierFactory;
import org.wildfly.clustering.web.infinispan.sso.coarse.CoarseSessionsFactory;
import org.wildfly.clustering.web.sso.SSOManager;
@@ -56,6 +59,6 @@ public InfinispanSSOManagerFactory(InfinispanSSOManagerFactoryConfiguration conf
SSOFactory<Map.Entry<A, AtomicReference<L>>, Map<D, S>, A, D, S, L> factory = new InfinispanSSOFactory<>(this.configuration.getCache(), properties, new MarshalledValueMarshaller<>(configuration.getMarshalledValueFactory(), configuration.getMarshallingContext()), configuration.getLocalContextFactory(), sessionsFactory);
IdentifierFactory<String> idFactory = new AffinityIdentifierFactory<>(configuration.getIdentifierFactory(), cache, this.configuration.getKeyAffinityServiceFactory());
Batcher<TransactionBatch> batcher = new InfinispanBatcher(cache);
return new InfinispanSSOManager<>(factory, idFactory, batcher);
return new CompositeSSOManager<>(factory, idFactory, batcher);
}
}
@@ -32,7 +32,7 @@
import org.jboss.msc.service.ServiceController;
import org.jboss.msc.service.ServiceName;
import org.jboss.msc.service.ServiceTarget;
import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.ee.cache.tx.TransactionBatch;
import org.wildfly.clustering.infinispan.spi.InfinispanCacheRequirement;
import org.wildfly.clustering.infinispan.spi.InfinispanRequirement;
import org.wildfly.clustering.infinispan.spi.affinity.KeyAffinityServiceFactory;
@@ -31,9 +31,11 @@
import org.infinispan.Cache;
import org.infinispan.context.Flag;
import org.wildfly.clustering.ee.Mutator;
import org.wildfly.clustering.ee.cache.CacheProperties;
import org.wildfly.clustering.ee.infinispan.CacheEntryMutator;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.web.infinispan.sso.SessionsFactory;
import org.wildfly.clustering.web.cache.sso.SessionsFactory;
import org.wildfly.clustering.web.cache.sso.coarse.CoarseSessions;
import org.wildfly.clustering.web.cache.sso.coarse.SessionFilter;
import org.wildfly.clustering.web.sso.Sessions;

/**
@@ -71,7 +73,7 @@ public CoarseSessionsFactory(Cache<CoarseSessionsKey, Map<D, S>> cache, CachePro

@Override
public Map.Entry<String, Map<D, S>> findEntryContaining(S session) {
SessionFilter<D, S> filter = new SessionFilter<>(session);
SessionFilter<CoarseSessionsKey, D, S> filter = new SessionFilter<>(session);
// Erase type to handle compilation issues with generics
// Our filter will handle type safety and casting
@SuppressWarnings("rawtypes")
@@ -27,6 +27,9 @@

import org.junit.Test;
import org.wildfly.clustering.Registration;
import org.wildfly.clustering.web.cache.session.SessionAttributesFactory;
import org.wildfly.clustering.web.cache.session.SessionFactory;
import org.wildfly.clustering.web.cache.session.SessionMetaDataFactory;
import org.wildfly.clustering.web.session.ImmutableSession;
import org.wildfly.clustering.web.session.ImmutableSessionAttributes;
import org.wildfly.clustering.web.session.ImmutableSessionMetaData;
@@ -33,7 +33,7 @@
import org.junit.Test;
import org.wildfly.clustering.ee.Batcher;
import org.wildfly.clustering.ee.Remover;
import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.ee.cache.tx.TransactionBatch;
import org.wildfly.clustering.web.session.ImmutableSessionMetaData;

/**
@@ -44,6 +44,7 @@
<modules>
<module>api</module>
<module>spi</module>
<module>cache</module>
<module>container</module>
<module>undertow</module>
<module>infinispan</module>
@@ -58,24 +58,20 @@
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-web-api</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.metadata</groupId>
<artifactId>jboss-metadata-web</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.spec.javax.servlet</groupId>
<artifactId>jboss-servlet-api_4.0_spec</artifactId>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-ee-spi</artifactId>
<version>${project.version}</version>
<scope>test</scope>
<classifier>tests</classifier>
</dependency>
</dependency>
<dependency>
<groupId>org.jboss.spec.javax.xml.bind</groupId>
<artifactId>jboss-jaxb-api_2.3_spec</artifactId>
<groupId>org.jboss.metadata</groupId>
<artifactId>jboss-metadata-web</artifactId>
</dependency>
<dependency>
<groupId>org.jboss.spec.javax.servlet</groupId>
<artifactId>jboss-servlet-api_4.0_spec</artifactId>
</dependency>
</dependencies>

@@ -24,6 +24,7 @@

import org.wildfly.clustering.ee.Immutability;
import org.wildfly.clustering.ee.immutable.AnnotationImmutability;

import org.wildfly.clustering.web.annotation.Immutable;

/**
@@ -33,13 +33,13 @@
import org.wildfly.clustering.ee.Immutability;
import org.wildfly.clustering.ee.immutable.CompositeImmutability;
import org.wildfly.clustering.ee.immutable.DefaultImmutability;
import org.wildfly.clustering.ee.immutable.ImmutabilityTestCase;
import org.wildfly.clustering.ee.immutable.DefaultImmutabilityTestCase;
import org.wildfly.clustering.web.annotation.Immutable;

/**
* @author Paul Ferraro
*/
public class SessionAttributeImmutabilityTestCase extends ImmutabilityTestCase {
public class SessionAttributeImmutabilityTestCase extends DefaultImmutabilityTestCase {

@Override
@Test
@@ -49,6 +49,7 @@
/**
* @author Paul Ferraro
*/
@SuppressWarnings("deprecation")
@MetaInfServices(DistributableServerRuntimeHandler.class)
public class UndertowDistributableServerRuntimeHandler implements DistributableServerRuntimeHandler {

@@ -2422,6 +2422,17 @@
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-ee-cache</artifactId>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-ee-infinispan</artifactId>
@@ -2631,6 +2642,16 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-web-cache</artifactId>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-web-extension</artifactId>
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>

<!--
~ JBoss, Home of Professional Open Source.
~ Copyright 2010, Red Hat, Inc., and individual contributors
~ as indicated by the @author tags. See the copyright.txt file in the
~ distribution for a full listing of individual contributors.
~
~ This is free software; you can redistribute it and/or modify it
~ under the terms of the GNU Lesser General Public License as
~ published by the Free Software Foundation; either version 2.1 of
~ the License, or (at your option) any later version.
~
~ This software is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
~ Lesser General Public License for more details.
~
~ You should have received a copy of the GNU Lesser General Public
~ License along with this software; if not, write to the Free
~ Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-->

<module xmlns="urn:jboss:module:1.5" name="org.wildfly.clustering.ee.cache">
<properties>
<property name="jboss.api" value="private"/>
</properties>

<resources>
<artifact name="${org.wildfly:wildfly-clustering-ee-cache}"/>
</resources>

<dependencies>
<module name="javax.transaction.api"/>
<module name="org.jboss.logging"/>
<module name="org.wildfly.clustering.ee.spi"/>
<module name="org.wildfly.common"/>
</dependencies>
</module>
@@ -35,6 +35,7 @@
<module name="javax.transaction.api"/>
<module name="org.infinispan"/>
<module name="org.infinispan.commons"/>
<module name="org.wildfly.clustering.ee.cache"/>
<module name="org.wildfly.clustering.ee.spi"/>
</dependencies>
</module>
@@ -33,7 +33,6 @@

<dependencies>
<module name="net.jcip"/>
<module name="org.jboss.logging"/>
<module name="org.wildfly.common"/>
</dependencies>
</module>
@@ -51,6 +51,7 @@
<module name="org.jboss.threads"/>
<module name="org.jgroups"/>
<module name="org.wildfly.clustering.api"/>
<module name="org.wildfly.clustering.ee.cache"/>
<module name="org.wildfly.clustering.ee.infinispan"/>
<module name="org.wildfly.clustering.ee.spi"/>
<module name="org.wildfly.clustering.ejb.spi"/>
@@ -49,6 +49,7 @@
<module name="org.jboss.threads"/>
<module name="org.jgroups"/>
<module name="org.wildfly.clustering.api"/>
<module name="org.wildfly.clustering.ee.cache"/>
<module name="org.wildfly.clustering.ee.infinispan"/>
<module name="org.wildfly.clustering.ee.spi"/>
<module name="org.wildfly.clustering.infinispan.spi" services="import"/>
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>

<!--
~ JBoss, Home of Professional Open Source.
~ Copyright 2010, Red Hat, Inc., and individual contributors
~ as indicated by the @author tags. See the copyright.txt file in the
~ distribution for a full listing of individual contributors.
~
~ This is free software; you can redistribute it and/or modify it
~ under the terms of the GNU Lesser General Public License as
~ published by the Free Software Foundation; either version 2.1 of
~ the License, or (at your option) any later version.
~
~ This software is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
~ Lesser General Public License for more details.
~
~ You should have received a copy of the GNU Lesser General Public
~ License along with this software; if not, write to the Free
~ Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-->

<module xmlns="urn:jboss:module:1.5" name="org.wildfly.clustering.web.cache">
<properties>
<property name="jboss.api" value="private"/>
</properties>

<resources>
<artifact name="${org.wildfly:wildfly-clustering-web-cache}"/>
</resources>

<dependencies>
<module name="javax.servlet.api"/>
<module name="org.jboss.as.clustering.common"/>
<module name="org.jboss.as.controller"/>
<module name="org.jboss.as.server"/>
<module name="org.jboss.logging"/>
<module name="org.jboss.metadata.web"/>
<module name="org.jboss.modules"/>
<module name="org.jboss.msc"/>
<module name="org.wildfly.clustering.ee.cache"/>
<module name="org.wildfly.clustering.ee.spi"/>
<module name="org.wildfly.clustering.marshalling.api"/>
<module name="org.wildfly.clustering.marshalling.spi"/>
<module name="org.wildfly.clustering.service"/>
<module name="org.wildfly.clustering.web.api"/>
<module name="org.wildfly.clustering.web.spi"/>
<module name="org.wildfly.security.elytron-private"/>
</dependencies>
</module>
@@ -48,8 +48,8 @@
<module name="org.jboss.metadata.web"/>
<module name="org.jboss.msc"/>
<module name="org.jboss.threads"/>
<module name="org.jgroups"/>
<module name="org.wildfly.clustering.api"/>
<module name="org.wildfly.clustering.ee.cache"/>
<module name="org.wildfly.clustering.ee.infinispan"/>
<module name="org.wildfly.clustering.ee.spi"/>
<module name="org.wildfly.clustering.infinispan.spi" services="import"/>
@@ -59,8 +59,8 @@
<module name="org.wildfly.clustering.server" services="import"/>
<module name="org.wildfly.clustering.service"/>
<module name="org.wildfly.clustering.spi"/>
<module name="org.wildfly.clustering.web.cache" services="import"/>
<module name="org.wildfly.clustering.web.spi"/>
<module name="org.wildfly.clustering.web.undertow" services="import"/>
<module name="org.wildfly.common"/>
<module name="org.wildfly.security.elytron-private"/>
</dependencies>
@@ -2998,6 +2998,16 @@
</exclusions>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-ee-cache</artifactId>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-ee-infinispan</artifactId>
@@ -3226,6 +3236,16 @@
</exclusions>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-web-cache</artifactId>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-web-container</artifactId>
10 pom.xml
@@ -600,6 +600,11 @@
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-ee-cache</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-ee-infinispan</artifactId>
@@ -709,6 +714,11 @@
<artifactId>wildfly-clustering-web-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-web-cache</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>wildfly-clustering-web-container</artifactId>