// Persist library : Persistence layer
// Copyright (C) 2003 Vincent Daron
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
using System;
using Persist.Config;
using System.Collections.Specialized;
namespace Persist.IdGenerators{
/// <summary>
/// This class manage an IdGenerator object
/// </summary>
class IdGeneratorHolder
{
private NameValueCollection theParameters = null;
private Type theIdGeneratorType = null;
private IIdGenerator theInstance = null;
private bool IsSingleInstance = false;
private bool isInitialized = false;
private string theName;
private string theTypeName;
/// <summary>
/// Constructor
/// </summary>
/// <param name="name">the IIdGenerator name</param>
/// <param name="idGeneratorTypeName">the IIdGenerator Type name</param>
/// <param name="parameters">the parameters used during the IIdGenerator Initialization</param>
/// <param name="singleInstance">Specified if it must have only one instance of the IIdGenerator</param>
public IdGeneratorHolder(string name,string idGeneratorTypeName, NameValueCollection parameters, bool singleInstance)
{
theName = name;
theTypeName = idGeneratorTypeName;
theParameters = parameters;
IsSingleInstance = singleInstance;
}
/// <summary>
/// the IIdGenerator name
/// Throw an exception if the IdGeneratorHolder is already initialized
/// </summary>
public string Name
{
get{return theName;}
set
{
if(isInitialized)throw new Exception("the Name of the IdGeneratorHodler cannot be changed once initialized");
theName = value;
}
}
/// <summary>
/// the IIdGenerator Type name
/// Throw an exception if the IdGeneratorHolder is already initialized
/// </summary>
public string TypeName
{
get{return theTypeName;}
set
{
if(isInitialized)throw new Exception("the TypeName of the IdGeneratorHodler cannot be changed once initialized");
theTypeName = value;
}
}
/// <summary>
/// Specified if it must have only one instance of the IIdGenerator
/// Throw an exception if the IdGeneratorHolder is already initialized
/// </summary>
public bool SingleInstance
{
get{return IsSingleInstance;}
set
{
if(isInitialized)throw new Exception("the SingleInstance flag of the IdGeneratorHodler cannot be changed once initialized");
IsSingleInstance = value;
}
}
/// <summary>
/// The IdGenerator Parameters used during initialization
/// Any changes after initialization will not be taken into account
/// </summary>
public NameValueCollection Parameters
{
get{return theParameters;}
}
/// <summary>
/// Initialize IdGeneratorHolder
/// Throw an exception if the TypeName is not found
/// </summary>
public void Init()
{
lock(this)
{
try
{
theIdGeneratorType = System.Type.GetType(theTypeName,true);
isInitialized = true;
}
catch(Exception e)
{
throw new ConfigurationException("IIdGenerator class with name " + theTypeName + " not found",e);
}
}
}
/// <summary>
/// Return the IIdGenerator Instance
/// Throw a ConfigurationException id not Initialized
/// </summary>
public IIdGenerator Instance
{
get
{
IIdGenerator result = null;
lock(typeof(IdGeneratorHolder))
{
if(!isInitialized)
{
throw new Exception("IdGeneratorHolder not initialized");
}
if(!IsSingleInstance)
{
result = GetNewInstance();
}
else
{
if(theInstance == null)
{
theInstance = GetNewInstance();
}
result = theInstance;
}
}
return result;
}
}
/// <summary>
/// Create a new Instance of the IIdGenerator
/// Throw an exception if an error occurs during creation
/// </summary>
/// <returns></returns>
private IIdGenerator GetNewInstance()
{
IIdGenerator idGen = (IIdGenerator)Activator.CreateInstance(theIdGeneratorType);
idGen.Init(theParameters);
return idGen;
}
}
}
|