private long sessionReplaceCounter = 0 ;
long processingTime = 0;
private long counterReceive_EVT_GET_ALL_SESSIONS = 0 ;
- private long counterSend_EVT_ALL_SESSION_DATA = 0 ;
private long counterReceive_EVT_ALL_SESSION_DATA = 0 ;
private long counterReceive_EVT_SESSION_CREATED = 0 ;
private long counterReceive_EVT_SESSION_EXPIRED = 0;
private long counterReceive_EVT_SESSION_ACCESSED = 0 ;
private long counterReceive_EVT_SESSION_DELTA = 0;
+ private int counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0 ;
+ private long counterReceive_EVT_CHANGE_SESSION_ID = 0 ;
private long counterSend_EVT_GET_ALL_SESSIONS = 0 ;
+ private long counterSend_EVT_ALL_SESSION_DATA = 0 ;
private long counterSend_EVT_SESSION_CREATED = 0;
private long counterSend_EVT_SESSION_DELTA = 0 ;
private long counterSend_EVT_SESSION_ACCESSED = 0;
private long counterSend_EVT_SESSION_EXPIRED = 0;
private int counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0 ;
- private int counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0 ;
+ private long counterSend_EVT_CHANGE_SESSION_ID = 0;
private int counterNoStateTransfered = 0 ;
-
// ------------------------------------------------------------- Constructor
public DeltaManager() {
super();
public int getCounterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE() {
return counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE;
}
-
+
+ /**
+ * @return Returns the counterSend_EVT_CHANGE_SESSION_ID.
+ */
+ public long getCounterSend_EVT_CHANGE_SESSION_ID() {
+ return counterSend_EVT_CHANGE_SESSION_ID;
+ }
+
/**
* @return Returns the counterReceive_EVT_ALL_SESSION_DATA.
*/
public int getCounterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE() {
return counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE;
}
+
+ /**
+ * @return Returns the counterReceive_EVT_CHANGE_SESSION_ID.
+ */
+ public long getCounterReceive_EVT_CHANGE_SESSION_ID() {
+ return counterReceive_EVT_CHANGE_SESSION_ID;
+ }
/**
* @return Returns the processingTime.
}
/**
+ * Change the session ID of the current session to a new randomly generated
+ * session ID.
+ *
+ * @param session The session to change the session ID for
+ */
+ @Override
+ public void changeSessionId(Session session) {
+ changeSessionId(session, true);
+ }
+
+ public void changeSessionId(Session session, boolean notify) {
+ // original sessionID
+ String orgSessionID = session.getId();
+ super.changeSessionId(session);
+ if (notify) {
+ // changed sessionID
+ String newSessionID = session.getId();
+ try {
+ // serialize sessionID
+ byte[] data = serializeSessionId(newSessionID);
+ // notify change sessionID
+ SessionMessage msg = new SessionMessageImpl(getName(),
+ SessionMessage.EVT_CHANGE_SESSION_ID, data,
+ orgSessionID, orgSessionID + "-"
+ + System.currentTimeMillis());
+ counterSend_EVT_CHANGE_SESSION_ID++;
+ send(msg);
+ } catch (IOException e) {
+ log.error(sm.getString("deltaManager.unableSerializeSessionID",
+ newSessionID), e);
+ }
+ }
+ }
+
+ /**
+ * serialize sessionID
+ * @throws IOException if an input/output error occurs
+ */
+ protected byte[] serializeSessionId(String sessionId) throws IOException {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(bos);
+ oos.writeUTF(sessionId);
+ oos.flush();
+ oos.close();
+ return bos.toByteArray();
+ }
+
+ /**
+ * Load sessionID
+ * @throws IOException if an input/output error occurs
+ */
+ protected String deserializeSessionId(byte[] data) throws IOException {
+ ReplicationStream ois = getReplicationStream(data);
+ String sessionId = ois.readUTF();
+ ois.close();
+ return sessionId;
+ }
+
+ /**
* Load Deltarequest from external node
* Load the Class at container classloader
* @see DeltaRequest#readExternal(java.io.ObjectInput)
case SessionMessage.EVT_SESSION_CREATED:
case SessionMessage.EVT_SESSION_EXPIRED:
case SessionMessage.EVT_SESSION_ACCESSED:
- case SessionMessage.EVT_SESSION_DELTA: {
+ case SessionMessage.EVT_SESSION_DELTA:
+ case SessionMessage.EVT_CHANGE_SESSION_ID: {
synchronized(receivedMessageQueue) {
if(receiverQueue) {
receivedMessageQueue.add(msg);
counterReceive_EVT_SESSION_DELTA = 0 ;
counterReceive_EVT_SESSION_EXPIRED = 0 ;
counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0;
+ counterReceive_EVT_CHANGE_SESSION_ID = 0;
counterSend_EVT_ALL_SESSION_DATA = 0;
counterSend_EVT_GET_ALL_SESSIONS = 0;
counterSend_EVT_SESSION_ACCESSED = 0 ;
counterSend_EVT_SESSION_DELTA = 0 ;
counterSend_EVT_SESSION_EXPIRED = 0 ;
counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0;
+ counterSend_EVT_CHANGE_SESSION_ID = 0;
}
handleSESSION_DELTA(msg,sender);
break;
}
+ case SessionMessage.EVT_CHANGE_SESSION_ID: {
+ handleCHANGE_SESSION_ID(msg,sender);
+ break;
+ }
default: {
//we didn't recognize the message type, do nothing
break;
cluster.send(newmsg, sender);
}
+ /**
+ * handle receive change sessionID at other node
+ * @param msg
+ * @param sender
+ * @throws IOException
+ */
+ protected void handleCHANGE_SESSION_ID(SessionMessage msg,Member sender) throws IOException {
+ counterReceive_EVT_CHANGE_SESSION_ID++;
+ DeltaSession session = (DeltaSession) findSession(msg.getSessionID());
+ String newSessionID = deserializeSessionId(msg.getSession());
+ session.setPrimarySession(false);
+ if(notifySessionListenersOnReplication) {
+ session.setId(newSessionID);
+ } else {
+ session.setIdInternal(newSessionID);
+ add(session);
+ }
+ }
/**
* send a block of session to sender
* The following events are currently available:
* <ul>
* <li><pre>public static final int EVT_SESSION_CREATED</pre><li>
+ * <li><pre>public static final int EVT_SESSION_EXPIRED</pre><li>
* <li><pre>public static final int EVT_SESSION_ACCESSED</pre><li>
- * <li><pre>public static final int EVT_ATTRIBUTE_ADDED</pre><li>
- * <li><pre>public static final int EVT_ATTRIBUTE_REMOVED</pre><li>
- * <li><pre>public static final int EVT_SESSION_EXPIRED_WONOTIFY</pre><li>
- * <li><pre>public static final int EVT_SESSION_EXPIRED_WNOTIFY</pre><li>
* <li><pre>public static final int EVT_GET_ALL_SESSIONS</pre><li>
- * <li><pre>public static final int EVT_SET_USER_PRINCIPAL</pre><li>
- * <li><pre>public static final int EVT_SET_SESSION_NOTE</pre><li>
- * <li><pre>public static final int EVT_REMOVE_SESSION_NOTE</pre><li>
+ * <li><pre>public static final int EVT_SESSION_DELTA</pre><li>
+ * <li><pre>public static final int EVT_ALL_SESSION_DATA</pre><li>
+ * <li><pre>public static final int EVT_ALL_SESSION_TRANSFERCOMPLETE</pre><li>
+ * <li><pre>public static final int EVT_CHANGE_SESSION_ID</pre><li>
* </ul>
*
*/
* When a session state is complete transferred, this is the event.
*/
public static final int EVT_ALL_SESSION_TRANSFERCOMPLETE = 14;
-
+
+ /**
+ * Event type used when a sessionID has been changed.
+ */
+ public static final int EVT_CHANGE_SESSION_ID = 15;
public String getContextName();
* The parameters: sessionID must be set.<BR>
* <B>EVT_SESSION_ACCESSED</B><BR>
* The parameters: sessionID must be set.<BR>
- * <B>EVT_SESSION_EXPIRED_XXXX</B><BR>
- * The parameters: sessionID must be set.<BR>
+ * <B>EVT_GET_ALL_SESSIONS</B><BR>
+ * get all sessions from from one of the nodes.<BR>
* <B>EVT_SESSION_DELTA</B><BR>
* Send attribute delta (add,update,remove attribute or principal, ...).<BR>
* <B>EVT_ALL_SESSION_DATA</B><BR>
* <B>EVT_ALL_SESSION_TRANSFERCOMPLETE</B><BR>
* send that all session state information are transfered
* after GET_ALL_SESSION received from this sender.<BR>
+ * <B>EVT_CHANGE_SESSION_ID</B><BR>
+ * send original sessionID and new sessionID.<BR>
* @param contextName - the name of the context (application
* @param eventtype - one of the 8 event type defined in this class
* @param session - the serialized byte array of the session itself
case EVT_SESSION_DELTA : return "SESSION-DELTA";
case EVT_ALL_SESSION_DATA : return "ALL-SESSION-DATA";
case EVT_ALL_SESSION_TRANSFERCOMPLETE : return "SESSION-STATE-TRANSFERED";
+ case EVT_CHANGE_SESSION_ID : return "SESSION-ID-CHANGED";
default : return "UNKNOWN-EVENT-TYPE";
}
}