blob: 8005e2ceddfef3d67e2bbcd0b78dfc7535104c6a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
using System;
using System.Text.RegularExpressions;
using System.Transactions;
using Apache.NMS.ActiveMQ.Transport;
using Apache.NMS.ActiveMQ.Util;
namespace Apache.NMS.ActiveMQ
{
/// <summary>
/// Extends the basic Connection class to provide a transacted Connection
/// instance that operates within the bounds of a .NET Scoped Transaction.
///
/// The default Session creation methods of Connection are overriden here
/// to always return a TX capable session instance.
/// </summary>
public sealed class NetTxConnection : Connection, INetTxConnection
{
private NetTxRecoveryPolicy recoveryPolicy = new NetTxRecoveryPolicy();
private Guid configuredResourceManagerId = Guid.Empty;
public NetTxConnection(Uri connectionUri, ITransport transport, IdGenerator clientIdGenerator)
: base(connectionUri, transport, clientIdGenerator)
{
}
public INetTxSession CreateNetTxSession()
{
return (INetTxSession) CreateSession(AcknowledgementMode.Transactional);
}
public INetTxSession CreateNetTxSession(Transaction tx)
{
NetTxSession session = (NetTxSession)CreateSession(AcknowledgementMode.Transactional);
session.Enlist(tx);
return session;
}
public INetTxSession CreateNetTxSession(Transaction tx, bool enlistNativeMsDtcResource)
{
NetTxSession session = (NetTxSession)CreateSession(AcknowledgementMode.Transactional);
session.Enlist(tx);
session.EnlistsMsDtcNativeResource = enlistNativeMsDtcResource;
return session;
}
public INetTxSession CreateNetTxSession(bool enlistNativeMsDtcResource)
{
NetTxSession session = (NetTxSession)CreateSession(AcknowledgementMode.Transactional);
session.EnlistsMsDtcNativeResource = enlistNativeMsDtcResource;
return session;
}
protected override Session CreateActiveMQSession(AcknowledgementMode ackMode)
{
CheckConnected();
return new NetTxSession(this, NextSessionId);
}
public NetTxRecoveryPolicy RecoveryPolicy
{
get { return this.recoveryPolicy; }
set { this.recoveryPolicy = value; }
}
public Guid ConfiguredResourceManagerId
{
get { return this.configuredResourceManagerId; }
set { this.configuredResourceManagerId = value; }
}
internal Guid ResourceManagerGuid
{
get
{
return ConfiguredResourceManagerId != Guid.Empty ?
ConfiguredResourceManagerId : GuidFromId(ResourceManagerId);
}
}
private static Guid GuidFromId(string id)
{
MatchCollection matches = Regex.Matches(id, @"(\d+)-(\d+)-(\d+):(\d+)$");
if(0 == matches.Count)
{
throw new FormatException(string.Format("Unable to extract a GUID from string '{0}'", id));
}
GroupCollection groups = matches[0].Groups;
// We don't use the hostname here, just the remaining bits.
int a = Int32.Parse(groups[1].Value);
short b = Int16.Parse(groups[3].Value);
short c = Int16.Parse(groups[4].Value);
byte[] d = BitConverter.GetBytes(Int64.Parse(groups[2].Value));
return new Guid(a, b, c, d);
}
}
}