springnet-commits Mailing List for Spring Framework .NET (Page 51)
Brought to you by:
aseovic,
markpollack
You can subscribe to this list here.
2004 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(33) |
Aug
(163) |
Sep
(491) |
Oct
(289) |
Nov
(336) |
Dec
(84) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2005 |
Jan
(227) |
Feb
(413) |
Mar
(128) |
Apr
(232) |
May
(92) |
Jun
(299) |
Jul
(386) |
Aug
(228) |
Sep
(237) |
Oct
(426) |
Nov
(325) |
Dec
(405) |
2006 |
Jan
(315) |
Feb
(311) |
Mar
(152) |
Apr
(177) |
May
(443) |
Jun
(92) |
Jul
(88) |
Aug
(80) |
Sep
(288) |
Oct
(515) |
Nov
(1049) |
Dec
(440) |
2007 |
Jan
(179) |
Feb
(406) |
Mar
(294) |
Apr
(80) |
May
(432) |
Jun
(242) |
Jul
(452) |
Aug
(710) |
Sep
(206) |
Oct
(240) |
Nov
(65) |
Dec
(227) |
2008 |
Jan
(80) |
Feb
(90) |
Mar
(98) |
Apr
(136) |
May
(101) |
Jun
(12) |
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Mark P. <mar...@us...> - 2007-09-07 01:52:32
|
Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Objects/Factory/Support In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv30194 Modified Files: AbstractAutowireCapableObjectFactory.cs AbstractObjectFactory.cs Log Message: SPRNET-720 - Change ObjectNameAutoProxyCreator default behavior to proxy the product of a IFactoryObject and not the IFactoryObject itself SPRNET-721 - Intercept all target interfaces when using an introduction with ObjectNameAutoProxyCreator Index: AbstractAutowireCapableObjectFactory.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Objects/Factory/Support/AbstractAutowireCapableObjectFactory.cs,v retrieving revision 1.81 retrieving revision 1.82 diff -C2 -d -r1.81 -r1.82 *** AbstractAutowireCapableObjectFactory.cs 28 Aug 2007 14:16:40 -0000 1.81 --- AbstractAutowireCapableObjectFactory.cs 7 Sep 2007 01:52:24 -0000 1.82 *************** *** 2112,2115 **** --- 2112,2129 ---- + /// <summary> + /// Applies the <code>PostProcessAfterInitialization</code> callback of all + /// registered IObjectPostProcessors, giving them a chance to post-process + /// the object obtained from IFactoryObjects (for example, to auto-proxy them) + /// </summary> + /// <param name="instance">The instance obtained from the IFactoryObject.</param> + /// <param name="objectName">Name of the object.</param> + /// <returns>The object instance to expose</returns> + /// <exception cref="ObjectsException">if any post-processing failed.</exception> + protected override object PostProcessObjectFromFactoryObject(object instance, string objectName) + { + return ApplyObjectPostProcessorsAfterInitialization(instance, objectName); + } + #endregion Index: AbstractObjectFactory.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Objects/Factory/Support/AbstractObjectFactory.cs,v retrieving revision 1.70 retrieving revision 1.71 diff -C2 -d -r1.70 -r1.71 *** AbstractObjectFactory.cs 28 Aug 2007 14:16:40 -0000 1.70 --- AbstractObjectFactory.cs 7 Sep 2007 01:52:25 -0000 1.71 *************** *** 226,231 **** public object GetObject(string name, Type requiredType, object[] arguments) { - object instance = null; string objectName = TransformedObjectName(name); // eagerly check singleton cache for manually registered singletons... object sharedInstance = GetSingleton(objectName); --- 226,231 ---- public object GetObject(string name, Type requiredType, object[] arguments) { string objectName = TransformedObjectName(name); + object instance = null; // eagerly check singleton cache for manually registered singletons... object sharedInstance = GetSingleton(objectName); *************** *** 727,731 **** protected virtual object GetObjectForInstance(string name, object instance) { ! string objectName = TransformedObjectName(name); // don't let calling code try to dereference the --- 727,731 ---- protected virtual object GetObjectForInstance(string name, object instance) { ! //string objectName = TransformedObjectName(name); // don't let calling code try to dereference the *************** *** 733,737 **** if (IsFactoryDereference(name) && !(instance is IFactoryObject)) { ! throw new ObjectIsNotAFactoryException(objectName, instance); } --- 733,737 ---- if (IsFactoryDereference(name) && !(instance is IFactoryObject)) { ! throw new ObjectIsNotAFactoryException(TransformedObjectName(name), instance); } *************** *** 744,749 **** --- 744,751 ---- if (!IsFactoryDereference(name)) { + // return object instance from factory... IFactoryObject factory = (IFactoryObject) instance; + string objectName = TransformedObjectName(name); #region Instrumentation *************** *** 756,767 **** #endregion ! try ! { ! instance = factory.GetObject(); ! } ! catch (Exception ex) ! { ! throw new ObjectCreationException("IFactoryObject threw exception on object creation.", ex); ! } if (factory is IConfigurableFactoryObject) --- 758,764 ---- #endregion ! RootObjectDefinition rod = ! (ContainsObjectDefinition(objectName) ? GetMergedObjectDefinition(objectName,true) : null); ! instance = GetObjectFromFactoryObject(factory,objectName, rod); if (factory is IConfigurableFactoryObject) *************** *** 773,777 **** if (log.IsDebugEnabled) { ! log.Debug(string.Format("Factory object with name '{0}' is configurable.", objectName)); } --- 770,774 ---- if (log.IsDebugEnabled) { ! log.Debug(string.Format("Factory object with name '{0}' is configurable.", TransformedObjectName(name))); } *************** *** 788,792 **** if (instance == null) { ! throw new FactoryObjectNotInitializedException(objectName, "Factory object returned null object - " + "possible cause: not fully initialized due to " --- 785,789 ---- if (instance == null) { ! throw new FactoryObjectNotInitializedException(TransformedObjectName(name), "Factory object returned null object - " + "possible cause: not fully initialized due to " *************** *** 801,805 **** log.Debug( string.Format("Calling code asked for IFactoryObject instance for name '{0}'.", ! objectName)); } } --- 798,802 ---- log.Debug( string.Format("Calling code asked for IFactoryObject instance for name '{0}'.", ! TransformedObjectName(name))); } } *************** *** 809,812 **** --- 806,869 ---- /// <summary> + /// Obtain an object to expose from the given IFactoryObject. + /// </summary> + /// <param name="factory">The IFactoryObject instance.</param> + /// <param name="objectName">Name of the object.</param> + /// <param name="rod">The merged object definition.</param> + /// <returns>The object obtained from the IFactoryObject</returns> + /// <exception cref="ObjectCreationException">If IFactoryObject object creation failed.</exception> + private object GetObjectFromFactoryObject(IFactoryObject factory, string objectName, RootObjectDefinition rod) + { + object instance; + + try + { + instance = factory.GetObject(); + } + catch (FactoryObjectNotInitializedException ex) { + throw new ObjectCurrentlyInCreationException("Object Name = " + objectName + ", " + ex, ex); + } + catch (Exception ex) + { + throw new ObjectCreationException("IFactoryObject threw exception on object creation for object with name = " + objectName, ex); + } + + // Do not accept a null value for a FactoryBean that's not fully + // initialized yet: Many FactoryBeans just return null then. + if (instance == null && IsSingletonCurrentlyInCreation(objectName)) { + throw new ObjectCurrentlyInCreationException(objectName, "FactoryObject which is currently in creation returned null from GetObject"); + } + + if (instance != null) + { + try { + instance = PostProcessObjectFromFactoryObject(instance, objectName); + } + catch (Exception ex) { + throw new ObjectCreationException(rod.ResourceDescription, objectName, + "Post-processing of the FactoryObject's object failed", ex); + } + } + + return instance; + } + + /// <summary> + /// Post-process the given object that has been obtained from the FactoryObject. + /// The resulting object will be exposed for object references. + /// </summary> + /// <remarks>The default implementation simply returns the given object + /// as-is. Subclasses may override this, for example, to apply + /// post-processors.</remarks> + /// <param name="instance">The instance obtained from the IFactoryObject.</param> + /// <param name="objectName">Name of the object.</param> + /// <returns>The object instance to expose</returns> + /// <exception cref="ObjectsException">if any post-processing failed.</exception> + protected virtual object PostProcessObjectFromFactoryObject(object instance, string objectName) + { + return instance; + } + + /// <summary> /// Convenience method to pull an <see cref="Spring.Objects.Factory.IFactoryObject"/> /// from this factory. |
From: Mark P. <mar...@us...> - 2007-09-07 01:51:53
|
Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Aop/Aop/Framework/AutoProxy In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv30174/AutoProxy Modified Files: AbstractAutoProxyCreator.cs ObjectNameAutoProxyCreator.cs Log Message: SPRNET-720 - Change ObjectNameAutoProxyCreator default behavior to proxy the product of a IFactoryObject and not the IFactoryObject itself SPRNET-721 - Intercept all target interfaces when using an introduction with ObjectNameAutoProxyCreator Index: AbstractAutoProxyCreator.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Aop/Aop/Framework/AutoProxy/AbstractAutoProxyCreator.cs,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** AbstractAutoProxyCreator.cs 22 Aug 2007 08:49:08 -0000 1.11 --- AbstractAutoProxyCreator.cs 7 Sep 2007 01:51:49 -0000 1.12 *************** *** 25,32 **** using System.Reflection; using AopAlliance.Aop; - using AopAlliance.Intercept; using Common.Logging; using Spring.Aop.Framework.Adapter; - using Spring.Aop.Support; using Spring.Aop.Target; using Spring.Collections; --- 25,30 ---- *************** *** 107,110 **** --- 105,114 ---- private IAdvisorAdapterRegistry advisorAdapterRegistry = GlobalAdvisorAdapterRegistry.Instance; + + /// <summary> + /// + /// </summary> + private bool freezeProxy = false; + /// <summary> /// Names of common interceptors. *************** *** 197,200 **** --- 201,219 ---- } + /// <summary> + /// Set whether or not the proxy should be frozen, preventing advice + /// from being added to it once it is created. + /// </summary> + /// <remarks> + /// <p>Overridden from the super class to prevent the proxy configuration + /// from being frozen before the proxy is created. The default is not frozen. + /// </p> + /// </remarks> + public override bool IsFrozen + { + get { return freezeProxy; } + set { this.freezeProxy = value; } + } + #endregion *************** *** 335,347 **** } - /* - protected virtual bool IsInfrastructureType(object obj, String name) - { - return ((obj is IAdvisor) - || (obj is IAdvice) - || (obj is IAdvisors) - || (obj is AbstractAutoProxyCreator)); - }*/ - /// <summary> /// Determines whether the object is an infrastructure type, --- 354,357 ---- *************** *** 430,437 **** --- 440,462 ---- protected virtual object CreateProxy(Type objectType, string objectName, object[] specificInterceptors, ITargetSource targetSource) { + ProxyFactory proxyFactory = new ProxyFactory(); // copy our properties (proxyTargetClass) inherited from ProxyConfig proxyFactory.CopyFrom(this); + object target = targetSource.GetTarget(); + + + if(!ProxyTargetType) + { + // Must allow for introductions; can't just set interfaces to + // the target's interfaces only. + Type[] targetInterfaceTypes = AopUtils.GetAllInterfaces(target); + foreach (Type interfaceType in targetInterfaceTypes) + { + proxyFactory.AddInterface(interfaceType); + } + } + IAdvisor[] advisors = BuildAdvisors(objectName, specificInterceptors); *************** *** 451,454 **** --- 476,480 ---- CustomizeProxyFactory(proxyFactory); + proxyFactory.IsFrozen = freezeProxy; return proxyFactory.GetProxy(); } Index: ObjectNameAutoProxyCreator.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Aop/Aop/Framework/AutoProxy/ObjectNameAutoProxyCreator.cs,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** ObjectNameAutoProxyCreator.cs 22 Aug 2007 08:49:09 -0000 1.6 --- ObjectNameAutoProxyCreator.cs 7 Sep 2007 01:51:49 -0000 1.7 *************** *** 23,26 **** --- 23,27 ---- using System; using System.Collections; + using Spring.Objects.Factory; using Spring.Util; *************** *** 33,38 **** --- 34,46 ---- /// </summary> /// <remarks> + /// <para> /// Auto proxy creator that identifies objects to proxy via a list of names. /// Checks for direct, "xxx*", "*xxx" and "*xxx*" matches. + /// </para> + /// <para>In case of a IFactoryObject, only the objects created by the + /// FactoryBean will get proxied. If you intend to proxy a IFactoryObject instance itself + /// specify the object name of the IFactoryObject including + /// the factory-object prefix "&" e.g. "&MyFactoryObject". + /// </para> /// </remarks> /// <seealso cref="Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator.SetObjectNames"/> *************** *** 74,84 **** if (objectNames != null) { ! if (objectNames.Contains(name)) ! { ! return PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS; ! } ! ! foreach (string mappedName in objectNames) { if (IsMatch(name, mappedName)) { --- 82,96 ---- if (objectNames != null) { ! for (int i = 0; i < objectNames.Count; i++) { + string mappedName = String.Copy((string) objectNames[i]); + if (typeof (IFactoryObject).IsAssignableFrom(objType)) + { + if (!name.StartsWith(ObjectFactoryUtils.FactoryObjectPrefix)) + { + continue; + } + mappedName = mappedName.Substring(ObjectFactoryUtils.FactoryObjectPrefix.Length); + } if (IsMatch(name, mappedName)) { |
From: Mark P. <mar...@us...> - 2007-09-07 01:51:53
|
Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Aop/Aop/Framework In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv30174 Modified Files: ProxyConfig.cs Log Message: SPRNET-720 - Change ObjectNameAutoProxyCreator default behavior to proxy the product of a IFactoryObject and not the IFactoryObject itself SPRNET-721 - Intercept all target interfaces when using an introduction with ObjectNameAutoProxyCreator Index: ProxyConfig.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Aop/Aop/Framework/ProxyConfig.cs,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** ProxyConfig.cs 2 Aug 2007 04:15:20 -0000 1.12 --- ProxyConfig.cs 7 Sep 2007 01:51:49 -0000 1.13 *************** *** 192,201 **** AssertUtils.ArgumentNotNull(otherConfiguration, "otherConfiguration"); ! this.optimize = otherConfiguration.Optimize; ! this.proxyTargetType = otherConfiguration.ProxyTargetType; ! this.proxyTargetAttributes = otherConfiguration.ProxyTargetAttributes; ! this.exposeProxy = otherConfiguration.ExposeProxy; ! this.frozen = otherConfiguration.IsFrozen; ! this.aopProxyFactory = otherConfiguration.AopProxyFactory; } --- 192,201 ---- AssertUtils.ArgumentNotNull(otherConfiguration, "otherConfiguration"); ! this.optimize = otherConfiguration.optimize; ! this.proxyTargetType = otherConfiguration.proxyTargetType; ! this.proxyTargetAttributes = otherConfiguration.proxyTargetAttributes; ! this.exposeProxy = otherConfiguration.exposeProxy; ! this.frozen = otherConfiguration.frozen; ! this.aopProxyFactory = otherConfiguration.aopProxyFactory; } |
From: Mark P. <mar...@us...> - 2007-09-07 01:03:38
|
Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Services/Web/Services In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv11397 Modified Files: WebServiceProxyFactory.cs Log Message: Fixed exception thrown by logging statement when serviceUri is null. Index: WebServiceProxyFactory.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Services/Web/Services/WebServiceProxyFactory.cs,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** WebServiceProxyFactory.cs 8 Aug 2007 17:48:09 -0000 1.24 --- WebServiceProxyFactory.cs 7 Sep 2007 01:03:30 -0000 1.25 *************** *** 306,310 **** if (LOG.IsDebugEnabled) { ! LOG.Debug(String.Format("Generated client proxy type [{0}] for web service [{1}]", wrapper.FullName, serviceUri.Description)); } --- 306,321 ---- if (LOG.IsDebugEnabled) { ! if (serviceUri != null) ! { ! LOG.Debug( ! String.Format("Generated client proxy type [{0}] for web service [{1}]", wrapper.FullName, ! serviceUri.Description)); ! } ! else if (proxyType != null) ! { ! LOG.Debug( ! String.Format("Generated client proxy type [{0}] for web service based on provided proxy type [{1}]", wrapper.FullName, ! proxyType.FullName)); ! } } |
From: Bruno B. <bb...@us...> - 2007-09-05 18:30:29
|
Update of /cvsroot/springnet/Spring.Net/doc/reference/src In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv27769 Modified Files: webservices.xml Log Message: Minor fix. Index: webservices.xml =================================================================== RCS file: /cvsroot/springnet/Spring.Net/doc/reference/src/webservices.xml,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** webservices.xml 21 Aug 2007 16:08:26 -0000 1.9 --- webservices.xml 5 Sep 2007 18:30:17 -0000 1.10 *************** *** 442,448 **** in order to work.</para> ! <para>The WebServiceProxyFactory also implements the interface, ! Spring.Objects.Factory.IConfigurableFactoryObject, allowing to specify ! configuration for the product that the WebServiceProxyFactoryCreates. This is done by specifying the ProductTemplate property. This is particularly useful for securing the web service. An example is shown --- 442,449 ---- in order to work.</para> ! <para>The <classname>WebServiceProxyFactory</classname> also implements the interface, ! <classname>Spring.Objects.Factory.IConfigurableFactoryObject</classname>, ! allowing to specify configuration for the product that the ! <classname>WebServiceProxyFactory</classname> creates. This is done by specifying the ProductTemplate property. This is particularly useful for securing the web service. An example is shown |
From: Erich E. <oak...@us...> - 2007-09-04 13:59:54
|
Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Context/Support In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv30849/Context/Support Modified Files: AbstractMessageSource.cs Log Message: fixed final missing comments Index: AbstractMessageSource.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Context/Support/AbstractMessageSource.cs,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** AbstractMessageSource.cs 27 Aug 2007 09:38:28 -0000 1.22 --- AbstractMessageSource.cs 28 Aug 2007 14:16:15 -0000 1.23 *************** *** 61,65 **** #region Fields ! /** Logger available to subclasses */ protected readonly ILog log; --- 61,67 ---- #region Fields ! /// <summary> ! /// holds the logger instance shared with subclasses. ! /// </summary> protected readonly ILog log; |
From: Erich E. <oak...@us...> - 2007-08-31 23:25:53
|
Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Objects/Factory/Config In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv30886/Config Modified Files: ObjectDefinitionVisitor.cs Log Message: fixed final missing comments Index: ObjectDefinitionVisitor.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Objects/Factory/Config/ObjectDefinitionVisitor.cs,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** ObjectDefinitionVisitor.cs 21 Aug 2007 19:28:33 -0000 1.6 --- ObjectDefinitionVisitor.cs 28 Aug 2007 14:16:40 -0000 1.7 *************** *** 173,176 **** --- 173,181 ---- } + /// <summary> + /// Resolves the given value taken from an object definition according to its type + /// </summary> + /// <param name="value">the value to resolve</param> + /// <returns>the resolved value</returns> protected virtual object ResolveValue(object value) { *************** *** 228,231 **** --- 233,239 ---- } + /// <summary> + /// Calls <see cref="ResolveValue"/> for list element. + /// </summary> protected virtual void VisitList(IList listVal) { *************** *** 241,244 **** --- 249,255 ---- } + /// <summary> + /// Calls <see cref="ResolveValue"/> for set element. + /// </summary> protected virtual void VisitSet(ISet setVal) { *************** *** 256,259 **** --- 267,273 ---- } + /// <summary> + /// Calls <see cref="ResolveValue"/> for dictionary's value element. + /// </summary> protected virtual void VisitDictionary(IDictionary dictVal) { *************** *** 274,278 **** } ! protected virtual object ResolveStringValue(string stringValue) { if (variableSource == null) --- 288,301 ---- } ! /// <summary> ! /// Looks up the value of the given variable name in the configured <see cref="IVariableSource"/>. ! /// </summary> ! /// <param name="variableName">The name of the variable to be looked up</param> ! /// <returns> ! /// The value of this variable, as returned from the <see cref="IVariableSource"/> passed ! /// into the constructor <see cref="ObjectDefinitionVisitor(IVariableSource)"/> ! /// </returns> ! /// <exception cref="InvalidOperationException">If no <see cref="IVariableSource"/> has been configured.</exception> ! protected virtual object ResolveStringValue(string variableName) { if (variableSource == null) *************** *** 281,285 **** "of this object into the constructor or override the 'ResolveStringValue' method"); } ! return variableSource.ResolveVariable(stringValue); } --- 304,308 ---- "of this object into the constructor or override the 'ResolveStringValue' method"); } ! return variableSource.ResolveVariable(variableName); } |
From: Mark P. <mar...@us...> - 2007-08-30 20:00:29
|
Update of /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.NHibernate.Tests/Data/NHibernate In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv1722 Modified Files: HibernateTransactionManagerTests.cs Log Message: SPRNET-716 Create new session if thread local storage SessionHolder is marked as SyncrhonizedWithTransaction. SPRNET-717 Add default transaction timeout property on AbstractPlatformTransactionManager Index: HibernateTransactionManagerTests.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.NHibernate.Tests/Data/NHibernate/HibernateTransactionManagerTests.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** HibernateTransactionManagerTests.cs 29 Aug 2007 03:42:26 -0000 1.1 --- HibernateTransactionManagerTests.cs 30 Aug 2007 20:00:21 -0000 1.2 *************** *** 363,379 **** ITransaction transaction = (ITransaction)mocks.CreateMock(typeof(ITransaction)); ! Expect.Call(sessionFactory.OpenSession()).Return(session).Repeat.Twice(); ! Expect.Call(session.Connection).Return(connection); - - Expect.Call(session.BeginTransaction(IsolationLevel.Unspecified)).Return(transaction); - Expect.Call(session.IsOpen).Return(true); - Expect.Call(session.FlushMode).Return(FlushMode.Auto).Repeat.Twice(); - session.Flush(); - LastCall.On(session).Repeat.Twice(); - transaction.Commit(); - LastCall.On(transaction).Repeat.Once(); - Expect.Call(session.Close()).Return(null).Repeat.Twice(); mocks.ReplayAll(); --- 363,381 ---- ITransaction transaction = (ITransaction)mocks.CreateMock(typeof(ITransaction)); ! //using (mocks.Ordered()) ! //{ ! Expect.Call(sessionFactory.OpenSession()).Return(session).Repeat.Twice(); ! Expect.Call(session.Connection).Return(connection); + Expect.Call(session.BeginTransaction(IsolationLevel.Unspecified)).Return(transaction); + Expect.Call(session.IsOpen).Return(true); + Expect.Call(session.FlushMode).Return(FlushMode.Auto).Repeat.Twice(); + session.Flush(); + LastCall.On(session).Repeat.Twice(); + transaction.Commit(); + LastCall.On(transaction).Repeat.Once(); + Expect.Call(session.Close()).Return(null).Repeat.Twice(); + //} mocks.ReplayAll(); *************** *** 394,397 **** --- 396,497 ---- } + [Test] + public void TransactionWithPropagationSupports() + { + ISessionFactory sessionFactory = (ISessionFactory)mocks.CreateMock(typeof(ISessionFactory)); + ISession session = (ISession)mocks.CreateMock(typeof(ISession)); + + Expect.Call(sessionFactory.OpenSession()).Return(session); + Expect.Call(session.FlushMode).Return(FlushMode.Never); + session.FlushMode = FlushMode.Auto; + LastCall.IgnoreArguments(); + session.Flush(); + LastCall.IgnoreArguments(); + session.FlushMode = FlushMode.Never; + Expect.Call(session.FlushMode).Return(FlushMode.Never); + Expect.Call(session.Close()).Return(null); + + mocks.ReplayAll(); + + + LocalSessionFactoryObjectStub lsfo = new LocalSessionFactoryObjectStub(sessionFactory); + lsfo.AfterPropertiesSet(); + ISessionFactory sfProxy = (ISessionFactory) lsfo.GetObject(); + Assert.IsNotNull(sfProxy); + + HibernateTransactionManager tm = new HibernateTransactionManager(sessionFactory); + TransactionTemplate tt = new TransactionTemplate(tm); + tt.PropagationBehavior = TransactionPropagation.Supports; + + Assert.IsTrue(!TransactionSynchronizationManager.HasResource(sessionFactory), "Hasn't thread session"); + + tt.Execute(new TransactionWithPropagationSupportsTxCallback(sessionFactory)); + + Assert.IsTrue(!TransactionSynchronizationManager.HasResource(sessionFactory), "Hasn't thread session"); + + mocks.VerifyAll(); + + } + + [Test] + public void TransactionWithPropagationSupportsAndInnerTransaction() + { + IDbConnection connection = (IDbConnection)mocks.CreateMock(typeof(IDbConnection)); + ISessionFactory sessionFactory = (ISessionFactory)mocks.CreateMock(typeof(ISessionFactory)); + ISession session1 = (ISession)mocks.CreateMock(typeof(ISession)); + ISession session2 = (ISession)mocks.CreateMock(typeof(ISession)); + ITransaction transaction = (ITransaction)mocks.CreateMock(typeof(ITransaction)); + + Expect.Call(sessionFactory.OpenSession()).Return(session1); + Expect.Call(session1.Connection).Return(connection); + Expect.Call(session1.SessionFactory).Return(sessionFactory); + Expect.Call(session1.FlushMode).Return(FlushMode.Auto).Repeat.Twice(); + + session1.Flush(); + LastCall.IgnoreArguments().Repeat.Twice(); + Expect.Call(session1.Close()).Return(null); + + Expect.Call(sessionFactory.OpenSession()).Return(session2); + Expect.Call(session2.Connection).Return(connection).Repeat.Twice(); + Expect.Call(session2.BeginTransaction(IsolationLevel.Unspecified)).Return(transaction); + Expect.Call(session2.FlushMode).Return(FlushMode.Auto); + session2.Flush(); + LastCall.IgnoreArguments(); + Expect.Call(session2.IsOpen).Return(true); + + + transaction.Commit(); + LastCall.On(transaction).Repeat.Once(); + + + Expect.Call(session2.Close()).Return(null); + + mocks.ReplayAll(); + + LocalSessionFactoryObjectStub lsfo = new LocalSessionFactoryObjectStub(sessionFactory); + lsfo.AfterPropertiesSet(); + ISessionFactory sfProxy = (ISessionFactory)lsfo.GetObject(); + Assert.IsNotNull(sfProxy); + + HibernateTransactionManager tm = new HibernateTransactionManager(sessionFactory); + + TransactionTemplate tt = new TransactionTemplate(tm); + tt.PropagationBehavior = TransactionPropagation.Supports; + TransactionTemplate tt2 = new TransactionTemplate(tm); + tt2.PropagationBehavior = TransactionPropagation.Required; + + HibernateTemplate ht = new HibernateTemplate(sessionFactory); + ht.TemplateFlushMode = TemplateFlushMode.Eager; + ht.ExposeNativeSession = true; + + Assert.IsTrue(!TransactionSynchronizationManager.HasResource(sessionFactory), "Hasn't thread session"); + + tt.Execute(new TransactionWithPropagationSupportsAndInnerTransactionTxCallback(tt2, sessionFactory, ht, session1, session2)); + + Assert.IsTrue(!TransactionSynchronizationManager.HasResource(sessionFactory), "Hasn't thread session"); + + mocks.ReplayAll(); + + } } *************** *** 717,719 **** --- 817,932 ---- #endregion + #region Supporting classes for test TransactionWithPropagationSupports + + public class TransactionWithPropagationSupportsTxCallback : ITransactionCallback + { + private ISessionFactory sf; + public TransactionWithPropagationSupportsTxCallback(ISessionFactory sf) + { + + this.sf = sf; + + } + + public object DoInTransaction(ITransactionStatus status) + { + Assert.IsTrue(!TransactionSynchronizationManager.HasResource(sf), "Hasn't thread session"); + Assert.IsTrue(!status.IsNewTransaction, "Is not new transaction"); + + Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly); + Assert.IsFalse(TransactionSynchronizationManager.ActualTransactionActive); + + HibernateTemplate ht = new HibernateTemplate(sf); + ht.TemplateFlushMode = TemplateFlushMode.Eager; + object returnValue = ht.Execute(new HibernateDelegate(Del)); + Assert.IsTrue(TransactionSynchronizationManager.HasResource(sf), "Has thread session"); + return null; + } + + private object Del(ISession session) + { + return null; + } + } + + #endregion + + + #region Supporting classes for test ParticipatingTransactionWithWithNotSupported + + public class TransactionWithPropagationSupportsAndInnerTransactionTxCallback : ITransactionCallback + { + private TransactionTemplate tt; + private ISessionFactory sf; + private HibernateTemplate ht; + private ISession session1; + private ISession session2; + + public TransactionWithPropagationSupportsAndInnerTransactionTxCallback(TransactionTemplate tt, + ISessionFactory sf, HibernateTemplate ht, ISession session1, ISession session2) + { + this.tt = tt; + this.sf = sf; + this.ht = ht; + this.session1 = session1; + this.session2 = session2; + } + + public object DoInTransaction(ITransactionStatus status) + { + Assert.IsTrue(!TransactionSynchronizationManager.HasResource(sf), "Hasn't thread session"); + Assert.IsTrue(!status.IsNewTransaction, "Is not new transaction"); + Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly); + Assert.IsFalse(TransactionSynchronizationManager.ActualTransactionActive); + + ht.Execute(new HibernateDelegate(HibernateDelegate)); + + Assert.IsTrue(TransactionSynchronizationManager.HasResource(sf), "Has thread session"); + + tt.Execute(new PropagationSupportsTxCallback(ht, session2)); + + Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly); + Assert.IsFalse(TransactionSynchronizationManager.ActualTransactionActive); + + return null; + } + + private object HibernateDelegate(ISession session) + { + Assert.AreSame(session1, session); + return null; + } + + public class PropagationSupportsTxCallback : ITransactionCallback + { + private HibernateTemplate ht; + private ISession session2; + + public PropagationSupportsTxCallback(HibernateTemplate ht, ISession session2) + { + this.ht = ht; + this.session2 = session2; + } + + public object DoInTransaction(ITransactionStatus status) + { + return ht.Execute(new HibernateDelegate(HibernateDelegate)); + } + + private object HibernateDelegate(ISession session) + { + Assert.IsFalse(TransactionSynchronizationManager.CurrentTransactionReadOnly); + Assert.IsTrue(TransactionSynchronizationManager.ActualTransactionActive); + Assert.AreSame(session2, session); + return null; + } + } + + + } + + + + #endregion + } \ No newline at end of file |
From: Mark P. <mar...@us...> - 2007-08-30 20:00:13
|
Update of /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.Integration.Tests/Data In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv1368 Modified Files: adoTemplateTests.xml Log Message: SPRNET-716 Create new session if thread local storage SessionHolder is marked as SyncrhonizedWithTransaction. SPRNET-717 Add default transaction timeout property on AbstractPlatformTransactionManager Index: adoTemplateTests.xml =================================================================== RCS file: /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.Integration.Tests/Data/adoTemplateTests.xml,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** adoTemplateTests.xml 7 Aug 2007 19:50:44 -0000 1.5 --- adoTemplateTests.xml 30 Aug 2007 20:00:07 -0000 1.6 *************** *** 17,21 **** <object id="adoTemplate" ! type="Spring.Data.AdoTemplate, Spring.Data"> <property name="DbProvider" ref="DbProvider"/> --- 17,21 ---- <object id="adoTemplate" ! type="Spring.Data.Core.AdoTemplate, Spring.Data"> <property name="DbProvider" ref="DbProvider"/> |
From: Mark P. <mar...@us...> - 2007-08-30 20:00:04
|
Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Transaction/Support In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv1326 Modified Files: AbstractPlatformTransactionManager.cs Log Message: SPRNET-716 Create new session if thread local storage SessionHolder is marked as SyncrhonizedWithTransaction. SPRNET-717 Add default transaction timeout property on AbstractPlatformTransactionManager Index: AbstractPlatformTransactionManager.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Transaction/Support/AbstractPlatformTransactionManager.cs,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** AbstractPlatformTransactionManager.cs 29 Aug 2007 03:42:20 -0000 1.22 --- AbstractPlatformTransactionManager.cs 30 Aug 2007 19:59:56 -0000 1.23 *************** *** 125,128 **** --- 125,129 ---- private bool _nestedTransactionsAllowed; private bool _rollbackOnCommitFailure; + private int _defaultTimeout = DefaultTransactionDefinition.TIMEOUT_DEFAULT; #region Logging Definition *************** *** 186,189 **** --- 187,214 ---- } + + /// <summary> + /// Gets or sets the default timeout that this transaction manager should apply if there + /// is no timeout specified at the transaction level, in seconds. + /// </summary> + /// <remarks>Returns DefaultTransactionDefinition.TIMEOUT_DEFAULT to indicate the + /// underlying transaction infrastructure's default timeout.</remarks> + /// <value>The default timeout.</value> + public int DefaultTimeout + { + get + { + return _defaultTimeout; + } + set + { + if (_defaultTimeout < DefaultTransactionDefinition.TIMEOUT_DEFAULT) + { + throw new InvalidTimeoutException("Invalid default timeout", _defaultTimeout); + } + _defaultTimeout = value; + } + } + #endregion *************** *** 474,478 **** definition.PropagationBehavior == TransactionPropagation.Nested) { ! object suspendedResources = suspend(null); if (debugEnabled) { --- 499,503 ---- definition.PropagationBehavior == TransactionPropagation.Nested) { ! object suspendedResources = Suspend(null); if (debugEnabled) { *************** *** 481,485 **** DoBegin(transaction, definition); newSynchronization = (_transactionSyncState != TransactionSynchronizationState.Never); ! return newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, suspendedResources); } --- 506,510 ---- DoBegin(transaction, definition); newSynchronization = (_transactionSyncState != TransactionSynchronizationState.Never); ! return NewTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, suspendedResources); } *************** *** 488,492 **** // Create "empty" transaction: no actual transaction, but potentially synchronization. newSynchronization = (_transactionSyncState == TransactionSynchronizationState.Always); ! return newTransactionStatus(definition, null, false, newSynchronization, debugEnabled, null); } --- 513,517 ---- // Create "empty" transaction: no actual transaction, but potentially synchronization. newSynchronization = (_transactionSyncState == TransactionSynchronizationState.Always); ! return NewTransactionStatus(definition, null, false, newSynchronization, debugEnabled, null); } *************** *** 508,515 **** log.Debug("Suspending current transaction"); } ! object suspendedResources = suspend(transaction); bool newSynchronization = (_transactionSyncState == TransactionSynchronizationState.Always); return ! newTransactionStatus(definition, null, false, newSynchronization, debugEnabled, suspendedResources); } --- 533,540 ---- log.Debug("Suspending current transaction"); } ! object suspendedResources = Suspend(transaction); bool newSynchronization = (_transactionSyncState == TransactionSynchronizationState.Always); return ! NewTransactionStatus(definition, null, false, newSynchronization, debugEnabled, suspendedResources); } *************** *** 522,526 **** definition.Name + "]"); } ! object suspendedResources = suspend(transaction); try { --- 547,551 ---- definition.Name + "]"); } ! object suspendedResources = Suspend(transaction); try { *************** *** 531,535 **** try { ! resume(transaction, suspendedResources); } catch (TransactionException resumeEx) --- 556,560 ---- try { ! Resume(transaction, suspendedResources); } catch (TransactionException resumeEx) *************** *** 544,548 **** bool newSynchronization = (_transactionSyncState != TransactionSynchronizationState.Never); return ! newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, suspendedResources); } if (definition.PropagationBehavior == TransactionPropagation.Nested) --- 569,573 ---- bool newSynchronization = (_transactionSyncState != TransactionSynchronizationState.Never); return ! NewTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, suspendedResources); } if (definition.PropagationBehavior == TransactionPropagation.Nested) *************** *** 562,566 **** { DefaultTransactionStatus status = ! newTransactionStatus(definition, transaction, false, false, debugEnabled, null); status.CreateAndHoldSavepoint(DateTime.Now.ToLongTimeString()); return status; --- 587,591 ---- { DefaultTransactionStatus status = ! NewTransactionStatus(definition, transaction, false, false, debugEnabled, null); status.CreateAndHoldSavepoint(DateTime.Now.ToLongTimeString()); return status; *************** *** 570,574 **** DoBegin(transaction, definition); bool newSynchronization = (_transactionSyncState != TransactionSynchronizationState.Never); ! return newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, null); } --- 595,599 ---- DoBegin(transaction, definition); bool newSynchronization = (_transactionSyncState != TransactionSynchronizationState.Never); ! return NewTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, null); } *************** *** 579,583 **** } bool newSynch = (_transactionSyncState != TransactionSynchronizationState.Never); ! return newTransactionStatus(definition, transaction, false, newSynch, debugEnabled, null); } --- 604,608 ---- } bool newSynch = (_transactionSyncState != TransactionSynchronizationState.Never); ! return NewTransactionStatus(definition, transaction, false, newSynch, debugEnabled, null); } *************** *** 641,646 **** try { ! triggerBeforeCommit(status); ! triggerBeforeCompletion(status); beforeCompletionInvoked = true; bool globalRollbackOnly = false; --- 666,671 ---- try { ! TriggerBeforeCommit(status); ! TriggerBeforeCompletion(status); beforeCompletionInvoked = true; bool globalRollbackOnly = false; *************** *** 667,671 **** catch (UnexpectedRollbackException) { ! triggerAfterCompletion(status, TransactionSynchronizationStatus.Rolledback); throw; } --- 692,696 ---- catch (UnexpectedRollbackException) { ! TriggerAfterCompletion(status, TransactionSynchronizationStatus.Rolledback); throw; } *************** *** 678,682 **** else { ! triggerAfterCompletion(status, TransactionSynchronizationStatus.Unknown); } throw; --- 703,707 ---- else { ! TriggerAfterCompletion(status, TransactionSynchronizationStatus.Unknown); } throw; *************** *** 686,690 **** if (!beforeCompletionInvoked) { ! triggerBeforeCompletion(status); } DoRollbackOnCommitException(status, ex); --- 711,715 ---- if (!beforeCompletionInvoked) { ! TriggerBeforeCompletion(status); } DoRollbackOnCommitException(status, ex); *************** *** 695,712 **** try { ! triggerAfterCommit(status); } finally { ! triggerAfterCompletion(status, TransactionSynchronizationStatus.Committed); } } finally { ! cleanupAfterCompletion(status); } } ! private void triggerAfterCommit(DefaultTransactionStatus status) { if (status.NewSynchronization) --- 720,737 ---- try { ! TriggerAfterCommit(status); } finally { ! TriggerAfterCompletion(status, TransactionSynchronizationStatus.Committed); } } finally { ! CleanupAfterCompletion(status); } } ! private void TriggerAfterCommit(DefaultTransactionStatus status) { if (status.NewSynchronization) *************** *** 773,777 **** try { ! triggerBeforeCompletion(status); if (status.HasSavepoint) { --- 798,802 ---- try { ! TriggerBeforeCompletion(status); if (status.HasSavepoint) { *************** *** 808,819 **** catch (Exception) { ! triggerAfterCompletion(status, TransactionSynchronizationStatus.Unknown); throw; } ! triggerAfterCompletion(status, TransactionSynchronizationStatus.Rolledback); } finally { ! cleanupAfterCompletion(status); } } --- 833,844 ---- catch (Exception) { ! TriggerAfterCompletion(status, TransactionSynchronizationStatus.Unknown); throw; } ! TriggerAfterCompletion(status, TransactionSynchronizationStatus.Rolledback); } finally { ! CleanupAfterCompletion(status); } } *************** *** 821,836 **** #endregion ! #region Private Methods ! ! private DefaultTransactionStatus newTransactionStatus(ITransactionDefinition definition, ! object transaction, bool newTransaction, ! bool newSynchronization, bool debug, ! object suspendedResources) { bool actualNewSynchronization = newSynchronization && !TransactionSynchronizationManager.SynchronizationActive; if (actualNewSynchronization) ! { TransactionSynchronizationManager.ActualTransactionActive = (transaction != null); TransactionSynchronizationManager.CurrentTransactionIsolationLevel = --- 846,860 ---- #endregion ! #region Protected Method ! private DefaultTransactionStatus NewTransactionStatus(ITransactionDefinition definition, ! object transaction, bool newTransaction, ! bool newSynchronization, bool debug, ! object suspendedResources) { bool actualNewSynchronization = newSynchronization && !TransactionSynchronizationManager.SynchronizationActive; if (actualNewSynchronization) ! { TransactionSynchronizationManager.ActualTransactionActive = (transaction != null); TransactionSynchronizationManager.CurrentTransactionIsolationLevel = *************** *** 846,871 **** /// <summary> ! /// Create a new TransactionStatus for the given arguments, ! /// initializing transaction synchronization if appropriate. /// </summary> ! private DefaultTransactionStatus newTransactionStatus2(object transaction, bool newTransaction, ! bool newSynchronization, bool readOnly, bool debug, ! object suspendedResources) { ! bool actualNewSynchronization = newSynchronization && ! !TransactionSynchronizationManager.SynchronizationActive; ! if (actualNewSynchronization) { ! ! //TODO setActualTransactionActive and isolation levels ! ! //TransactionSynchronizationManager.CurrentTransactionName = de ! TransactionSynchronizationManager.InitSynchronization(); } ! return ! new DefaultTransactionStatus(transaction, newTransaction, actualNewSynchronization, readOnly, debug, ! suspendedResources); } /// <summary> /// Suspend the given transaction. Suspends transaction synchronization first, --- 870,895 ---- /// <summary> ! /// Determines the timeout to use for the given definition. Will fall back to this manager's default ! /// timeout if the transaction definition doesn't specify a non-default value. /// </summary> ! /// <param name="definition">The transaction definition.</param> ! /// <returns>the actual timeout to use.</returns> ! protected int DetermineTimeout(ITransactionDefinition definition) { ! if (definition.TransactionTimeout != DefaultTransactionDefinition.TIMEOUT_DEFAULT) { ! return definition.TransactionTimeout; } ! return _defaultTimeout; } + #endregion + + #region Private Methods + + + + + /// <summary> /// Suspend the given transaction. Suspends transaction synchronization first, *************** *** 874,878 **** /// <param name="transaction">the current transaction object</param> /// <returns>an object that holds suspended resources</returns> ! private object suspend(object transaction) { if (TransactionSynchronizationManager.SynchronizationActive) --- 898,902 ---- /// <param name="transaction">the current transaction object</param> /// <returns>an object that holds suspended resources</returns> ! private object Suspend(object transaction) { if (TransactionSynchronizationManager.SynchronizationActive) *************** *** 949,953 **** /// <param name="transaction">the current transaction object</param> /// <param name="suspendedResources"> the object that holds suspended resources, as returned by suspend</param> ! private void resume(object transaction, object suspendedResources) { SuspendedResourcesHolder resourcesHolder = (SuspendedResourcesHolder) suspendedResources; --- 973,977 ---- /// <param name="transaction">the current transaction object</param> /// <param name="suspendedResources"> the object that holds suspended resources, as returned by suspend</param> ! private void Resume(object transaction, object suspendedResources) { SuspendedResourcesHolder resourcesHolder = (SuspendedResourcesHolder) suspendedResources; *************** *** 1007,1014 **** //TODO investigate rollback behavior... log.Error("Commit exception overridden by rollback exception", exception); ! triggerAfterCompletion(status, TransactionSynchronizationStatus.Unknown); throw; } ! triggerAfterCompletion(status, TransactionSynchronizationStatus.Rolledback); } --- 1031,1038 ---- //TODO investigate rollback behavior... log.Error("Commit exception overridden by rollback exception", exception); ! TriggerAfterCompletion(status, TransactionSynchronizationStatus.Unknown); throw; } ! TriggerAfterCompletion(status, TransactionSynchronizationStatus.Rolledback); } *************** *** 1017,1021 **** /// </summary> /// <param name="status">object representing the transaction</param> ! private void triggerBeforeCommit(DefaultTransactionStatus status) { if (status.NewSynchronization) --- 1041,1045 ---- /// </summary> /// <param name="status">object representing the transaction</param> ! private void TriggerBeforeCommit(DefaultTransactionStatus status) { if (status.NewSynchronization) *************** *** 1033,1037 **** /// </summary> /// <param name="status">object representing the transaction</param> ! private void triggerBeforeCompletion(DefaultTransactionStatus status) { if (status.NewSynchronization) --- 1057,1061 ---- /// </summary> /// <param name="status">object representing the transaction</param> ! private void TriggerBeforeCompletion(DefaultTransactionStatus status) { if (status.NewSynchronization) *************** *** 1063,1067 **** /// Completion status according to <see cref="Spring.Transaction.Support.TransactionSynchronizationStatus"/> /// </param> ! private void triggerAfterCompletion(DefaultTransactionStatus status, TransactionSynchronizationStatus completionStatus) { if (status.NewSynchronization) --- 1087,1091 ---- /// Completion status according to <see cref="Spring.Transaction.Support.TransactionSynchronizationStatus"/> /// </param> ! private void TriggerAfterCompletion(DefaultTransactionStatus status, TransactionSynchronizationStatus completionStatus) { if (status.NewSynchronization) *************** *** 1103,1107 **** /// </summary> /// <param name="status">object representing the transaction</param> ! private void cleanupAfterCompletion(DefaultTransactionStatus status) { status.Completed = true; --- 1127,1131 ---- /// </summary> /// <param name="status">object representing the transaction</param> ! private void CleanupAfterCompletion(DefaultTransactionStatus status) { status.Completed = true; *************** *** 1120,1124 **** log.Debug("Resuming suspended transaction"); } ! resume(status.Transaction, status.SuspendedResources); } } --- 1144,1148 ---- log.Debug("Resuming suspended transaction"); } ! Resume(status.Transaction, status.SuspendedResources); } } |
From: Mark P. <mar...@us...> - 2007-08-30 20:00:02
|
Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Data/Core In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv1315 Modified Files: AdoPlatformTransactionManager.cs Log Message: SPRNET-716 Create new session if thread local storage SessionHolder is marked as SyncrhonizedWithTransaction. SPRNET-717 Add default transaction timeout property on AbstractPlatformTransactionManager Index: AdoPlatformTransactionManager.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Data/Core/AdoPlatformTransactionManager.cs,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** AdoPlatformTransactionManager.cs 29 Aug 2007 03:42:13 -0000 1.2 --- AdoPlatformTransactionManager.cs 30 Aug 2007 19:59:49 -0000 1.3 *************** *** 182,188 **** txMgrStateObject.ConnectionHolder.TransactionActive = true; ! if (definition.TransactionTimeout != DefaultTransactionDefinition.TIMEOUT_DEFAULT) { ! txMgrStateObject.ConnectionHolder.TimeoutInSeconds = definition.TransactionTimeout; } --- 182,189 ---- txMgrStateObject.ConnectionHolder.TransactionActive = true; ! int timeout = DetermineTimeout(definition); ! if (timeout != DefaultTransactionDefinition.TIMEOUT_DEFAULT) { ! txMgrStateObject.ConnectionHolder.TimeoutInSeconds = timeout; } |
From: Mark P. <mar...@us...> - 2007-08-30 19:59:53
|
Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data.NHibernate/Data/NHibernate In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv1302 Modified Files: HibernateTransactionManager.cs Log Message: SPRNET-716 Create new session if thread local storage SessionHolder is marked as SyncrhonizedWithTransaction. SPRNET-717 Add default transaction timeout property on AbstractPlatformTransactionManager Index: HibernateTransactionManager.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data.NHibernate/Data/NHibernate/HibernateTransactionManager.cs,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** HibernateTransactionManager.cs 29 Aug 2007 03:42:05 -0000 1.3 --- HibernateTransactionManager.cs 30 Aug 2007 19:59:44 -0000 1.4 *************** *** 323,327 **** HibernateTransactionObject txObject = (HibernateTransactionObject) transaction; ! if (DbProvider != null && TransactionSynchronizationManager.HasResource(DbProvider)) { throw new IllegalTransactionStateException( --- 323,328 ---- HibernateTransactionObject txObject = (HibernateTransactionObject) transaction; ! if (DbProvider != null && TransactionSynchronizationManager.HasResource(DbProvider) ! && !txObject.ConnectionHolder.SynchronizedWithTransaction) { throw new IllegalTransactionStateException( *************** *** 335,339 **** { ! if (txObject.SessionHolder == null) { IInterceptor interceptor = EntityInterceptor; --- 336,340 ---- { ! if (txObject.SessionHolder == null || txObject.SessionHolder.SynchronizedWithTransaction) { IInterceptor interceptor = EntityInterceptor; *************** *** 381,388 **** // Register transaction timeout. ! if (definition.TransactionTimeout != DefaultTransactionDefinition.TIMEOUT_DEFAULT) { ! //TODO investigate naming of Deading/TTL...java vs. .net ! txObject.SessionHolder.TimeoutInSeconds = definition.TransactionTimeout; } --- 382,389 ---- // Register transaction timeout. ! int timeout = DetermineTimeout(definition); ! if (timeout != DefaultTransactionDefinition.TIMEOUT_DEFAULT) { ! txObject.SessionHolder.TimeoutInSeconds = timeout; } *************** *** 392,396 **** //investigate passing null for tx. ConnectionHolder conHolder = new ConnectionHolder(con, adoTx); ! if (definition.TransactionTimeout != DefaultTransactionDefinition.TIMEOUT_DEFAULT) { conHolder.TimeoutInMillis = definition.TransactionTimeout; --- 393,397 ---- //investigate passing null for tx. ConnectionHolder conHolder = new ConnectionHolder(con, adoTx); ! if (timeout != DefaultTransactionDefinition.TIMEOUT_DEFAULT) { conHolder.TimeoutInMillis = definition.TransactionTimeout; |
From: Erich E. <oak...@us...> - 2007-08-29 18:33:21
|
Update of /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.Integration.Tests In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv30927/Spring.Data.Integration.Tests Modified Files: Spring.Data.Integration.Tests.2005.csproj Log Message: fixed final missing comments Index: Spring.Data.Integration.Tests.2005.csproj =================================================================== RCS file: /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.Integration.Tests/Spring.Data.Integration.Tests.2005.csproj,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** Spring.Data.Integration.Tests.2005.csproj 22 Aug 2007 08:50:23 -0000 1.20 --- Spring.Data.Integration.Tests.2005.csproj 28 Aug 2007 14:16:53 -0000 1.21 *************** *** 86,93 **** <HintPath>..\..\..\lib\Net\2.0\nunit.framework.dll</HintPath> </Reference> - <Reference Include="Oracle.DataAccess, Version=2.102.2.20, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86"> - <SpecificVersion>False</SpecificVersion> - <HintPath>..\..\..\lib\oracle\2.0\Oracle.DataAccess.dll</HintPath> - </Reference> <Reference Include="System"> <Name>System</Name> --- 86,89 ---- |
From: Erich E. <oak...@us...> - 2007-08-29 18:10:49
|
Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Objects/Factory/Xml In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv30886/Xml Modified Files: NamespaceParserSupport.cs ObjectsNamespaceParser.cs Log Message: fixed final missing comments Index: NamespaceParserSupport.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Objects/Factory/Xml/NamespaceParserSupport.cs,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** NamespaceParserSupport.cs 7 Aug 2007 21:23:37 -0000 1.7 --- NamespaceParserSupport.cs 28 Aug 2007 14:16:40 -0000 1.8 *************** *** 22,25 **** --- 22,26 ---- using System.Xml; using Spring.Objects.Factory.Config; + using Spring.Util; namespace Spring.Objects.Factory.Xml *************** *** 105,110 **** --- 106,116 ---- } + /// <summary> + /// Register the specified <see cref="IObjectDefinitionParser"/> for the given <paramref name="elementName"/> + /// </summary> protected virtual void RegisterObjectDefinitionParser(string elementName, IObjectDefinitionParser parser) { + AssertUtils.ArgumentNotNull(elementName, "elementName"); + AssertUtils.ArgumentNotNull(parser, "parser"); objectParsers[elementName] = parser; } Index: ObjectsNamespaceParser.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Objects/Factory/Xml/ObjectsNamespaceParser.cs,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** ObjectsNamespaceParser.cs 8 Aug 2007 17:47:13 -0000 1.5 --- ObjectsNamespaceParser.cs 28 Aug 2007 14:16:40 -0000 1.6 *************** *** 551,554 **** --- 551,557 ---- } + /// <summary> + /// Parse <see cref="ObjectDefinitionConstants.LookupMethodElement"/> element and add parsed element to <paramref name="overrides"/> + /// </summary> protected void ParseLookupMethodElement( string name, MethodOverrides overrides, XmlElement element, ObjectDefinitionParserHelper parserHelper) *************** *** 573,576 **** --- 576,582 ---- } + /// <summary> + /// Parse <see cref="ObjectDefinitionConstants.ReplacedMethodElement"/> element and add parsed element to <paramref name="overrides"/> + /// </summary> protected void ParseReplacedMethodElement( string name, MethodOverrides overrides, XmlElement element, ObjectDefinitionParserHelper parserHelper) |
From: Erich E. <oak...@us...> - 2007-08-29 18:09:24
|
Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Objects/Factory/Support In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv30886/Support Modified Files: AbstractAutowireCapableObjectFactory.cs AbstractObjectFactory.cs Log Message: fixed final missing comments Index: AbstractAutowireCapableObjectFactory.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Objects/Factory/Support/AbstractAutowireCapableObjectFactory.cs,v retrieving revision 1.80 retrieving revision 1.81 diff -C2 -d -r1.80 -r1.81 *** AbstractAutowireCapableObjectFactory.cs 22 Aug 2007 08:49:39 -0000 1.80 --- AbstractAutowireCapableObjectFactory.cs 28 Aug 2007 14:16:40 -0000 1.81 *************** *** 31,34 **** --- 31,35 ---- using Spring.Core.TypeConversion; using Spring.Core.TypeResolution; + using Spring.Objects; using Spring.Objects.Factory.Config; using Spring.Objects.Support; *************** *** 868,871 **** --- 869,880 ---- } + /// <summary> + /// Creates an <see cref="IObjectWrapper"/> instance from the <see cref="RootObjectDefinition"/> passed in <paramref name="definition"/> + /// using constructor <paramref name="arguments"/> + /// </summary> + /// <param name="name">The name of the object to create - used for error messages.</param> + /// <param name="definition">The <see cref="RootObjectDefinition"/> describing the object to be created.</param> + /// <param name="arguments">optional arguments to pass to the constructor</param> + /// <returns>An <see cref="IObjectWrapper"/> wrapping the already instantiated object</returns> protected IObjectWrapper CreateObjectInstance(string name, RootObjectDefinition definition, object[] arguments) { *************** *** 1840,1843 **** --- 1849,1857 ---- } + /// <summary> + /// Resolve the target type of the passed <see cref="TypedStringValue"/>. + /// </summary> + /// <param name="value">The <see cref="TypedStringValue"/> who's target type is to be resolved</param> + /// <returns>The resolved target type, if any. <see lang="null" /> otherwise.</returns> protected virtual Type ResolveTargetType(TypedStringValue value) { Index: AbstractObjectFactory.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Objects/Factory/Support/AbstractObjectFactory.cs,v retrieving revision 1.69 retrieving revision 1.70 diff -C2 -d -r1.69 -r1.70 *** AbstractObjectFactory.cs 22 Aug 2007 08:49:39 -0000 1.69 --- AbstractObjectFactory.cs 28 Aug 2007 14:16:40 -0000 1.70 *************** *** 174,178 **** } ! protected bool HasInstantiationAwareBeanPostProcessors { --- 174,180 ---- } ! /// <summary> ! /// Returns, whether this object factory instance contains <see cref="IInstantiationAwareObjectPostProcessor"/> objects. ! /// </summary> protected bool HasInstantiationAwareBeanPostProcessors { *************** *** 180,183 **** --- 182,188 ---- } + /// <summary> + /// Returns, whether this object factory instance contains <see cref="IDestructionAwareObjectPostProcessor"/> objects. + /// </summary> protected bool HasDestructionAwareBeanPostProcessors { *************** *** 455,458 **** --- 460,468 ---- } + /// <summary> + /// Ensures, that the given name is prefixed with <see cref="ObjectFactoryUtils.FactoryObjectPrefix"/> + /// if it incidentially already starts with this prefix. This avoids troubles when dereferencing + /// the object name during <see cref="ObjectFactoryUtils.TransformedObjectName"/> + /// </summary> protected string OriginalObjectName(string name) { |
From: Erich E. <oak...@us...> - 2007-08-29 17:30:16
|
Update of /cvsroot/springnet/Spring.Net/test/Spring/Spring.Core.Tests/Core/TypeConversion In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv32118/Core/TypeConversion Modified Files: TimeSpanConverterTests.cs Log Message: switched BaseCacheAttribute to use Spring's TimeSpanConverter Index: TimeSpanConverterTests.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/test/Spring/Spring.Core.Tests/Core/TypeConversion/TimeSpanConverterTests.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** TimeSpanConverterTests.cs 31 Jul 2007 18:21:02 -0000 1.1 --- TimeSpanConverterTests.cs 29 Aug 2007 17:29:41 -0000 1.2 *************** *** 22,25 **** --- 22,26 ---- using System; + using System.Reflection; using NUnit.Framework; |
From: Erich E. <oak...@us...> - 2007-08-29 17:30:07
|
Update of /cvsroot/springnet/Spring.Net/test/Spring/Spring.Core.Tests/Caching In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv32164 Added Files: BaseCacheAttributeTests.cs Log Message: switched BaseCacheAttribute to use Spring's TimeSpanConverter --- NEW FILE: BaseCacheAttributeTests.cs --- (This appears to be a binary file; contents omitted.) |
From: Erich E. <oak...@us...> - 2007-08-29 17:29:49
|
Update of /cvsroot/springnet/Spring.Net/test/Spring/Spring.Core.Tests In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv32118 Modified Files: Spring.Core.Tests.2005.csproj Log Message: switched BaseCacheAttribute to use Spring's TimeSpanConverter Index: Spring.Core.Tests.2005.csproj =================================================================== RCS file: /cvsroot/springnet/Spring.Net/test/Spring/Spring.Core.Tests/Spring.Core.Tests.2005.csproj,v retrieving revision 1.63 retrieving revision 1.64 diff -C2 -d -r1.63 -r1.64 *** Spring.Core.Tests.2005.csproj 25 Aug 2007 16:08:36 -0000 1.63 --- Spring.Core.Tests.2005.csproj 29 Aug 2007 17:29:41 -0000 1.64 *************** *** 116,119 **** --- 116,120 ---- </Compile> <Compile Include="Caching\AbstractCacheTests.cs" /> + <Compile Include="Caching\BaseCacheAttributeTests.cs" /> <Compile Include="Collections\AbstractQueueTests.cs"> <SubType>Code</SubType> |
From: Erich E. <oak...@us...> - 2007-08-29 17:29:47
|
Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Caching In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv31992/Caching Modified Files: BaseCacheAttribute.cs Log Message: switched BaseCacheAttribute to use Spring's TimeSpanConverter Index: BaseCacheAttribute.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Core/Caching/BaseCacheAttribute.cs,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** BaseCacheAttribute.cs 24 Aug 2007 22:43:55 -0000 1.4 --- BaseCacheAttribute.cs 29 Aug 2007 17:29:10 -0000 1.5 *************** *** 1,3 **** --- 1,4 ---- using System; + using Spring.Core.TypeConversion; using Spring.Expressions; *************** *** 14,17 **** --- 15,25 ---- #region Fields + /// <summary> + /// The <see cref="TimeSpanConverter"/> instance used to parse <see cref="TimeSpan"/> values. + /// </summary> + /// <see cref="TimeToLive"/> + /// <see cref="TimeToLiveTimeSpan"/> + protected static readonly TimeSpanConverter TimeSpanConverter = new TimeSpanConverter(); + private string cacheName; private string key; *************** *** 144,148 **** { timeToLive = value; ! timeToLiveTimeSpan = (timeToLive == null) ? TimeSpan.MinValue : TimeSpan.Parse(timeToLive); } } --- 152,156 ---- { timeToLive = value; ! timeToLiveTimeSpan = (timeToLive == null) ? TimeSpan.MinValue : (TimeSpan)TimeSpanConverter.ConvertFrom(timeToLive); } } |
From: Mark P. <mar...@us...> - 2007-08-29 03:42:36
|
Update of /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.Tests/Transaction In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv9768 Modified Files: CommonTypes.cs Log Message: NHibernate unit tests SPRNET-714 - SessionFactory not bound to thread local storage if DbProvider for HibernateTransactionManager is null SPRNET-715 - SpringSessionSynchronization did not close hibernate session with a nested transaction with TransactionPropagation.NotSupported Index: CommonTypes.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.Tests/Transaction/CommonTypes.cs,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** CommonTypes.cs 8 Aug 2007 20:59:55 -0000 1.10 --- CommonTypes.cs 29 Aug 2007 03:42:32 -0000 1.11 *************** *** 13,17 **** public MyMockTxnObject() : this( "MyMockTxnObject" ) {} public MyMockTxnObject( string name ) : base( name ) {} ! public void SetExpectedRollbackOnlyCalls( int calls ) { _isRollbackOnlyCalls.Expected = calls; --- 13,20 ---- public MyMockTxnObject() : this( "MyMockTxnObject" ) {} public MyMockTxnObject( string name ) : base( name ) {} ! ! ! ! public void SetExpectedRollbackOnlyCalls( int calls ) { _isRollbackOnlyCalls.Expected = calls; *************** *** 22,30 **** } #region ISmartTransactionObject Members ! public bool IsRollbackOnly() ! { ! _isRollbackOnlyCalls.Inc(); ! return _isRollbackOnly; ! } #endregion --- 25,37 ---- } #region ISmartTransactionObject Members ! ! public bool RollbackOnly ! { ! get ! { ! _isRollbackOnlyCalls.Inc(); ! return _isRollbackOnly; ! } ! } #endregion *************** *** 45,53 **** #region ISmartTransactionObject Members ! public bool IsRollbackOnly() ! { ! // TODO: Add MyMockTxnObjectSavepointMgr.IsRollbackOnly implementation ! return false; ! } #endregion --- 52,62 ---- #region ISmartTransactionObject Members ! public bool RollbackOnly ! { ! get ! { // TODO: Add MyMockTxnObjectSavepointMgr.IsRollbackOnly implementation ! return false; ! } ! } #endregion |
From: Mark P. <mar...@us...> - 2007-08-29 03:42:34
|
Update of /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.NHibernate.Tests/Data/NHibernate In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv9745/Data/NHibernate Added Files: HibernateTransactionManagerTests.cs Log Message: NHibernate unit tests SPRNET-714 - SessionFactory not bound to thread local storage if DbProvider for HibernateTransactionManager is null SPRNET-715 - SpringSessionSynchronization did not close hibernate session with a nested transaction with TransactionPropagation.NotSupported --- NEW FILE: HibernateTransactionManagerTests.cs --- (This appears to be a binary file; contents omitted.) |
From: Mark P. <mar...@us...> - 2007-08-29 03:42:34
|
Update of /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.NHibernate.Tests In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv9745 Modified Files: Spring.Data.NHibernate.Tests.2005.csproj Log Message: NHibernate unit tests SPRNET-714 - SessionFactory not bound to thread local storage if DbProvider for HibernateTransactionManager is null SPRNET-715 - SpringSessionSynchronization did not close hibernate session with a nested transaction with TransactionPropagation.NotSupported Index: Spring.Data.NHibernate.Tests.2005.csproj =================================================================== RCS file: /cvsroot/springnet/Spring.Net/test/Spring/Spring.Data.NHibernate.Tests/Spring.Data.NHibernate.Tests.2005.csproj,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** Spring.Data.NHibernate.Tests.2005.csproj 22 Aug 2007 20:17:04 -0000 1.3 --- Spring.Data.NHibernate.Tests.2005.csproj 29 Aug 2007 03:42:26 -0000 1.4 *************** *** 85,88 **** --- 85,89 ---- <ItemGroup> <Compile Include="Data\NHibernate\Config\AopConfiguration.cs" /> + <Compile Include="Data\NHibernate\HibernateTransactionManagerTests.cs" /> <Compile Include="Data\NHibernate\ISimpleService.cs" /> <Compile Include="Data\NHibernate\ITestObjectDao.cs" /> |
From: Mark P. <mar...@us...> - 2007-08-29 03:42:26
|
Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Transaction/Support In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv9723 Modified Files: AbstractPlatformTransactionManager.cs DefaultTransactionStatus.cs ISmartTransactionObject.cs Log Message: NHibernate unit tests SPRNET-714 - SessionFactory not bound to thread local storage if DbProvider for HibernateTransactionManager is null SPRNET-715 - SpringSessionSynchronization did not close hibernate session with a nested transaction with TransactionPropagation.NotSupported Index: AbstractPlatformTransactionManager.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Transaction/Support/AbstractPlatformTransactionManager.cs,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** AbstractPlatformTransactionManager.cs 4 Jul 2007 19:57:41 -0000 1.21 --- AbstractPlatformTransactionManager.cs 29 Aug 2007 03:42:20 -0000 1.22 *************** *** 496,500 **** private ITransactionStatus HandleExistingTransaction(ITransactionDefinition definition, object transaction, bool debugEnabled) { ! bool newSynchronization; if (definition.PropagationBehavior == TransactionPropagation.Never) { --- 496,500 ---- private ITransactionStatus HandleExistingTransaction(ITransactionDefinition definition, object transaction, bool debugEnabled) { ! //bool newSynchronization; if (definition.PropagationBehavior == TransactionPropagation.Never) { *************** *** 509,513 **** } object suspendedResources = suspend(transaction); ! newSynchronization = (_transactionSyncState == TransactionSynchronizationState.Always); return newTransactionStatus(definition, null, false, newSynchronization, debugEnabled, --- 509,513 ---- } object suspendedResources = suspend(transaction); ! bool newSynchronization = (_transactionSyncState == TransactionSynchronizationState.Always); return newTransactionStatus(definition, null, false, newSynchronization, debugEnabled, *************** *** 542,546 **** } } ! newSynchronization = (_transactionSyncState != TransactionSynchronizationState.Never); return newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, suspendedResources); --- 542,546 ---- } } ! bool newSynchronization = (_transactionSyncState != TransactionSynchronizationState.Never); return newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, suspendedResources); *************** *** 569,573 **** { DoBegin(transaction, definition); ! newSynchronization = (_transactionSyncState != TransactionSynchronizationState.Never); return newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, null); --- 569,573 ---- { DoBegin(transaction, definition); ! bool newSynchronization = (_transactionSyncState != TransactionSynchronizationState.Never); return newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, null); *************** *** 578,583 **** log.Debug("Participating in existing transaction"); } ! newSynchronization = (_transactionSyncState != TransactionSynchronizationState.Never); ! return newTransactionStatus(definition, transaction, false, newSynchronization, debugEnabled, null); } --- 578,583 ---- log.Debug("Participating in existing transaction"); } ! bool newSynch = (_transactionSyncState != TransactionSynchronizationState.Never); ! return newTransactionStatus(definition, transaction, false, newSynch, debugEnabled, null); } *************** *** 605,609 **** DefaultTransactionStatus defaultStatus = (DefaultTransactionStatus) transactionStatus; ! if (defaultStatus.RollbackOnly) { if (defaultStatus.Debug) --- 605,609 ---- DefaultTransactionStatus defaultStatus = (DefaultTransactionStatus) transactionStatus; ! if (defaultStatus.LocalRollbackOnly) { if (defaultStatus.Debug) *************** *** 611,621 **** log.Debug("Transaction code has requested rollback"); } ! Rollback(transactionStatus); return; } ! else { ! ProcessCommit(defaultStatus); } } --- 611,635 ---- log.Debug("Transaction code has requested rollback"); } ! ProcessRollback(defaultStatus); return; } ! if (defaultStatus.GlobalRollbackOnly) { ! if (defaultStatus.Debug) ! { ! log.Debug("Global transaction is marked as rollback-only but transactional code requested commit"); ! } ! ProcessRollback(defaultStatus); ! // Throw UnexpectedRollbackException only at outermost transaction boundary ! // or if explicitly asked to. ! if (defaultStatus.IsNewTransaction) ! { ! throw new UnexpectedRollbackException( ! "Transaction rolled back because it has been marked as rollback-only"); ! } ! return; } + ProcessCommit(defaultStatus); + } *************** *** 630,633 **** --- 644,652 ---- triggerBeforeCompletion(status); beforeCompletionInvoked = true; + bool globalRollbackOnly = false; + if (status.IsNewTransaction) + { + globalRollbackOnly = status.GlobalRollbackOnly; + } if (status.HasSavepoint) { *************** *** 638,641 **** --- 657,667 ---- DoCommit(status); } + // Throw UnexpectedRollbackException if we have a global rollback-only + // marker but still didn't get a corresponding exception from commit. + if (globalRollbackOnly) + { + throw new UnexpectedRollbackException( + "Transaction silently rolled back because it has been marked as rollback-only"); + } } catch (UnexpectedRollbackException) *************** *** 648,652 **** if (RollbackOnCommitFailure) { ! doRollbackOnCommitException(status, ex); } else --- 674,678 ---- if (RollbackOnCommitFailure) { ! DoRollbackOnCommitException(status, ex); } else *************** *** 662,666 **** triggerBeforeCompletion(status); } ! doRollbackOnCommitException(status, ex); throw; } --- 688,692 ---- triggerBeforeCompletion(status); } ! DoRollbackOnCommitException(status, ex); throw; } *************** *** 766,771 **** else if (status.HasTransaction()) { ! //TODO investigate spring 2.0 changes here. ! if (status.RollbackOnly) { if(status.Debug) --- 792,796 ---- else if (status.HasTransaction()) { ! if (status.LocalRollbackOnly) { if(status.Debug) *************** *** 808,812 **** if (actualNewSynchronization) { ! TransactionSynchronizationManager.ActualTransactionActive = transaction != null; TransactionSynchronizationManager.CurrentTransactionIsolationLevel = definition.TransactionIsolationLevel; --- 833,837 ---- if (actualNewSynchronization) { ! TransactionSynchronizationManager.ActualTransactionActive = (transaction != null); TransactionSynchronizationManager.CurrentTransactionIsolationLevel = definition.TransactionIsolationLevel; *************** *** 957,961 **** /// in case of a rollback error /// </exception> ! private void doRollbackOnCommitException(DefaultTransactionStatus status, Exception exception) { try --- 982,986 ---- /// in case of a rollback error /// </exception> ! private void DoRollbackOnCommitException(DefaultTransactionStatus status, Exception exception) { try *************** *** 969,976 **** --- 994,1010 ---- DoRollback(status); } + else if (status.HasTransaction()) + { + if (status.Debug) + { + log.Debug("Marking existing transaction as rollback-only after commit exception", exception); + } + DoSetRollbackOnly(status); + } } catch (Exception) { //TODO investigate rollback behavior... + log.Error("Commit exception overridden by rollback exception", exception); triggerAfterCompletion(status, TransactionSynchronizationStatus.Unknown); throw; Index: ISmartTransactionObject.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Transaction/Support/ISmartTransactionObject.cs,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** ISmartTransactionObject.cs 18 May 2006 21:37:51 -0000 1.5 --- ISmartTransactionObject.cs 29 Aug 2007 03:42:20 -0000 1.6 *************** *** 40,48 **** public interface ISmartTransactionObject { ! /// <summary> ! /// Return whether the transaction is internally marked as rollback-only. ! /// </summary> ! /// <returns>True of the transaction is marked as rollback-only.</returns> ! bool IsRollbackOnly(); } } --- 40,51 ---- public interface ISmartTransactionObject { ! /// <summary> ! /// Return whether the transaction is internally marked as rollback-only. ! /// </summary> ! /// <returns>True of the transaction is marked as rollback-only.</returns> ! bool RollbackOnly ! { ! get; ! } } } Index: DefaultTransactionStatus.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Transaction/Support/DefaultTransactionStatus.cs,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** DefaultTransactionStatus.cs 12 May 2007 17:49:47 -0000 1.12 --- DefaultTransactionStatus.cs 29 Aug 2007 03:42:20 -0000 1.13 *************** *** 216,222 **** { get { ! return ( _rollbackOnly || ! ((_transaction is ISmartTransactionObject ) && ! (( ISmartTransactionObject)_transaction).IsRollbackOnly())); } set { _rollbackOnly = value; } --- 216,220 ---- { get { ! return ( LocalRollbackOnly || GlobalRollbackOnly); } set { _rollbackOnly = value; } *************** *** 224,227 **** --- 222,248 ---- #endregion + + /// <summary> + /// Determine the rollback-only flag via checking this TransactionStatus. Will only + /// return true if the application set the property RollbackOnly to true on this + /// TransactionStatus object. + /// </summary> + /// <value><c>true</c> if [local rollback only]; otherwise, <c>false</c>.</value> + public bool LocalRollbackOnly + { + get + { + return _rollbackOnly; + } + } + + public bool GlobalRollbackOnly + { + get + { + return ((_transaction is ISmartTransactionObject) && + ((ISmartTransactionObject) _transaction).RollbackOnly); + } + } #region ISavepointManager Members /// <summary> |
From: Mark P. <mar...@us...> - 2007-08-29 03:42:23
|
Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Data/Core In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv9684/Core Modified Files: AdoPlatformTransactionManager.cs Log Message: NHibernate unit tests SPRNET-714 - SessionFactory not bound to thread local storage if DbProvider for HibernateTransactionManager is null SPRNET-715 - SpringSessionSynchronization did not close hibernate session with a nested transaction with TransactionPropagation.NotSupported Index: AdoPlatformTransactionManager.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Data/Core/AdoPlatformTransactionManager.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** AdoPlatformTransactionManager.cs 3 Aug 2007 19:51:11 -0000 1.1 --- AdoPlatformTransactionManager.cs 29 Aug 2007 03:42:13 -0000 1.2 *************** *** 270,274 **** --- 270,293 ---- } + /// <summary> + /// Set the given transaction rollback-only. Only called on rollback + /// if the current transaction takes part in an existing one. + /// </summary> + /// <param name="status">The status representation of the transaction.</param> + /// <exception cref="Spring.Transaction.TransactionException"> + /// In the case of system errors. + /// </exception> + protected override void DoSetRollbackOnly(DefaultTransactionStatus status) + { + DbProviderTransactionObject txMgrStateObject = + (DbProviderTransactionObject)status.Transaction; + if (status.Debug) + { + IDbConnection conn = txMgrStateObject.ConnectionHolder.Connection; + log.Debug("Setting ADO.NET transaction [" + conn + ", " + conn.ConnectionString + "] rollback-only."); + } + txMgrStateObject.SetRollbackOnly(); + } protected override void DoCleanupAfterCompletion(object transaction) { *************** *** 333,337 **** } ! public bool RollbackOnly { get --- 352,361 ---- } ! /// <summary> ! /// Return whether the transaction is internally marked as rollback-only. ! /// </summary> ! /// <value></value> ! /// <returns>True of the transaction is marked as rollback-only.</returns> ! public override bool RollbackOnly { get *************** *** 340,344 **** } } ! } --- 364,368 ---- } } ! } |
From: Mark P. <mar...@us...> - 2007-08-29 03:42:21
|
Update of /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Data/Support In directory sc8-pr-cvs8.sourceforge.net:/tmp/cvs-serv9684/Support Modified Files: AdoTransactionObjectSupport.cs Log Message: NHibernate unit tests SPRNET-714 - SessionFactory not bound to thread local storage if DbProvider for HibernateTransactionManager is null SPRNET-715 - SpringSessionSynchronization did not close hibernate session with a nested transaction with TransactionPropagation.NotSupported Index: AdoTransactionObjectSupport.cs =================================================================== RCS file: /cvsroot/springnet/Spring.Net/src/Spring/Spring.Data/Data/Support/AdoTransactionObjectSupport.cs,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** AdoTransactionObjectSupport.cs 3 Jul 2007 22:32:10 -0000 1.5 --- AdoTransactionObjectSupport.cs 29 Aug 2007 03:42:13 -0000 1.6 *************** *** 25,28 **** --- 25,29 ---- using Common.Logging; using Spring.Transaction; + using Spring.Transaction.Support; #endregion *************** *** 38,42 **** /// <author>Mark Pollack (.NET)</author> /// <version>$Id$</version> ! public abstract class AdoTransactionObjectSupport : ISavepointManager { #region Fields --- 39,43 ---- /// <author>Mark Pollack (.NET)</author> /// <version>$Id$</version> ! public abstract class AdoTransactionObjectSupport : ISavepointManager, ISmartTransactionObject { #region Fields *************** *** 87,91 **** } ! #endregion /// <summary> --- 88,99 ---- } ! /// <summary> ! /// Return whether the transaction is internally marked as rollback-only. ! /// </summary> ! /// <value></value> ! /// <returns>True of the transaction is marked as rollback-only.</returns> ! public abstract bool RollbackOnly { get; } ! ! #endregion /// <summary> *************** *** 115,119 **** /// or <see cref="Spring.Transaction.ISavepointManager.ReleaseSavepoint"/>. /// </returns> ! public void CreateSavepoint(string savepointName) { throw new NotImplementedException(); --- 123,127 ---- /// or <see cref="Spring.Transaction.ISavepointManager.ReleaseSavepoint"/>. /// </returns> ! public virtual void CreateSavepoint(string savepointName) { throw new NotImplementedException(); *************** *** 130,134 **** /// If the rollback failed. /// </exception> ! public void RollbackToSavepoint(string savepoint) { throw new NotImplementedException(); --- 138,142 ---- /// If the rollback failed. /// </exception> ! public virtual void RollbackToSavepoint(string savepoint) { throw new NotImplementedException(); *************** *** 152,159 **** /// If the release failed. /// </exception> ! public void ReleaseSavepoint(string savepoint) { throw new NotImplementedException(); } } } --- 160,169 ---- /// If the release failed. /// </exception> ! public virtual void ReleaseSavepoint(string savepoint) { throw new NotImplementedException(); } + + } } |