/*
 * 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.Reflection;

namespace Apache.NMS.MSMQ
{
	/// <summary>
	/// Implements the Connection Meta-Data feature for Apache.NMS.MSMQ
	/// </summary>
	public class ConnectionMetaData : IConnectionMetaData
	{
		private int nmsMajorVersion;
		private int nmsMinorVersion;

		private string nmsProviderName;
		private string nmsVersion;

		private int providerMajorVersion;
		private int providerMinorVersion;
		private string providerVersion;

		private string[] nmsxProperties;

		public ConnectionMetaData()
		{
			Assembly self = Assembly.GetExecutingAssembly();
			AssemblyName asmName = self.GetName();

			this.nmsProviderName = asmName.Name;
			this.providerMajorVersion = asmName.Version.Major;
			this.providerMinorVersion = asmName.Version.Minor;
			this.providerVersion = asmName.Version.ToString();

			this.nmsxProperties = new String[] { };

			foreach(AssemblyName name in self.GetReferencedAssemblies())
			{
				if(0 == string.Compare(name.Name, "Apache.NMS", true))
				{
					this.nmsMajorVersion = name.Version.Major;
					this.nmsMinorVersion = name.Version.Minor;
					this.nmsVersion = name.Version.ToString();

					return;
				}
			}

			throw new NMSException("Could not find a reference to the Apache.NMS Assembly.");
		}

		public int NMSMajorVersion
		{
			get { return this.nmsMajorVersion; }
		}

		public int NMSMinorVersion
		{
			get { return this.nmsMinorVersion; }
		}

		public string NMSProviderName
		{
			get { return this.nmsProviderName; }
		}

		public string NMSVersion
		{
			get { return this.nmsVersion; }
		}

		public string[] NMSXPropertyNames
		{
			get { return this.nmsxProperties; }
		}

		public int ProviderMajorVersion
		{
			get { return this.providerMajorVersion; }
		}

		public int ProviderMinorVersion
		{
			get { return this.providerMinorVersion; }
		}

		public string ProviderVersion
		{
			get { return this.providerVersion; }
		}
	}
}
