|
From: <fab...@us...> - 2008-07-21 15:21:29
|
Revision: 3644
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3644&view=rev
Author: fabiomaulo
Date: 2008-07-21 15:21:34 +0000 (Mon, 21 Jul 2008)
Log Message:
-----------
- Support for EntityMode.Map (NH-1401)
- Support DefaultEntityMode in Settings (NH-1401)
- Support Cache for Dynamic entities (NH-1402)
BREAKING CHANGE:
- see Configuration.cs for method related with Cache Concurrency Strategy
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Cfg/ClassExtractor.cs
trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs
trunk/nhibernate/src/NHibernate/Cfg/Environment.cs
trunk/nhibernate/src/NHibernate/Cfg/MappingsQueueEntry.cs
trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs
trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs
trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassIdBinder.cs
trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs
trunk/nhibernate/src/NHibernate/Tuple/Entity/EntityMetamodel.cs
trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj
trunk/nhibernate/src/NHibernate.Test/TestCase.cs
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/EntityModeTest/
trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Map/
trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Map/Basic/
trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Map/Basic/DynamicClassFixture.cs
trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Map/Basic/ProductLine.hbm.xml
Modified: trunk/nhibernate/src/NHibernate/Cfg/ClassExtractor.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cfg/ClassExtractor.cs 2008-07-21 05:23:55 UTC (rev 3643)
+++ trunk/nhibernate/src/NHibernate/Cfg/ClassExtractor.cs 2008-07-21 15:21:34 UTC (rev 3644)
@@ -1,4 +1,3 @@
-using System;
using System.Collections;
using System.Xml;
using Iesi.Collections;
@@ -23,7 +22,7 @@
public ClassEntry(string extends, string className, string assembly, string @namespace)
{
_fullExtends = extends == null ? null : TypeNameParser.Parse(extends, @namespace, assembly);
- _fullClassName = TypeNameParser.Parse(className, @namespace, assembly);
+ _fullClassName = className == null ? null : TypeNameParser.Parse(className, @namespace, assembly);
}
public AssemblyQualifiedTypeName FullExtends
Modified: trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2008-07-21 05:23:55 UTC (rev 3643)
+++ trunk/nhibernate/src/NHibernate/Cfg/Configuration.cs 2008-07-21 15:21:34 UTC (rev 3644)
@@ -444,25 +444,25 @@
/// </summary>
public Mappings CreateMappings(Dialect.Dialect dialect)
{
- return new Mappings(classes,
- collections,
- tables,
- namedQueries,
- namedSqlQueries,
- sqlResultSetMappings,
- imports,
- secondPasses,
- propertyReferences,
- namingStrategy,
- typeDefs,
- filterDefinitions,
- extendsQueue,
- auxiliaryDatabaseObjects,
- tableNameBinding,
+ return new Mappings(classes,
+ collections,
+ tables,
+ namedQueries,
+ namedSqlQueries,
+ sqlResultSetMappings,
+ imports,
+ secondPasses,
+ propertyReferences,
+ namingStrategy,
+ typeDefs,
+ filterDefinitions,
+ extendsQueue,
+ auxiliaryDatabaseObjects,
+ tableNameBinding,
columnNameBindingPerTable,
defaultAssembly,
defaultNamespace,
- dialect
+ dialect
);
}
@@ -1291,19 +1291,9 @@
// Load class-cache
foreach (ClassCacheConfiguration ccc in hc.SessionFactory.ClassesCache)
{
- System.Type clazz;
- try
- {
- clazz = ReflectHelper.ClassForName(ccc.Class);
- }
- catch (TypeLoadException tle)
- {
- throw new HibernateConfigException("class-cache Configuration: Could not find class " + ccc.Class, tle);
- }
-
string region = string.IsNullOrEmpty(ccc.Region) ? ccc.Class : ccc.Region;
bool includeLazy = (ccc.Include != ClassCacheInclude.NonLazy);
- SetCacheConcurrencyStrategy(clazz, CfgXmlHelper.ClassCacheUsageConvertToString(ccc.Usage), region, includeLazy);
+ SetCacheConcurrencyStrategy(ccc.Class, CfgXmlHelper.ClassCacheUsageConvertToString(ccc.Usage), region, includeLazy);
}
// Load collection-cache
@@ -1317,7 +1307,7 @@
}
string region = string.IsNullOrEmpty(ccc.Region) ? role : ccc.Region;
- SetCacheConcurrencyStrategy(role, CfgXmlHelper.ClassCacheUsageConvertToString(ccc.Usage), region);
+ SetCollectionCacheConcurrencyStrategy(role, CfgXmlHelper.ClassCacheUsageConvertToString(ccc.Usage), region);
}
// Events
@@ -1347,6 +1337,20 @@
return this;
}
+ internal RootClass GetRootClassMapping(string clazz)
+ {
+ try
+ {
+ return (RootClass)GetClassMapping(clazz);
+ }
+ catch (InvalidCastException)
+ {
+ throw new HibernateConfigException(
+ "class-cache Configuration: You may only specify a cache for root <class> mappings "
+ + "(cache was specified for " + clazz + ")");
+ }
+ }
+
internal RootClass GetRootClassMapping(System.Type clazz)
{
PersistentClass persistentClass = GetClassMapping(clazz);
@@ -1371,36 +1375,40 @@
/// <summary>
/// Set up a cache for an entity class
/// </summary>
- public Configuration SetCacheConcurrencyStrategy(System.Type clazz, string concurrencyStrategy)
+ public Configuration SetCacheConcurrencyStrategy(String clazz, String concurrencyStrategy)
{
- SetCacheConcurrencyStrategy(clazz, concurrencyStrategy, clazz.FullName);
+ SetCacheConcurrencyStrategy(clazz, concurrencyStrategy, clazz);
return this;
}
- internal void SetCacheConcurrencyStrategy(System.Type clazz, string concurrencyStrategy, string region)
+ public void SetCacheConcurrencyStrategy(String clazz, String concurrencyStrategy, String region)
{
SetCacheConcurrencyStrategy(clazz, concurrencyStrategy, region, true);
}
- internal void SetCacheConcurrencyStrategy(System.Type clazz, string concurrencyStrategy,
- string region, bool includeLazy)
+ internal void SetCacheConcurrencyStrategy(String clazz, String concurrencyStrategy, String region, bool includeLazy)
{
- RootClass rootClass = GetRootClassMapping(clazz);
+ RootClass rootClass = GetRootClassMapping(StringHelper.GetFullClassname(clazz));
+ if (rootClass == null)
+ {
+ throw new HibernateConfigException("Cannot cache an unknown entity: " + clazz);
+ }
rootClass.CacheConcurrencyStrategy = concurrencyStrategy;
rootClass.CacheRegionName = region;
rootClass.SetLazyPropertiesCacheable(includeLazy);
}
+
/// <summary>
/// Set up a cache for a collection role
/// </summary>
- public Configuration SetCacheConcurrencyStrategy(string collectionRole, string concurrencyStrategy)
+ public Configuration SetCollectionCacheConcurrencyStrategy(string collectionRole, string concurrencyStrategy)
{
- SetCacheConcurrencyStrategy(collectionRole, concurrencyStrategy, collectionRole);
+ SetCollectionCacheConcurrencyStrategy(collectionRole, concurrencyStrategy, collectionRole);
return this;
}
- internal void SetCacheConcurrencyStrategy(string collectionRole, string concurrencyStrategy, string region)
+ internal void SetCollectionCacheConcurrencyStrategy(string collectionRole, string concurrencyStrategy, string region)
{
NHibernate.Mapping.Collection collection = GetCollectionMapping(collectionRole);
collection.CacheConcurrencyStrategy = concurrencyStrategy;
@@ -1613,7 +1621,7 @@
else
{
object[] listeners =
- (object[]) System.Array.CreateInstance(eventListeners.GetListenerClassFor(type), listenerClasses.Length);
+ (object[])System.Array.CreateInstance(eventListeners.GetListenerClassFor(type), listenerClasses.Length);
for (int i = 0; i < listeners.Length; i++)
{
try
@@ -1657,88 +1665,88 @@
switch (type)
{
case ListenerType.Autoflush:
- eventListeners.AutoFlushEventListeners = new IAutoFlushEventListener[] { };
+ eventListeners.AutoFlushEventListeners = new IAutoFlushEventListener[] { };
break;
case ListenerType.Merge:
- eventListeners.MergeEventListeners = new IMergeEventListener[] { };
+ eventListeners.MergeEventListeners = new IMergeEventListener[] { };
break;
case ListenerType.Create:
- eventListeners.PersistEventListeners = new IPersistEventListener[] { };
+ eventListeners.PersistEventListeners = new IPersistEventListener[] { };
break;
case ListenerType.CreateOnFlush:
- eventListeners.PersistOnFlushEventListeners = new IPersistEventListener[] { };
+ eventListeners.PersistOnFlushEventListeners = new IPersistEventListener[] { };
break;
case ListenerType.Delete:
- eventListeners.DeleteEventListeners = new IDeleteEventListener[] { };
+ eventListeners.DeleteEventListeners = new IDeleteEventListener[] { };
break;
case ListenerType.DirtyCheck:
- eventListeners.DirtyCheckEventListeners = new IDirtyCheckEventListener[] { };
+ eventListeners.DirtyCheckEventListeners = new IDirtyCheckEventListener[] { };
break;
case ListenerType.Evict:
- eventListeners.EvictEventListeners = new IEvictEventListener[] { };
+ eventListeners.EvictEventListeners = new IEvictEventListener[] { };
break;
case ListenerType.Flush:
- eventListeners.FlushEventListeners = new IFlushEventListener[] { };
+ eventListeners.FlushEventListeners = new IFlushEventListener[] { };
break;
case ListenerType.FlushEntity:
- eventListeners.FlushEntityEventListeners = new IFlushEntityEventListener[] { };
+ eventListeners.FlushEntityEventListeners = new IFlushEntityEventListener[] { };
break;
case ListenerType.Load:
- eventListeners.LoadEventListeners = new ILoadEventListener[] { };
+ eventListeners.LoadEventListeners = new ILoadEventListener[] { };
break;
case ListenerType.LoadCollection:
- eventListeners.InitializeCollectionEventListeners = new IInitializeCollectionEventListener[] { };
+ eventListeners.InitializeCollectionEventListeners = new IInitializeCollectionEventListener[] { };
break;
case ListenerType.Lock:
- eventListeners.LockEventListeners = new ILockEventListener[] { };
+ eventListeners.LockEventListeners = new ILockEventListener[] { };
break;
case ListenerType.Refresh:
- eventListeners.RefreshEventListeners = new IRefreshEventListener[] { };
+ eventListeners.RefreshEventListeners = new IRefreshEventListener[] { };
break;
case ListenerType.Replicate:
- eventListeners.ReplicateEventListeners = new IReplicateEventListener[] { };
+ eventListeners.ReplicateEventListeners = new IReplicateEventListener[] { };
break;
case ListenerType.SaveUpdate:
- eventListeners.SaveOrUpdateEventListeners = new ISaveOrUpdateEventListener[] { };
+ eventListeners.SaveOrUpdateEventListeners = new ISaveOrUpdateEventListener[] { };
break;
case ListenerType.Save:
- eventListeners.SaveEventListeners = new ISaveOrUpdateEventListener[] { };
+ eventListeners.SaveEventListeners = new ISaveOrUpdateEventListener[] { };
break;
case ListenerType.PreUpdate:
- eventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] { };
+ eventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[] { };
break;
case ListenerType.Update:
- eventListeners.UpdateEventListeners = new ISaveOrUpdateEventListener[] { };
+ eventListeners.UpdateEventListeners = new ISaveOrUpdateEventListener[] { };
break;
case ListenerType.PreLoad:
- eventListeners.PreLoadEventListeners = new IPreLoadEventListener[] { };
+ eventListeners.PreLoadEventListeners = new IPreLoadEventListener[] { };
break;
case ListenerType.PreDelete:
- eventListeners.PreDeleteEventListeners = new IPreDeleteEventListener[] { };
+ eventListeners.PreDeleteEventListeners = new IPreDeleteEventListener[] { };
break;
case ListenerType.PreInsert:
- eventListeners.PreInsertEventListeners = new IPreInsertEventListener[] { };
+ eventListeners.PreInsertEventListeners = new IPreInsertEventListener[] { };
break;
case ListenerType.PostLoad:
- eventListeners.PostLoadEventListeners = new IPostLoadEventListener[] { };
+ eventListeners.PostLoadEventListeners = new IPostLoadEventListener[] { };
break;
case ListenerType.PostInsert:
- eventListeners.PostInsertEventListeners = new IPostInsertEventListener[] { };
+ eventListeners.PostInsertEventListeners = new IPostInsertEventListener[] { };
break;
case ListenerType.PostUpdate:
- eventListeners.PostUpdateEventListeners = new IPostUpdateEventListener[] { };
+ eventListeners.PostUpdateEventListeners = new IPostUpdateEventListener[] { };
break;
case ListenerType.PostDelete:
- eventListeners.PostDeleteEventListeners = new IPostDeleteEventListener[] { };
+ eventListeners.PostDeleteEventListeners = new IPostDeleteEventListener[] { };
break;
case ListenerType.PostCommitUpdate:
- eventListeners.PostCommitUpdateEventListeners = new IPostUpdateEventListener[] { };
+ eventListeners.PostCommitUpdateEventListeners = new IPostUpdateEventListener[] { };
break;
case ListenerType.PostCommitInsert:
- eventListeners.PostCommitInsertEventListeners = new IPostInsertEventListener[] { };
+ eventListeners.PostCommitInsertEventListeners = new IPostInsertEventListener[] { };
break;
case ListenerType.PostCommitDelete:
- eventListeners.PostCommitDeleteEventListeners = new IPostDeleteEventListener[] { };
+ eventListeners.PostCommitDeleteEventListeners = new IPostDeleteEventListener[] { };
break;
default:
log.Warn("Unrecognized listener type [" + type + "]");
@@ -1760,88 +1768,88 @@
switch (type)
{
case ListenerType.Autoflush:
- eventListeners.AutoFlushEventListeners = (IAutoFlushEventListener[]) listeners;
+ eventListeners.AutoFlushEventListeners = (IAutoFlushEventListener[])listeners;
break;
case ListenerType.Merge:
- eventListeners.MergeEventListeners = (IMergeEventListener[])listeners;
+ eventListeners.MergeEventListeners = (IMergeEventListener[])listeners;
break;
case ListenerType.Create:
- eventListeners.PersistEventListeners = (IPersistEventListener[])listeners;
+ eventListeners.PersistEventListeners = (IPersistEventListener[])listeners;
break;
case ListenerType.CreateOnFlush:
- eventListeners.PersistOnFlushEventListeners = (IPersistEventListener[])listeners;
+ eventListeners.PersistOnFlushEventListeners = (IPersistEventListener[])listeners;
break;
case ListenerType.Delete:
- eventListeners.DeleteEventListeners = (IDeleteEventListener[])listeners;
+ eventListeners.DeleteEventListeners = (IDeleteEventListener[])listeners;
break;
case ListenerType.DirtyCheck:
- eventListeners.DirtyCheckEventListeners = (IDirtyCheckEventListener[])listeners;
+ eventListeners.DirtyCheckEventListeners = (IDirtyCheckEventListener[])listeners;
break;
case ListenerType.Evict:
- eventListeners.EvictEventListeners = (IEvictEventListener[])listeners;
+ eventListeners.EvictEventListeners = (IEvictEventListener[])listeners;
break;
case ListenerType.Flush:
- eventListeners.FlushEventListeners = (IFlushEventListener[])listeners;
+ eventListeners.FlushEventListeners = (IFlushEventListener[])listeners;
break;
case ListenerType.FlushEntity:
- eventListeners.FlushEntityEventListeners = (IFlushEntityEventListener[])listeners;
+ eventListeners.FlushEntityEventListeners = (IFlushEntityEventListener[])listeners;
break;
case ListenerType.Load:
- eventListeners.LoadEventListeners = (ILoadEventListener[])listeners;
+ eventListeners.LoadEventListeners = (ILoadEventListener[])listeners;
break;
case ListenerType.LoadCollection:
- eventListeners.InitializeCollectionEventListeners = (IInitializeCollectionEventListener[])listeners;
+ eventListeners.InitializeCollectionEventListeners = (IInitializeCollectionEventListener[])listeners;
break;
case ListenerType.Lock:
- eventListeners.LockEventListeners = (ILockEventListener[])listeners;
+ eventListeners.LockEventListeners = (ILockEventListener[])listeners;
break;
case ListenerType.Refresh:
- eventListeners.RefreshEventListeners = (IRefreshEventListener[])listeners;
+ eventListeners.RefreshEventListeners = (IRefreshEventListener[])listeners;
break;
case ListenerType.Replicate:
- eventListeners.ReplicateEventListeners = (IReplicateEventListener[])listeners;
+ eventListeners.ReplicateEventListeners = (IReplicateEventListener[])listeners;
break;
case ListenerType.SaveUpdate:
- eventListeners.SaveOrUpdateEventListeners = (ISaveOrUpdateEventListener[])listeners;
+ eventListeners.SaveOrUpdateEventListeners = (ISaveOrUpdateEventListener[])listeners;
break;
case ListenerType.Save:
- eventListeners.SaveEventListeners = (ISaveOrUpdateEventListener[])listeners;
+ eventListeners.SaveEventListeners = (ISaveOrUpdateEventListener[])listeners;
break;
case ListenerType.PreUpdate:
- eventListeners.PreUpdateEventListeners = (IPreUpdateEventListener[])listeners;
+ eventListeners.PreUpdateEventListeners = (IPreUpdateEventListener[])listeners;
break;
case ListenerType.Update:
- eventListeners.UpdateEventListeners = (ISaveOrUpdateEventListener[])listeners;
+ eventListeners.UpdateEventListeners = (ISaveOrUpdateEventListener[])listeners;
break;
case ListenerType.PreLoad:
- eventListeners.PreLoadEventListeners = (IPreLoadEventListener[])listeners;
+ eventListeners.PreLoadEventListeners = (IPreLoadEventListener[])listeners;
break;
case ListenerType.PreDelete:
- eventListeners.PreDeleteEventListeners = (IPreDeleteEventListener[])listeners;
+ eventListeners.PreDeleteEventListeners = (IPreDeleteEventListener[])listeners;
break;
case ListenerType.PreInsert:
- eventListeners.PreInsertEventListeners = (IPreInsertEventListener[])listeners;
+ eventListeners.PreInsertEventListeners = (IPreInsertEventListener[])listeners;
break;
case ListenerType.PostLoad:
- eventListeners.PostLoadEventListeners = (IPostLoadEventListener[])listeners;
+ eventListeners.PostLoadEventListeners = (IPostLoadEventListener[])listeners;
break;
case ListenerType.PostInsert:
- eventListeners.PostInsertEventListeners = (IPostInsertEventListener[])listeners;
+ eventListeners.PostInsertEventListeners = (IPostInsertEventListener[])listeners;
break;
case ListenerType.PostUpdate:
- eventListeners.PostUpdateEventListeners = (IPostUpdateEventListener[])listeners;
+ eventListeners.PostUpdateEventListeners = (IPostUpdateEventListener[])listeners;
break;
case ListenerType.PostDelete:
- eventListeners.PostDeleteEventListeners = (IPostDeleteEventListener[])listeners;
+ eventListeners.PostDeleteEventListeners = (IPostDeleteEventListener[])listeners;
break;
case ListenerType.PostCommitUpdate:
- eventListeners.PostCommitUpdateEventListeners = (IPostUpdateEventListener[])listeners;
+ eventListeners.PostCommitUpdateEventListeners = (IPostUpdateEventListener[])listeners;
break;
case ListenerType.PostCommitInsert:
- eventListeners.PostCommitInsertEventListeners = (IPostInsertEventListener[])listeners;
+ eventListeners.PostCommitInsertEventListeners = (IPostInsertEventListener[])listeners;
break;
case ListenerType.PostCommitDelete:
- eventListeners.PostCommitDeleteEventListeners = (IPostDeleteEventListener[])listeners;
+ eventListeners.PostCommitDeleteEventListeners = (IPostDeleteEventListener[])listeners;
break;
default:
log.Warn("Unrecognized listener type [" + type + "]");
@@ -1865,7 +1873,7 @@
{
if (table.IsPhysicalTable)
{
- ITableMetadata tableInfo = databaseMetadata.GetTableMetadata(table.Name, table.Schema ?? defaultSchema,
+ ITableMetadata tableInfo = databaseMetadata.GetTableMetadata(table.Name, table.Schema ?? defaultSchema,
table.Catalog ?? defaultCatalog, table.IsQuoted);
if (tableInfo == null)
{
@@ -1897,7 +1905,7 @@
if (fk.HasPhysicalConstraint)
{
bool create = tableInfo == null || (
- tableInfo.GetForeignKeyMetadata(fk.Name) == null &&
+ tableInfo.GetForeignKeyMetadata(fk.Name) == null &&
(!(dialect is MySQLDialect) || tableInfo.GetIndexMetadata(fk.Name) == null)
);
if (create)
@@ -1939,7 +1947,7 @@
if (!pc.IsInherited)
{
IPersistentIdentifierGenerator ig =
- pc.Identifier.CreateIdentifierGenerator(dialect, defaultCatalog, defaultSchema, (RootClass) pc) as
+ pc.Identifier.CreateIdentifierGenerator(dialect, defaultCatalog, defaultSchema, (RootClass)pc) as
IPersistentIdentifierGenerator;
if (ig != null)
@@ -1952,8 +1960,8 @@
if (collection.IsIdentified)
{
IPersistentIdentifierGenerator ig =
- ((IdentifierCollection) collection).Identifier.CreateIdentifierGenerator(dialect, defaultCatalog, defaultSchema,
- null) as IPersistentIdentifierGenerator;
+ ((IdentifierCollection)collection).Identifier.CreateIdentifierGenerator(dialect, defaultCatalog, defaultSchema,
+ null) as IPersistentIdentifierGenerator;
if (ig != null)
generators[ig.GeneratorKey()] = ig;
Modified: trunk/nhibernate/src/NHibernate/Cfg/Environment.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cfg/Environment.cs 2008-07-21 05:23:55 UTC (rev 3643)
+++ trunk/nhibernate/src/NHibernate/Cfg/Environment.cs 2008-07-21 15:21:34 UTC (rev 3644)
@@ -49,8 +49,8 @@
{
Assembly thisAssembly = Assembly.GetExecutingAssembly();
AssemblyInformationalVersionAttribute[] attrs = (AssemblyInformationalVersionAttribute[])
- thisAssembly.GetCustomAttributes(
- typeof(AssemblyInformationalVersionAttribute), false);
+ thisAssembly.GetCustomAttributes(
+ typeof(AssemblyInformationalVersionAttribute), false);
if (attrs != null && attrs.Length > 0)
{
@@ -85,6 +85,9 @@
/// <summary> A default database catalog name to use for unqualified tablenames</summary>
public const string DefaultCatalog = "default_catalog";
+ /// <summary>The EntityMode in which set the Session opened from the SessionFactory.</summary>
+ public const string DefaultEntityMode = "default_entity_mode";
+
public const string ShowSql = "show_sql";
public const string MaxFetchDepth = "max_fetch_depth";
public const string CurrentSessionContextClass = "current_session_context_class";
@@ -192,7 +195,7 @@
if (config == null)
{
- log.Info(string.Format("{0} section not found in application configuration file",CfgXmlHelper.CfgSectionName));
+ log.Info(string.Format("{0} section not found in application configuration file", CfgXmlHelper.CfgSectionName));
return;
}
@@ -246,7 +249,7 @@
/// </remarks>
public static IDictionary<string, string> Properties
{
- get { return new Dictionary<string,string>(GlobalProperties); }
+ get { return new Dictionary<string, string>(GlobalProperties); }
}
[Obsolete]
@@ -293,7 +296,7 @@
{
string defaultBytecodeProvider = "lcg";
string provider = PropertiesHelper.GetString(PropertyBytecodeProvider, properties,
- defaultBytecodeProvider);
+ defaultBytecodeProvider);
log.Info("Bytecode provider name : " + provider);
return BuildBytecodeProvider(provider);
}
Modified: trunk/nhibernate/src/NHibernate/Cfg/MappingsQueueEntry.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cfg/MappingsQueueEntry.cs 2008-07-21 05:23:55 UTC (rev 3643)
+++ trunk/nhibernate/src/NHibernate/Cfg/MappingsQueueEntry.cs 2008-07-21 15:21:34 UTC (rev 3644)
@@ -33,7 +33,8 @@
foreach (ClassExtractor.ClassEntry ce in classEntries)
{
- result.Add(ce.FullClassName);
+ if (ce.FullClassName != null)
+ result.Add(ce.FullClassName);
}
return result;
@@ -69,4 +70,4 @@
get { return containedClassNames; }
}
}
-}
\ No newline at end of file
+}
Modified: trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2008-07-21 05:23:55 UTC (rev 3643)
+++ trunk/nhibernate/src/NHibernate/Cfg/SettingsFactory.cs 2008-07-21 15:21:34 UTC (rev 3644)
@@ -99,12 +99,12 @@
log.Info("Default schema: " + defaultSchema);
if (defaultCatalog != null)
log.Info("Default catalog: " + defaultCatalog);
- settings.DefaultSchemaName=defaultSchema;
- settings.DefaultCatalogName=defaultCatalog;
+ settings.DefaultSchemaName = defaultSchema;
+ settings.DefaultCatalogName = defaultCatalog;
int batchFetchSize = PropertiesHelper.GetInt32(Environment.DefaultBatchFetchSize, properties, 1);
log.Info("Default batch fetch size: " + batchFetchSize);
- settings.DefaultBatchFetchSize= batchFetchSize;
+ settings.DefaultBatchFetchSize = batchFetchSize;
//Statistics and logging:
@@ -126,11 +126,11 @@
settings.QueryTranslatorFactory = CreateQueryTranslatorFactory(properties);
- IDictionary<string, string> querySubstitutions =
- PropertiesHelper.ToDictionary(Environment.QuerySubstitutions, " ,=;:\n\t\r\f", properties);
+ IDictionary<string, string> querySubstitutions = PropertiesHelper.ToDictionary(Environment.QuerySubstitutions,
+ " ,=;:\n\t\r\f", properties);
if (log.IsInfoEnabled)
{
- log.Info("Query language substitutions: " + CollectionPrinter.ToString((IDictionary)querySubstitutions));
+ log.Info("Query language substitutions: " + CollectionPrinter.ToString((IDictionary) querySubstitutions));
}
string autoSchemaExport = PropertiesHelper.GetString(Environment.Hbm2ddlAuto, properties, null);
@@ -169,13 +169,13 @@
if (useQueryCache)
{
- string queryCacheFactoryClassName =
- PropertiesHelper.GetString(Environment.QueryCacheFactory, properties, typeof(StandardQueryCacheFactory).FullName);
+ string queryCacheFactoryClassName = PropertiesHelper.GetString(Environment.QueryCacheFactory, properties,
+ typeof (StandardQueryCacheFactory).FullName);
log.Info("query cache factory: " + queryCacheFactoryClassName);
try
{
- settings.QueryCacheFactory = (IQueryCacheFactory) Activator.CreateInstance(
- ReflectHelper.ClassForName(queryCacheFactoryClassName));
+ settings.QueryCacheFactory =
+ (IQueryCacheFactory) Activator.CreateInstance(ReflectHelper.ClassForName(queryCacheFactoryClassName));
}
catch (Exception cnfe)
{
@@ -200,18 +200,23 @@
{
try
{
- isolation = (IsolationLevel) Enum.Parse(typeof(IsolationLevel), isolationString);
+ isolation = (IsolationLevel) Enum.Parse(typeof (IsolationLevel), isolationString);
log.Info("Using Isolation Level: " + isolation);
}
catch (ArgumentException ae)
{
log.Error("error configuring IsolationLevel " + isolationString, ae);
throw new HibernateException(
- "The isolation level of " + isolationString + " is not a valid IsolationLevel. Please " +
- "use one of the Member Names from the IsolationLevel.", ae);
+ "The isolation level of " + isolationString + " is not a valid IsolationLevel. Please "
+ + "use one of the Member Names from the IsolationLevel.", ae);
}
}
+ EntityMode defaultEntityMode =
+ EntityModeHelper.Parse(PropertiesHelper.GetString(Environment.DefaultEntityMode, properties, "poco"));
+ log.Info("Default entity-mode: " + defaultEntityMode);
+ settings.DefaultEntityMode = defaultEntityMode;
+
bool namedQueryChecking = PropertiesHelper.GetBoolean(Environment.QueryStartupChecking, properties, true);
log.Info("Named query checking : " + EnabledDisabled(namedQueryChecking));
settings.IsNamedQueryStartupCheckingEnabled = namedQueryChecking;
Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs 2008-07-21 05:23:55 UTC (rev 3643)
+++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassBinder.cs 2008-07-21 15:21:34 UTC (rev 3644)
@@ -147,9 +147,11 @@
// IMPORT
// For entities, the EntityName is the key to find a persister
// NH Different behavior: we are using the association between EntityName and its more certain implementation (AssemblyQualifiedName)
- mappings.AddImport(model.MappedClass.AssemblyQualifiedName, model.EntityName);
+ // Dynamic entities have no class, reverts to EntityName. -AK
+ string qualifiedName = model.MappedClass == null ? model.EntityName : model.MappedClass.AssemblyQualifiedName;
+ mappings.AddImport(qualifiedName, model.EntityName);
if (mappings.IsAutoImport && model.EntityName.IndexOf('.') > 0)
- mappings.AddImport(model.MappedClass.AssemblyQualifiedName, StringHelper.Unqualify(model.EntityName));
+ mappings.AddImport(qualifiedName, StringHelper.Unqualify(model.EntityName));
// BATCH SIZE
XmlAttribute batchNode = node.Attributes["batch-size"];
@@ -1175,20 +1177,14 @@
return type;
}
- private static string GetEntityName(XmlNode elem, Mappings model)
+ protected static string GetEntityName(XmlNode elem, Mappings model)
{
string entityName = XmlHelper.GetAttributeValue(elem, "entity-name");
- if (entityName == null)
- {
- XmlAttribute att = elem.Attributes["class"];
+ string className = XmlHelper.GetAttributeValue(elem, "class");
+ entityName = entityName
+ ?? (className == null ? null : StringHelper.GetFullClassname(FullClassName(className, model)));
- return att == null ? null : GetClassName(att.Value, model);
- }
- else
- {
- return entityName;
- }
-
+ return entityName;
}
protected XmlNodeList SelectNodes(XmlNode node, string xpath)
Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassIdBinder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassIdBinder.cs 2008-07-21 05:23:55 UTC (rev 3643)
+++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/ClassIdBinder.cs 2008-07-21 15:21:34 UTC (rev 3644)
@@ -1,10 +1,7 @@
-using System.Collections;
using System.Collections.Generic;
using System.Xml;
-
using NHibernate.Cfg.MappingSchema;
using NHibernate.Mapping;
-using NHibernate.Type;
using NHibernate.Util;
namespace NHibernate.Cfg.XmlHbmBinding
@@ -29,7 +26,7 @@
AddColumns(idSchema, id);
CreateIdentifierProperty(idSchema, rootClass, id);
- VerifiyIdTypeIsValid(id, rootClass.MappedClass.Name);
+ VerifiyIdTypeIsValid(id, rootClass.EntityName);
BindGenerator(idSchema, id);
id.Table.SetIdentifierValue(id);
BindUnsavedValue(idSchema, id);
@@ -61,9 +58,10 @@
if (idSchema.name != null)
{
string access = idSchema.access ?? mappings.DefaultAccess;
- id.SetTypeUsingReflection(rootClass.MappedClass.AssemblyQualifiedName, idSchema.name, access);
+ id.SetTypeUsingReflection(rootClass.MappedClass == null ? null : rootClass.MappedClass.AssemblyQualifiedName,
+ idSchema.name, access);
- Mapping.Property property = new Mapping.Property(id);
+ Property property = new Property(id);
property.Name = idSchema.name;
if (property.Value.Type == null)
@@ -230,4 +228,4 @@
return column;
}
}
-}
\ No newline at end of file
+}
Modified: trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs 2008-07-21 05:23:55 UTC (rev 3643)
+++ trunk/nhibernate/src/NHibernate/Cfg/XmlHbmBinding/CollectionBinder.cs 2008-07-21 15:21:34 UTC (rev 3644)
@@ -451,8 +451,7 @@
private void BindOneToMany(XmlNode node, OneToMany model)
{
- model.ReferencedEntityName = ClassForNameChecked(node.Attributes["class"].Value, mappings,
- "associated class not found: {0}").FullName;
+ model.ReferencedEntityName = GetEntityName(node, mappings);
string notFound = XmlHelper.GetAttributeValue(node, "not-found");
model.IsIgnoreNotFound = "ignore".Equals(notFound);
Modified: trunk/nhibernate/src/NHibernate/Tuple/Entity/EntityMetamodel.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Tuple/Entity/EntityMetamodel.cs 2008-07-21 05:23:55 UTC (rev 3643)
+++ trunk/nhibernate/src/NHibernate/Tuple/Entity/EntityMetamodel.cs 2008-07-21 15:21:34 UTC (rev 3644)
@@ -91,14 +91,15 @@
entityType = TypeFactory.ManyToOne(name);
type = persistentClass.MappedClass;
rootType = persistentClass.RootClazz.MappedClass;
- rootTypeAssemblyQualifiedName = rootType.AssemblyQualifiedName;
+ rootTypeAssemblyQualifiedName = rootType == null ? null : rootType.AssemblyQualifiedName;
- identifierProperty =
- PropertyFactory.BuildIdentifierProperty(persistentClass, sessionFactory.GetIdentifierGenerator(rootName));
+ identifierProperty = PropertyFactory.BuildIdentifierProperty(persistentClass,
+ sessionFactory.GetIdentifierGenerator(rootName));
versioned = persistentClass.IsVersioned;
- bool lazyAvailable = persistentClass.HasPocoRepresentation && FieldInterceptionHelper.IsInstrumented(persistentClass.MappedClass);
+ bool lazyAvailable = persistentClass.HasPocoRepresentation
+ && FieldInterceptionHelper.IsInstrumented(persistentClass.MappedClass);
bool hasLazy = false;
propertySpan = persistentClass.PropertyClosureSpan;
@@ -155,6 +156,7 @@
}
#region temporary
+
bool lazyProperty = prop.IsLazy && lazyAvailable;
if (lazyProperty)
hasLazy = true;
@@ -169,11 +171,13 @@
updateInclusions[i] = DetermineUpdateValueGenerationType(prop, properties[i]);
propertyVersionability[i] = properties[i].IsVersionable;
nonlazyPropertyUpdateability[i] = properties[i].IsUpdateable && !lazyProperty;
- propertyCheckability[i] = propertyUpdateability[i] ||
- (propertyTypes[i].IsAssociationType &&
- ((IAssociationType) propertyTypes[i]).IsAlwaysDirtyChecked);
+ propertyCheckability[i] = propertyUpdateability[i]
+ ||
+ (propertyTypes[i].IsAssociationType
+ && ((IAssociationType) propertyTypes[i]).IsAlwaysDirtyChecked);
cascadeStyles[i] = properties[i].CascadeStyle;
+
#endregion
if (properties[i].IsLazy)
@@ -224,24 +228,23 @@
hasLazyProperties = hasLazy;
if (hasLazyProperties) log.Info("lazy property fetching available for: " + name);
- lazy = persistentClass.IsLazy &&
- (!persistentClass.HasPocoRepresentation || !ReflectHelper.IsFinalClass(persistentClass.ProxyInterface));
+ lazy = persistentClass.IsLazy
+ && (!persistentClass.HasPocoRepresentation || !ReflectHelper.IsFinalClass(persistentClass.ProxyInterface));
mutable = persistentClass.IsMutable;
if (!persistentClass.IsAbstract.HasValue)
{
// legacy behavior (with no abstract attribute specified)
- isAbstract = persistentClass.HasPocoRepresentation &&
- ReflectHelper.IsAbstractClass(persistentClass.MappedClass);
+ isAbstract = persistentClass.HasPocoRepresentation && ReflectHelper.IsAbstractClass(persistentClass.MappedClass);
}
else
{
isAbstract = persistentClass.IsAbstract.Value;
- if (!isAbstract && persistentClass.HasPocoRepresentation &&
- ReflectHelper.IsAbstractClass(persistentClass.MappedClass))
+ if (!isAbstract && persistentClass.HasPocoRepresentation
+ && ReflectHelper.IsAbstractClass(persistentClass.MappedClass))
{
- log.Warn("entity [" + type.FullName +
- "] is abstract-class/interface explicitly mapped as non-abstract; be sure to supply entity-names");
+ log.Warn("entity [" + type.FullName
+ + "] is abstract-class/interface explicitly mapped as non-abstract; be sure to supply entity-names");
}
}
selectBeforeUpdate = persistentClass.SelectBeforeUpdate;
@@ -252,9 +255,7 @@
explicitPolymorphism = persistentClass.IsExplicitPolymorphism;
inherited = persistentClass.IsInherited;
superclass = inherited ? persistentClass.Superclass.EntityName : null;
- superclassType = inherited ?
- persistentClass.Superclass.MappedClass :
- null;
+ superclassType = inherited ? persistentClass.Superclass.MappedClass : null;
hasSubclasses = persistentClass.HasSubclasses;
optimisticLockMode = persistentClass.OptimisticLockMode;
@@ -675,4 +676,4 @@
get { return naturalIdPropertyNumbers; }
}
}
-}
\ No newline at end of file
+}
Modified: trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd
===================================================================
--- trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd 2008-07-21 05:23:55 UTC (rev 3643)
+++ trunk/nhibernate/src/NHibernate/nhibernate-configuration.xsd 2008-07-21 15:21:34 UTC (rev 3644)
@@ -97,6 +97,7 @@
<xs:enumeration value="proxyfactory.factory_class" />
<xs:enumeration value="adonet.factory_class" />
<xs:enumeration value="default_batch_fetch_size" />
+ <xs:enumeration value="default_entity_mode" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
Added: trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Map/Basic/DynamicClassFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Map/Basic/DynamicClassFixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Map/Basic/DynamicClassFixture.cs 2008-07-21 15:21:34 UTC (rev 3644)
@@ -0,0 +1,98 @@
+using System.Collections;
+using System.Collections.Generic;
+using NHibernate.Cfg;
+using NHibernate.Engine;
+using NUnit.Framework;
+
+namespace NHibernate.Test.EntityModeTest.Map.Basic
+{
+ [TestFixture]
+ public class DynamicClassFixture : TestCase
+ {
+ protected override string MappingsAssembly
+ {
+ get { return "NHibernate.Test"; }
+ }
+
+ protected override IList Mappings
+ {
+ get { return new string[] {"EntityModeTest.Map.Basic.ProductLine.hbm.xml"}; }
+ }
+
+ protected override void Configure(Configuration configuration)
+ {
+ configuration.SetProperty(Environment.DefaultEntityMode, EntityModeHelper.ToString(EntityMode.Map));
+ }
+
+ [Test]
+ public void TestLazyDynamicClass()
+ {
+ ITransaction t;
+ using(ISession s = OpenSession())
+ {
+ ISessionImplementor si = (ISessionImplementor) s;
+ Assert.IsTrue(si.EntityMode == EntityMode.Map, "Incorrectly handled default_entity_mode");
+ ISession other = s.GetSession(EntityMode.Poco);
+ other.Close();
+ Assert.IsFalse(other.IsOpen);
+ }
+ IDictionary cars;
+ IList models;
+ using (ISession s = OpenSession())
+ {
+ t = s.BeginTransaction();
+
+ cars = new Hashtable();
+ cars["Description"] = "Cars";
+
+ IDictionary monaro = new Hashtable();
+ monaro["ProductLine"] = cars;
+ monaro["Name"] = "Monaro";
+ monaro["Description"] = "Holden Monaro";
+
+ IDictionary hsv = new Hashtable();
+ hsv["ProductLine"] = cars;
+ hsv["Name"] = "hsv";
+ hsv["Description"] = "Holden hsv";
+
+ models = new List<IDictionary>();
+ models.Add(monaro);
+ models.Add(hsv);
+
+ cars["Models"] = models;
+
+ s.Save("ProductLine", cars);
+ t.Commit();
+ }
+
+ using (ISession s = OpenSession())
+ {
+ t = s.BeginTransaction();
+ cars = (IDictionary) s.CreateQuery("from ProductLine pl order by pl.Description").UniqueResult();
+ models = (IList) cars["Models"];
+ Assert.IsFalse(NHibernateUtil.IsInitialized(models));
+ Assert.AreEqual(2, models.Count);
+ Assert.IsTrue(NHibernateUtil.IsInitialized(models));
+ s.Clear();
+ IList list = s.CreateQuery("from Model m").List();
+ foreach (IDictionary ht in list)
+ {
+ Assert.IsFalse(NHibernateUtil.IsInitialized(ht["ProductLine"]));
+ }
+ IDictionary model = (IDictionary) list[0];
+ Assert.IsTrue(((IList) ((IDictionary) model["ProductLine"])["Models"]).Contains(model));
+ s.Clear();
+
+ t.Commit();
+ }
+
+ using (ISession s = OpenSession())
+ {
+ t = s.BeginTransaction();
+ cars = (IDictionary) s.CreateQuery("from ProductLine pl order by pl.Description").UniqueResult();
+ s.Delete(cars);
+ t.Commit();
+ }
+ }
+ }
+}
\ No newline at end of file
Property changes on: trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Map/Basic/DynamicClassFixture.cs
___________________________________________________________________
Added: svn:mergeinfo
+
Added: trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Map/Basic/ProductLine.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Map/Basic/ProductLine.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Map/Basic/ProductLine.hbm.xml 2008-07-21 15:21:34 UTC (rev 3644)
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" ?>
+
+<!--
+ This mapping demonstrates "dynamic" entities.
+-->
+
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
+ <class entity-name="ProductLine">
+ <id name="Id" column="productId" type="System.Int32">
+ <generator class="native"/>
+ </id>
+ <property name="Description" not-null="true" length="200" type="string"/>
+
+ <bag name="Models" cascade="all" inverse="true">
+ <key column="productId"/>
+ <one-to-many class="Model"/>
+ </bag>
+
+ </class>
+ <class entity-name="Model">
+ <id name="Id" column="modelId" type="System.Int32">
+ <generator class="native"/>
+ </id>
+
+ <property name="Name" not-null="true" length="25" type="string"/>
+ <property name="Description" not-null="true" length="200" type="string"/>
+ <many-to-one name="ProductLine" column="productId" not-null="true" class="ProductLine"/>
+
+ </class>
+
+
+</hibernate-mapping>
Property changes on: trunk/nhibernate/src/NHibernate.Test/EntityModeTest/Map/Basic/ProductLine.hbm.xml
___________________________________________________________________
Added: svn:mergeinfo
+
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj 2008-07-21 05:23:55 UTC (rev 3643)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test-2.0.csproj 2008-07-21 15:21:34 UTC (rev 3644)
@@ -134,6 +134,7 @@
<Compile Include="DynamicEntity\Tuplizer\MyEntityTuplizer.cs" />
<Compile Include="DynamicEntity\Tuplizer\TuplizerDynamicEntity.cs" />
<Compile Include="EngineTest\TypedValueFixture.cs" />
+ <Compile Include="EntityModeTest\Map\Basic\DynamicClassFixture.cs" />
<Compile Include="ExceptionsTest\Group.cs" />
<Compile Include="ExceptionsTest\MSSQLExceptionConverterExample.cs" />
<Compile Include="ExceptionsTest\PropertyAccessExceptionFixture.cs" />
@@ -1360,6 +1361,7 @@
<ItemGroup>
<EmbeddedResource Include="DynamicEntity\Interceptor\Customer.hbm.xml" />
<Content Include="DynamicEntity\package.html" />
+ <EmbeddedResource Include="EntityModeTest\Map\Basic\ProductLine.hbm.xml" />
<EmbeddedResource Include="DynamicEntity\Tuplizer\Customer.hbm.xml" />
</ItemGroup>
<ItemGroup>
Modified: trunk/nhibernate/src/NHibernate.Test/TestCase.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/TestCase.cs 2008-07-21 05:23:55 UTC (rev 3643)
+++ trunk/nhibernate/src/NHibernate.Test/TestCase.cs 2008-07-21 15:21:34 UTC (rev 3644)
@@ -253,7 +253,7 @@
protected ISessionFactoryImplementor Sfi
{
- get { return (ISessionFactoryImplementor) sessions; }
+ get { return sessions; }
}
protected virtual ISession OpenSession()
@@ -278,11 +278,11 @@
foreach (PersistentClass clazz in configuration.ClassMappings)
{
bool hasLob = false;
- foreach (Mapping.Property prop in clazz.PropertyClosureIterator)
+ foreach (Property prop in clazz.PropertyClosureIterator)
{
if (prop.Value.IsSimpleValue)
{
- IType type = ((SimpleValue) prop.Value).Type;
+ IType type = ((SimpleValue)prop.Value).Type;
if (type == NHibernateUtil.BinaryBlob)
{
hasLob = true;
@@ -291,13 +291,13 @@
}
if (!hasLob && !clazz.IsInherited)
{
- configuration.SetCacheConcurrencyStrategy(clazz.MappedClass, CacheConcurrencyStrategy);
+ configuration.SetCacheConcurrencyStrategy(clazz.EntityName, CacheConcurrencyStrategy);
}
}
foreach (Mapping.Collection coll in configuration.CollectionMappings)
{
- configuration.SetCacheConcurrencyStrategy(coll.Role, CacheConcurrencyStrategy);
+ configuration.SetCollectionCacheConcurrencyStrategy(coll.Role, CacheConcurrencyStrategy);
}
}
@@ -320,4 +320,4 @@
#endregion
}
-}
\ No newline at end of file
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|