This commit is contained in:
Jan Bartel 2017-03-16 14:27:48 +11:00
parent 5e6243caec
commit 5bc7882190
3 changed files with 50 additions and 4 deletions

View File

@ -98,6 +98,7 @@ public class GCloudSessionDataStore extends AbstractSessionDataStore
public static final String EXPIRY = "expiry"; public static final String EXPIRY = "expiry";
public static final String MAXINACTIVE = "maxInactive"; public static final String MAXINACTIVE = "maxInactive";
public static final String ATTRIBUTES = "attributes"; public static final String ATTRIBUTES = "attributes";
public static final String LASTSAVED = "lastSaved";
public static final String KIND = "GCloudSession"; public static final String KIND = "GCloudSession";
protected String _kind = KIND; protected String _kind = KIND;
@ -107,6 +108,7 @@ public class GCloudSessionDataStore extends AbstractSessionDataStore
protected String _accessed = ACCESSED; protected String _accessed = ACCESSED;
protected String _lastAccessed = LASTACCESSED; protected String _lastAccessed = LASTACCESSED;
protected String _lastNode = LASTNODE; protected String _lastNode = LASTNODE;
protected String _lastSaved = LASTSAVED;
protected String _createTime = CREATETIME; protected String _createTime = CREATETIME;
protected String _cookieSetTime = COOKIESETTIME; protected String _cookieSetTime = COOKIESETTIME;
protected String _expiry = EXPIRY; protected String _expiry = EXPIRY;
@ -302,6 +304,23 @@ public class GCloudSessionDataStore extends AbstractSessionDataStore
_attributes = attributes; _attributes = attributes;
} }
/**
* @return the lastSaved
*/
public String getLastSaved()
{
return _lastSaved;
}
/**
* @param lastSaved the lastSaved to set
*/
public void setLastSaved(String lastSaved)
{
checkNotNull(lastSaved);
_lastSaved = lastSaved;
}
/** /**
* @see java.lang.Object#toString() * @see java.lang.Object#toString()
*/ */
@ -868,6 +887,7 @@ public class GCloudSessionDataStore extends AbstractSessionDataStore
.set(_model.getLastNode(),session.getLastNode()) .set(_model.getLastNode(),session.getLastNode())
.set(_model.getExpiry(), session.getExpiry()) .set(_model.getExpiry(), session.getExpiry())
.set(_model.getMaxInactive(), session.getMaxInactiveMs()) .set(_model.getMaxInactive(), session.getMaxInactiveMs())
.set(_model.getLastSaved(), session.getLastSaved())
.set(_model.getAttributes(), BlobValue.newBuilder(Blob.copyFrom(baos.toByteArray())).setExcludeFromIndexes(true).build()).build(); .set(_model.getAttributes(), BlobValue.newBuilder(Blob.copyFrom(baos.toByteArray())).setExcludeFromIndexes(true).build()).build();
@ -902,6 +922,17 @@ public class GCloudSessionDataStore extends AbstractSessionDataStore
long createTime = entity.getLong(_model.getCreateTime()); long createTime = entity.getLong(_model.getCreateTime());
long cookieSet = entity.getLong(_model.getCookieSetTime()); long cookieSet = entity.getLong(_model.getCookieSetTime());
String lastNode = entity.getString(_model.getLastNode()); String lastNode = entity.getString(_model.getLastNode());
long lastSaved = 0;
//for compatibility with previously saved sessions, lastSaved may not be present
try
{
lastSaved = entity.getLong(_model.getLastSaved());
}
catch (DatastoreException e)
{
LOG.ignore(e);
}
long expiry = entity.getLong(_model.getExpiry()); long expiry = entity.getLong(_model.getExpiry());
long maxInactive = entity.getLong(_model.getMaxInactive()); long maxInactive = entity.getLong(_model.getMaxInactive());
Blob blob = (Blob) entity.getBlob(_model.getAttributes()); Blob blob = (Blob) entity.getBlob(_model.getAttributes());
@ -912,6 +943,7 @@ public class GCloudSessionDataStore extends AbstractSessionDataStore
session.setVhost(vhost); session.setVhost(vhost);
session.setCookieSet(cookieSet); session.setCookieSet(cookieSet);
session.setLastNode(lastNode); session.setLastNode(lastNode);
session.setLastSaved(lastSaved);
session.setExpiry(expiry); session.setExpiry(expiry);
try (ClassLoadingObjectInputStream ois = new ClassLoadingObjectInputStream(blob.asInputStream())) try (ClassLoadingObjectInputStream ois = new ClassLoadingObjectInputStream(blob.asInputStream()))
{ {

View File

@ -117,6 +117,12 @@ public class MongoSessionDataStore extends NoSqlSessionDataStore
*/ */
public final static String __VERSION = __METADATA + ".version"; public final static String __VERSION = __METADATA + ".version";
public final static String __LASTSAVED = __METADATA + ".lastSaved";
public final static String __LASTNODE = __METADATA + ".lastNode";
/** /**
* Last access time of session * Last access time of session
*/ */
@ -202,14 +208,15 @@ public class MongoSessionDataStore extends NoSqlSessionDataStore
if (valid == null || !valid) if (valid == null || !valid)
return; return;
Object version = getNestedValue(sessionDocument, getContextSubfield(__VERSION)); Object version = getNestedValue(sessionDocument, getContextSubfield(__VERSION));
Long lastSaved = (Long)getNestedValue(sessionDocument, getContextSubfield(__LASTSAVED));
String lastNode = (String)getNestedValue(sessionDocument, getContextSubfield(__LASTNODE));
Long created = (Long)sessionDocument.get(__CREATED); Long created = (Long)sessionDocument.get(__CREATED);
Long accessed = (Long)sessionDocument.get(__ACCESSED); Long accessed = (Long)sessionDocument.get(__ACCESSED);
Long maxInactive = (Long)sessionDocument.get(__MAX_IDLE); Long maxInactive = (Long)sessionDocument.get(__MAX_IDLE);
Long expiry = (Long)sessionDocument.get(__EXPIRY); Long expiry = (Long)sessionDocument.get(__EXPIRY);
NoSqlSessionData data = null; NoSqlSessionData data = null;
// get the session for the context // get the session for the context
@ -228,6 +235,8 @@ public class MongoSessionDataStore extends NoSqlSessionDataStore
data.setExpiry(expiry); data.setExpiry(expiry);
data.setContextPath(_context.getCanonicalContextPath()); data.setContextPath(_context.getCanonicalContextPath());
data.setVhost(_context.getVhost()); data.setVhost(_context.getVhost());
data.setLastSaved(lastSaved);
data.setLastNode(lastNode);
HashMap<String, Object> attributes = new HashMap<>(); HashMap<String, Object> attributes = new HashMap<>();
for (String name : sessionSubDocumentForContext.keySet()) for (String name : sessionSubDocumentForContext.keySet())
@ -427,7 +436,7 @@ public class MongoSessionDataStore extends NoSqlSessionDataStore
*/ */
@Override @Override
public void doStore(String id, SessionData data, long lastSaveTime) throws Exception public void doStore(String id, SessionData data, long lastSaveTime) throws Exception
{ {
NoSqlSessionData nsqd = (NoSqlSessionData)data; NoSqlSessionData nsqd = (NoSqlSessionData)data;
// Form query for upsert // Form query for upsert
@ -449,12 +458,16 @@ public class MongoSessionDataStore extends NoSqlSessionDataStore
sets.put(__CREATED,nsqd.getCreated()); sets.put(__CREATED,nsqd.getCreated());
sets.put(__VALID,true); sets.put(__VALID,true);
sets.put(getContextSubfield(__VERSION),version); sets.put(getContextSubfield(__VERSION),version);
sets.put(getContextSubfield(__LASTSAVED), data.getLastSaved());
sets.put(getContextSubfield(__LASTNODE), data.getLastNode());
sets.put(__MAX_IDLE, nsqd.getMaxInactiveMs()); sets.put(__MAX_IDLE, nsqd.getMaxInactiveMs());
sets.put(__EXPIRY, nsqd.getExpiry()); sets.put(__EXPIRY, nsqd.getExpiry());
nsqd.setVersion(version); nsqd.setVersion(version);
} }
else else
{ {
sets.put(getContextSubfield(__LASTSAVED), data.getLastSaved());
sets.put(getContextSubfield(__LASTNODE), data.getLastNode());
version = new Long(((Number)version).longValue() + 1); version = new Long(((Number)version).longValue() + 1);
nsqd.setVersion(version); nsqd.setVersion(version);
update.put("$inc",_version_1); update.put("$inc",_version_1);

View File

@ -196,6 +196,7 @@ public class FileSessionDataStore extends AbstractSessionDataStore
try (FileInputStream in = new FileInputStream(file)) try (FileInputStream in = new FileInputStream(file))
{ {
SessionData data = load(in); SessionData data = load(in);
data.setLastSaved(file.lastModified());
//delete restored file //delete restored file
file.delete(); file.delete();
reference.set(data); reference.set(data);