You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2014/02/18 11:01:54 UTC
[10/17] git commit: WICKET-5508 Memory model improvements for Session
fields
WICKET-5508 Memory model improvements for Session fields
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/c78379f4
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/c78379f4
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/c78379f4
Branch: refs/heads/sandbox/component-queueing-2
Commit: c78379f4ba3fdd58c574a610db3e85e616860d10
Parents: 87df7f4
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Tue Feb 18 10:13:20 2014 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Tue Feb 18 10:13:20 2014 +0200
----------------------------------------------------------------------
.../main/java/org/apache/wicket/Session.java | 86 +++++++++++++-------
1 file changed, 55 insertions(+), 31 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/wicket/blob/c78379f4/wicket-core/src/main/java/org/apache/wicket/Session.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Session.java b/wicket-core/src/main/java/org/apache/wicket/Session.java
index 37de3f3..147351b 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Session.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Session.java
@@ -23,6 +23,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
import org.apache.wicket.application.IClassResolver;
import org.apache.wicket.authorization.IAuthorizationStrategy;
@@ -40,6 +42,7 @@ import org.apache.wicket.session.ISessionStore;
import org.apache.wicket.util.IProvider;
import org.apache.wicket.util.LazyInitializer;
import org.apache.wicket.util.io.IClusterable;
+import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.lang.Objects;
import org.apache.wicket.util.time.Duration;
import org.slf4j.Logger;
@@ -114,10 +117,10 @@ public abstract class Session implements IClusterable, IEventSink
public static final String SESSION_ATTRIBUTE_NAME = "session";
/** a sequence used for whenever something session-specific needs a unique value */
- private int sequence = 1;
+ private final AtomicInteger sequence = new AtomicInteger(1);
/** a sequence used for generating page IDs */
- private int pageId = 0;
+ private final AtomicInteger pageId = new AtomicInteger(0);
/** synchronize page's access by session */
private final IProvider<PageAccessSynchronizer> pageAccessSynchronizer;
@@ -174,7 +177,7 @@ public abstract class Session implements IClusterable, IEventSink
protected ClientInfo clientInfo;
/** True if session state has been changed */
- private transient boolean dirty = false;
+ private transient volatile boolean dirty = false;
/** feedback messages */
private final FeedbackMessages feedbackMessages = new FeedbackMessages();
@@ -183,13 +186,13 @@ public abstract class Session implements IClusterable, IEventSink
private String id = null;
/** The locale to use when loading resources for this session. */
- private Locale locale;
+ private final AtomicReference<Locale> locale;
/** Application level meta data. */
private MetaDataEntry<?>[] metaData;
/** True, if session has been invalidated */
- private transient boolean sessionInvalidated = false;
+ private transient volatile boolean sessionInvalidated = false;
/**
* Temporary instance of the session store. Should be set on each request as it is not supposed
@@ -198,7 +201,7 @@ public abstract class Session implements IClusterable, IEventSink
private transient ISessionStore sessionStore;
/** Any special "skin" style to use when loading resources. */
- private String style;
+ private final AtomicReference<String> style = new AtomicReference<>();
/**
* Holds attributes for sessions that are still temporary/ not bound to a session store. Only
@@ -219,12 +222,13 @@ public abstract class Session implements IClusterable, IEventSink
*/
public Session(Request request)
{
- locale = request.getLocale();
+ Locale locale = request.getLocale();
if (locale == null)
{
throw new IllegalStateException(
"Request#getLocale() cannot return null, request has to have a locale set on it");
}
+ this.locale = new AtomicReference<>(locale);
pageAccessSynchronizer = new PageAccessSynchronizerProvider();
}
@@ -402,7 +406,7 @@ public abstract class Session implements IClusterable, IEventSink
*/
public Locale getLocale()
{
- return locale;
+ return locale.get();
}
/**
@@ -443,7 +447,7 @@ public abstract class Session implements IClusterable, IEventSink
*/
public final String getStyle()
{
- return style;
+ return style.get();
}
/**
@@ -565,15 +569,13 @@ public abstract class Session implements IClusterable, IEventSink
*/
public Session setLocale(final Locale locale)
{
- if (locale == null)
- {
- throw new IllegalArgumentException("Argument 'locale' must not be null");
- }
- if (!Objects.equal(this.locale, locale))
+ Args.notNull(locale, "locale");
+
+ if (!Objects.equal(getLocale(), locale))
{
+ this.locale.set(locale);
dirty();
}
- this.locale = locale;
return this;
}
@@ -605,8 +607,11 @@ public abstract class Session implements IClusterable, IEventSink
*/
public final Session setStyle(final String style)
{
- this.style = style;
- dirty();
+ if (!Objects.equal(getStyle(), style))
+ {
+ this.style.set(style);
+ dirty();
+ }
return this;
}
@@ -682,11 +687,36 @@ public abstract class Session implements IClusterable, IEventSink
}
/**
- * Marks session state as dirty so that it will be flushed at the end of the request.
+ * Marks session state as dirty so that it will be (re)stored in the ISessionStore
+ * at the end of the request.
+ * <strong>Note</strong>: binds the session if it is temporary
*/
public final void dirty()
{
- dirty = true;
+ dirty(true);
+ }
+
+ /**
+ * Marks session state as dirty so that it will be re-stored in the ISessionStore
+ * at the end of the request.
+ *
+ * @param forced
+ * A flag indicating whether the session should be marked as dirty even
+ * when it is temporary. If {@code true} the Session will be bound.
+ */
+ public final void dirty(boolean forced)
+ {
+ if (isTemporary())
+ {
+ if (forced)
+ {
+ dirty = true;
+ }
+ }
+ else
+ {
+ dirty = true;
+ }
}
/**
@@ -839,26 +869,20 @@ public abstract class Session implements IClusterable, IEventSink
*
* @return session-unique value
*/
- public synchronized int nextSequenceValue()
+ public int nextSequenceValue()
{
- if (isTemporary() == false)
- {
- dirty();
- }
- return sequence++;
+ dirty(false);
+ return sequence.getAndIncrement();
}
/**
*
* @return the next page id
*/
- public synchronized int nextPageId()
+ public int nextPageId()
{
- if (isTemporary() == false)
- {
- dirty();
- }
- return pageId++;
+ dirty(false);
+ return pageId.getAndIncrement();
}
/**