#region License
//The contents of this file are subject to the Mozilla Public License
//Version 1.1 (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.mozilla.org/MPL/
//Software distributed under the License is distributed on an "AS IS"
//basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
//License for the specific language governing rights and limitations
//under the License.
#endregion
using System;
using System.Collections.Generic;
using System.Reflection;
using Migrator.Framework;
using Migrator.Providers;
namespace Migrator
{
///
/// Handles loading Provider implementations
///
public class ProviderFactory
{
private static readonly Assembly providerAssembly;
private static readonly Dictionary dialects = new Dictionary();
static ProviderFactory()
{
//string directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase);
//string fullPath = Path.Combine(directory, "Migrator.Providers.dll");
//if (fullPath.StartsWith("file:\\"))
// fullPath = fullPath.Substring(6);
//else if (fullPath.StartsWith("file:"))
// fullPath = fullPath.Substring(5);
providerAssembly = Assembly.GetAssembly(typeof(TransformationProvider));
//providerAssembly = Assembly.LoadFrom("Migrator.Providers.dll");
LoadDialects();
}
public static ITransformationProvider Create(string providerName, string connectionString)
{
object dialectInstance = DialectForProvider(providerName);
MethodInfo mi = dialectInstance.GetType().GetMethod("NewProviderForDialect", new Type[] {typeof (String)});
return (ITransformationProvider)mi.Invoke(dialectInstance, new object[] { connectionString });
}
public static object DialectForProvider(string providerName)
{
if (String.IsNullOrEmpty(providerName))
return null;
foreach (string key in dialects.Keys)
{
if (0 < key.IndexOf(providerName, StringComparison.InvariantCultureIgnoreCase))
return dialects[key];
}
return null;
}
public static void LoadDialects()
{
Type dialectType = providerAssembly.GetType("Migrator.Providers.Dialect");
foreach (Type t in providerAssembly.GetTypes())
{
if (t.IsSubclassOf(dialectType))
{
dialects.Add(t.FullName, Activator.CreateInstance(t, null));
}
}
}
}
}