Skip to content

Commit

Permalink
WFLY-6315 Session.invalidate() should not trigger session listeners i…
Browse files Browse the repository at this point in the history
…f session is not valid.
  • Loading branch information
pferraro committed Apr 28, 2016
1 parent c0b66ff commit f6dcc31
Show file tree
Hide file tree
Showing 19 changed files with 211 additions and 91 deletions.
Expand Up @@ -51,11 +51,6 @@ public ImmutableSessionAttributes getAttributes() {
return this.attributes; return this.attributes;
} }


@Override
public boolean isValid() {
return true;
}

@Override @Override
public ImmutableSessionMetaData getMetaData() { public ImmutableSessionMetaData getMetaData() {
return this.metaData; return this.metaData;
Expand Down
Expand Up @@ -22,12 +22,10 @@
package org.wildfly.clustering.web.infinispan.session; package org.wildfly.clustering.web.infinispan.session;


import java.time.Instant; import java.time.Instant;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;


import org.wildfly.clustering.ee.infinispan.Remover; import org.wildfly.clustering.ee.infinispan.Remover;
import org.wildfly.clustering.web.LocalContextFactory; import org.wildfly.clustering.web.LocalContextFactory;
import org.wildfly.clustering.web.infinispan.logging.InfinispanWebLogger;
import org.wildfly.clustering.web.session.Session; import org.wildfly.clustering.web.session.Session;
import org.wildfly.clustering.web.session.SessionAttributes; import org.wildfly.clustering.web.session.SessionAttributes;
import org.wildfly.clustering.web.session.SessionMetaData; import org.wildfly.clustering.web.session.SessionMetaData;
Expand All @@ -38,14 +36,13 @@
*/ */
public class InfinispanSession<L> extends InfinispanImmutableSession implements Session<L> { public class InfinispanSession<L> extends InfinispanImmutableSession implements Session<L> {


private final SessionMetaData metaData; private final InvalidatableSessionMetaData metaData;
private final SessionAttributes attributes; private final SessionAttributes attributes;
private final AtomicReference<L> localContext; private final AtomicReference<L> localContext;
private final LocalContextFactory<L> localContextFactory; private final LocalContextFactory<L> localContextFactory;
private final Remover<String> remover; private final Remover<String> remover;
private final AtomicBoolean valid = new AtomicBoolean(true);


public InfinispanSession(String id, SessionMetaData metaData, SessionAttributes attributes, AtomicReference<L> localContext, LocalContextFactory<L> localContextFactory, Remover<String> remover) { public InfinispanSession(String id, InvalidatableSessionMetaData metaData, SessionAttributes attributes, AtomicReference<L> localContext, LocalContextFactory<L> localContextFactory, Remover<String> remover) {
super(id, metaData, attributes); super(id, metaData, attributes);
this.metaData = metaData; this.metaData = metaData;
this.attributes = attributes; this.attributes = attributes;
Expand All @@ -61,15 +58,14 @@ public SessionAttributes getAttributes() {


@Override @Override
public void invalidate() { public void invalidate() {
if (!this.valid.compareAndSet(true, false)) { if (this.metaData.invalidate()) {
throw InfinispanWebLogger.ROOT_LOGGER.invalidSession(this.getId()); this.remover.remove(this.getId());
} }
this.remover.remove(this.getId());
} }


@Override @Override
public boolean isValid() { public boolean isValid() {
return this.valid.get(); return this.metaData.isValid();
} }


@Override @Override
Expand All @@ -79,7 +75,7 @@ public SessionMetaData getMetaData() {


@Override @Override
public void close() { public void close() {
if (this.valid.get()) { if (this.metaData.isValid()) {
this.metaData.setLastAccessedTime(Instant.now()); this.metaData.setLastAccessedTime(Instant.now());
} }
} }
Expand Down
Expand Up @@ -32,7 +32,6 @@
import org.wildfly.clustering.web.session.ImmutableSessionMetaData; import org.wildfly.clustering.web.session.ImmutableSessionMetaData;
import org.wildfly.clustering.web.session.Session; import org.wildfly.clustering.web.session.Session;
import org.wildfly.clustering.web.session.SessionAttributes; import org.wildfly.clustering.web.session.SessionAttributes;
import org.wildfly.clustering.web.session.SessionMetaData;


/** /**
* @author Paul Ferraro * @author Paul Ferraro
Expand Down Expand Up @@ -116,7 +115,7 @@ public SessionAttributesFactory<V> getAttributesFactory() {
@Override @Override
public Session<L> createSession(String id, Map.Entry<InfinispanSessionMetaData<L>, V> entry) { public Session<L> createSession(String id, Map.Entry<InfinispanSessionMetaData<L>, V> entry) {
InfinispanSessionMetaData<L> key = entry.getKey(); InfinispanSessionMetaData<L> key = entry.getKey();
SessionMetaData metaData = this.metaDataFactory.createSessionMetaData(id, key); InvalidatableSessionMetaData metaData = this.metaDataFactory.createSessionMetaData(id, key);
SessionAttributes attributes = this.attributesFactory.createSessionAttributes(id, entry.getValue()); SessionAttributes attributes = this.attributesFactory.createSessionAttributes(id, entry.getValue());
return new InfinispanSession<>(id, metaData, attributes, key.getLocalContext(), this.localContextFactory, this); return new InfinispanSession<>(id, metaData, attributes, key.getLocalContext(), this.localContextFactory, this);
} }
Expand Down
Expand Up @@ -425,7 +425,7 @@ public String getId() {


@Override @Override
public SessionMetaData getMetaData() { public SessionMetaData getMetaData() {
if (!this.isValid()) { if (!this.session.isValid()) {
throw InfinispanWebLogger.ROOT_LOGGER.invalidSession(this.getId()); throw InfinispanWebLogger.ROOT_LOGGER.invalidSession(this.getId());
} }
return this.session.getMetaData(); return this.session.getMetaData();
Expand All @@ -438,12 +438,15 @@ public boolean isValid() {


@Override @Override
public void invalidate() { public void invalidate() {
if (!this.session.isValid()) {
throw InfinispanWebLogger.ROOT_LOGGER.invalidSession(this.getId());
}
this.session.invalidate(); this.session.invalidate();
} }


@Override @Override
public SessionAttributes getAttributes() { public SessionAttributes getAttributes() {
if (!this.isValid()) { if (!this.session.isValid()) {
throw InfinispanWebLogger.ROOT_LOGGER.invalidSession(this.getId()); throw InfinispanWebLogger.ROOT_LOGGER.invalidSession(this.getId());
} }
return this.session.getAttributes(); return this.session.getAttributes();
Expand Down
Expand Up @@ -28,7 +28,6 @@
import org.wildfly.clustering.ee.infinispan.Mutator; import org.wildfly.clustering.ee.infinispan.Mutator;
import org.wildfly.clustering.infinispan.spi.distribution.Key; import org.wildfly.clustering.infinispan.spi.distribution.Key;
import org.wildfly.clustering.web.session.ImmutableSessionMetaData; import org.wildfly.clustering.web.session.ImmutableSessionMetaData;
import org.wildfly.clustering.web.session.SessionMetaData;


/** /**
* @author Paul Ferraro * @author Paul Ferraro
Expand Down Expand Up @@ -82,7 +81,7 @@ private InfinispanSessionMetaData<L> getValue(String id, Cache<SessionCreationMe
} }


@Override @Override
public SessionMetaData createSessionMetaData(String id, InfinispanSessionMetaData<L> entry) { public InvalidatableSessionMetaData createSessionMetaData(String id, InfinispanSessionMetaData<L> entry) {
SessionCreationMetaDataKey creationMetaDataKey = new SessionCreationMetaDataKey(id); SessionCreationMetaDataKey creationMetaDataKey = new SessionCreationMetaDataKey(id);
Mutator creationMutator = this.transactional && this.creationMetaDataCache.getAdvancedCache().getCacheEntry(creationMetaDataKey).isCreated() ? Mutator.PASSIVE : new CacheEntryMutator<>(this.creationMetaDataCache, creationMetaDataKey, new SessionCreationMetaDataEntry<>(entry.getCreationMetaData(), entry.getLocalContext())); Mutator creationMutator = this.transactional && 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); SessionCreationMetaData creationMetaData = new MutableSessionCreationMetaData(entry.getCreationMetaData(), creationMutator);
Expand Down
@@ -0,0 +1,42 @@
/*
* JBoss, Home of Professional Open Source.
* Copyright 2016, 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.web.infinispan.session;

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

/**
* @author Paul Ferraro
*/
public interface InvalidatableSessionMetaData extends SessionMetaData {
/**
* Indicates whether or not this session is still valid.
* @return true, if this session is valid, false otherwise
*/
boolean isValid();

/**
* Invalidates the session.
* @return true, if session was invalidated, false if it was already invalid.
*/
boolean invalidate();
}
Expand Up @@ -55,4 +55,14 @@ public void setMaxInactiveInterval(Duration duration) {
this.metaData.setMaxInactiveInterval(duration); this.metaData.setMaxInactiveInterval(duration);
this.mutator.mutate(); this.mutator.mutate();
} }

@Override
public boolean isValid() {
return this.metaData.isValid();
}

@Override
public boolean invalidate() {
return this.metaData.invalidate();
}
} }
Expand Up @@ -31,4 +31,8 @@
public interface SessionCreationMetaData extends ImmutableSessionCreationMetaData { public interface SessionCreationMetaData extends ImmutableSessionCreationMetaData {


void setMaxInactiveInterval(Duration duration); void setMaxInactiveInterval(Duration duration);

boolean isValid();

boolean invalidate();
} }
Expand Up @@ -27,12 +27,11 @@
import org.wildfly.clustering.ee.infinispan.Locator; import org.wildfly.clustering.ee.infinispan.Locator;
import org.wildfly.clustering.ee.infinispan.Remover; import org.wildfly.clustering.ee.infinispan.Remover;
import org.wildfly.clustering.web.session.ImmutableSessionMetaData; import org.wildfly.clustering.web.session.ImmutableSessionMetaData;
import org.wildfly.clustering.web.session.SessionMetaData;


/** /**
* @author Paul Ferraro * @author Paul Ferraro
*/ */
public interface SessionMetaDataFactory<V, L> extends Creator<String, V, Void>, Locator<String, V>, Remover<String>, Evictor<String> { public interface SessionMetaDataFactory<V, L> extends Creator<String, V, Void>, Locator<String, V>, Remover<String>, Evictor<String> {
SessionMetaData createSessionMetaData(String id, V value); InvalidatableSessionMetaData createSessionMetaData(String id, V value);
ImmutableSessionMetaData createImmutableSessionMetaData(String id, V value); ImmutableSessionMetaData createImmutableSessionMetaData(String id, V value);
} }
Expand Up @@ -32,13 +32,11 @@
public class SimpleImmutableSession implements ImmutableSession { public class SimpleImmutableSession implements ImmutableSession {


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


public SimpleImmutableSession(ImmutableSession session) { public SimpleImmutableSession(ImmutableSession session) {
this.id = session.getId(); this.id = session.getId();
this.valid = session.isValid();
this.metaData = new SimpleImmutableSessionMetaData(session.getMetaData()); this.metaData = new SimpleImmutableSessionMetaData(session.getMetaData());
this.attributes = new SimpleImmutableSessionAttributes(session.getAttributes()); this.attributes = new SimpleImmutableSessionAttributes(session.getAttributes());
} }
Expand All @@ -53,11 +51,6 @@ public ImmutableSessionMetaData getMetaData() {
return this.metaData; return this.metaData;
} }


@Override
public boolean isValid() {
return this.valid;
}

@Override @Override
public ImmutableSessionAttributes getAttributes() { public ImmutableSessionAttributes getAttributes() {
return this.attributes; return this.attributes;
Expand Down
Expand Up @@ -24,6 +24,7 @@


import java.time.Duration; import java.time.Duration;
import java.time.Instant; import java.time.Instant;
import java.util.concurrent.atomic.AtomicBoolean;


/** /**
* @author Paul Ferraro * @author Paul Ferraro
Expand All @@ -32,6 +33,7 @@ public class SimpleSessionCreationMetaData implements SessionCreationMetaData {


private final Instant creationTime; private final Instant creationTime;
private volatile Duration maxInactiveInterval = Duration.ZERO; private volatile Duration maxInactiveInterval = Duration.ZERO;
private final AtomicBoolean valid = new AtomicBoolean(true);


public SimpleSessionCreationMetaData() { public SimpleSessionCreationMetaData() {
this(Instant.now()); this(Instant.now());
Expand All @@ -55,4 +57,14 @@ public Duration getMaxInactiveInterval() {
public void setMaxInactiveInterval(Duration duration) { public void setMaxInactiveInterval(Duration duration) {
this.maxInactiveInterval = duration; this.maxInactiveInterval = duration;
} }

@Override
public boolean isValid() {
return this.valid.get();
}

@Override
public boolean invalidate() {
return this.valid.compareAndSet(true, false);
}
} }
Expand Up @@ -24,13 +24,11 @@
import java.time.Duration; import java.time.Duration;
import java.time.Instant; import java.time.Instant;


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

/** /**
* Composite view of the meta data of a session, combining volatile and static aspects. * Composite view of the meta data of a session, combining volatile and static aspects.
* @author Paul Ferraro * @author Paul Ferraro
*/ */
public class SimpleSessionMetaData extends AbstractImmutableSessionMetaData implements SessionMetaData { public class SimpleSessionMetaData extends AbstractImmutableSessionMetaData implements InvalidatableSessionMetaData {


private final SessionCreationMetaData creationMetaData; private final SessionCreationMetaData creationMetaData;
private final SessionAccessMetaData accessMetaData; private final SessionAccessMetaData accessMetaData;
Expand All @@ -46,6 +44,16 @@ public boolean isNew() {
return this.accessMetaData.getLastAccessedDuration().isZero(); return this.accessMetaData.getLastAccessedDuration().isZero();
} }


@Override
public boolean isValid() {
return this.creationMetaData.isValid();
}

@Override
public boolean invalidate() {
return this.creationMetaData.invalidate();
}

@Override @Override
public Instant getCreationTime() { public Instant getCreationTime() {
return this.creationMetaData.getCreationTime(); return this.creationMetaData.getCreationTime();
Expand Down
Expand Up @@ -35,7 +35,6 @@
import org.wildfly.clustering.web.session.ImmutableSessionMetaData; import org.wildfly.clustering.web.session.ImmutableSessionMetaData;
import org.wildfly.clustering.web.session.Session; import org.wildfly.clustering.web.session.Session;
import org.wildfly.clustering.web.session.SessionAttributes; import org.wildfly.clustering.web.session.SessionAttributes;
import org.wildfly.clustering.web.session.SessionMetaData;


/** /**
* @author Paul Ferraro * @author Paul Ferraro
Expand Down Expand Up @@ -134,7 +133,7 @@ public void createSession() {
Object localContext = new Object(); Object localContext = new Object();
InfinispanSessionMetaData<Object> metaDataValue = new InfinispanSessionMetaData<>(creationMetaData, accessMetaData, new AtomicReference<>(localContext)); InfinispanSessionMetaData<Object> metaDataValue = new InfinispanSessionMetaData<>(creationMetaData, accessMetaData, new AtomicReference<>(localContext));
Object attributesValue = new Object(); Object attributesValue = new Object();
SessionMetaData metaData = mock(SessionMetaData.class); InvalidatableSessionMetaData metaData = mock(InvalidatableSessionMetaData.class);
SessionAttributes attributes = mock(SessionAttributes.class); SessionAttributes attributes = mock(SessionAttributes.class);
String id = "id"; String id = "id";


Expand Down

0 comments on commit f6dcc31

Please sign in to comment.