/* * 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[] recoverables); private static readonly FactoryFinder FACTORY_FINDER = new FactoryFinder(); 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[] GetRecoverables() { KeyValuePair[] result = new KeyValuePair[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 } }