activemq-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From tab...@apache.org
Subject svn commit: r1067312 - in /activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/Transactions: RecoveryLoggerHarness.cs RecoveryLoggerHarnessFactory.cs
Date Fri, 04 Feb 2011 22:16:42 GMT
Author: tabish
Date: Fri Feb  4 22:16:42 2011
New Revision: 1067312

URL: http://svn.apache.org/viewvc?rev=1067312&view=rev
Log:
Adds a Test Harrness for RecoverLogger types that allows test cases to hook the RecoveryLogger
in use and control when failures occur.

Added:
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/Transactions/RecoveryLoggerHarness.cs
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/Transactions/RecoveryLoggerHarnessFactory.cs

Added: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/Transactions/RecoveryLoggerHarness.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/Transactions/RecoveryLoggerHarness.cs?rev=1067312&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/Transactions/RecoveryLoggerHarness.cs
(added)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/Transactions/RecoveryLoggerHarness.cs
Fri Feb  4 22:16:42 2011
@@ -0,0 +1,229 @@
+/*
+ * 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.Collections.Generic;
+
+using Apache.NMS.ActiveMQ.Commands;
+using Apache.NMS.ActiveMQ.Util;
+using Apache.NMS.Util;
+
+namespace Apache.NMS.ActiveMQ.Transactions
+{
+    public class RecoveryLoggerHarness : IRecoveryLogger
+    {
+        public delegate void HarnessedEventHandler();
+        public delegate void HarnessedLogRecoveryInfoHandler(XATransactionId xid, byte[]
recoveryInfo);
+        public delegate void HarnessedLogRecoveredHandler(XATransactionId xid);
+        public delegate void HarnessedGetRecoverablesHandler(KeyValuePair<XATransactionId,
byte[]>[] recoverables);
+        
+        private static readonly FactoryFinder<RecoveryLoggerFactoryAttribute, IRecoveryLoggerFactory>
FACTORY_FINDER =
+            new FactoryFinder<RecoveryLoggerFactoryAttribute, IRecoveryLoggerFactory>();
+
+        private IRecoveryLogger containedLogger;
+
+        public event HarnessedEventHandler PreInitializeEvent;
+        public event HarnessedEventHandler PostInitializeEvent;
+
+        public event HarnessedLogRecoveryInfoHandler PreLogRecoveryInfoEvent;
+        public event HarnessedLogRecoveryInfoHandler PostLogRecoveryInfoEvent;
+
+        public event HarnessedLogRecoveredHandler PreLogRecoverdEvent;
+        public event HarnessedLogRecoveredHandler PostLogRecoverdEvent;
+
+        public event HarnessedGetRecoverablesHandler PreGetRecoverablesEvent;
+        public event HarnessedGetRecoverablesHandler PostGetRecoverablesEvent;
+
+        public event HarnessedEventHandler PrePurgeEvent;
+        public event HarnessedEventHandler PostPurgeEvent;
+
+        public RecoveryLoggerHarness()
+        {
+            this.containedLogger = new RecoveryFileLogger();
+        }
+
+        public string ResourceManagerId
+        {
+            get { return this.containedLogger.ResourceManagerId; }
+        }
+
+        public void Initialize(string resourceManagerId)
+        {
+            if(this.PreInitializeEvent != null)
+            {
+                this.PreInitializeEvent();
+            }
+            
+            this.containedLogger.Initialize(resourceManagerId);
+
+            if (this.PostInitializeEvent != null)
+            {
+                this.PostInitializeEvent();
+            }
+        }
+
+        public void LogRecoveryInfo(XATransactionId xid, byte[] recoveryInformation)
+        {
+            if (recoveryInformation == null || recoveryInformation.Length == 0)
+            {
+                return;
+            }
+
+            if (this.PreLogRecoveryInfoEvent != null)
+            {
+                this.PreLogRecoveryInfoEvent(xid, recoveryInformation);
+            }
+
+            this.containedLogger.LogRecoveryInfo(xid, recoveryInformation);
+
+            if (this.PostLogRecoveryInfoEvent != null)
+            {
+                this.PostLogRecoveryInfoEvent(xid, recoveryInformation);
+            }
+        }
+
+        public KeyValuePair<XATransactionId, byte[]>[] GetRecoverables()
+        {
+            KeyValuePair<XATransactionId, byte[]>[] result = new KeyValuePair<XATransactionId,
byte[]>[0];
+
+            if (this.PreGetRecoverablesEvent != null)
+            {
+                this.PreGetRecoverablesEvent(result);
+            }
+
+            result = this.containedLogger.GetRecoverables();
+
+            if (this.PostGetRecoverablesEvent != null)
+            {
+                this.PostGetRecoverablesEvent(result);
+            }
+
+            return result;
+        }
+
+        public void LogRecovered(XATransactionId xid)
+        {
+            if (this.PreLogRecoverdEvent != null)
+            {
+                this.PreLogRecoverdEvent(xid);
+            }
+
+            this.containedLogger.LogRecovered(xid);
+
+            if (this.PostLogRecoverdEvent != null)
+            {
+                this.PostLogRecoverdEvent(xid);
+            }
+        }
+
+        public void Purge()
+        {
+            if (this.PrePurgeEvent != null)
+            {
+                this.PrePurgeEvent();
+            }
+
+            this.containedLogger.Purge();
+
+            if (this.PostPurgeEvent != null)
+            {
+                this.PostPurgeEvent();
+            }
+        }
+
+        public string LoggerType
+        {
+            get { return this.containedLogger.LoggerType; }
+        }
+
+        #region Harness Methods
+
+        public IRecoveryLogger Harnessed
+        {
+            get { return this.containedLogger; }    
+        }
+
+        public string HarnessedType
+        {
+            get { return this.containedLogger != null ? this.containedLogger.LoggerType :
""; }
+            set
+            {
+                if (string.IsNullOrEmpty(value))
+                {
+                    throw new NMSException(String.Format("Recovery Logger name invalid: [{0}]",
value));
+                }
+
+                IRecoveryLoggerFactory factory = null;
+
+                try
+                {
+                    factory = NewInstance(value.ToLower());
+                }
+                catch (NMSException)
+                {
+                    throw;
+                }
+                catch (Exception e)
+                {
+                    throw NMSExceptionSupport.Create("Error creating Recovery Logger", e);
+                }
+
+                this.containedLogger = factory.Create();
+            }
+        }
+
+        private static IRecoveryLoggerFactory NewInstance(string scheme)
+        {
+            try
+            {
+                Type factoryType = FindLoggerFactory(scheme);
+
+                if (factoryType == null)
+                {
+                    throw new Exception("NewInstance failed to find a match for id = " +
scheme);
+                }
+
+                return (IRecoveryLoggerFactory)Activator.CreateInstance(factoryType);
+            }
+            catch (Exception ex)
+            {
+                Tracer.WarnFormat("NewInstance failed to create an IRecoveryLoggerFactory
with error: {1}", ex.Message);
+                throw;
+            }
+        }
+
+        private static Type FindLoggerFactory(string scheme)
+        {
+            try
+            {
+                return FACTORY_FINDER.FindFactoryType(scheme);
+            }
+            catch
+            {
+                throw new NMSException("Failed to find Factory for Recovery Logger type:
" + scheme);
+            }
+        }
+
+        public Object Clone()
+        {
+            return this.MemberwiseClone();
+        }       
+
+        #endregion
+    }
+}
+

Added: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/Transactions/RecoveryLoggerHarnessFactory.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/Transactions/RecoveryLoggerHarnessFactory.cs?rev=1067312&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/Transactions/RecoveryLoggerHarnessFactory.cs
(added)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/Transactions/RecoveryLoggerHarnessFactory.cs
Fri Feb  4 22:16:42 2011
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+
+namespace Apache.NMS.ActiveMQ.Transactions
+{
+    [RecoveryLoggerFactory("harness")]
+    public class RecoveryLoggerHarnessFactory : IRecoveryLoggerFactory
+    {
+        public IRecoveryLogger Create()
+        {
+            return new RecoveryLoggerHarness();
+        }
+    }
+}
+



Mime
View raw message