String attrName = entry.getKey();
SessionAttribute attr = entry.getValue();
if (attr.isModified()) {
String storeName = attr.getStoreName();
SessionStore store = attr.getStore();
Object[] storeInfo = stores.get(storeName);
if (storeInfo == null) {
storeInfo = new Object[] { store, createHashMap() };
stores.put(storeName, storeInfo);
}
@SuppressWarnings("unchecked")
Map<String, Object> storeAttrs = (Map<String, Object>) storeInfo[1];
Object attrValue = attr.getValue();
// �����model������ת����store�е�ֵ��
if (attrValue instanceof SessionModel) {
attrValue = requestContext.getSessionConfig().getSessionModelEncoders()[0]
.encode((SessionModel) attrValue);
} else {
// ֻ����session model�����modified״̬
modified = true;
}
storeAttrs.put(attrName, attrValue);
}
}
// �����û�в����ı䣨��û�е���setAttribute��removeAttribute����
// Ҳû�б��������û�е���invalidate��clear��������isKeepInTouch=false��
// ���ύ�ˣ�ֱ���˳���
if (!modified && !cleared && !requestContext.getSessionConfig().isKeepInTouch()) {
return;
}
// ��ÿһ��store�ֱ������
for (Map.Entry<String, Object[]> entry : stores.entrySet()) {
String storeName = entry.getKey();
SessionStore store = (SessionStore) entry.getValue()[0];
@SuppressWarnings("unchecked")
Map<String, Object> storeAttrs = (Map<String, Object>) entry.getValue()[1];
store.commit(storeAttrs, getId(), new StoreContextImpl(storeName));
}
// ����invalidate��clear�����ã�����ʣ���store��֪ͨ���������ǰ�����ݡ�
if (cleared) {
if (storeNames.length > stores.size()) {
for (String storeName : storeNames) {
if (!stores.containsKey(storeName)) {
SessionStore store = requestContext.getSessionConfig().getStores().getStore(storeName);
Map<String, Object> storeAttrs = emptyMap();
store.commit(storeAttrs, sessionID, new StoreContextImpl(storeName));
}
}
}
}
}