private void handleSessionBindings(NoSqlSession session, HazelcastSessionData o) { Map<String, Object> attrs = o.getAttributeMap(); if (attrs != null) { for (String name : attrs.keySet()) { String attr = name; Object value = attrs.get(name); if (attrs.keySet().contains(name)) { session.doPutOrRemove(attr, value); session.bindValue(attr, value); } else { session.doPutOrRemove(attr, value); } } // cleanup, remove values from session, that don't exist in data anymore: for (String name : session.getNames()) { if (!attrs.keySet().contains(name)) { session.doPutOrRemove(name, null); session.unbindValue(name, session.getAttribute(name)); } } } }
@Override protected Object save(NoSqlSession session, Object version, boolean activateAfterSave) { session.willPassivate(); if (session.isValid()) { boolean isNew = false; JettySession row; Optional<JettySession> optionalRow = cache.getUnchecked(session.getClusterId()); row = new JettySession(session.getClusterId(), session.getCreationTime()); cache.put(session.getClusterId(), Optional.of(row)); version = 0; } else { row.setAccessed(session.getAccessed()); Set<String> attributesToSave = session.takeDirty(); if (isNew || isSaveAllAttributes()) { attributesToSave.addAll(session.getNames()); data.put(name, session.getAttribute(name)); } else { simpleOrmSession.delete(JettySession.class, session.getClusterId(), getSimpleOrmContext()); cache.invalidate(session.getClusterId()); session.didActivate();
private void setData(NoSqlSession session, Map<String, Object> data) { for (Map.Entry<String, Object> col : data.entrySet()) { String name = col.getKey(); Object value = col.getValue(); session.doPutOrRemove(name, value); session.bindValue(name, value); } }
data = getKey(session.getClusterId()); throw (new IllegalStateException("unable to deserialize session: id=" + session.getClusterId(), error)); session.invalidate(); return null; session.invalidate(); return null; session.willPassivate(); try if (!session.getNames().contains(name)) session.doPutOrRemove(name, value); session.bindValue(name, value); session.doPutOrRemove(name, value); for (String name : session.getNames()) session.doPutOrRemove(name, null); session.unbindValue(name, session.getAttribute(name)); session.didActivate(); return version;
@Override protected Object refresh(NoSqlSession session, Object version) { Optional<JettySession> optRow = cache.getUnchecked(session.getClusterId()); if (version != null) { if (optRow.isPresent()) { Long savedVersion = optRow.get().getVersion(); if (savedVersion != null && savedVersion == ((Number) version).longValue()) { // refresh not required return version; } } } if (!optRow.isPresent()) { session.invalidate(); return null; } JettySession row = optRow.get(); session.willPassivate(); session.clearAttributes(); setData(session, row.getData()); row.setAccessed(System.currentTimeMillis()); simpleOrmSession.save(row, VISIBILITY_STRING, getSimpleOrmContext()); session.didActivate(); return version; }
@Override protected Object save(NoSqlSession session, Object version, boolean activateAfterSave) { LOG.info("HazelcastSessionManager:save: " + session); session.willPassivate(); HazelcastSessionData sessionData = sessions.get(session.getClusterId()); if (sessionData == null) { sessionData = new HazelcastSessionData(); } // handle valid or invalid if (session.isValid()) { // handle new or existing version = handleSessionAddition(session, version, sessionData); } else { sessionData.setValid(false); } sessions.set(session.getClusterId(), sessionData); if (activateAfterSave) { session.didActivate(); } return version; }
private Object handleSessionAddition(NoSqlSession session, Object version, HazelcastSessionData sessionData) { if (version == null) { // New session version = new Long(1); sessionData.setCreationTime(session.getCreationTime()); sessionData.setValid(true); } else { version = new Long(((Number) version).longValue() + 1); } sessionData.setVersion(version); sessionData.setAccessed(session.getAccessed()); Set<String> names = session.takeDirty(); if (isSaveAllAttributes()) { // note dirty may include removed names names.addAll(session.getNames()); } for (String name : names) { Object value = session.getAttribute(name); if (value == null) { sessionData.getAttributeMap().remove(name); } else if (value instanceof Serializable) { sessionData.getAttributeMap().put(name, value); } else { LOG.warn("Session attribute [" + name + "] not saved since it's not Serializable"); } } return version; }
@Override protected synchronized NoSqlSession loadSession(String clusterId) { LOG.info("HazelcastSessionManager:loadSession: " + clusterId); HazelcastSessionData o = sessions.get(clusterId); if (o == null) { return null; } Boolean valid = o.isValid(); if (valid == null || !valid) { return null; } Object version = o.getVersion(); Long created = o.getCreationTime(); Long accessed = o.getAccessed(); NoSqlSession session = new NoSqlSession(this, created, accessed, clusterId, version); // get the attributes for the context Map<String, Object> attrs = o.getAttributeMap(); if (attrs != null) { for (String name : attrs.keySet()) { String attr = name; Object value = attrs.get(name); session.doPutOrRemove(attr, value); session.bindValue(attr, value); } } session.didActivate(); return session; }
session.willPassivate(); if (!session.isValid()) log.debug("save: skip saving invalidated session: id=" + session.getId()); deleteKey(session.getId()); return null; if (!setKey(session.getId(), data)) throw (new IllegalArgumentException("unable to serialize session: id=" + session.getId() + ", data=" + data, error)); log.debug("save:db.sessions.update(" + session.getId() + "," + data + ")"); session.didActivate();
@Override protected boolean remove(NoSqlSession session) { /* * Check if the session exists and if it does remove the context associated with this session */ HazelcastSessionData o = sessions.get(session.getClusterId()); if (o != null) { LOG.debug("HazelcastSessionManager:remove: " + session.getClusterId()); // ??sessions.remove(session.getClusterId()); return true; } else { return false; } }
@Override protected NoSqlSession loadSession(String clusterId) { Optional<JettySession> row = cache.getUnchecked(clusterId); if (!row.isPresent()) { return null; } JettySession jettySession = row.get(); NoSqlSession session = new NoSqlSession( this, jettySession.getCreated(), jettySession.getAccessed(), jettySession.getClusterId(), jettySession.getVersion()); setData(session, jettySession.getData()); session.didActivate(); return session; }
/** * Overridden to update the session state prior to saving if any attribute value has a different * hash code than it used to. This allows us to detect changes when a mutable object is used as * an attribute value. */ @Override protected void complete() { for (Map.Entry<String, Object> a: getAttributeMap().entrySet()) { Integer oldHash = attributeHashes.get(a.getKey()); if (oldHash == null || oldHash.intValue() != safeHash(a.getValue())) { // super.doPutOrRemove always sets the dirty state super.doPutOrRemove(a.getKey(), a.getValue()); } } super.complete(); }
/** * Overridden to change the attribute (which sets the "dirty" state) only if the new attribute value * is not equal to the old attribute value. */ @Override public Object doPutOrRemove(String name, Object value) { Object oldValue = doGet(name); return (valueEquals(oldValue, value)) ? value : super.doPutOrRemove(name, value); }
HazelcastSessionData o = sessions.get(session.getClusterId()); if (o != null) { Object saved = o.getVersion(); HazelcastSessionData o = sessions.get(session.getClusterId()); session.invalidate(); return null; session.invalidate(); return null; session.willPassivate(); session.clearAttributes(); sessions.set(session.getClusterId(), o); session.didActivate(); return version;
@Override protected boolean remove(NoSqlSession session) { String id = session.getClusterId(); Optional<JettySession> optRow = cache.getUnchecked(id); simpleOrmSession.delete(JettySession.class, id, getSimpleOrmContext()); cache.invalidate(id); return optRow.isPresent(); }
@Override protected void update(NoSqlSession session, String newClusterId, String newNodeId) throws Exception { HazelcastSessionData sessionData = sessions.get(session.getClusterId()); sessions.set(newClusterId, sessionData); sessions.remove(session.getClusterId()); }
@Override protected void update(final NoSqlSession session, final String newClusterId, final String newNodeId) throws Exception { ISerializableSession data = getKey(session.getClusterId()); if (data == null) { log.warn("Couldn't get session data for old key {}", session.getClusterId()); return; } deleteKey(session.getClusterId()); setKey(newClusterId, data); }