/*
* (C) 2007-2012 Alibaba Group Holding Limited.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* Authors:
* wuhua <wq163@163.com> , boyan <killme2008@gmail.com>
*/
package com.taobao.metamorphosis.server.network;
import com.taobao.gecko.service.Connection;
import com.taobao.metamorphosis.transaction.LocalTransactionId;
import com.taobao.metamorphosis.transaction.TransactionId;
/**
* SessionContext������
*
* @author boyan(boyan@taobao.com)
* @date 2011-8-18
*
*/
public class SessionContextHolder {
private SessionContextHolder() {
}
public static final String GLOBAL_SESSION_KEY = "SessionContextGlobalKey" + System.currentTimeMillis();
public static SessionContext getOrCreateSessionContext(final Connection conn, final TransactionId xid) {
SessionContext context = null;
if (xid != null && xid.isLocalTransaction()) {
// �����������session id�������sessionId��key�洢
final LocalTransactionId id = (LocalTransactionId) xid;
context = (SessionContext) conn.getAttribute(id.getSessionId());
if (context == null) {
context = new SessionContextImpl(id.getSessionId(), conn);
final SessionContext old = (SessionContext) conn.setAttributeIfAbsent(id.getSessionId(), context);
if (old != null) {
context = old;
}
}
}
else {
// XA����û��session id��ʹ�ù���key�������ظ�new
context = (SessionContext) conn.getAttribute(GLOBAL_SESSION_KEY);
if (context == null) {
context = new SessionContextImpl(null, conn);
final SessionContext old = (SessionContext) conn.setAttributeIfAbsent(GLOBAL_SESSION_KEY, context);
if (old != null) {
context = old;
}
}
}
return context;
}
}