using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Xsd2Code.Library.Extensions;
using Xsd2Code.Library.Helpers;
using System.Reflection;
using Xsd2Code.Library.Properties;
namespace Xsd2Code.Library
{
///
/// Class factory
///
///
/// Revision history:
///
/// Created 2009-05-28 by Pascal Cabanel
///
static class GeneratorFactory
{
///
/// Get code generator extension
///
/// Generator parameters
///
internal static Result GetCodeExtension(GeneratorParams generatorParams)
{
var extention = new Result(GeneratorFactory.GetExtention(generatorParams.TargetFramework), true);
if (extention.Entity != null)
return extention;
var types = Assembly.GetExecutingAssembly().GetTypes()
.Select(type => new
{
Type = type,
TargetFrameworkAttributes =
type.GetCustomAttributes(typeof(CodeExtensionAttribute), true)
})
.Where(o =>
o.TargetFrameworkAttributes.Length > 0 &&
o.TargetFrameworkAttributes
.Where(attr =>
((CodeExtensionAttribute)attr).TargetFramework == generatorParams.TargetFramework)
.Count() > 0)
.ToList();
if (types.Count == 1)
{
try
{
return new Result(Activator.CreateInstance(types[0].Type) as ICodeExtension, true);
}
catch (Exception ex)
{
return new Result(null, false, ex.Message, MessageType.Error);
}
}
return new Result(null, false,
string.Format(Resources.UnsupportedTargetFramework,
generatorParams.TargetFramework),
MessageType.Error);
}
internal static ICodeExtension GetExtention(TargetFramework target)
{
switch (target)
{
case TargetFramework.Net20:
return new Net20Extension();
case TargetFramework.Net30:
return new Net30Extension();
case TargetFramework.Net35:
return new Net35Extension();
case TargetFramework.Silverlight:
return new SilverlightExtension();
}
return null;
}
}
}