Skip to content

Commit

Permalink
Refactor marshalling configuration from wildfly-clustering-web-infini…
Browse files Browse the repository at this point in the history
…span into wildfly-clustering-web-undertow.

Session manager modules need to be independent of class resolution.
  • Loading branch information
pferraro committed Dec 5, 2016
1 parent cbde955 commit ae70b9e
Show file tree
Hide file tree
Showing 23 changed files with 233 additions and 180 deletions.
2 changes: 1 addition & 1 deletion clustering/web/infinispan/pom.xml
Expand Up @@ -52,7 +52,7 @@
</dependency>
<dependency>
<groupId>org.wildfly</groupId>
<artifactId>wildfly-clustering-marshalling-jboss</artifactId>
<artifactId>wildfly-clustering-marshalling-spi</artifactId>
</dependency>
<dependency>
<groupId>org.wildfly</groupId>
Expand Down
Expand Up @@ -21,17 +21,10 @@
*/
package org.wildfly.clustering.web.infinispan.session;

import java.io.Externalizable;
import java.io.Serializable;
import java.util.function.Function;

import javax.servlet.ServletContext;

import org.infinispan.Cache;
import org.infinispan.remoting.transport.Address;
import org.jboss.marshalling.MarshallingConfiguration;
import org.jboss.marshalling.ModularClassResolver;
import org.jboss.modules.Module;
import org.wildfly.clustering.dispatcher.CommandDispatcherFactory;
import org.wildfly.clustering.ee.Batcher;
import org.wildfly.clustering.ee.Recordable;
Expand All @@ -41,13 +34,7 @@
import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.group.NodeFactory;
import org.wildfly.clustering.infinispan.spi.distribution.Key;
import org.wildfly.clustering.marshalling.jboss.ExternalizerObjectTable;
import org.wildfly.clustering.marshalling.jboss.MarshallingContext;
import org.wildfly.clustering.marshalling.jboss.SimpleClassTable;
import org.wildfly.clustering.marshalling.jboss.SimpleMarshalledValueFactory;
import org.wildfly.clustering.marshalling.jboss.SimpleMarshallingConfigurationRepository;
import org.wildfly.clustering.marshalling.jboss.SimpleMarshallingContextFactory;
import org.wildfly.clustering.marshalling.spi.IndexExternalizer;
import org.wildfly.clustering.marshalling.spi.Marshallability;
import org.wildfly.clustering.marshalling.spi.MarshalledValueFactory;
import org.wildfly.clustering.marshalling.spi.MarshalledValueMarshaller;
import org.wildfly.clustering.web.IdentifierFactory;
Expand All @@ -66,35 +53,11 @@
* Factory for creating session managers.
* @author Paul Ferraro
*/
public class InfinispanSessionManagerFactory implements SessionManagerFactory<TransactionBatch> {

enum MarshallingVersion implements Function<Module, MarshallingConfiguration> {
VERSION_1() {
@Override
public MarshallingConfiguration apply(Module module) {
MarshallingConfiguration config = new MarshallingConfiguration();
config.setClassResolver(ModularClassResolver.getInstance(module.getModuleLoader()));
config.setClassTable(new SimpleClassTable(IndexExternalizer.UNSIGNED_BYTE, Serializable.class, Externalizable.class));
return config;
}
},
VERSION_2() {
@Override
public MarshallingConfiguration apply(Module module) {
MarshallingConfiguration config = new MarshallingConfiguration();
config.setClassResolver(ModularClassResolver.getInstance(module.getModuleLoader()));
config.setClassTable(new SimpleClassTable(IndexExternalizer.UNSIGNED_BYTE, Serializable.class, Externalizable.class));
config.setObjectTable(new ExternalizerObjectTable(module.getClassLoader()));
return config;
}
},
;
static final MarshallingVersion CURRENT = VERSION_2;
}
public class InfinispanSessionManagerFactory<C extends Marshallability> implements SessionManagerFactory<TransactionBatch> {

private final InfinispanSessionManagerFactoryConfiguration config;
private final InfinispanSessionManagerFactoryConfiguration<C> config;

public InfinispanSessionManagerFactory(InfinispanSessionManagerFactoryConfiguration config) {
public InfinispanSessionManagerFactory(InfinispanSessionManagerFactoryConfiguration<C> config) {
this.config = config;
}

Expand Down Expand Up @@ -167,17 +130,16 @@ public Recordable<ImmutableSession> getInactiveSessionRecorder() {
}

private SessionAttributesFactory<?> createSessionAttributesFactory(CacheProperties properties) {
SessionManagerFactoryConfiguration config = this.config.getSessionManagerFactoryConfiguration();
Module module = config.getModule();
MarshallingContext context = new SimpleMarshallingContextFactory().createMarshallingContext(new SimpleMarshallingConfigurationRepository(MarshallingVersion.class, MarshallingVersion.CURRENT, module), module.getClassLoader());
MarshalledValueFactory<MarshallingContext> factory = new SimpleMarshalledValueFactory(context);
SessionManagerFactoryConfiguration<C> config = this.config.getSessionManagerFactoryConfiguration();
MarshalledValueFactory<C> factory = config.getMarshalledValueFactory();
C context = config.getMarshallingContext();

switch (this.config.getSessionManagerFactoryConfiguration().getAttributePersistenceStrategy()) {
case FINE: {
return new FineSessionAttributesFactory(this.config.getCache(), this.config.getCache(), new MarshalledValueMarshaller<>(factory, context), properties);
return new FineSessionAttributesFactory<>(this.config.getCache(), this.config.getCache(), new MarshalledValueMarshaller<>(factory, context), properties);
}
case COARSE: {
return new CoarseSessionAttributesFactory(this.config.getCache(), new MarshalledValueMarshaller<>(factory, context), properties);
return new CoarseSessionAttributesFactory<>(this.config.getCache(), new MarshalledValueMarshaller<>(factory, context), properties);
}
default: {
// Impossible
Expand Down
Expand Up @@ -41,6 +41,7 @@
import org.wildfly.clustering.infinispan.spi.affinity.KeyAffinityServiceFactory;
import org.wildfly.clustering.infinispan.spi.service.CacheBuilder;
import org.wildfly.clustering.infinispan.spi.service.TemplateConfigurationBuilder;
import org.wildfly.clustering.marshalling.spi.Marshallability;
import org.wildfly.clustering.service.Builder;
import org.wildfly.clustering.service.InjectedValueDependency;
import org.wildfly.clustering.service.ValueDependency;
Expand All @@ -49,15 +50,15 @@
import org.wildfly.clustering.web.session.SessionManagerFactoryConfiguration;
import org.wildfly.clustering.web.session.SessionManagerFactory;

public class InfinispanSessionManagerFactoryBuilder implements CapabilityServiceBuilder<SessionManagerFactory<TransactionBatch>>, Value<SessionManagerFactory<TransactionBatch>>, InfinispanSessionManagerFactoryConfiguration {
public class InfinispanSessionManagerFactoryBuilder<C extends Marshallability> implements CapabilityServiceBuilder<SessionManagerFactory<TransactionBatch>>, Value<SessionManagerFactory<TransactionBatch>>, InfinispanSessionManagerFactoryConfiguration<C> {
public static final String DEFAULT_CACHE_CONTAINER = "web";

@SuppressWarnings("rawtypes")
private final InjectedValue<Cache> cache = new InjectedValue<>();
@SuppressWarnings("rawtypes")
private final InjectedValue<NodeFactory> nodeFactory = new InjectedValue<>();

private final SessionManagerFactoryConfiguration configuration;
private final SessionManagerFactoryConfiguration<C> configuration;
private final String containerName;
private final CapabilityServiceBuilder<?> configurationBuilder;
private final CapabilityServiceBuilder<?> cacheBuilder;
Expand All @@ -67,7 +68,7 @@ public class InfinispanSessionManagerFactoryBuilder implements CapabilityService
private volatile ValueDependency<KeyAffinityServiceFactory> affinityFactory;
private volatile ValueDependency<CommandDispatcherFactory> dispatcherFactory;

public InfinispanSessionManagerFactoryBuilder(SessionManagerFactoryConfiguration configuration) {
public InfinispanSessionManagerFactoryBuilder(SessionManagerFactoryConfiguration<C> configuration) {
this.configuration = configuration;

ServiceName baseServiceName = ServiceName.JBOSS.append("infinispan");
Expand Down Expand Up @@ -125,11 +126,11 @@ public ServiceBuilder<SessionManagerFactory<TransactionBatch>> build(ServiceTarg

@Override
public SessionManagerFactory<TransactionBatch> getValue() {
return new InfinispanSessionManagerFactory(this);
return new InfinispanSessionManagerFactory<>(this);
}

@Override
public SessionManagerFactoryConfiguration getSessionManagerFactoryConfiguration() {
public SessionManagerFactoryConfiguration<C> getSessionManagerFactoryConfiguration() {
return this.configuration;
}

Expand Down
Expand Up @@ -23,6 +23,7 @@

import org.jboss.as.clustering.controller.CapabilityServiceBuilder;
import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.marshalling.spi.Marshallability;
import org.wildfly.clustering.web.session.SessionManagerFactoryConfiguration;
import org.wildfly.clustering.web.session.SessionManagerFactory;
import org.wildfly.clustering.web.session.SessionManagerFactoryBuilderProvider;
Expand All @@ -34,7 +35,7 @@
public class InfinispanSessionManagerFactoryBuilderProvider implements SessionManagerFactoryBuilderProvider<TransactionBatch> {

@Override
public CapabilityServiceBuilder<SessionManagerFactory<TransactionBatch>> getBuilder(SessionManagerFactoryConfiguration config) {
return new InfinispanSessionManagerFactoryBuilder(config);
public <C extends Marshallability> CapabilityServiceBuilder<SessionManagerFactory<TransactionBatch>> getBuilder(SessionManagerFactoryConfiguration<C> config) {
return new InfinispanSessionManagerFactoryBuilder<>(config);
}
}
Expand Up @@ -26,11 +26,12 @@
import org.wildfly.clustering.dispatcher.CommandDispatcherFactory;
import org.wildfly.clustering.group.NodeFactory;
import org.wildfly.clustering.infinispan.spi.affinity.KeyAffinityServiceFactory;
import org.wildfly.clustering.marshalling.spi.Marshallability;
import org.wildfly.clustering.web.session.SessionManagerFactoryConfiguration;

public interface InfinispanSessionManagerFactoryConfiguration {
public interface InfinispanSessionManagerFactoryConfiguration<C extends Marshallability> {

SessionManagerFactoryConfiguration getSessionManagerFactoryConfiguration();
SessionManagerFactoryConfiguration<C> getSessionManagerFactoryConfiguration();

<K, V> Cache<K, V> getCache();

Expand Down
Expand Up @@ -32,9 +32,7 @@
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.ee.Mutator;
import org.wildfly.clustering.ee.infinispan.CacheEntryMutator;
import org.wildfly.clustering.marshalling.jboss.MarshallingContext;
import org.wildfly.clustering.marshalling.spi.InvalidSerializedFormException;
import org.wildfly.clustering.marshalling.spi.MarshalledValue;
import org.wildfly.clustering.marshalling.spi.Marshaller;
import org.wildfly.clustering.web.infinispan.logging.InfinispanWebLogger;
import org.wildfly.clustering.web.infinispan.session.SessionAttributes;
Expand All @@ -45,29 +43,29 @@
* {@link SessionAttributesFactory} for coarse granularity sessions, where all session attributes are stored in a single cache entry.
* @author Paul Ferraro
*/
public class CoarseSessionAttributesFactory implements SessionAttributesFactory<Map.Entry<Map<String, Object>, MarshalledValue<Map<String, Object>, MarshallingContext>>> {
public class CoarseSessionAttributesFactory<V> implements SessionAttributesFactory<Map.Entry<Map<String, Object>, V>> {

private final Cache<SessionAttributesKey, MarshalledValue<Map<String, Object>, MarshallingContext>> cache;
private final Marshaller<Map<String, Object>, MarshalledValue<Map<String, Object>, MarshallingContext>> marshaller;
private final Cache<SessionAttributesKey, V> cache;
private final Marshaller<Map<String, Object>, V> marshaller;
private final CacheProperties properties;

public CoarseSessionAttributesFactory(Cache<SessionAttributesKey, MarshalledValue<Map<String, Object>, MarshallingContext>> cache, Marshaller<Map<String, Object>, MarshalledValue<Map<String, Object>, MarshallingContext>> marshaller, CacheProperties properties) {
public CoarseSessionAttributesFactory(Cache<SessionAttributesKey, V> cache, Marshaller<Map<String, Object>, V> marshaller, CacheProperties properties) {
this.cache = cache;
this.marshaller = marshaller;
this.properties = properties;
}

@Override
public Map.Entry<Map<String, Object>, MarshalledValue<Map<String, Object>, MarshallingContext>> createValue(String id, Void context) {
public Map.Entry<Map<String, Object>, V> createValue(String id, Void context) {
Map<String, Object> attributes = this.properties.isLockOnRead() ? new HashMap<>() : new ConcurrentHashMap<>();
MarshalledValue<Map<String, Object>, MarshallingContext> value = this.marshaller.write(attributes);
V value = this.marshaller.write(attributes);
this.cache.getAdvancedCache().withFlags(Flag.IGNORE_RETURN_VALUES).put(new SessionAttributesKey(id), value);
return new SimpleImmutableEntry<>(attributes, value);
}

@Override
public Map.Entry<Map<String, Object>, MarshalledValue<Map<String, Object>, MarshallingContext>> findValue(String id) {
MarshalledValue<Map<String, Object>, MarshallingContext> value = this.cache.get(new SessionAttributesKey(id));
public Map.Entry<Map<String, Object>, V> findValue(String id) {
V value = this.cache.get(new SessionAttributesKey(id));
if (value != null) {
try {
Map<String, Object> attributes = this.marshaller.read(value);
Expand All @@ -93,14 +91,14 @@ public boolean evict(String id) {
}

@Override
public SessionAttributes createSessionAttributes(String id, Map.Entry<Map<String, Object>, MarshalledValue<Map<String, Object>, MarshallingContext>> entry) {
public SessionAttributes createSessionAttributes(String id, Map.Entry<Map<String, Object>, V> entry) {
SessionAttributesKey key = new SessionAttributesKey(id);
Mutator mutator = this.properties.isTransactional() && this.cache.getAdvancedCache().getCacheEntry(key).isCreated() ? Mutator.PASSIVE : new CacheEntryMutator<>(this.cache, key, entry.getValue());
return new CoarseSessionAttributes(entry.getKey(), mutator, this.marshaller, this.properties);
}

@Override
public ImmutableSessionAttributes createImmutableSessionAttributes(String id, Map.Entry<Map<String, Object>, MarshalledValue<Map<String, Object>, MarshallingContext>> entry) {
public ImmutableSessionAttributes createImmutableSessionAttributes(String id, Map.Entry<Map<String, Object>, V> entry) {
return new CoarseImmutableSessionAttributes(entry.getKey());
}
}
Expand Up @@ -35,9 +35,7 @@
import org.wildfly.clustering.ee.Mutator;
import org.wildfly.clustering.ee.infinispan.CacheEntryMutator;
import org.wildfly.clustering.ee.infinispan.CacheProperties;
import org.wildfly.clustering.marshalling.jboss.MarshallingContext;
import org.wildfly.clustering.marshalling.spi.InvalidSerializedFormException;
import org.wildfly.clustering.marshalling.spi.MarshalledValue;
import org.wildfly.clustering.marshalling.spi.Marshaller;
import org.wildfly.clustering.web.infinispan.logging.InfinispanWebLogger;
import org.wildfly.clustering.web.infinispan.session.SessionAttributes;
Expand All @@ -50,14 +48,14 @@
* A separate cache entry stores the activate attribute names for the session.
* @author Paul Ferraro
*/
public class FineSessionAttributesFactory implements SessionAttributesFactory<SessionAttributeNamesEntry> {
public class FineSessionAttributesFactory<V> implements SessionAttributesFactory<SessionAttributeNamesEntry> {

private final Cache<SessionAttributeNamesKey, SessionAttributeNamesEntry> namesCache;
private final Cache<SessionAttributeKey, MarshalledValue<Object, MarshallingContext>> attributeCache;
private final Marshaller<Object, MarshalledValue<Object, MarshallingContext>> marshaller;
private final Cache<SessionAttributeKey, V> attributeCache;
private final Marshaller<Object, V> marshaller;
private final CacheProperties properties;

public FineSessionAttributesFactory(Cache<SessionAttributeNamesKey, SessionAttributeNamesEntry> namesCache, Cache<SessionAttributeKey, MarshalledValue<Object, MarshallingContext>> attributeCache, Marshaller<Object, MarshalledValue<Object, MarshallingContext>> marshaller, CacheProperties properties) {
public FineSessionAttributesFactory(Cache<SessionAttributeNamesKey, SessionAttributeNamesEntry> namesCache, Cache<SessionAttributeKey, V> attributeCache, Marshaller<Object, V> marshaller, CacheProperties properties) {
this.namesCache = namesCache;
this.attributeCache = attributeCache;
this.marshaller = marshaller;
Expand All @@ -76,9 +74,9 @@ public SessionAttributeNamesEntry findValue(String id) {
SessionAttributeNamesEntry entry = this.namesCache.get(new SessionAttributeNamesKey(id));
if (entry != null) {
ConcurrentMap<String, Integer> names = entry.getNames();
Map<SessionAttributeKey, MarshalledValue<Object, MarshallingContext>> attributes = this.attributeCache.getAdvancedCache().getAll(names.values().stream().map(attributeId -> new SessionAttributeKey(id, attributeId)).collect(Collectors.toSet()));
Predicate<Map.Entry<String, MarshalledValue<Object, MarshallingContext>>> invalidAttribute = attribute -> {
MarshalledValue<Object, MarshallingContext> value = attribute.getValue();
Map<SessionAttributeKey, V> attributes = this.attributeCache.getAdvancedCache().getAll(names.values().stream().map(attributeId -> new SessionAttributeKey(id, attributeId)).collect(Collectors.toSet()));
Predicate<Map.Entry<String, V>> invalidAttribute = attribute -> {
V value = attribute.getValue();
if (value == null) {
InfinispanWebLogger.ROOT_LOGGER.missingSessionAttributeCacheEntry(id, attribute.getKey());
return true;
Expand Down
Expand Up @@ -23,25 +23,22 @@

import java.util.concurrent.atomic.AtomicReference;

import org.wildfly.clustering.marshalling.jboss.MarshallingContext;
import org.wildfly.clustering.marshalling.spi.MarshalledValue;

/**
* Cache entry that store authentication data plus any local context.
* @author Paul Ferraro
* @param <A> the identity type
* @param <L> the local context type
*/
public class AuthenticationEntry<A, L> {
public class AuthenticationEntry<V, L> {

private final MarshalledValue<A, MarshallingContext> authentication;
private final V authentication;
private final AtomicReference<L> localContext = new AtomicReference<>();

public AuthenticationEntry(MarshalledValue<A, MarshallingContext> authentication) {
public AuthenticationEntry(V authentication) {
this.authentication = authentication;
}

public MarshalledValue<A, MarshallingContext> getAuthentication() {
public V getAuthentication() {
return this.authentication;
}

Expand Down

0 comments on commit ae70b9e

Please sign in to comment.