Merge branch 'sprnet-1431'
149
.gitignore
vendored
@@ -1,74 +1,75 @@
|
||||
#OS junk files
|
||||
[Tt]humbs.db
|
||||
*.DS_Store
|
||||
|
||||
#Visual Studio files
|
||||
*.user
|
||||
*.aps
|
||||
*.pch
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
*.suo
|
||||
*.bak
|
||||
*.log
|
||||
*.[Cc]ache
|
||||
[Oo]bj
|
||||
[Bb]in
|
||||
[Dd]ebug*/
|
||||
[Rr]elease*/
|
||||
|
||||
#Tooling
|
||||
_ReSharper*/
|
||||
*.resharper
|
||||
[Tt]est[Rr]esult*
|
||||
|
||||
#Project files
|
||||
[Bb]uild/
|
||||
Spring.Net.snk
|
||||
s3-credentials.ps1
|
||||
TIBCO.EMS.*
|
||||
|
||||
#Subversion files
|
||||
.svn
|
||||
|
||||
# Office Temp Files
|
||||
~$*
|
||||
|
||||
#Documentation output
|
||||
doc/reference/target/
|
||||
|
||||
#Packaging Output
|
||||
packages/
|
||||
nuget-packages/
|
||||
|
||||
#Build log and other log files
|
||||
buildlog.txt
|
||||
log.txt*
|
||||
|
||||
# XMLmind temporary files
|
||||
*.xml~
|
||||
|
||||
# web site model pre-compiled files
|
||||
PrecompiledWeb
|
||||
|
||||
*.dotCover
|
||||
/src/Spring/Spring.Aop/Spring.Aop.xml
|
||||
/src/Spring/Spring.Core/Spring.Core.xml
|
||||
/src/Spring/Spring.Data.NHibernate20/Spring.Data.NHibernate20.xml
|
||||
/src/Spring/Spring.Data.NHibernate21/Spring.Data.NHibernate21.xml
|
||||
/src/Spring/Spring.Data.NHibernate30/Spring.Data.NHibernate30.xml
|
||||
/src/Spring/Spring.Data.NHibernate31/Spring.Data.NHibernate31.xml
|
||||
/src/Spring/Spring.Data.NHibernate32/Spring.Data.NHibernate32.xml
|
||||
/src/Spring/Spring.Data.NHibernate33/Spring.Data.NHibernate33.xml
|
||||
/src/Spring/Spring.Messaging.Ems/Spring.Messaging.Ems.xml
|
||||
/src/Spring/Spring.Messaging.Nms/Spring.Messaging.Nms.xml
|
||||
/src/Spring/Spring.Messaging/Spring.Messaging.xml
|
||||
/src/Spring/Spring.Data/Spring.Data.xml
|
||||
/src/Spring/Spring.Web/Spring.Web.xml
|
||||
/src/Spring/Spring.Web.Mvc/Spring.Web.Mvc.xml
|
||||
/src/Spring/Spring.Web.Mvc3/Spring.Web.Mvc3.xml
|
||||
/src/Spring/Spring.Web.Mvc4/Spring.Web.Mvc4.xml
|
||||
/src/Spring/Spring.Testing.NUnit/Spring.Testing.NUnit.xml
|
||||
/src/Spring/Spring.Services/Spring.Services.xml
|
||||
/src/Spring/Spring.Web.Extensions/Spring.Web.Extensions.xml
|
||||
/src/Spring/GenCommonAssemblyInfo.cs
|
||||
#OS junk files
|
||||
[Tt]humbs.db
|
||||
*.DS_Store
|
||||
|
||||
#Visual Studio files
|
||||
*.user
|
||||
*.aps
|
||||
*.pch
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
*.suo
|
||||
*.bak
|
||||
*.log
|
||||
*.[Cc]ache
|
||||
[Oo]bj
|
||||
[Bb]in
|
||||
[Dd]ebug*/
|
||||
[Rr]elease*/
|
||||
|
||||
#Tooling
|
||||
_ReSharper*/
|
||||
*.resharper
|
||||
[Tt]est[Rr]esult*
|
||||
|
||||
#Project files
|
||||
[Bb]uild/
|
||||
Spring.Net.snk
|
||||
s3-credentials.ps1
|
||||
TIBCO.EMS.*
|
||||
|
||||
#Subversion files
|
||||
.svn
|
||||
|
||||
# Office Temp Files
|
||||
~$*
|
||||
|
||||
#Documentation output
|
||||
doc/reference/target/
|
||||
|
||||
#Packaging Output
|
||||
packages/
|
||||
nuget-packages/
|
||||
|
||||
#Build log and other log files
|
||||
buildlog.txt
|
||||
log.txt*
|
||||
|
||||
# XMLmind temporary files
|
||||
*.xml~
|
||||
|
||||
# web site model pre-compiled files
|
||||
PrecompiledWeb
|
||||
|
||||
*.dotCover
|
||||
/src/Spring/Spring.Aop/Spring.Aop.xml
|
||||
/src/Spring/Spring.Core/Spring.Core.xml
|
||||
/src/Spring/Spring.Data.NHibernate20/Spring.Data.NHibernate20.xml
|
||||
/src/Spring/Spring.Data.NHibernate21/Spring.Data.NHibernate21.xml
|
||||
/src/Spring/Spring.Data.NHibernate30/Spring.Data.NHibernate30.xml
|
||||
/src/Spring/Spring.Data.NHibernate31/Spring.Data.NHibernate31.xml
|
||||
/src/Spring/Spring.Data.NHibernate32/Spring.Data.NHibernate32.xml
|
||||
/src/Spring/Spring.Data.NHibernate33/Spring.Data.NHibernate33.xml
|
||||
/src/Spring/Spring.Messaging.Ems/Spring.Messaging.Ems.xml
|
||||
/src/Spring/Spring.Messaging.Nms/Spring.Messaging.Nms.xml
|
||||
/src/Spring/Spring.Messaging/Spring.Messaging.xml
|
||||
/src/Spring/Spring.Data/Spring.Data.xml
|
||||
/src/Spring/Spring.Web/Spring.Web.xml
|
||||
/src/Spring/Spring.Web.Mvc/Spring.Web.Mvc.xml
|
||||
/src/Spring/Spring.Web.Mvc3/Spring.Web.Mvc3.xml
|
||||
/src/Spring/Spring.Web.Mvc4/Spring.Web.Mvc4.xml
|
||||
/src/Spring/Spring.Testing.NUnit/Spring.Testing.NUnit.xml
|
||||
/src/Spring/Spring.Services/Spring.Services.xml
|
||||
/src/Spring/Spring.Web.Extensions/Spring.Web.Extensions.xml
|
||||
/src/Spring/GenCommonAssemblyInfo.cs
|
||||
/.project
|
||||
|
||||
@@ -66,6 +66,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Scheduling.Quartz20.
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Scheduling.Quartz20.Tests.2008", "test\Spring\Spring.Scheduling.Quartz20.Tests\Spring.Scheduling.Quartz20.Tests.2008.csproj", "{47E7DF97-2515-4F2F-BBFD-0A4C205800DE}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Web.Conversation.NHibernate32.2008", "src\Spring\Spring.Web.Conversation.NHibernate32\Spring.Web.Conversation.NHibernate32.2008.csproj", "{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Web.Conversation.NHibernate33.2008", "src\Spring\Spring.Web.Conversation.NHibernate33\Spring.Web.Conversation.NHibernate33.2008.csproj", "{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Web.Conversation.NHibernate32.Tests.2008", "test\Spring\Spring.Web.Conversation.NHibernate32.Tests\Spring.Web.Conversation.NHibernate32.Tests.2008.csproj", "{2FB16852-22AD-4A5B-885A-97136265CC46}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Web.Conversation.NHibernate33.Tests.2008", "test\Spring\Spring.Web.Conversation.NHibernate33.Tests\Spring.Web.Conversation.NHibernate33.Tests.2008.csproj", "{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|.NET = Debug|.NET
|
||||
@@ -244,26 +252,6 @@ Global
|
||||
{4D6D616B-7643-4D6B-8E5E-14ECFDB9AF82}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{4D6D616B-7643-4D6B-8E5E-14ECFDB9AF82}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{4D6D616B-7643-4D6B-8E5E-14ECFDB9AF82}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{E823D54C-CE82-4868-929F-5F95A999F61E}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{E823D54C-CE82-4868-929F-5F95A999F61E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E823D54C-CE82-4868-929F-5F95A999F61E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E823D54C-CE82-4868-929F-5F95A999F61E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{E823D54C-CE82-4868-929F-5F95A999F61E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{E823D54C-CE82-4868-929F-5F95A999F61E}.Release|.NET.ActiveCfg = Release|Any CPU
|
||||
{E823D54C-CE82-4868-929F-5F95A999F61E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E823D54C-CE82-4868-929F-5F95A999F61E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E823D54C-CE82-4868-929F-5F95A999F61E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{E823D54C-CE82-4868-929F-5F95A999F61E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{9FE720ED-2BD9-4FB9-89C8-FFFA4A491CB5}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{9FE720ED-2BD9-4FB9-89C8-FFFA4A491CB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{9FE720ED-2BD9-4FB9-89C8-FFFA4A491CB5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{9FE720ED-2BD9-4FB9-89C8-FFFA4A491CB5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{9FE720ED-2BD9-4FB9-89C8-FFFA4A491CB5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{9FE720ED-2BD9-4FB9-89C8-FFFA4A491CB5}.Release|.NET.ActiveCfg = Release|Any CPU
|
||||
{9FE720ED-2BD9-4FB9-89C8-FFFA4A491CB5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{9FE720ED-2BD9-4FB9-89C8-FFFA4A491CB5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{9FE720ED-2BD9-4FB9-89C8-FFFA4A491CB5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{9FE720ED-2BD9-4FB9-89C8-FFFA4A491CB5}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{AEB1578C-9018-4D49-B440-789F38DD2F29}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{AEB1578C-9018-4D49-B440-789F38DD2F29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{AEB1578C-9018-4D49-B440-789F38DD2F29}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
@@ -404,6 +392,46 @@ Global
|
||||
{47E7DF97-2515-4F2F-BBFD-0A4C205800DE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{47E7DF97-2515-4F2F-BBFD-0A4C205800DE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{47E7DF97-2515-4F2F-BBFD-0A4C205800DE}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Release|.NET.ActiveCfg = Release|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Release|.NET.ActiveCfg = Release|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Release|.NET.ActiveCfg = Release|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Release|.NET.ActiveCfg = Release|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@@ -93,6 +93,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Messaging.Nms.Integr
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Scheduling.Quartz20.Integration.Tests.2010", "test\Spring\Spring.Scheduling.Quartz20.Integration.Tests\Spring.Scheduling.Quartz20.Integration.Tests.2010.csproj", "{8CF0F34A-CC93-4D87-AE14-A2DEEF072F26}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Web.Conversation.NHibernate32.2010", "src\Spring\Spring.Web.Conversation.NHibernate32\Spring.Web.Conversation.NHibernate32.2010.csproj", "{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Web.Conversation.NHibernate33.2010", "src\Spring\Spring.Web.Conversation.NHibernate33\Spring.Web.Conversation.NHibernate33.2010.csproj", "{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Web.Conversation.NHibernate32.Tests.2010", "test\Spring\Spring.Web.Conversation.NHibernate32.Tests\Spring.Web.Conversation.NHibernate32.Tests.2010.csproj", "{2FB16852-22AD-4A5B-885A-97136265CC46}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Web.Conversation.NHibernate33.Tests.2010", "test\Spring\Spring.Web.Conversation.NHibernate33.Tests\Spring.Web.Conversation.NHibernate33.Tests.2010.csproj", "{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(TestCaseManagementSettings) = postSolution
|
||||
CategoryFile = Spring.Net.2010.vsmdi
|
||||
@@ -436,14 +444,10 @@ Global
|
||||
{9C86BC69-DD23-4DCC-B11F-8781BBC887CF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{900E3839-301E-48B1-BAEB-B6645620ACFF}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{900E3839-301E-48B1-BAEB-B6645620ACFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{900E3839-301E-48B1-BAEB-B6645620ACFF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{900E3839-301E-48B1-BAEB-B6645620ACFF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{900E3839-301E-48B1-BAEB-B6645620ACFF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{900E3839-301E-48B1-BAEB-B6645620ACFF}.Release|.NET.ActiveCfg = Release|Any CPU
|
||||
{900E3839-301E-48B1-BAEB-B6645620ACFF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{900E3839-301E-48B1-BAEB-B6645620ACFF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{900E3839-301E-48B1-BAEB-B6645620ACFF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{900E3839-301E-48B1-BAEB-B6645620ACFF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{CB351EB2-049D-40BE-BB09-1CE4ED68FE67}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{CB351EB2-049D-40BE-BB09-1CE4ED68FE67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CB351EB2-049D-40BE-BB09-1CE4ED68FE67}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
@@ -486,14 +490,10 @@ Global
|
||||
{247787CF-ECE1-4675-8B42-7DF4329A4891}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{FA934E92-C8C2-428A-BE2A-26818F17A787}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{FA934E92-C8C2-428A-BE2A-26818F17A787}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{FA934E92-C8C2-428A-BE2A-26818F17A787}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{FA934E92-C8C2-428A-BE2A-26818F17A787}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{FA934E92-C8C2-428A-BE2A-26818F17A787}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{FA934E92-C8C2-428A-BE2A-26818F17A787}.Release|.NET.ActiveCfg = Release|Any CPU
|
||||
{FA934E92-C8C2-428A-BE2A-26818F17A787}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{FA934E92-C8C2-428A-BE2A-26818F17A787}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{FA934E92-C8C2-428A-BE2A-26818F17A787}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{FA934E92-C8C2-428A-BE2A-26818F17A787}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{CD6A49DE-745C-4360-AADF-3539CFEC6639}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{CD6A49DE-745C-4360-AADF-3539CFEC6639}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CD6A49DE-745C-4360-AADF-3539CFEC6639}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
@@ -534,6 +534,46 @@ Global
|
||||
{8CF0F34A-CC93-4D87-AE14-A2DEEF072F26}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{8CF0F34A-CC93-4D87-AE14-A2DEEF072F26}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{8CF0F34A-CC93-4D87-AE14-A2DEEF072F26}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Release|.NET.ActiveCfg = Release|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Release|.NET.ActiveCfg = Release|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Release|.NET.ActiveCfg = Release|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{2FB16852-22AD-4A5B-885A-97136265CC46}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Release|.NET.ActiveCfg = Release|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{C57B05EA-FD1A-40EC-BB60-D2E45AB1A86A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
192
Spring.build
@@ -111,7 +111,13 @@ Commandline Examples:
|
||||
<property name="spring.basedir" value="${project::get-base-directory()}"/>
|
||||
<property name="spring.nonredistdir" value="${spring.basedir}\..\..\nonredist"/>
|
||||
<property name="tool.dir" value="${project::get-base-directory()}\build-support\tools"/>
|
||||
|
||||
|
||||
<!--Support for Windows XP in other languages. In Portuguese, for example, is "c:\Arquivos de Programs"-->
|
||||
<property name="programfiles" value="C:\Program Files"/>
|
||||
<property name="programfilesx86" value="C:\Program Files (x86)"/>
|
||||
<property name="programfiles" value="${environment::get-variable('ProgramFiles')}" failonerror="false"/>
|
||||
<property name="programfilesx86" value="${environment::get-variable('ProgramFiles(x86)')}" failonerror="false"/>
|
||||
|
||||
<!-- build SDK docs with NDoc -->
|
||||
<property name="doc.sdk" value="false"/>
|
||||
|
||||
@@ -411,9 +417,12 @@ Commandline Examples:
|
||||
<nant buildfile="src/Spring/Spring.Scheduling.Quartz20/Spring.Scheduling.Quartz20.build" target="build" if="${build-quartz}"/>
|
||||
<nant buildfile="src/Spring/Spring.Messaging/Spring.Messaging.build" target="build" if="${build-msmq}"/>
|
||||
<nant buildfile="src/Spring/Spring.Template.Velocity/Spring.Template.Velocity.build" target="build" if="${build-velocity}"/>
|
||||
<!--"Spring.ConversationWA.NH*.dll" should be at last to prevent the other assemblies are compiled with reference to this-->
|
||||
<nant buildfile="src/Spring/Spring.Web.Conversation.NHibernate32/Spring.Web.Conversation.NHibernate32.build" target="build" if="${build-conversation}"/>
|
||||
<nant buildfile="src/Spring/Spring.Web.Conversation.NHibernate33/Spring.Web.Conversation.NHibernate33.build" target="build" if="${build-conversation}"/>
|
||||
|
||||
<!-- test assemblies -->
|
||||
|
||||
|
||||
<nant buildfile="test/Spring/Spring.Core.Tests/Spring.Core.Tests.build" target="test"/>
|
||||
<nant buildfile="test/Spring/Spring.Aop.Tests/Spring.Aop.Tests.build" target="test" if="${build-aop}"/>
|
||||
<nant buildfile="test/Spring/Spring.Data.Tests/Spring.Data.Tests.build" target="test" if="${build-data}"/>
|
||||
@@ -438,6 +447,9 @@ Commandline Examples:
|
||||
<nant buildfile="test/Spring/Spring.Scheduling.Quartz20.Tests/Spring.Scheduling.Quartz20.Tests.build" target="test" if="${build-quartz}"/>
|
||||
<nant buildfile="test/Spring/Spring.Messaging.Tests/Spring.Messaging.Tests.build" target="test" if="${build-msmq}"/>
|
||||
<nant buildfile="test/Spring/Spring.Template.Velocity.Tests/Spring.Template.Velocity.Tests.build" target="test" if="${build-velocity}"/>
|
||||
<!--"Spring.ConversationWA.NH*.Tests.dll" should be at last to prevent the other tests are compiled with reference to this-->
|
||||
<nant buildfile="test/Spring/Spring.Web.Conversation.NHibernate32.Tests/Spring.Web.Conversation.NHibernate32.Tests.build" target="test" if="${build-conversation}"/>
|
||||
<nant buildfile="test/Spring/Spring.Web.Conversation.NHibernate33.Tests/Spring.Web.Conversation.NHibernate33.Tests.build" target="test" if="${build-conversation}"/>
|
||||
|
||||
<!-- Main solutions and examples are compiled via task build-solutions -->
|
||||
|
||||
@@ -573,7 +585,7 @@ Commandline Examples:
|
||||
|
||||
<!-- Top level targets -->
|
||||
<!-- target for developers to do just debug build and test everything in CVS -->
|
||||
<target name="test">
|
||||
<target name="test" description="build an test">
|
||||
<echo message="Compiling debug configuration for all runtime configurations."/>
|
||||
<property name="nant.target.root.name" value="build"/>
|
||||
<call target="build-all-function"/>
|
||||
@@ -615,7 +627,7 @@ Commandline Examples:
|
||||
</if>
|
||||
</target>
|
||||
|
||||
<target name="build-mono-2.0">
|
||||
<target name="build-mono-2.0" if="false">
|
||||
|
||||
<if test="${property::exists('project.build.package') and project.build.package}">
|
||||
<call target="set-release-build-configuration"/>
|
||||
@@ -646,7 +658,7 @@ Commandline Examples:
|
||||
failonerror="false"/>
|
||||
</target>
|
||||
|
||||
<target name="clean-obj">
|
||||
<target name="clean-obj" description="Clean all 'obj' and 'bin' folders">
|
||||
<delete dir="src/Spring/Spring.Aop/obj" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Aop/bin" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Core/obj" failonerror="false"/>
|
||||
@@ -674,9 +686,32 @@ Commandline Examples:
|
||||
<delete dir="src/Spring/Spring.Testing.Microsoft/obj" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Testing.Microsoft/bin" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Web/obj" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Web.Conversation.NHibernate32/obj" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Web.Conversation.NHibernate32/bin" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Web/bin" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Web.Extensions/obj" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Web.Extensions/bin" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Web.Mvc/obj" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Web.Mvc/bin" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Web.Mvc3/obj" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Web.Mvc3/bin" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Web.Mvc4/obj" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Web.Mvc4/bin" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Web.Conversation.NHibernate32/obj" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Web.Conversation.NHibernate32/bin" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Web.Conversation.NHibernate33/obj" failonerror="false"/>
|
||||
<delete dir="src/Spring/Spring.Web.Conversation.NHibernate33/bin" failonerror="false"/>
|
||||
|
||||
<delete dir="test/Spring/Spring.Messaging.Ems.Integration.Tests/obj" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Messaging.Ems.Integration.Tests/bin" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/obj" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/bin" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Web.Mvc.Tests/obj" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Web.Mvc.Tests/bin" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Web.Mvc3.Tests/obj" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Web.Mvc3.Tests/bin" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Web.Mvc4.Tests/obj" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Web.Mvc4.Tests/bin" failonerror="false"/>
|
||||
|
||||
<delete dir="test/Spring/Spring.Aop.Tests/obj" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Aop.Tests/bin" failonerror="false"/>
|
||||
@@ -714,6 +749,43 @@ Commandline Examples:
|
||||
<delete dir="test/Spring/Spring.Testing.Microsoft.Tests/bin" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Testing.NUnit.Tests/obj" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Testing.NUnit.Tests/bin" failonerror="false"/>
|
||||
|
||||
<delete failonerror="false">
|
||||
<fileset basedir="test/Spring/Spring.Web.Conversation.NHibernate32.Tests/Data/Spring/ConversationWA/WebConversationStateTest/Bin">
|
||||
<include name="*.dll"/>
|
||||
<include name="*.xml"/>
|
||||
<include name="*.pdb"/>
|
||||
</fileset>
|
||||
</delete>
|
||||
<delete failonerror="false">
|
||||
<fileset basedir="test/Spring/Spring.Web.Conversation.NHibernate33.Tests/Data/Spring/ConversationWA/WebConversationStateTest/Bin">
|
||||
<include name="*.dll"/>
|
||||
<include name="*.xml"/>
|
||||
<include name="*.pdb"/>
|
||||
</fileset>
|
||||
</delete>
|
||||
<delete dir="test/Spring/Spring.Messaging.Ems.Integration.Tests/bin" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Messaging.Ems.Integration.Tests/obj" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/bin" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Scheduling.Quartz20.Integration.Tests/obj" failonerror="false"/>
|
||||
<delete failonerror="false">
|
||||
<fileset basedir="test/Spring/Spring.Services.Tests/Data/Spring/WindowsService/Cassini/wwwroot/bin">
|
||||
<include name="*.dll"/>
|
||||
<include name="*.xml"/>
|
||||
<include name="*.pdb"/>
|
||||
</fileset>
|
||||
</delete>
|
||||
<delete dir="test/Spring/Spring.Web.Mvc.Tests/obj" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Web.Mvc.Tests/bin" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Web.Mvc3.Tests/obj" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Web.Mvc3.Tests/bin" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Web.Mvc4.Tests/obj" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Web.Mvc4.Tests/bin" failonerror="false"/>
|
||||
|
||||
<delete dir="test/Spring/Spring.Web.Conversation.NHibernate32.Tests/obj" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Web.Conversation.NHibernate32.Tests/bin" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Web.Conversation.NHibernate33.Tests/obj" failonerror="false"/>
|
||||
<delete dir="test/Spring/Spring.Web.Conversation.NHibernate33.Tests/bin" failonerror="false"/>
|
||||
|
||||
<delete dir="examples/Spring/Spring.CachingQuickStart/src/Spring.CachingQuickStart.Web/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.CachingQuickStart/src/Spring.CachingQuickStart.Web/obj" failonerror="false"/>
|
||||
@@ -744,6 +816,100 @@ Commandline Examples:
|
||||
<delete dir="examples/Spring/SpringAir/test/SpringAir.Core.Tests/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/SpringAir/test/SpringAir.Data.Ado.Tests/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/SpringAir/test/SpringAir.Data.Ado.Tests/bin" failonerror="false"/>
|
||||
|
||||
<delete dir="examples/Spring/Spring.AopQuickStart/src/Spring.AopQuickStart.Common/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.AopQuickStart/src/Spring.AopQuickStart.Common/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.AopQuickStart/src/Spring.AopQuickStart.Step1/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.AopQuickStart/src/Spring.AopQuickStart.Step1/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.AopQuickStart/src/Spring.AopQuickStart.Step2/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.AopQuickStart/src/Spring.AopQuickStart.Step2/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.AopQuickStart/src/Spring.AopQuickStart.Step3/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.AopQuickStart/src/Spring.AopQuickStart.Step3/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.AopQuickStart/src/Spring.AopQuickStart.Step4/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.AopQuickStart/src/Spring.AopQuickStart.Step4/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.AopQuickStart/src/Spring.AopQuickStart.Step5/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.AopQuickStart/src/Spring.AopQuickStart.Step5/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.AopQuickStart/src/Spring.AopQuickStart.Step6/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.AopQuickStart/src/Spring.AopQuickStart.Step6/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.AopQuickStart/src/Spring.AopQuickStart.Step7/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.AopQuickStart/src/Spring.AopQuickStart.Step7/obj" failonerror="false"/>
|
||||
<delete failonerror="false">
|
||||
<fileset basedir="examples/Spring/Spring.Calculator/src/Spring.Calculator.Web.2005/Bin">
|
||||
<include name="*.dll"/>
|
||||
<include name="*.xml"/>
|
||||
<include name="*.pdb"/>
|
||||
</fileset>
|
||||
</delete>
|
||||
<delete failonerror="false">
|
||||
<fileset basedir="examples/Spring/Spring.Calculator/src/Spring.Calculator.Web.2005/Bin">
|
||||
<include name="*.dll"/>
|
||||
<include name="*.xml"/>
|
||||
<include name="*.pdb"/>
|
||||
</fileset>
|
||||
</delete>
|
||||
<delete dir="examples/Spring/Spring.DataQuickStart/src/Spring/Spring.DataQuickStart/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.DataQuickStart/test/Spring/Spring.DataQuickStart.Tests/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.IoCQuickStart.AppContext/src/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.IoCQuickStart.AppContext/src/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.IoCQuickStart.EventRegistry/src/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.IoCQuickStart.EventRegistry/src/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.IoCQuickStart.MovieFinder/src/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.IoCQuickStart.MovieFinder/src/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.MsmqQuickStart/src/Spring/Spring.MsmqQuickStart.Client/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.MsmqQuickStart/src/Spring/Spring.MsmqQuickStart.Client/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.MsmqQuickStart/src/Spring/Spring.MsmqQuickStart.Common/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.MsmqQuickStart/src/Spring/Spring.MsmqQuickStart.Common/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.MsmqQuickStart/src/Spring/Spring.MsmqQuickStart.Server/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.MsmqQuickStart/src/Spring/Spring.MsmqQuickStart.Server/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Client/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Client/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Common/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Common/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.NmsQuickStart/src/Spring/Spring.NmsQuickStart.Server/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.TxQuickStart/src/Spring/Spring.TxQuickStart/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.TxQuickStart/src/Spring/Spring.TxQuickStart/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.TxQuickStart/test/Spring/Spring.TxQuickStart.Tests/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.TxQuickStart/test/Spring/Spring.TxQuickStart.Tests/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.WcfQuickStart/src/Spring.WcfQuickStart.Aspects/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.WcfQuickStart/src/Spring.WcfQuickStart.Aspects/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.WcfQuickStart/src/Spring.WcfQuickStart.ClientApp/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.WcfQuickStart/src/Spring.WcfQuickStart.ClientApp/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.WcfQuickStart/src/Spring.WcfQuickStart.Contracts/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.WcfQuickStart/src/Spring.WcfQuickStart.Contracts/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.WcfQuickStart/src/Spring.WcfQuickStart.ServerApp/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.WcfQuickStart/src/Spring.WcfQuickStart.ServerApp/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.WcfQuickStart/src/Spring.WcfQuickStart.ServerWeb/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.WcfQuickStart/src/Spring.WcfQuickStart.ServerWeb/obj" failonerror="false"/>
|
||||
<delete failonerror="false">
|
||||
<fileset basedir="examples/Spring/Spring.Web.Extensions.Example/src/Spring.Web.Extensions.Example.2008/Bin">
|
||||
<include name="*.dll"/>
|
||||
<include name="*.xml"/>
|
||||
<include name="*.pdb"/>
|
||||
</fileset>
|
||||
</delete>
|
||||
<delete failonerror="false">
|
||||
<fileset basedir="examples/Spring/Spring.Web.Extensions.Example/src/Spring.Web.Extensions.Example.2010/Bin">
|
||||
<include name="*.dll"/>
|
||||
<include name="*.xml"/>
|
||||
<include name="*.pdb"/>
|
||||
</fileset>
|
||||
</delete>
|
||||
<delete dir="examples/Spring/SpringAir/src/SpringAir.Web.2005.References/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/SpringAir/src/SpringAir.Web.2005.References/obj" failonerror="false"/>
|
||||
|
||||
<delete dir="examples/Spring/Spring.Data.NHibernate.Northwind/src/Spring.Northwind.Dao/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.Data.NHibernate.Northwind/src/Spring.Northwind.Dao/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.Data.NHibernate.Northwind/src/Spring.Northwind.Dao.NHibernate/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.Data.NHibernate.Northwind/src/Spring.Northwind.Dao.NHibernate/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.Data.NHibernate.Northwind/src/Spring.Northwind.Service/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.Data.NHibernate.Northwind/src/Spring.Northwind.Service/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.Data.NHibernate.Northwind/src/Spring.Northwind.Web/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.Data.NHibernate.Northwind/src/Spring.Northwind.Web/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.Data.NHibernate.Northwind/src/Spring.Northwind.Web.ConvWA/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.Data.NHibernate.Northwind/src/Spring.Northwind.Web.ConvWA/bin" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.Data.NHibernate.Northwind/test/Spring.Northwind.IntegrationTests/obj" failonerror="false"/>
|
||||
<delete dir="examples/Spring/Spring.Data.NHibernate.Northwind/test/Spring.Northwind.IntegrationTests/bin" failonerror="false"/>
|
||||
</target>
|
||||
|
||||
<target name="package" depends="set-package-configuration" description="Build and Package distribution">
|
||||
@@ -1253,6 +1419,14 @@ Commandline Examples:
|
||||
<include name="*/*/Spring.Template.Velocity.xml"/>
|
||||
<include name="*/*/Spring.Template.Velocity.pdb"/>
|
||||
|
||||
<include name="*/*/Spring.Web.Conversation.NHibernate32.dll"/>
|
||||
<include name="*/*/Spring.Web.Conversation.NHibernate32.xml"/>
|
||||
<include name="*/*/Spring.Web.Conversation.NHibernate32.pdb"/>
|
||||
|
||||
<include name="*/*/Spring.Web.Conversation.NHibernate33.dll"/>
|
||||
<include name="*/*/Spring.Web.Conversation.NHibernate33.xml"/>
|
||||
<include name="*/*/Spring.Web.Conversation.NHibernate33.pdb"/>
|
||||
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
@@ -1405,6 +1579,7 @@ Commandline Examples:
|
||||
<property name="test.integration.nms" value="false" overwrite="false" />
|
||||
<property name="build-aop" value="true" />
|
||||
<property name="build-data" value="true" />
|
||||
<property name="build-conversation" value="true" />
|
||||
<property name="build-services" value="true" />
|
||||
<property name="build-testing-nunit" value="true" />
|
||||
<property name="build-testing-microsoft" value="false" />
|
||||
@@ -1444,6 +1619,7 @@ Commandline Examples:
|
||||
<property name="test.integration.nms" value="false" overwrite="false" />
|
||||
<property name="build-aop" value="true"/>
|
||||
<property name="build-data" value="true"/>
|
||||
<property name="build-conversation" value="true" />
|
||||
<property name="build-services" value="true"/>
|
||||
<property name="build-testing-nunit" value="true"/>
|
||||
<property name="build-testing-microsoft" value="false" />
|
||||
@@ -1479,6 +1655,8 @@ Commandline Examples:
|
||||
<include name="src/Spring/Spring.Testing.NUnit/**"/>
|
||||
<include name="src/Spring/Spring.Testing.Microsoft/**"/>
|
||||
<include name="src/Spring/CommonAssemblyInfo.cs"/>
|
||||
<include name="src/Spring/Spring.Web.Conversation.NHibernate32/**"/>
|
||||
<include name="src/Spring/Spring.Web.Conversation.NHibernate33/**"/>
|
||||
|
||||
<include name="test/Spring/Spring.Core.Tests/**"/>
|
||||
<include name="test/Spring/Spring.Aop.Tests/**"/>
|
||||
@@ -1502,6 +1680,8 @@ Commandline Examples:
|
||||
<include name="test/Spring/Spring.Testing.NUnit.Tests/**"/>
|
||||
<include name="test/Spring/Spring.Testing.Microsoft.Tests/**"/>
|
||||
<include name="test/Spring/CommonAssemblyInfo.cs"/>
|
||||
<include name="test/Spring/Spring.Web.Conversation.NHibernate32.Tests/**"/>
|
||||
<include name="test/Spring/Spring.Web.Conversation.NHibernate33.Tests/**"/>
|
||||
|
||||
<include name="examples/Spring/Spring.Examples.build"/>
|
||||
<include name="examples/Spring/Spring.AopQuickStart/**"/>
|
||||
@@ -1548,7 +1728,7 @@ Commandline Examples:
|
||||
</target>
|
||||
|
||||
<!-- build all Visual Studio Solutions -->
|
||||
<target name="build-solutions">
|
||||
<target name="build-solutions" description="Build the solutions">
|
||||
<!-- some examples are linked against the "bin" dir of the distribution so copy them from 'build' to 'bin' -->
|
||||
<delete dir="${spring.basedir}/bin" />
|
||||
|
||||
|
||||
@@ -21,23 +21,49 @@ Rebuilding Solutions using Nant and "solutions.build":
|
||||
|
||||
<property name="root.dir" value="${project::get-base-directory()}\.." overwrite="false" />
|
||||
|
||||
<property name="vs2003.install.dir.key" value="SOFTWARE\Microsoft\VisualStudio\7.1\InstallDir"/>
|
||||
<readregistry property="vs2003.install.dir" key="${vs2003.install.dir.key}" hive="LocalMachine" failonerror="false"/>
|
||||
<property name="devenv11.exe" value="${vs2003.install.dir}devenv.exe" if="${property::exists('vs2003.install.dir')}" />
|
||||
|
||||
<readregistry property="net35.install.dir" key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5\InstallPath" hive="LocalMachine" failonerror="true"/>
|
||||
<readregistry property="net40.install.dir" key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\InstallPath" hive="LocalMachine" failonerror="true"/>
|
||||
<property name="msbuild.exe" value="${net40.install.dir}\msbuild.exe"/>
|
||||
|
||||
<readregistry property="vs2008.install.dir" key="SOFTWARE\Microsoft\VisualStudio\9.0\InstallDir" hive="LocalMachine" failonerror="false"/>
|
||||
<!--
|
||||
Ensure use of 32 bits version of frameworks and IDE to avoid the error
|
||||
[MSB6003: The specified task executable "ResGen.exe" could not be run...]
|
||||
on "Win 7 64".
|
||||
-->
|
||||
<property name="reg.software.prefix" value="SOFTWARE\Microsoft"/>
|
||||
<readregistry property="wow6432node" key="SOFTWARE\Wow6432Node\" hive="LocalMachine" failonerror="false"/>
|
||||
<if test="${property::exists('wow6432node')}">
|
||||
<property name="reg.software.prefix" value="SOFTWARE\Wow6432Node\Microsoft"/>
|
||||
</if>
|
||||
|
||||
<readregistry property="vs2010.install.dir" key="SOFTWARE\Microsoft\VisualStudio\10.0\InstallDir" hive="LocalMachine" failonerror="false"/>
|
||||
<readregistry property="net35.install.dir" key="${reg.software.prefix}\NET Framework Setup\NDP\v3.5\InstallPath" hive="LocalMachine" failonerror="true"/>
|
||||
<readregistry property="net40.install.dir" key="${reg.software.prefix}\NET Framework Setup\NDP\v4\Full\InstallPath" hive="LocalMachine" failonerror="true"/>
|
||||
|
||||
<readregistry property="vs2008.install.dir" key="${reg.software.prefix}\VisualStudio\9.0\InstallDir" hive="LocalMachine" failonerror="false"/>
|
||||
<if test="${not property::exists('vs2008.install.dir')}">
|
||||
<readregistry property="vs2010.install.dir" key="${reg.software.prefix}\VWDExpress\9.0\InstallDir" hive="LocalMachine" failonerror="false"/>
|
||||
</if>
|
||||
|
||||
<readregistry property="vs2010.install.dir" key="${reg.software.prefix}\VisualStudio\10.0\InstallDir" hive="LocalMachine" failonerror="false"/>
|
||||
<if test="${not property::exists('vs2010.install.dir')}">
|
||||
<readregistry property="vs2010.install.dir" key="${reg.software.prefix}\VWDExpress\10.0\InstallDir" hive="LocalMachine" failonerror="false"/>
|
||||
</if>
|
||||
|
||||
<property name="msbuild.exe" value="${net40.install.dir}\msbuild.exe"/>
|
||||
|
||||
<property name="buildconfiguration" value="Debug" />
|
||||
|
||||
<echo message="reg.software.prefix: '${reg.software.prefix}'"/>
|
||||
<echo message="vs2008.install.dir: '${vs2008.install.dir}'"/>
|
||||
<echo message="vs2010.install.dir: '${vs2010.install.dir}'"/>
|
||||
<echo message="msbuild.exe: '${msbuild.exe}'"/>
|
||||
|
||||
<target name="RebuildAllSolutions" description="Rebuild all Solutions">
|
||||
<!--
|
||||
Forcing use of specific SDK to avoid the error "TRK0002: Failed to execute
|
||||
command ResGen ..." on "Win 7 64".
|
||||
See: http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/e8c1d26a-5e77-4422-bbc8-f0b7f25702d2/
|
||||
-->
|
||||
<property name="msbuild.exe" value="${net35.install.dir}\msbuild.exe"/>
|
||||
<call target="RebuildAllSolutions-3.5" if="${property::exists('vs2008.install.dir')}" />
|
||||
<call target="RebuildAllSolutions-4.0" if="${property::exists('vs2010.install.dir')}" />
|
||||
<property name="msbuild.exe" value="${net40.install.dir}\msbuild.exe"/>
|
||||
<call target="RebuildAllSolutions-4.0" if="${property::exists('vs2010.install.dir')}" />
|
||||
</target>
|
||||
|
||||
<target name="Clean">
|
||||
@@ -131,16 +157,20 @@ Rebuilding Solutions using Nant and "solutions.build":
|
||||
<arg line="/nologo" />
|
||||
<arg line="/verbosity:minimal" />
|
||||
<arg line="/property:Configuration=${solutionconfiguration}"/>
|
||||
<!--Specifying mandatory property in SDK 7-->
|
||||
<arg line='/property:Platform="Any CPU"'/>
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
<target name="RebuildSolution-4.0" description="rebuilds a given VS2010 solution file">
|
||||
<echo message="Rebuilding .NET 4.0 Solution ${solutionfile}" />
|
||||
<exec program="${msbuild.exe}">
|
||||
<exec program="${msbuild.exe}" verbose="true">
|
||||
<arg value="${solutionfile}"/>
|
||||
<arg line="/nologo" />
|
||||
<arg line="/verbosity:minimal" />
|
||||
<arg line="/property:Configuration=${solutionconfiguration}"/>
|
||||
<!--Specifying mandatory property in SDK 7-->
|
||||
<arg line='/property:Platform="Any CPU"'/>
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
|
||||
@@ -9,7 +9,9 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Northwind.Dao.NHiber
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Northwind.IntegrationTests.2008", "test\Spring.Northwind.IntegrationTests\Spring.Northwind.IntegrationTests.2008.csproj", "{2D0C5DF7-3BDB-44FB-BC1B-58E60B170BAD}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Northwind.Web", "src\Spring.Northwind.Web\Spring.Northwind.Web.2008.csproj", "{2967CA64-7352-46E3-89C0-6BB3A0A13FC1}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Northwind.Web.2008", "src\Spring.Northwind.Web\Spring.Northwind.Web.2008.csproj", "{2967CA64-7352-46E3-89C0-6BB3A0A13FC1}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Northwind.Web.Conversation.2008", "src\Spring.Northwind.Web.Conversation\Spring.Northwind.Web.Conversation.2008.csproj", "{8DCDA20D-DF9F-4723-9649-BC6934B36DC4}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
@@ -71,6 +73,16 @@ Global
|
||||
{2967CA64-7352-46E3-89C0-6BB3A0A13FC1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{2967CA64-7352-46E3-89C0-6BB3A0A13FC1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{2967CA64-7352-46E3-89C0-6BB3A0A13FC1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{8DCDA20D-DF9F-4723-9649-BC6934B36DC4}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{8DCDA20D-DF9F-4723-9649-BC6934B36DC4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{8DCDA20D-DF9F-4723-9649-BC6934B36DC4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{8DCDA20D-DF9F-4723-9649-BC6934B36DC4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{8DCDA20D-DF9F-4723-9649-BC6934B36DC4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{8DCDA20D-DF9F-4723-9649-BC6934B36DC4}.Release|.NET.ActiveCfg = Release|Any CPU
|
||||
{8DCDA20D-DF9F-4723-9649-BC6934B36DC4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{8DCDA20D-DF9F-4723-9649-BC6934B36DC4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{8DCDA20D-DF9F-4723-9649-BC6934B36DC4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{8DCDA20D-DF9F-4723-9649-BC6934B36DC4}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||
# Visual Studio 2010
|
||||
# Visual Web Developer Express 2010
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Northwind.Service.2010", "src\Spring.Northwind.Service\Spring.Northwind.Service.2010.csproj", "{9E15876F-E9E0-43B7-9874-B54F163757D6}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Northwind.Dao.2010", "src\Spring.Northwind.Dao\Spring.Northwind.Dao.2010.csproj", "{7F45EEA2-50AC-44E2-85A6-2FFB02E38C44}"
|
||||
@@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Northwind.Integratio
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Northwind.Web.2010", "src\Spring.Northwind.Web\Spring.Northwind.Web.2010.csproj", "{2967CA64-7352-46E3-89C0-6BB3A0A13FC1}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Northwind.Web.Conversation.2010", "src\Spring.Northwind.Web.Conversation\Spring.Northwind.Web.Conversation.2010.csproj", "{8EEAB62E-DBAF-4C5F-9906-77B2A817F945}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|.NET = Debug|.NET
|
||||
@@ -71,6 +73,16 @@ Global
|
||||
{2967CA64-7352-46E3-89C0-6BB3A0A13FC1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{2967CA64-7352-46E3-89C0-6BB3A0A13FC1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{2967CA64-7352-46E3-89C0-6BB3A0A13FC1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{8EEAB62E-DBAF-4C5F-9906-77B2A817F945}.Debug|.NET.ActiveCfg = Debug|Any CPU
|
||||
{8EEAB62E-DBAF-4C5F-9906-77B2A817F945}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{8EEAB62E-DBAF-4C5F-9906-77B2A817F945}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{8EEAB62E-DBAF-4C5F-9906-77B2A817F945}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{8EEAB62E-DBAF-4C5F-9906-77B2A817F945}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{8EEAB62E-DBAF-4C5F-9906-77B2A817F945}.Release|.NET.ActiveCfg = Release|Any CPU
|
||||
{8EEAB62E-DBAF-4C5F-9906-77B2A817F945}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{8EEAB62E-DBAF-4C5F-9906-77B2A817F945}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{8EEAB62E-DBAF-4C5F-9906-77B2A817F945}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{8EEAB62E-DBAF-4C5F-9906-77B2A817F945}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<objects xmlns="http://www.springframework.net"
|
||||
xmlns:db="http://www.springframework.net/database">
|
||||
<!-- Referenced by main application context configuration file. Conversation especific. -->
|
||||
<description>
|
||||
The Northwind object definitions for the Data Access Objects.
|
||||
</description>
|
||||
|
||||
<!-- Property placeholder configurer for database settings -->
|
||||
<object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core">
|
||||
<property name="ConfigSections" value="databaseSettings"/>
|
||||
</object>
|
||||
|
||||
<!-- Database Configuration -->
|
||||
<db:provider id="DbProvider"
|
||||
provider="SQLite-1.0.65"
|
||||
connectionString="Data Source=|DataDirectory|Northwind.db;Version=3;FailIfMissing=True;"/>
|
||||
|
||||
<!-- NHibernate Configuration -->
|
||||
<object id="NHibernateSessionFactory" type="Spring.Northwind.Dao.NHibernate.CustomLocalSessionFactoryObject, Spring.Northwind.Dao.NHibernate">
|
||||
<property name="DbProvider" ref="DbProvider"/>
|
||||
<property name="MappingAssemblies">
|
||||
<list>
|
||||
<value>Spring.Northwind.Dao.NHibernate</value>
|
||||
</list>
|
||||
</property>
|
||||
<property name="HibernateProperties">
|
||||
<dictionary>
|
||||
<entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
|
||||
<entry key="dialect" value="NHibernate.Dialect.SQLiteDialect"/>
|
||||
<entry key="connection.driver_class" value="NHibernate.Driver.SQLite20Driver"/>
|
||||
<entry key="use_proxy_validator" value="false" />
|
||||
<entry key="show_sql" value="false"/>
|
||||
<entry key="format_sql" value="true"/>
|
||||
<entry key="connection.release_mode" value="on_close"/>
|
||||
</dictionary>
|
||||
</property>
|
||||
|
||||
<!-- provides integation with Spring's declarative transaction management features -->
|
||||
<property name="ExposeTransactionAwareSessionFactory" value="true" />
|
||||
|
||||
</object>
|
||||
|
||||
<!-- Transaction Management Strategy - local database transactions -->
|
||||
<object id="transactionManager"
|
||||
type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate32">
|
||||
|
||||
<property name="DbProvider" ref="DbProvider"/>
|
||||
<property name="SessionFactory" ref="NHibernateSessionFactory"/>
|
||||
|
||||
</object>
|
||||
|
||||
<!-- Exception translation object post processor -->
|
||||
<object type="Spring.Dao.Attributes.PersistenceExceptionTranslationPostProcessor, Spring.Data"/>
|
||||
|
||||
<!-- Data Access Objects -->
|
||||
<object id="CustomerDao" type="Spring.Northwind.Dao.NHibernate.HibernateCustomerDao, Spring.Northwind.Dao.NHibernate">
|
||||
<property name="SessionFactory" ref="NHibernateSessionFactory"/>
|
||||
</object>
|
||||
|
||||
<object id="OrderDao" type="Spring.Northwind.Dao.NHibernate.HibernateOrderDao, Spring.Northwind.Dao.NHibernate">
|
||||
<property name="SessionFactory" ref="NHibernateSessionFactory"/>
|
||||
</object>
|
||||
|
||||
<object id="CustomerClassificationCalculator" type="Spring.Northwind.Domain.DefaultCustomerClassificationCalculator, Spring.Northwind.Dao">
|
||||
|
||||
</object>
|
||||
|
||||
<object id="CustomerEntityProtoType" type="Spring.Northwind.Domain.Customer, Spring.Northwind.Dao" singleton="false">
|
||||
<constructor-arg ref="CustomerClassificationCalculator" />
|
||||
</object>
|
||||
|
||||
|
||||
</objects>
|
||||
@@ -95,6 +95,9 @@
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Dao\Dao.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Dao\DaoConversation.xml" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
||||
@@ -127,6 +127,9 @@
|
||||
<Name>Spring.Northwind.Dao.2010</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Dao\DaoConversation.xml" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
<asp:DataGrid runat="server" CssClass="datagrid">
|
||||
<HeaderStyle CssClass="datagrid-header" />
|
||||
<ItemStyle CssClass="datagrid-item" />
|
||||
<AlternatingItemStyle CssClass="datagrid-alt-item" />
|
||||
<FooterStyle CssClass="datagrid-header" />
|
||||
</asp:DataGrid>
|
||||
@@ -0,0 +1,175 @@
|
||||
body {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
background-color: #dfeac1;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.logo {
|
||||
position:relative;
|
||||
top:-8px;
|
||||
left:22px;
|
||||
float:left;
|
||||
}
|
||||
|
||||
.headerText
|
||||
{
|
||||
color: White;
|
||||
left: 350px;
|
||||
top: 50px;
|
||||
font-family: Verdana;
|
||||
font-size: 150%;
|
||||
font-weight: bold;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
border: 1px solid #CCA383;
|
||||
width: 60%;
|
||||
background: LightGoldenrodYellow;
|
||||
padding: 3px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
fieldset legend {
|
||||
background: PaleGoldenrod;
|
||||
padding: 6px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.formLabelCell
|
||||
{
|
||||
text-align: left;
|
||||
padding-left: 10px;
|
||||
padding-right: 30px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.formValueCell
|
||||
{
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.actionPanel
|
||||
{
|
||||
margin: 30px;
|
||||
border: 1px solid #CCA383;
|
||||
width: 50%;
|
||||
background: LightGoldenrodYellow;
|
||||
text-align: center;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
.actionResultWindow
|
||||
{
|
||||
margin: 30px;
|
||||
border: 1px solid #CCA383;
|
||||
width: 90%;
|
||||
background: LightGoldenrodYellow;
|
||||
text-align: left;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
#headerCell
|
||||
{
|
||||
background: url(../img/header-spring.png);
|
||||
height: 150px;
|
||||
width: 719px;
|
||||
}
|
||||
|
||||
#contentCell
|
||||
{
|
||||
background-image: url(../img/bg-spring.png);
|
||||
text-align: left;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
#footerCell
|
||||
{
|
||||
background-image: url(../img/footern.gif);
|
||||
text-align: center;
|
||||
height: 29px;
|
||||
}
|
||||
|
||||
.datagrid
|
||||
{
|
||||
border: solid 1px Tan;
|
||||
margin-left: 10px;
|
||||
width: 95%;
|
||||
}
|
||||
|
||||
.datagrid-header
|
||||
{
|
||||
font-weight: bold;
|
||||
background-color: Tan;
|
||||
}
|
||||
|
||||
.datagid-item
|
||||
{
|
||||
background-color: LightGoldenrodYellow;
|
||||
}
|
||||
|
||||
.datagrid-alt-item
|
||||
{
|
||||
background-color: PaleGoldenrod;
|
||||
}
|
||||
|
||||
.datagrid-footer
|
||||
{
|
||||
font-weight: bold;
|
||||
background-color: Tan;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-family: Verdana, Arial, Helvetica, sans;
|
||||
font-size: 14px;
|
||||
font-weight: normal;
|
||||
color: #90A720;
|
||||
}
|
||||
a, a:active, a:visited {
|
||||
font-family: Verdana, Arial, Helvetica, sans;
|
||||
font-size: 12px;
|
||||
color: #606060;
|
||||
}
|
||||
a:hover {
|
||||
font-family: Verdana, Arial, Helvetica, sans;
|
||||
font-size: 12px;
|
||||
color: #000000;
|
||||
}
|
||||
b {
|
||||
font-family: Verdana, Arial, Helvetica, sans;
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
color: #606060;
|
||||
}
|
||||
i {
|
||||
font-family: Verdana, Arial, Helvetica, sans;
|
||||
font-size: 12px;
|
||||
color: #606060;
|
||||
}
|
||||
|
||||
table {
|
||||
font-family: Verdana, Arial, Helvetica, sans;
|
||||
font-size: 12px;
|
||||
color: #606060;
|
||||
}
|
||||
.news {
|
||||
border: 1px solid;
|
||||
border-color: #C9C9C9;
|
||||
padding: 12px;
|
||||
font-family: Verdana, Arial, Helvetica, sans;
|
||||
font-size: 12px;
|
||||
color: #606060;
|
||||
background-color: #F5F5F5;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
ul {
|
||||
margin-left: 25px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
|
||||
<objects xmlns="http://www.springframework.net">
|
||||
|
||||
<object name="CommonLoggingAroundAdvice" type="Spring.Aspects.Logging.SimpleLoggingAdvice, Spring.Aop">
|
||||
<property name="LogUniqueIdentifier" value="true"/>
|
||||
<property name="LogExecutionTime" value="true"/>
|
||||
<property name="LogMethodArguments" value="true"/>
|
||||
<property name="LogReturnValue" value="true"/>
|
||||
|
||||
<property name="Separator" value=";"/>
|
||||
<property name="LogLevel" value="Info"/>
|
||||
|
||||
|
||||
<property name="HideProxyTypeNames" value="true"/>
|
||||
<property name="UseDynamicLogger" value="true"/>
|
||||
</object>
|
||||
|
||||
</objects>
|
||||
@@ -0,0 +1,60 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<log4net debug="false">
|
||||
|
||||
<appender name="AspNetTraceAppender" type="log4net.Appender.AspNetTraceAppender">
|
||||
<layout type="log4net.Layout.PatternLayout">
|
||||
<conversionPattern value="[%thread] %-5level - %message" />
|
||||
</layout>
|
||||
</appender>
|
||||
|
||||
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
|
||||
<file value="Logs/log.txt" />
|
||||
<appendToFile value="true" />
|
||||
<rollingStyle value="Size" />
|
||||
<maxSizeRollBackups value="10" />
|
||||
<maximumFileSize value="100KB" />
|
||||
<staticLogFileName value="true" />
|
||||
<layout type="log4net.Layout.PatternLayout">
|
||||
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
|
||||
</layout>
|
||||
</appender>
|
||||
|
||||
<appender name="TraceAppender" type="log4net.Appender.TraceAppender">
|
||||
<layout type="log4net.Layout.PatternLayout">
|
||||
<conversionPattern value="%-5level %M - %message%newline" />
|
||||
</layout>
|
||||
</appender>
|
||||
|
||||
<appender name="MemoryAppender" type="log4net.Appender.MemoryAppender">
|
||||
<!-- simple appender to get results to UI -->
|
||||
</appender>
|
||||
|
||||
<!-- Set default logging level to DEBUG -->
|
||||
<root>
|
||||
<level value="DEBUG" />
|
||||
<!--<appender-ref ref="AspNetTraceAppender" />-->
|
||||
<appender-ref ref="TraceAppender" />
|
||||
<appender-ref ref="RollingFileAppender" />
|
||||
</root>
|
||||
<!--
|
||||
In Spring.NET there is a 1-1 correspondence between the logger name and
|
||||
the namespace of the class doing the logging...
|
||||
-->
|
||||
<logger name="Spring">
|
||||
<level value="DEBUG" />
|
||||
</logger>
|
||||
<logger name="NHibernate">
|
||||
<level value="INFO" />
|
||||
</logger>
|
||||
<logger name="NHibernate.SQL">
|
||||
<level value="DEBUG" />
|
||||
</logger>
|
||||
<logger name="Spring.Transaction>">
|
||||
<level value="INFO" />
|
||||
<appender-ref ref="MemoryAppender" />
|
||||
</logger>
|
||||
<logger name="Spring.Northwind">
|
||||
<level value="INFO" />
|
||||
<appender-ref ref="MemoryAppender" />
|
||||
</logger>
|
||||
</log4net>
|
||||
@@ -0,0 +1,8 @@
|
||||
using Spring.Northwind.Domain;
|
||||
|
||||
public interface ICustomerEditController
|
||||
{
|
||||
void EditCustomer(Customer customer);
|
||||
void Clear();
|
||||
Customer CurrentCustomer { get; }
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
using NHibernate;
|
||||
using Spring.Data.NHibernate;
|
||||
using Spring.Northwind.Domain;
|
||||
|
||||
/// <summary>
|
||||
/// </summary>
|
||||
/// <author>erich.eichinger</author>
|
||||
public class NHibernateCustomerEditController : ICustomerEditController
|
||||
{
|
||||
private readonly ISessionFactory sessionFactory;
|
||||
private Customer currentCustomer;
|
||||
|
||||
public NHibernateCustomerEditController(ISessionFactory sessionFactory)
|
||||
{
|
||||
this.sessionFactory = sessionFactory;
|
||||
}
|
||||
|
||||
private ISession Session
|
||||
{
|
||||
get { return sessionFactory.GetCurrentSession(); }
|
||||
}
|
||||
|
||||
public void EditCustomer(Customer customer)
|
||||
{
|
||||
currentCustomer = customer;
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
currentCustomer = null;
|
||||
}
|
||||
|
||||
public Customer CurrentCustomer
|
||||
{
|
||||
get
|
||||
{
|
||||
Customer customer = currentCustomer;
|
||||
|
||||
//since the Customer entity may have been retrieved from a prior request, we need to reattach it to the current session
|
||||
// in order to support lazy-loading, etc. on the Customer
|
||||
Session.Lock(customer, LockMode.None);
|
||||
|
||||
return customer;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
using System;
|
||||
using System.Data;
|
||||
using System.Configuration;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using Spring.Web.Conversation;
|
||||
|
||||
/// <summary>
|
||||
/// Base classe for page's that suport conversation.
|
||||
/// </summary>
|
||||
public class ConversationPage : Spring.Web.UI.Page
|
||||
{
|
||||
private IConversationState conversation = null;
|
||||
/// <summary>
|
||||
/// Converastion exposed to pages.
|
||||
/// </summary>
|
||||
public IConversationState Conversation
|
||||
{
|
||||
get { return conversation; }
|
||||
set { conversation = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Here start/resume conversation to reconnect the ISession.
|
||||
/// </summary>
|
||||
/// <param name="e"></param>
|
||||
protected override void OnInit(EventArgs e)
|
||||
{
|
||||
this.Conversation.StartResumeConversation();
|
||||
base.OnInit(e);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
<%@ Page Language="C#" MasterPageFile="~/Shared/MasterPage.master"
|
||||
Inherits="CustomerEditor" Codebehind="CustomerEditor.aspx.cs" %>
|
||||
|
||||
<asp:Content ID="content" ContentPlaceHolderID="content" runat="server">
|
||||
<h1>
|
||||
Update customer information</h1>
|
||||
<div align="center">
|
||||
<spring:DataBindingPanel runat="server">
|
||||
<fieldset>
|
||||
<legend>Customer details</legend>
|
||||
<table>
|
||||
<tr>
|
||||
<td class="formLabelCell">
|
||||
ID:</td>
|
||||
<td class="formValueCell">
|
||||
<asp:TextBox runat="server" BindingTarget="CurrentCustomer.Id" BindingDirection="TargetToSource"
|
||||
ReadOnly="true" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="formLabelCell">
|
||||
Contact:</td>
|
||||
<td class="formValueCell">
|
||||
<asp:TextBox runat="server" BindingTarget="CurrentCustomer.ContactName" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" style="text-align: right; padding-top: 10px">
|
||||
<asp:Button runat="server" ID="btnSave" Text="Save" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
</spring:DataBindingPanel>
|
||||
<div class="actionPanel">
|
||||
<asp:LinkButton ID="customerList" runat="server" onclick="customerList_Click">« Back to customer list</asp:LinkButton> |
|
||||
<asp:LinkButton ID="cancel" runat="server" onclick="cancel_Click">Cancel edit »</asp:LinkButton>
|
||||
</div>
|
||||
</div>
|
||||
</asp:Content>
|
||||
@@ -0,0 +1,71 @@
|
||||
using System;
|
||||
using Spring.Northwind.Dao;
|
||||
using Spring.Northwind.Domain;
|
||||
using Spring.Web.UI;
|
||||
|
||||
public partial class CustomerEditor : ConversationPage
|
||||
{
|
||||
private ICustomerEditController customerEditController;
|
||||
private ICustomerDao customerDao;
|
||||
|
||||
public ICustomerDao CustomerDao
|
||||
{
|
||||
set { customerDao = value; }
|
||||
}
|
||||
|
||||
public ICustomerEditController CustomerEditController
|
||||
{
|
||||
set { customerEditController = value; }
|
||||
}
|
||||
|
||||
public Customer CurrentCustomer
|
||||
{
|
||||
get
|
||||
{
|
||||
return customerEditController.CurrentCustomer;
|
||||
}
|
||||
}
|
||||
|
||||
public CustomerEditor()
|
||||
{
|
||||
InitializeControls += Page_InitializeControls;
|
||||
DataBound += Page_DataBound;
|
||||
DataUnbound += Page_DataUnbound;
|
||||
}
|
||||
|
||||
override protected void InitializeDataBindings()
|
||||
{
|
||||
base.InitializeDataBindings();
|
||||
|
||||
// do the "one time" setup for databinding
|
||||
}
|
||||
|
||||
private void Page_DataBound(object sender, EventArgs e)
|
||||
{
|
||||
// perform custom tasks for binding data from model to the form
|
||||
}
|
||||
|
||||
private void Page_DataUnbound(object sender, EventArgs e)
|
||||
{
|
||||
// perform custom tasks for unbinding data from form to the model
|
||||
}
|
||||
|
||||
private void Page_InitializeControls(object sender, EventArgs e)
|
||||
{
|
||||
btnSave.Click += BtnSave_Click;
|
||||
}
|
||||
|
||||
private void BtnSave_Click(object sender, EventArgs e)
|
||||
{
|
||||
customerDao.Update(CurrentCustomer);
|
||||
SetResult("ViewCustomer");
|
||||
}
|
||||
protected void customerList_Click(object sender, EventArgs e)
|
||||
{
|
||||
SetResult("CustomerList");
|
||||
}
|
||||
protected void cancel_Click(object sender, EventArgs e)
|
||||
{
|
||||
SetResult("CancelEdit");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:2.0.50727.5448
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
public partial class CustomerEditor {
|
||||
|
||||
/// <summary>
|
||||
/// btnSave control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.Button btnSave;
|
||||
|
||||
/// <summary>
|
||||
/// customerList control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.LinkButton customerList;
|
||||
|
||||
/// <summary>
|
||||
/// cancel control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.LinkButton cancel;
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
<%@ Page Language="C#" MasterPageFile="~/Shared/MasterPage.master" Inherits="CustomerList" Codebehind="CustomerList.aspx.cs" %>
|
||||
<%@ Reference page="CustomerEditor.aspx" %>
|
||||
|
||||
<asp:Content ID="content" ContentPlaceHolderID="content" runat="server">
|
||||
|
||||
<h1>Customers in database</h1>
|
||||
|
||||
<p>
|
||||
Below you can see all customers in the database paged to grid.
|
||||
By clicking customer name you enter the details and edit information.
|
||||
By clicking orders you can see all orders that customer has. Orders can
|
||||
be in shipped state (they have shipped date) or they can be waiting for
|
||||
shipment. You can ship orders that aren't shipped yet on the orders screen.
|
||||
</p>
|
||||
<p>
|
||||
The customer entity is created with Spring and injected with an ICustomerClassificationCalculator
|
||||
which includes basic calculation algorithm that we can use to calculate customer's value to us.
|
||||
</p>
|
||||
<br />
|
||||
<asp:DataGrid id="customerList" runat="server"
|
||||
AllowPaging="true"
|
||||
AllowSorting="false"
|
||||
BorderColor="black"
|
||||
BorderWidth="1"
|
||||
CellPadding="3"
|
||||
AutoGenerateColumns="false"
|
||||
ShowFooter="true"
|
||||
>
|
||||
<Columns>
|
||||
|
||||
<asp:BoundColumn HeaderText="Id" DataField="ID" />
|
||||
<asp:ButtonColumn HeaderText="Name" DataTextField="ContactName" CommandName="ViewCustomer" />
|
||||
<asp:BoundColumn HeaderText="Company" DataField="CompanyName"/>
|
||||
<asp:BoundColumn HeaderText="Classification" DataField="Classification"/>
|
||||
<asp:ButtonColumn CommandName="ViewOrders" Text="Orders" />
|
||||
<asp:TemplateColumn>
|
||||
<ItemTemplate>
|
||||
<asp:Button ID="BtnShowOrders" runat="server" Text="+" OnClick="BtnShowOrders_Click" />
|
||||
<div style="position:relative">
|
||||
<div id="DivCustomerOrderList" runat="server" visible="false">
|
||||
<asp:DataGrid ID="DtgCustomerOrderList" runat="server" Visible="False"
|
||||
AutoGenerateColumns="false" Width="400px">
|
||||
<Columns>
|
||||
<asp:BoundColumn HeaderText="Id" DataField="Id" />
|
||||
<asp:BoundColumn HeaderText="ShipName" DataField="ShipName" />
|
||||
<asp:BoundColumn HeaderText="ShipAddress" DataField="ShipAddress" />
|
||||
</Columns>
|
||||
</asp:DataGrid>
|
||||
</div>
|
||||
</div>
|
||||
</ItemTemplate>
|
||||
</asp:TemplateColumn>
|
||||
</Columns>
|
||||
</asp:DataGrid>
|
||||
</asp:Content>
|
||||
@@ -0,0 +1,151 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Web.UI.WebControls;
|
||||
using Spring.Northwind.Dao;
|
||||
using Spring.Northwind.Domain;
|
||||
using System.Collections.Generic;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.Web.UI;
|
||||
|
||||
public partial class CustomerList : ConversationPage
|
||||
{
|
||||
private ICustomerEditController customerEditController;
|
||||
private ICustomerDao customerDao;
|
||||
|
||||
public ICustomerDao CustomerDao
|
||||
{
|
||||
set { this.customerDao = value; }
|
||||
}
|
||||
|
||||
public ICustomerEditController CustomerEditController
|
||||
{
|
||||
set { this.customerEditController = value; }
|
||||
}
|
||||
|
||||
public Customer SelectedCustomer
|
||||
{
|
||||
get
|
||||
{
|
||||
return (Customer) this.customerList.SelectedItem.DataItem;
|
||||
}
|
||||
}
|
||||
|
||||
public CustomerList()
|
||||
{
|
||||
this.InitializeControls+=new EventHandler(Page_InitializeControls);
|
||||
this.DataBound+=new EventHandler(Page_DataBound);
|
||||
this.DataUnbound+=new EventHandler(Page_DataUnbound);
|
||||
}
|
||||
|
||||
override protected void InitializeDataBindings()
|
||||
{
|
||||
base.InitializeDataBindings();
|
||||
|
||||
// do the "one time" setup for databinding
|
||||
}
|
||||
|
||||
private void Page_DataBound(object sender, EventArgs e)
|
||||
{
|
||||
// perform custom tasks for binding data from model to the form
|
||||
}
|
||||
|
||||
private void Page_DataUnbound(object sender, EventArgs e)
|
||||
{
|
||||
// perform custom tasks for unbinding data from form to the model
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// List not attached. This page will make searching the database only once per conversation.
|
||||
/// </summary>
|
||||
private IList<Customer> CustomersLoadedOncePerConvList
|
||||
{
|
||||
get
|
||||
{
|
||||
return (IList<Customer>)this.Conversation["CustomersLoadedOncePerConvList"];
|
||||
}
|
||||
set
|
||||
{
|
||||
this.Conversation["CustomersLoadedOncePerConvList"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
private void Page_InitializeControls(object sender, EventArgs e)
|
||||
{
|
||||
//searching the database only once per conversation.
|
||||
if (this.CustomersLoadedOncePerConvList == null)
|
||||
{
|
||||
// create/initialize controls here
|
||||
this.CustomersLoadedOncePerConvList = customerDao.GetAll();
|
||||
}
|
||||
|
||||
customerList.DataSource = this.CustomersLoadedOncePerConvList;
|
||||
customerList.ItemCommand+=new DataGridCommandEventHandler(CustomerList_ItemCommand);
|
||||
customerList.PageIndexChanged+=new DataGridPageChangedEventHandler(CustomerList_PageIndexChanged);
|
||||
if (!IsPostBack)
|
||||
{
|
||||
customerList.DataBind();
|
||||
}
|
||||
else
|
||||
{
|
||||
customerList.ItemCreated+=new DataGridItemEventHandler(this.CustomerList_ItemCreated);
|
||||
}
|
||||
}
|
||||
|
||||
private void CustomerList_PageIndexChanged(object source, DataGridPageChangedEventArgs e)
|
||||
{
|
||||
customerList.CurrentPageIndex = e.NewPageIndex;
|
||||
customerList.DataBind();
|
||||
}
|
||||
|
||||
private void CustomerList_ItemCommand(object source, DataGridCommandEventArgs e)
|
||||
{
|
||||
switch(e.CommandName)
|
||||
{
|
||||
case "ViewOrders":
|
||||
case "ViewCustomer":
|
||||
customerList.SelectedIndex = e.Item.ItemIndex;
|
||||
customerEditController.EditCustomer(this.SelectedCustomer);
|
||||
SetResult(e.CommandName);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void CustomerList_ItemCreated(object sender, DataGridItemEventArgs e)
|
||||
{
|
||||
if(e.Item.DataSetIndex > -1)
|
||||
{
|
||||
e.Item.DataItem = ((IList) customerList.DataSource)[e.Item.DataSetIndex];
|
||||
}
|
||||
}
|
||||
|
||||
protected void BtnShowOrders_Click(object sender, EventArgs e)
|
||||
{
|
||||
Button BtnShowOrders = (Button)sender;
|
||||
DataGridItem dgi = (DataGridItem)BtnShowOrders.NamingContainer;
|
||||
DataGrid DtgCustomerOrderList = (DataGrid)dgi.FindControl("DtgCustomerOrderList");
|
||||
HtmlControl DivCustomerOrderList = (HtmlControl)dgi.FindControl("DivCustomerOrderList");
|
||||
if (BtnShowOrders.Text == "+")
|
||||
{
|
||||
//discovery index for Customer
|
||||
int customerIndex;
|
||||
customerIndex = (this.customerList.PageSize * this.customerList.CurrentPageIndex) + dgi.ItemIndex;
|
||||
Customer customerFromLine = this.CustomersLoadedOncePerConvList[customerIndex];
|
||||
DtgCustomerOrderList.DataSource = customerFromLine.Orders;
|
||||
DtgCustomerOrderList.DataBind();
|
||||
DtgCustomerOrderList.Visible = true;
|
||||
DivCustomerOrderList.Visible = true;
|
||||
//background-color:White; position:absolute; left:-180px. Positioning, just visual.
|
||||
DivCustomerOrderList.Style[HtmlTextWriterStyle.BackgroundColor] = "White";
|
||||
DivCustomerOrderList.Style[HtmlTextWriterStyle.Position] = "absolute";
|
||||
DivCustomerOrderList.Style[HtmlTextWriterStyle.Left] = "-380px";
|
||||
|
||||
BtnShowOrders.Text = "-";
|
||||
}
|
||||
else
|
||||
{
|
||||
DtgCustomerOrderList.Visible = false;
|
||||
DivCustomerOrderList.Visible = false;
|
||||
BtnShowOrders.Text = "+";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:2.0.50727.5448
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
public partial class CustomerList {
|
||||
|
||||
/// <summary>
|
||||
/// customerList control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.DataGrid customerList;
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<%@ Page Language="C#" MasterPageFile="~/Shared/MasterPage.master" AutoEventWireup="true" Inherits="CustomerOrders" Codebehind="CustomerOrders.aspx.cs" %>
|
||||
|
||||
<asp:Content ID="content" ContentPlaceHolderID="content" runat="server">
|
||||
|
||||
<h1>Orders for customer <strong><asp:Literal ID="customerName" runat="server" /></strong></h1>
|
||||
|
||||
<p>
|
||||
On this screen you can see all orders that customer has. By clicking "Process Orders" you
|
||||
can send service request to ship all unshipped orders for that customer. Behind the scenes
|
||||
Spring.NET will begin service level transaction that propagates to DAO layer which then
|
||||
automatically participates int the existing transaction.
|
||||
</p>
|
||||
|
||||
<div align="center">
|
||||
<asp:DataGrid ID="customerOrders" runat="server" AllowPaging="false" AllowSorting="false"
|
||||
BorderColor="black" BorderWidth="1" CellPadding="3" AutoGenerateColumns="false"
|
||||
ShowFooter="true">
|
||||
<HeaderStyle CssClass="" />
|
||||
<ItemStyle CssClass="" />
|
||||
<AlternatingItemStyle CssClass="" />
|
||||
<Columns>
|
||||
<asp:BoundColumn HeaderText="OrderID" DataField="ID" />
|
||||
<asp:BoundColumn HeaderText="OrderDate" DataFormatString="{0:d}" DataField="OrderDate" />
|
||||
<asp:BoundColumn HeaderText="ShippedDate" DataFormatString="{0:d}" DataField="ShippedDate" />
|
||||
</Columns>
|
||||
</asp:DataGrid>
|
||||
|
||||
<p>
|
||||
<asp:Button ID="processOrders" runat="server" Text="Process Orders"
|
||||
onclick="processOrders_Click" />
|
||||
</p>
|
||||
<div class="actionPanel">
|
||||
<asp:LinkButton ID="customerList" runat="server" onclick="customerList_Click">« Back to customer list</asp:LinkButton>
|
||||
</div>
|
||||
</div>
|
||||
</asp:Content>
|
||||
@@ -0,0 +1,77 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Web.UI.WebControls;
|
||||
|
||||
using NHibernate;
|
||||
|
||||
using Spring.Northwind.Domain;
|
||||
|
||||
public partial class CustomerOrders : ConversationPage
|
||||
{
|
||||
private ICustomerEditController customerEditController;
|
||||
|
||||
public ICustomerEditController CustomerEditController
|
||||
{
|
||||
set { customerEditController = value; }
|
||||
}
|
||||
|
||||
public Customer SelectedCustomer
|
||||
{
|
||||
get { return customerEditController.CurrentCustomer; }
|
||||
}
|
||||
|
||||
public CustomerOrders()
|
||||
{
|
||||
InitializeControls += Page_InitializeControls;
|
||||
DataBound += Page_DataBound;
|
||||
DataUnbound += Page_DataUnbound;
|
||||
}
|
||||
|
||||
protected override void InitializeDataBindings()
|
||||
{
|
||||
base.InitializeDataBindings();
|
||||
|
||||
// do the "one time" setup for databinding
|
||||
}
|
||||
|
||||
private void Page_DataBound(object sender, EventArgs e)
|
||||
{
|
||||
// perform custom tasks for binding data from model to the form
|
||||
}
|
||||
|
||||
private void Page_DataUnbound(object sender, EventArgs e)
|
||||
{
|
||||
// perform custom tasks for unbinding data from form to the model
|
||||
}
|
||||
|
||||
private void Page_InitializeControls(object sender, EventArgs e)
|
||||
{
|
||||
// create/initialize controls here
|
||||
customerOrders.DataSource = SelectedCustomer.Orders;
|
||||
customerName.Text = SelectedCustomer.CompanyName;
|
||||
if (!IsPostBack)
|
||||
{
|
||||
customerOrders.DataBind();
|
||||
}
|
||||
else
|
||||
{
|
||||
customerOrders.ItemCreated += CustomerList_ItemCreated;
|
||||
}
|
||||
}
|
||||
|
||||
private void CustomerList_ItemCreated(object sender, DataGridItemEventArgs e)
|
||||
{
|
||||
if (e.Item.DataSetIndex > -1)
|
||||
{
|
||||
e.Item.DataItem = ((IList) customerOrders.DataSource)[e.Item.DataSetIndex];
|
||||
}
|
||||
}
|
||||
protected void customerList_Click(object sender, EventArgs e)
|
||||
{
|
||||
SetResult("CustomerList");
|
||||
}
|
||||
protected void processOrders_Click(object sender, EventArgs e)
|
||||
{
|
||||
SetResult("ProcessOrders");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:2.0.50727.5448
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
public partial class CustomerOrders {
|
||||
|
||||
/// <summary>
|
||||
/// customerName control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.Literal customerName;
|
||||
|
||||
/// <summary>
|
||||
/// customerOrders control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.DataGrid customerOrders;
|
||||
|
||||
/// <summary>
|
||||
/// processOrders control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.Button processOrders;
|
||||
|
||||
/// <summary>
|
||||
/// customerList control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.LinkButton customerList;
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<%@ Page Language="C#" MasterPageFile="~/Shared/MasterPage.master"
|
||||
Inherits="CustomerView" Codebehind="CustomerView.aspx.cs" %>
|
||||
|
||||
<asp:Content ID="content" ContentPlaceHolderID="content" runat="server">
|
||||
<div align="center">
|
||||
<spring:DataBindingPanel runat="server" ID="panel">
|
||||
<fieldset>
|
||||
<legend>Customer details</legend>
|
||||
<table>
|
||||
<tr>
|
||||
<td class="formLabelCell">
|
||||
ID:</td>
|
||||
<td class="formValueCell">
|
||||
<%= CurrentCustomer.Id %>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="formLabelCell">
|
||||
Contact:</td>
|
||||
<td class="formValueCell">
|
||||
<%= CurrentCustomer.ContactName %>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</fieldset>
|
||||
</spring:DataBindingPanel>
|
||||
<div class="actionPanel">
|
||||
<asp:LinkButton ID="customerList" runat="server" onclick="customerList_Click">« Back to customer list</asp:LinkButton> |
|
||||
<asp:LinkButton ID="editCustomer" runat="server" onclick="editCustomer_Click">Edit Customer »</asp:LinkButton>
|
||||
</div>
|
||||
</div>
|
||||
</asp:Content>
|
||||
@@ -0,0 +1,69 @@
|
||||
using System;
|
||||
using System.Web;
|
||||
using Spring.Northwind.Dao;
|
||||
using Spring.Northwind.Domain;
|
||||
using Spring.Web.UI;
|
||||
|
||||
public partial class CustomerView : ConversationPage
|
||||
{
|
||||
private ICustomerEditController customerEditController;
|
||||
private ICustomerDao customerDao;
|
||||
|
||||
public ICustomerDao CustomerDao
|
||||
{
|
||||
set { this.customerDao = value; }
|
||||
}
|
||||
|
||||
public ICustomerEditController CustomerEditController
|
||||
{
|
||||
set { this.customerEditController = value; }
|
||||
}
|
||||
|
||||
public Customer CurrentCustomer
|
||||
{
|
||||
get { return customerEditController.CurrentCustomer; }
|
||||
}
|
||||
|
||||
// public static void Edit( Customer customer )
|
||||
// {
|
||||
// HttpContext.Current.Session[typeof(CustomerEditor).FullName + ".Customer"] = customer;
|
||||
// }
|
||||
|
||||
public CustomerView()
|
||||
{
|
||||
this.InitializeControls += new EventHandler(Page_InitializeControls);
|
||||
this.DataBound += new EventHandler(Page_DataBound);
|
||||
this.DataUnbound += new EventHandler(Page_DataUnbound);
|
||||
}
|
||||
|
||||
override protected void InitializeDataBindings()
|
||||
{
|
||||
base.InitializeDataBindings();
|
||||
|
||||
// do the "one time" setup for databinding
|
||||
}
|
||||
|
||||
private void Page_DataBound(object sender, EventArgs e)
|
||||
{
|
||||
// perform custom tasks for binding data from model to the form
|
||||
}
|
||||
|
||||
private void Page_DataUnbound(object sender, EventArgs e)
|
||||
{
|
||||
// perform custom tasks for unbinding data from form to the model
|
||||
}
|
||||
|
||||
private void Page_InitializeControls(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
protected void customerList_Click(object sender, EventArgs e)
|
||||
{
|
||||
SetResult("CustomerList");
|
||||
}
|
||||
protected void editCustomer_Click(object sender, EventArgs e)
|
||||
{
|
||||
SetResult("EditCustomer");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:2.0.50727.5448
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
public partial class CustomerView {
|
||||
|
||||
/// <summary>
|
||||
/// panel control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::Spring.Web.UI.Controls.DataBindingPanel panel;
|
||||
|
||||
/// <summary>
|
||||
/// customerList control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.LinkButton customerList;
|
||||
|
||||
/// <summary>
|
||||
/// editCustomer control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.LinkButton editCustomer;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
<%@ Page Language="C#" MasterPageFile="~/Shared/MasterPage.master" AutoEventWireup="true" Inherits="_Default" Codebehind="Default.aspx.cs" %>
|
||||
|
||||
<asp:Content ID="content" ContentPlaceHolderID="content" runat="server">
|
||||
|
||||
<h1>Welcome to Spring.NET Northwind sample application!</h1>
|
||||
|
||||
<p>
|
||||
This sample demostrates Spring.NET NHibernate integration and concepts. All data access is done using NHibernate and
|
||||
all transactions are automatically handled by Spring.NET.
|
||||
</p>
|
||||
|
||||
<asp:LinkButton ID="customerList" runat="server" onclick="customerList_Click">Proceed to customer listing »</asp:LinkButton>
|
||||
</asp:Content>
|
||||
@@ -0,0 +1,53 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using Spring.Northwind.Dao;
|
||||
using Spring.Northwind.Domain;
|
||||
using Spring.Northwind.Service;
|
||||
|
||||
public partial class _Default : ConversationPage
|
||||
{
|
||||
private ICustomerDao customerDao;
|
||||
private IFulfillmentService fulfillmentService;
|
||||
|
||||
public IFulfillmentService FulfillmentService
|
||||
{
|
||||
set { this.fulfillmentService = value; }
|
||||
}
|
||||
|
||||
public ICustomerDao CustomerDao
|
||||
{
|
||||
set { this.customerDao = value; }
|
||||
}
|
||||
|
||||
protected void Button1_Click(object sender, EventArgs e)
|
||||
{
|
||||
ProcessCustomer();
|
||||
}
|
||||
|
||||
public void ProcessCustomer()
|
||||
{
|
||||
string customerId = "ERNSH";
|
||||
|
||||
// check, if exists
|
||||
Customer customer = customerDao.Get(customerId);
|
||||
|
||||
//Find all orders for customer and ship them
|
||||
this.fulfillmentService.ProcessCustomer(customer.Id);
|
||||
//assertions....
|
||||
|
||||
// prepare for display - note that OrderDetails are loaded lazy here!
|
||||
foreach (Order order in customer.Orders)
|
||||
{
|
||||
Debug.Assert(order.OrderDetails.Count > 0);
|
||||
foreach(OrderDetail details in order.OrderDetails)
|
||||
{
|
||||
details.Quantity = details.Quantity - 1;
|
||||
// do something here
|
||||
}
|
||||
}
|
||||
}
|
||||
protected void customerList_Click(object sender, EventArgs e)
|
||||
{
|
||||
SetResult("CustomerList");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:2.0.50727.5448
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
public partial class _Default {
|
||||
|
||||
/// <summary>
|
||||
/// customerList control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.LinkButton customerList;
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<%@ Page Language="C#" MasterPageFile="~/Shared/MasterPage.master" AutoEventWireup="true" Inherits="FullfillmentResult" Codebehind="FulfillmentResult.aspx.cs" %>
|
||||
|
||||
<%@ Register Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
|
||||
Namespace="System.Web.UI" TagPrefix="asp" %>
|
||||
<asp:Content ID="content" ContentPlaceHolderID="content" runat="server">
|
||||
<h1>Order processing results</h1>
|
||||
|
||||
<p>
|
||||
Below you can see the results from order fullfilment.
|
||||
</p>
|
||||
|
||||
<div align="center">
|
||||
<div class="actionResultWindow">
|
||||
<asp:Label ID="results" runat="server" Text=""></asp:Label>
|
||||
</div>
|
||||
<div class="actionPanel">
|
||||
<asp:LinkButton ID="customerOrders" runat="server" OnClick="customerOrders_Click">« Back to customer order list</asp:LinkButton>
|
||||
</div>
|
||||
</div>
|
||||
</asp:Content>
|
||||
@@ -0,0 +1,65 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
using log4net.Appender;
|
||||
using log4net.Core;
|
||||
using log4net.Layout;
|
||||
using log4net.Repository;
|
||||
|
||||
using Spring.Northwind.Service;
|
||||
using Spring.Web.UI;
|
||||
|
||||
using LogManager=log4net.LogManager;
|
||||
|
||||
public partial class FullfillmentResult : ConversationPage
|
||||
{
|
||||
private IFulfillmentService fulfillmentService;
|
||||
private ICustomerEditController customerEditController;
|
||||
|
||||
public IFulfillmentService FulfillmentService
|
||||
{
|
||||
set { fulfillmentService = value; }
|
||||
}
|
||||
|
||||
public ICustomerEditController CustomerEditController
|
||||
{
|
||||
set { customerEditController = value; }
|
||||
}
|
||||
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
// gather log4net output with small hack to get results...
|
||||
ILoggerRepository repository = LogManager.GetRepository();
|
||||
IAppender[] appenders = repository.GetAppenders();
|
||||
MemoryAppender appender = null;
|
||||
foreach (IAppender a in appenders)
|
||||
{
|
||||
if (a is MemoryAppender)
|
||||
{
|
||||
// we found our appender to look results from
|
||||
appender = a as MemoryAppender;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (appender != null)
|
||||
{
|
||||
appender.Clear();
|
||||
fulfillmentService.ProcessCustomer(customerEditController.CurrentCustomer.Id);
|
||||
LoggingEvent[] events = appender.GetEvents();
|
||||
StringWriter stringWriter = new StringWriter();
|
||||
PatternLayout layout = new PatternLayout("%date{HH:mm:ss} %-5level %logger{1}: %message<br />");
|
||||
foreach (LoggingEvent loggingEvent in events)
|
||||
{
|
||||
layout.Format(stringWriter, loggingEvent);
|
||||
}
|
||||
|
||||
results.Text = stringWriter.ToString();
|
||||
}
|
||||
|
||||
}
|
||||
protected void customerOrders_Click(object sender, EventArgs e)
|
||||
{
|
||||
SetResult("Back");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:2.0.50727.5448
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
public partial class FullfillmentResult {
|
||||
|
||||
/// <summary>
|
||||
/// results control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.Label results;
|
||||
|
||||
/// <summary>
|
||||
/// customerOrders control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.LinkButton customerOrders;
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<%@ Application Language="C#" %>
|
||||
|
||||
<script runat="server">
|
||||
|
||||
void Application_Start(object sender, EventArgs e)
|
||||
{
|
||||
// Code that runs on application startup
|
||||
}
|
||||
|
||||
void Application_End(object sender, EventArgs e)
|
||||
{
|
||||
// Code that runs on application shutdown
|
||||
}
|
||||
|
||||
void Application_Error(object sender, EventArgs e)
|
||||
{
|
||||
// Code that runs when an unhandled error occurs
|
||||
|
||||
}
|
||||
|
||||
void Session_Start(object sender, EventArgs e)
|
||||
{
|
||||
// Code that runs when a new session is started
|
||||
|
||||
}
|
||||
|
||||
void Session_End(object sender, EventArgs e)
|
||||
{
|
||||
// Code that runs when a session ends.
|
||||
// Note: The Session_End event is raised only when the sessionstate mode
|
||||
// is set to InProc in the Web.config file. If session mode is set to StateServer
|
||||
// or SQLServer, the event is not raised.
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 540 B |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 22 KiB |
@@ -0,0 +1,45 @@
|
||||
<%@ Master Language="C#" AutoEventWireup="true" Inherits="Shared_MasterPage" Codebehind="MasterPage.master.cs" %>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head runat="server">
|
||||
<title>Spring.NET NHibernate Northwind Example</title>
|
||||
<link type="text/css" rel="Stylesheet" href="../CSS/style.css" />
|
||||
</head>
|
||||
<body>
|
||||
<form id="form1" runat="server">
|
||||
<a name="top" />
|
||||
<div align="center">
|
||||
<div style="position: relative; top: 0px; width: 719px;">
|
||||
<table border="0" cellpadding="0" cellspacing="0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td id="headerCell">
|
||||
<div class="logo">
|
||||
<a href="~/Default.aspx" runat="server">
|
||||
<img src="img/logo.png" border="0" height="84" width="271"></a>
|
||||
</div>
|
||||
<div class="headerText">
|
||||
Goes Northwind <br /> with NHibernate
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="contentCell">
|
||||
<div style="margin: 20px;">
|
||||
|
||||
<asp:ContentPlaceHolder ID="content" runat="server">
|
||||
</asp:ContentPlaceHolder>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td id="footerCell">
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,9 @@
|
||||
using System;
|
||||
|
||||
public partial class Shared_MasterPage : System.Web.UI.MasterPage
|
||||
{
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:2.0.50727.5448
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
public partial class Shared_MasterPage {
|
||||
|
||||
/// <summary>
|
||||
/// form1 control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.HtmlControls.HtmlForm form1;
|
||||
|
||||
/// <summary>
|
||||
/// content control.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Auto-generated field.
|
||||
/// To modify move field declaration from designer file to code-behind file.
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.WebControls.ContentPlaceHolder content;
|
||||
}
|
||||
@@ -0,0 +1,238 @@
|
||||
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{8DCDA20D-DF9F-4723-9649-BC6934B36DC4}</ProjectGuid>
|
||||
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Spring.Northwind.Web</RootNamespace>
|
||||
<AssemblyName>Spring.Northwind.Web</AssemblyName>
|
||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Common.Logging, Version=1.2.0.0, Culture=neutral, PublicKeyToken=af08829b84f0328e">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Common.Logging.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Common.Logging.Log4Net, Version=1.2.0.2, Culture=neutral, PublicKeyToken=af08829b84f0328e, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\net\2.0\Common.Logging.Log4Net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\lib\NHibernate32\net\3.5\Iesi.Collections.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\net\2.0\log4net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NHibernate, Version=3.2.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\lib\NHibernate32\net\3.5\NHibernate.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Aop, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Spring.Aop.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Web.Conversation.NHibernate32, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Spring.Web.Conversation.NHibernate32.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Core, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Spring.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Data, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Spring.Data.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Data.NHibernate32, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Spring.Data.NHibernate32.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Web, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Spring.Web.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Core">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Data.DataSetExtensions">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Data.SQLite, Version=1.0.65.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\net\2.0\System.Data.SQLite.DLL</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Web.Extensions">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Xml.Linq">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Web" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Web.Services" />
|
||||
<Reference Include="System.EnterpriseServices" />
|
||||
<Reference Include="System.Web.Mobile" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="CSS\style.css" />
|
||||
<Content Include="CustomerEditor.aspx" />
|
||||
<Content Include="CustomerList.aspx" />
|
||||
<Content Include="CustomerOrders.aspx" />
|
||||
<Content Include="CustomerView.aspx" />
|
||||
<Content Include="Default.aspx" />
|
||||
<Content Include="FulfillmentResult.aspx" />
|
||||
<Content Include="Global.asax" />
|
||||
<Content Include="Img\bg-spring.png" />
|
||||
<Content Include="Img\footern.gif" />
|
||||
<Content Include="Img\header-spring.png" />
|
||||
<Content Include="Img\logo.png" />
|
||||
<Content Include="Img\springNet_release.png" />
|
||||
<Content Include="Logs\log.txt" />
|
||||
<Content Include="Web.net40.config" />
|
||||
<Content Include="Web.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="ConversationPage.cs">
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerEditor.aspx.designer.cs">
|
||||
<DependentUpon>CustomerEditor.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerList.aspx.designer.cs">
|
||||
<DependentUpon>CustomerList.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerOrders.aspx.designer.cs">
|
||||
<DependentUpon>CustomerOrders.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerView.aspx.designer.cs">
|
||||
<DependentUpon>CustomerView.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Default.aspx.designer.cs">
|
||||
<DependentUpon>Default.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="FulfillmentResult.aspx.designer.cs">
|
||||
<DependentUpon>FulfillmentResult.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Controller\ICustomerEditController.cs" />
|
||||
<Compile Include="Controller\NHibernateCustomerEditController.cs" />
|
||||
<Compile Include="CustomerEditor.aspx.cs">
|
||||
<DependentUpon>CustomerEditor.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerList.aspx.cs">
|
||||
<DependentUpon>CustomerList.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerOrders.aspx.cs">
|
||||
<DependentUpon>CustomerOrders.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerView.aspx.cs">
|
||||
<DependentUpon>CustomerView.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Default.aspx.cs">
|
||||
<DependentUpon>Default.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="FulfillmentResult.aspx.cs">
|
||||
<DependentUpon>FulfillmentResult.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Shared\MasterPage.master.cs">
|
||||
<DependentUpon>MasterPage.master</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Shared\MasterPage.master.designer.cs">
|
||||
<DependentUpon>MasterPage.master</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="App_Themes\Spring\Spring.skin" />
|
||||
<Content Include="Config\Aspects.xml" />
|
||||
<Content Include="Config\Log4Net.xml" />
|
||||
<Content Include="Shared\MasterPage.master" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Spring.Northwind.Dao.NHibernate\Spring.Northwind.Dao.NHibernate.2008.csproj">
|
||||
<Project>{6E4F55A0-C281-4706-A08B-BDEC2D2FBDA4}</Project>
|
||||
<Name>Spring.Northwind.Dao.NHibernate.2008</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Northwind.Dao\Spring.Northwind.Dao.2008.csproj">
|
||||
<Project>{7F45EEA2-50AC-44E2-85A6-2FFB02E38C44}</Project>
|
||||
<Name>Spring.Northwind.Dao.2008</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Northwind.Service\Spring.Northwind.Service.2008.csproj">
|
||||
<Project>{9E15876F-E9E0-43B7-9874-B54F163757D6}</Project>
|
||||
<Name>Spring.Northwind.Service.2008</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Web.net30.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Web.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="App_Data\" />
|
||||
<Folder Include="Properties\" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
<ProjectExtensions>
|
||||
<VisualStudio>
|
||||
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
|
||||
<WebProjectProperties>
|
||||
<UseIIS>False</UseIIS>
|
||||
<AutoAssignPort>True</AutoAssignPort>
|
||||
<DevelopmentServerPort>60934</DevelopmentServerPort>
|
||||
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
||||
<IISUrl>
|
||||
</IISUrl>
|
||||
<NTLMAuthentication>False</NTLMAuthentication>
|
||||
<UseCustomServer>False</UseCustomServer>
|
||||
<CustomServerUrl>
|
||||
</CustomServerUrl>
|
||||
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
|
||||
</WebProjectProperties>
|
||||
</FlavorProperties>
|
||||
</VisualStudio>
|
||||
</ProjectExtensions>
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>copy "$(ProjectDir)Web.net30.config" "$(ProjectDir)Web.config" /Y</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,234 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{8EEAB62E-DBAF-4C5F-9906-77B2A817F945}</ProjectGuid>
|
||||
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Spring.Northwind.Web</RootNamespace>
|
||||
<AssemblyName>Spring.Northwind.Web</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
<OldToolsVersion>3.5</OldToolsVersion>
|
||||
<UpgradeBackupLocation />
|
||||
<TargetFrameworkProfile />
|
||||
<UseIISExpress>false</UseIISExpress>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Common.Logging, Version=1.2.0.0, Culture=neutral, PublicKeyToken=af08829b84f0328e">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Common.Logging.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Common.Logging.Log4Net1210">
|
||||
<HintPath>..\..\lib\net\2.0\Common.Logging.Log4Net1210.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\lib\NHibernate32\net\4.0\Iesi.Collections.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\net\2.0\log4net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NHibernate">
|
||||
<HintPath>..\..\..\..\..\lib\NHibernate32\net\4.0\NHibernate.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Aop, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Spring.Aop.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Web.Conversation.NHibernate32">
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Spring.Web.Conversation.NHibernate32.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Core, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Spring.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Data, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Spring.Data.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Data.NHibernate32, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Spring.Data.NHibernate32.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Web, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Spring.Web.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="System.Data.SQLite, Version=1.0.65.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\net\2.0\System.Data.SQLite.DLL</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Web.ApplicationServices" />
|
||||
<Reference Include="System.Web.DynamicData" />
|
||||
<Reference Include="System.Web.Entity" />
|
||||
<Reference Include="System.Web.Extensions" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Web" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Web.Services" />
|
||||
<Reference Include="System.EnterpriseServices" />
|
||||
<Reference Include="System.Web.Mobile" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="CSS\style.css" />
|
||||
<Content Include="CustomerEditor.aspx" />
|
||||
<Content Include="CustomerList.aspx" />
|
||||
<Content Include="CustomerOrders.aspx" />
|
||||
<Content Include="CustomerView.aspx" />
|
||||
<Content Include="Default.aspx" />
|
||||
<Content Include="FulfillmentResult.aspx" />
|
||||
<Content Include="Global.asax" />
|
||||
<Content Include="Img\bg-spring.png" />
|
||||
<Content Include="Img\footern.gif" />
|
||||
<Content Include="Img\header-spring.png" />
|
||||
<Content Include="Img\logo.png" />
|
||||
<Content Include="Img\springNet_release.png" />
|
||||
<Content Include="Logs\log.txt" />
|
||||
<Content Include="Web.config" />
|
||||
<Content Include="Web.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="ConversationPage.cs">
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerEditor.aspx.designer.cs">
|
||||
<DependentUpon>CustomerEditor.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerList.aspx.designer.cs">
|
||||
<DependentUpon>CustomerList.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerOrders.aspx.designer.cs">
|
||||
<DependentUpon>CustomerOrders.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerView.aspx.designer.cs">
|
||||
<DependentUpon>CustomerView.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Default.aspx.designer.cs">
|
||||
<DependentUpon>Default.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="FulfillmentResult.aspx.designer.cs">
|
||||
<DependentUpon>FulfillmentResult.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Controller\ICustomerEditController.cs" />
|
||||
<Compile Include="Controller\NHibernateCustomerEditController.cs" />
|
||||
<Compile Include="CustomerEditor.aspx.cs">
|
||||
<DependentUpon>CustomerEditor.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerList.aspx.cs">
|
||||
<DependentUpon>CustomerList.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerOrders.aspx.cs">
|
||||
<DependentUpon>CustomerOrders.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerView.aspx.cs">
|
||||
<DependentUpon>CustomerView.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Default.aspx.cs">
|
||||
<DependentUpon>Default.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="FulfillmentResult.aspx.cs">
|
||||
<DependentUpon>FulfillmentResult.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Shared\MasterPage.master.cs">
|
||||
<DependentUpon>MasterPage.master</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Shared\MasterPage.master.designer.cs">
|
||||
<DependentUpon>MasterPage.master</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="App_Themes\Spring\Spring.skin" />
|
||||
<Content Include="Config\Aspects.xml" />
|
||||
<Content Include="Config\Log4Net.xml" />
|
||||
<Content Include="Shared\MasterPage.master" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Spring.Northwind.Dao.NHibernate\Spring.Northwind.Dao.NHibernate.2010.csproj">
|
||||
<Project>{6E4F55A0-C281-4706-A08B-BDEC2D2FBDA4}</Project>
|
||||
<Name>Spring.Northwind.Dao.NHibernate.2010</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Northwind.Dao\Spring.Northwind.Dao.2010.csproj">
|
||||
<Project>{7F45EEA2-50AC-44E2-85A6-2FFB02E38C44}</Project>
|
||||
<Name>Spring.Northwind.Dao.2010</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Northwind.Service\Spring.Northwind.Service.2010.csproj">
|
||||
<Project>{9E15876F-E9E0-43B7-9874-B54F163757D6}</Project>
|
||||
<Name>Spring.Northwind.Service.2010</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="App_Data\" />
|
||||
<Folder Include="Properties\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Web.net30.config" />
|
||||
<Content Include="Web.net40.config" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
<ProjectExtensions>
|
||||
<VisualStudio>
|
||||
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
|
||||
<WebProjectProperties>
|
||||
<UseIIS>False</UseIIS>
|
||||
<AutoAssignPort>True</AutoAssignPort>
|
||||
<DevelopmentServerPort>60934</DevelopmentServerPort>
|
||||
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
||||
<IISUrl>
|
||||
</IISUrl>
|
||||
<NTLMAuthentication>False</NTLMAuthentication>
|
||||
<UseCustomServer>False</UseCustomServer>
|
||||
<CustomServerUrl>
|
||||
</CustomServerUrl>
|
||||
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
|
||||
</WebProjectProperties>
|
||||
</FlavorProperties>
|
||||
</VisualStudio>
|
||||
</ProjectExtensions>
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>copy "$(ProjectDir)Web.net40.config" "$(ProjectDir)Web.config" /Y</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,73 @@
|
||||
<?xml version="1.0"?>
|
||||
<!--
|
||||
Note: As an alternative to hand editing this file you can use the
|
||||
web admin tool to configure settings for your application. Use
|
||||
the Website->Asp.Net Configuration option in Visual Studio.
|
||||
A full list of settings and comments can be found in
|
||||
machine.config.comments usually located in
|
||||
\Windows\Microsoft.Net\Framework\v2.x\Config
|
||||
-->
|
||||
<configuration>
|
||||
<configSections>
|
||||
<sectionGroup name="common">
|
||||
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
|
||||
</sectionGroup>
|
||||
<sectionGroup name="spring">
|
||||
<section name="context" type="Spring.Context.Support.WebContextHandler, Spring.Web"/>
|
||||
<section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/>
|
||||
</sectionGroup>
|
||||
<section name="databaseSettings" type="System.Configuration.NameValueSectionHandler"/>
|
||||
</configSections>
|
||||
<common>
|
||||
<logging>
|
||||
<factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net1210">
|
||||
<!-- choices are INLINE, FILE, FILE-WATCH, EXTERNAL-->
|
||||
<!-- otherwise BasicConfigurer.Configure is used -->
|
||||
<!-- log4net configuration file is specified with key configFile-->
|
||||
<arg key="configType" value="FILE-WATCH"/>
|
||||
<arg key="configFile" value="~/Config/Log4Net.xml"/>
|
||||
</factoryAdapter>
|
||||
</logging>
|
||||
</common>
|
||||
<spring>
|
||||
<parsers>
|
||||
<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data"/>
|
||||
<parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data"/>
|
||||
</parsers>
|
||||
<context>
|
||||
<resource uri="~/Config/Aspects.xml"/>
|
||||
<resource uri="assembly://Spring.Northwind.Dao.NHibernate/Spring.Northwind.Dao/DaoConversation.xml"/>
|
||||
<resource uri="assembly://Spring.Northwind.Service/Spring.Northwind.Service/Services.xml"/>
|
||||
<resource uri="~/Web.xml"/>
|
||||
</context>
|
||||
</spring>
|
||||
<!-- These properties are referenced in Dao.xml -->
|
||||
<databaseSettings>
|
||||
<add key="db.datasource" value=".\SQLEXPRESS; Integrated Security=true; AttachDbFilename=|DataDirectory|northwnd.mdf; User Instance=true;"/>
|
||||
<add key="db.user" value="springqa"/>
|
||||
<add key="db.password" value="springqa"/>
|
||||
<add key="db.database" value="Northwind"/>
|
||||
</databaseSettings>
|
||||
<appSettings>
|
||||
<add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="NHibernateSessionFactory"/>
|
||||
</appSettings>
|
||||
<connectionStrings/>
|
||||
<system.web>
|
||||
<httpModules>
|
||||
<add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/>
|
||||
<!--<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate21"/>-->
|
||||
<!--Module that controls the conversations at the end of the request. Ends the Conversations in timeout and pause the conversations at the end of the request.-->
|
||||
<add name="ConversationModule" type="Spring.Web.Conversation.HttpModule.ConversationModule, Spring.Web.Conversation.NHibernate32"/>
|
||||
</httpModules>
|
||||
<httpHandlers>
|
||||
<add verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web"/>
|
||||
<add verb="*" path="ContextMonitor.ashx" type="Spring.Web.Support.ContextMonitor, Spring.Web"/>
|
||||
</httpHandlers>
|
||||
<compilation debug="true" targetFramework="4.0"/>
|
||||
<pages theme="Spring" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
|
||||
<controls>
|
||||
<add tagPrefix="spring" namespace="Spring.Web.UI.Controls" assembly="Spring.Web"/>
|
||||
</controls>
|
||||
</pages>
|
||||
</system.web>
|
||||
</configuration>
|
||||
@@ -0,0 +1,74 @@
|
||||
<?xml version="1.0"?>
|
||||
<!--
|
||||
Note: As an alternative to hand editing this file you can use the
|
||||
web admin tool to configure settings for your application. Use
|
||||
the Website->Asp.Net Configuration option in Visual Studio.
|
||||
A full list of settings and comments can be found in
|
||||
machine.config.comments usually located in
|
||||
\Windows\Microsoft.Net\Framework\v2.x\Config
|
||||
-->
|
||||
<configuration>
|
||||
<configSections>
|
||||
<sectionGroup name="common">
|
||||
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
|
||||
</sectionGroup>
|
||||
<sectionGroup name="spring">
|
||||
<section name="context" type="Spring.Context.Support.WebContextHandler, Spring.Web"/>
|
||||
<section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/>
|
||||
</sectionGroup>
|
||||
<section name="databaseSettings" type="System.Configuration.NameValueSectionHandler"/>
|
||||
</configSections>
|
||||
<common>
|
||||
<logging>
|
||||
<factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net1210">
|
||||
<!-- choices are INLINE, FILE, FILE-WATCH, EXTERNAL-->
|
||||
<!-- otherwise BasicConfigurer.Configure is used -->
|
||||
<!-- log4net configuration file is specified with key configFile-->
|
||||
<arg key="configType" value="FILE-WATCH"/>
|
||||
<arg key="configFile" value="~/Config/Log4Net.xml"/>
|
||||
</factoryAdapter>
|
||||
</logging>
|
||||
</common>
|
||||
<spring>
|
||||
<parsers>
|
||||
<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data"/>
|
||||
<parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data"/>
|
||||
</parsers>
|
||||
<context>
|
||||
<resource uri="~/Config/Aspects.xml"/>
|
||||
<resource uri="assembly://Spring.Northwind.Dao.NHibernate/Spring.Northwind.Dao/DaoConversation.xml"/>
|
||||
<resource uri="assembly://Spring.Northwind.Service/Spring.Northwind.Service/Services.xml"/>
|
||||
<resource uri="~/Web.xml"/>
|
||||
</context>
|
||||
</spring>
|
||||
<!-- These properties are referenced in Dao.xml -->
|
||||
<databaseSettings>
|
||||
<add key="db.datasource" value=".\SQLEXPRESS; Integrated Security=true; AttachDbFilename=|DataDirectory|northwnd.mdf; User Instance=true;"/>
|
||||
<add key="db.user" value="springqa"/>
|
||||
<add key="db.password" value="springqa"/>
|
||||
<add key="db.database" value="Northwind"/>
|
||||
</databaseSettings>
|
||||
<appSettings>
|
||||
<add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="NHibernateSessionFactory"/>
|
||||
</appSettings>
|
||||
<connectionStrings/>
|
||||
<system.web>
|
||||
<httpModules>
|
||||
<add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/>
|
||||
<!--<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate21"/>-->
|
||||
<!--Module that controls the conversations at the end of the request. Ends the Conversations in timeout and pause the conversations at the end of the request.-->
|
||||
<add name="ConversationModule" type="Spring.Web.Conversation.HttpModule.ConversationModule, Spring.Web.Conversation.NHibernate32"/>
|
||||
</httpModules>
|
||||
<httpHandlers>
|
||||
<add verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web"/>
|
||||
<add verb="*" path="*.asmx" type="Spring.Web.Services.WebServiceHandlerFactory, Spring.Web"/>
|
||||
<add verb="*" path="ContextMonitor.ashx" type="Spring.Web.Support.ContextMonitor, Spring.Web"/>
|
||||
</httpHandlers>
|
||||
<compilation debug="true"/>
|
||||
<pages theme="Spring">
|
||||
<controls>
|
||||
<add tagPrefix="spring" namespace="Spring.Web.UI.Controls" assembly="Spring.Web"/>
|
||||
</controls>
|
||||
</pages>
|
||||
</system.web>
|
||||
</configuration>
|
||||
@@ -0,0 +1,73 @@
|
||||
<?xml version="1.0"?>
|
||||
<!--
|
||||
Note: As an alternative to hand editing this file you can use the
|
||||
web admin tool to configure settings for your application. Use
|
||||
the Website->Asp.Net Configuration option in Visual Studio.
|
||||
A full list of settings and comments can be found in
|
||||
machine.config.comments usually located in
|
||||
\Windows\Microsoft.Net\Framework\v2.x\Config
|
||||
-->
|
||||
<configuration>
|
||||
<configSections>
|
||||
<sectionGroup name="common">
|
||||
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
|
||||
</sectionGroup>
|
||||
<sectionGroup name="spring">
|
||||
<section name="context" type="Spring.Context.Support.WebContextHandler, Spring.Web"/>
|
||||
<section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/>
|
||||
</sectionGroup>
|
||||
<section name="databaseSettings" type="System.Configuration.NameValueSectionHandler"/>
|
||||
</configSections>
|
||||
<common>
|
||||
<logging>
|
||||
<factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net1210">
|
||||
<!-- choices are INLINE, FILE, FILE-WATCH, EXTERNAL-->
|
||||
<!-- otherwise BasicConfigurer.Configure is used -->
|
||||
<!-- log4net configuration file is specified with key configFile-->
|
||||
<arg key="configType" value="FILE-WATCH"/>
|
||||
<arg key="configFile" value="~/Config/Log4Net.xml"/>
|
||||
</factoryAdapter>
|
||||
</logging>
|
||||
</common>
|
||||
<spring>
|
||||
<parsers>
|
||||
<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data"/>
|
||||
<parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data"/>
|
||||
</parsers>
|
||||
<context>
|
||||
<resource uri="~/Config/Aspects.xml"/>
|
||||
<resource uri="assembly://Spring.Northwind.Dao.NHibernate/Spring.Northwind.Dao/DaoConversation.xml"/>
|
||||
<resource uri="assembly://Spring.Northwind.Service/Spring.Northwind.Service/Services.xml"/>
|
||||
<resource uri="~/Web.xml"/>
|
||||
</context>
|
||||
</spring>
|
||||
<!-- These properties are referenced in Dao.xml -->
|
||||
<databaseSettings>
|
||||
<add key="db.datasource" value=".\SQLEXPRESS; Integrated Security=true; AttachDbFilename=|DataDirectory|northwnd.mdf; User Instance=true;"/>
|
||||
<add key="db.user" value="springqa"/>
|
||||
<add key="db.password" value="springqa"/>
|
||||
<add key="db.database" value="Northwind"/>
|
||||
</databaseSettings>
|
||||
<appSettings>
|
||||
<add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="NHibernateSessionFactory"/>
|
||||
</appSettings>
|
||||
<connectionStrings/>
|
||||
<system.web>
|
||||
<httpModules>
|
||||
<add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/>
|
||||
<!--<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate21"/>-->
|
||||
<!--Module that controls the conversations at the end of the request. Ends the Conversations in timeout and pause the conversations at the end of the request.-->
|
||||
<add name="ConversationModule" type="Spring.Web.Conversation.HttpModule.ConversationModule, Spring.Web.Conversation.NHibernate32"/>
|
||||
</httpModules>
|
||||
<httpHandlers>
|
||||
<add verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web"/>
|
||||
<add verb="*" path="ContextMonitor.ashx" type="Spring.Web.Support.ContextMonitor, Spring.Web"/>
|
||||
</httpHandlers>
|
||||
<compilation debug="true" targetFramework="4.0"/>
|
||||
<pages theme="Spring" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
|
||||
<controls>
|
||||
<add tagPrefix="spring" namespace="Spring.Web.UI.Controls" assembly="Spring.Web"/>
|
||||
</controls>
|
||||
</pages>
|
||||
</system.web>
|
||||
</configuration>
|
||||
@@ -0,0 +1,135 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<objects xmlns="http://www.springframework.net">
|
||||
|
||||
<!-- Referenced by main application context configuration file -->
|
||||
|
||||
<description>
|
||||
The Northwind web layer definitions
|
||||
</description>
|
||||
|
||||
<object name="CustomerEditController" type="NHibernateCustomerEditController" singleton="false">
|
||||
<constructor-arg name="sessionFactory" ref="NHibernateSessionFactory"/>
|
||||
</object>
|
||||
|
||||
<object type="Default.aspx">
|
||||
<property name="Conversation" ref="convDefault"/>
|
||||
<property name="FulfillmentService" ref="FulfillmentService" />
|
||||
<property name="CustomerDao" ref="CustomerDao" />
|
||||
<property name="Results">
|
||||
<dictionary>
|
||||
<entry key="CustomerList" value="redirect:CustomerList.aspx" />
|
||||
</dictionary>
|
||||
</property>
|
||||
</object>
|
||||
|
||||
<!--Conversation for 'Default.aspx'-->
|
||||
<!--"convDefault" will have only one functionality: trigger the release of other conversations when started (StartResumeConversation())-->
|
||||
<object name="convDefault" type="Spring.Web.Conversation.WebConversationSpringState, Spring.Web.Conversation.NHibernate32" scope="session">
|
||||
<property name="Id" value="convDefault"></property>
|
||||
<property name="TimeOut" value="0"></property>
|
||||
<property name="ConversationManager" ref="conversationManager"></property>
|
||||
<property name="SessionFactoryName" value="NHibernateSessionFactory"/>
|
||||
<property name="DbProviderName" value="DbProvider"/>
|
||||
</object>
|
||||
|
||||
|
||||
<!--Using workaround for 'conversation scope' to reference for 'CustomerEditController'. It is not as volatile as "request scope" not as durable as the "session scope"-->
|
||||
<object name="CustomerEditPage" abstract="true">
|
||||
<property name="CustomerEditController" expression="@(convCustomer)['CustomerEditController']"/>
|
||||
<property name="Conversation" ref="convCustomer"/>
|
||||
</object>
|
||||
|
||||
<!--Using workaround for 'conversation scope' to reference for 'CustomerEditController'. It is not as volatile as "request scope" not as durable as the "session scope"-->
|
||||
<object type="CustomerList.aspx" parent="CustomerEditPage">
|
||||
<property name="CustomerDao" ref="CustomerDao" />
|
||||
<property name="Results">
|
||||
<dictionary>
|
||||
<entry key="ViewCustomer" value="redirect:CustomerView.aspx" />
|
||||
<entry key="ViewOrders" value="redirect:CustomerOrders.aspx" />
|
||||
</dictionary>
|
||||
</property>
|
||||
</object>
|
||||
|
||||
<object type="CustomerEditor.aspx" parent="CustomerEditPage">
|
||||
<property name="CustomerDao" ref="CustomerDao" />
|
||||
<property name="Results">
|
||||
<dictionary>
|
||||
<entry key="CustomerList" value="redirect:CustomerList.aspx" />
|
||||
<entry key="ViewCustomer" value="redirect:CustomerView.aspx" />
|
||||
<entry key="CancelEdit" value="redirect:CustomerView.aspx" />
|
||||
</dictionary>
|
||||
</property>
|
||||
</object>
|
||||
|
||||
<!--Using workaround for 'conversation scope' to reference for 'CustomerEditController'. It is not as volatile as "request scope" not as durable as the "session scope"-->
|
||||
<object type="CustomerView.aspx">
|
||||
<property name="CustomerDao" ref="CustomerDao" />
|
||||
<property name="CustomerEditController" expression="@(convCustomer)['CustomerEditController']" />
|
||||
<property name="Conversation" ref="convCustomer"/>
|
||||
<property name="Results">
|
||||
<dictionary>
|
||||
<entry key="EditCustomer" value="redirect:CustomerEditor.aspx" />
|
||||
<entry key="CustomerList" value="redirect:CustomerList.aspx" />
|
||||
</dictionary>
|
||||
</property>
|
||||
</object>
|
||||
|
||||
<object type="CustomerOrders.aspx" parent="CustomerEditPage">
|
||||
<property name="Results">
|
||||
<dictionary>
|
||||
<entry key="CustomerList" value="redirect:CustomerList.aspx" />
|
||||
<entry key="ProcessOrders" value="redirect:FulfillmentResult.aspx" />
|
||||
</dictionary>
|
||||
</property>
|
||||
</object>
|
||||
|
||||
<!--Using workaround for 'conversation scope' to reference for 'CustomerEditController'. It is not as volatile as "request scope" not as durable as the "session scope"-->
|
||||
<object type="FulfillmentResult.aspx">
|
||||
<property name="FulfillmentService" ref="FulfillmentService" />
|
||||
<property name="CustomerEditController" expression="@(convCustomer)['CustomerEditController']" />
|
||||
<property name="Conversation" ref="convCustomer"/>
|
||||
<property name="Results">
|
||||
<dictionary>
|
||||
<entry key="Back" value="redirect:CustomerOrders.aspx" />
|
||||
</dictionary>
|
||||
</property>
|
||||
</object>
|
||||
|
||||
<!--Conversation for 'CustomerEditor.aspx', 'CustomerList.aspx', 'CustomerOrders.aspx', 'CustomerView.aspx', and 'FulfillmentResult.aspx'-->
|
||||
<!--Important: If the application had other parties ("management employees" for example), they should use another conversation.-->
|
||||
<object name="convCustomer" type="Spring.Web.Conversation.WebConversationSpringState, Spring.Web.Conversation.NHibernate32" scope="session">
|
||||
<property name="Id" value="convCustomer"></property>
|
||||
<property name="TimeOut" value="0"></property>
|
||||
<property name="ConversationManager" ref="conversationManager"></property>
|
||||
<property name="SessionFactoryName" value="NHibernateSessionFactory"/>
|
||||
<property name="DbProviderName" value="DbProvider"/>
|
||||
<!--Using workaround for 'conversation scope' to reference for 'CustomerEditController'. It is not as volatile as "request scope" not as durable as the "session scope"-->
|
||||
<property name="['CustomerEditController']" ref="CustomerEditController"></property>
|
||||
</object>
|
||||
|
||||
<!--Conversation Manager-->
|
||||
<object name="conversationManager" type="Spring.Web.Conversation.WebConversationManager, Spring.Web.Conversation.NHibernate32" scope="session">
|
||||
<property name="SessionFactoryName" value="NHibernateSessionFactory"/>
|
||||
<property name="EndPaused" value="true"/>
|
||||
</object>
|
||||
|
||||
<!--Configuration for Spring HttpModule interceptor's-->
|
||||
<object name="HttpApplicationConfigurer" type="Spring.Context.Support.HttpApplicationConfigurer, Spring.Web">
|
||||
<property name="ModuleTemplates">
|
||||
<dictionary>
|
||||
<entry key="ConversationModule">
|
||||
<!-- this name must match the module name -->
|
||||
<object>
|
||||
<!-- select "view source" in your browser on any page to see the appended html comment -->
|
||||
<property name="ConversationManagerNameList">
|
||||
<list element-type="string">
|
||||
<value>conversationManager</value>
|
||||
</list>
|
||||
</property>
|
||||
</object>
|
||||
</entry>
|
||||
</dictionary>
|
||||
</property>
|
||||
</object>
|
||||
|
||||
</objects>
|
||||
@@ -0,0 +1,196 @@
|
||||
I prepared the sample application and posted in
|
||||
https://jira.springsource.org/browse/SPRNET-1431 as the file
|
||||
"Spring.Web.Conversation.example.zip.".
|
||||
Below explanations to clarify (or not) what I did.
|
||||
|
||||
This "sample application" is a modification of "Spring.Data.NHibernate.Northwind"
|
||||
contained in the version "1.3.0" of "Spring.NET" to use Conversation.
|
||||
Currently, the "Spring.Net" has no "conversation scope" or implements the
|
||||
concept of "Extended Persistence Context" ("session per conversation strategy").
|
||||
|
||||
In this Sample Application the objective is demonstrate:
|
||||
1) How to keep instances of objects in a mimicry of "conversation scope".
|
||||
Shown in [expression="@(convCustomer)['CustomerEditController']"].
|
||||
2) How to enjoy the "extended persistence context". "Lazy load errors" do not happen
|
||||
anymore and repeated calls of "ISession.Get" to a "same record" do not cause
|
||||
numerous visits to the database, we take advantage of NHibernatecache.
|
||||
The modifications on "CustomerList.aspx" demonstrate this.
|
||||
To verify the effectiveness of Conversation, comment on
|
||||
"App_Code\ConversationPage.cs" the line
|
||||
"this.Conversation.StartResumeConversation ();" then you will see the error
|
||||
"failed to lazily initialize a collection of role" occurring at the click
|
||||
of the button "+" on "CustomerList.aspx".
|
||||
|
||||
|
||||
IMPORTANT: Never use a single conversation for the entire application (with the
|
||||
same duration of the "HTTP Session"). Remember, NHibernate keeps a cache of all
|
||||
loaded objects, if the conversation is held for a long time this cache tends to
|
||||
grow indefinitely (the limit is the amount of database records). That is, each
|
||||
conversation should be limited to a subset of the application pages, and must
|
||||
be discarded at the end of interaction with this subset
|
||||
(IConversationState.EndConversation()).
|
||||
In "Spring.Web.Conversation.WebConversationManager" keep
|
||||
[<property name="EndPaused" value="true"/>] is recommended, so when you start
|
||||
a conversation the others are discarded.
|
||||
|
||||
ADDITIONAL INFORMATION: The unit tests ("Spring.Northwind.IntegrationTests.2008")
|
||||
are not working. But there is no problem because it is not related to the
|
||||
changes made to support conversation, in fact they were already resulting in
|
||||
errors even before that.
|
||||
|
||||
|
||||
List of changes in "Spring.Data.NHibernate.Northwind":
|
||||
|
||||
-Spring.Northwind.Web.References.2008
|
||||
Adding links to schemes to enable auto complete.
|
||||
-web.config
|
||||
-module, added:
|
||||
<!--Module that controls the conversations at the end of the request. Ends the Conversations in timeout and pause the conversations at the end of the request.-->
|
||||
<add name="ConversationModule" type="Spring.Web.Conversation.HttpModule.ConversationModule, Spring.Web.Conversation"/>
|
||||
-module, removed:
|
||||
<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate21"/>
|
||||
|
||||
-web.xml
|
||||
-module configurations
|
||||
<!--Configuration for Spring HttpModule interceptor's-->
|
||||
<object name="HttpApplicationConfigurer" type="Spring.Context.Support.HttpApplicationConfigurer, Spring.Web">
|
||||
<property name="ModuleTemplates">
|
||||
<dictionary>
|
||||
<entry key="ConversationModule">
|
||||
<!-- this name must match the module name -->
|
||||
<object>
|
||||
<!-- select "view source" in your browser on any page to see the appended html comment -->
|
||||
<property name="ConversationManagerNameList">
|
||||
<list element-type="string">
|
||||
<value>conversationManager</value>
|
||||
</list>
|
||||
</property>
|
||||
</object>
|
||||
</entry>
|
||||
</dictionary>
|
||||
</property>
|
||||
</object>
|
||||
|
||||
-conversation manager
|
||||
<!--Conversation Manager-->
|
||||
<object name="conversationManager" type="Spring.Web.Conversation.WebConversationManager, Spring.Web.Conversation" scope="session">
|
||||
<property name="SessionFactory" ref="NHibernateSessionFactory"/>
|
||||
<property name="EndPaused" value="true"/>
|
||||
</object>
|
||||
-Customer Conversation
|
||||
<!--Conversation for 'CustomerEditor.aspx', 'CustomerList.aspx', 'CustomerOrders.aspx', 'CustomerView.aspx', and 'FulfillmentResult.aspx'-->
|
||||
<!--Important: If the application had other parties ("management employees" for example), they should use another conversation.-->
|
||||
<object name="convCustomer" type="Spring.Web.Conversation.WebConversationSpringState, Spring.Web.Conversation" scope="session">
|
||||
<property name="Id" value="convCustomer"></property>
|
||||
<property name="TimeOut" value="0"></property>
|
||||
<property name="ConversationManager" ref="conversationManager"></property>
|
||||
<property name="SessionFactory" ref="NHibernateSessionFactory"/>
|
||||
<property name="DbProvider" ref="DbProvider"/>
|
||||
<!--Using workaround for 'conversation scope' to reference for 'CustomerEditController'. It is not as volatile as "request scope" not as durable as the "session scope"-->
|
||||
<property name="['CustomerEditController']" ref="CustomerEditController"></property>
|
||||
</object>
|
||||
|
||||
-Change "CustomerEditController" scope, remove [scope="session"] and put [singleton="false"]:
|
||||
<object name="CustomerEditController" type="NHibernateCustomerEditController" singleton="false">
|
||||
<constructor-arg name="sessionFactory" ref="NHibernateSessionFactory"/>
|
||||
</object>
|
||||
...
|
||||
|
||||
-Change reference for 'CustomerEditController' remove [ref="CustomerEditController"] and put [expression="@(convCustomer)['CustomerEditController']"]
|
||||
<!--Using workaround for 'conversation scope' to reference for 'CustomerEditController'. It is not as volatile as "request scope" not as durable as the "session scope"-->
|
||||
<object name="CustomerEditPage" abstract="true">
|
||||
<property name="CustomerEditController" expression="@(convCustomer)['CustomerEditController']"/>
|
||||
<property name="Conversation" ref="convCustomer"/>
|
||||
</object>
|
||||
...
|
||||
<!--Using workaround for 'conversation scope' to reference for 'CustomerEditController'. It is not as volatile as "request scope" not as durable as the "session scope"-->
|
||||
<object type="CustomerView.aspx">
|
||||
<property name="CustomerDao" ref="CustomerDao" />
|
||||
<property name="CustomerEditController" expression="@(convCustomer)['CustomerEditController']" />
|
||||
<property name="Conversation" ref="convCustomer"/>
|
||||
<property name="Results">
|
||||
<dictionary>
|
||||
<entry key="EditCustomer" value="redirect:CustomerEditor.aspx" />
|
||||
<entry key="CustomerList" value="redirect:CustomerList.aspx" />
|
||||
</dictionary>
|
||||
</property>
|
||||
</object>
|
||||
...
|
||||
<!--Using workaround for 'conversation scope' to reference for 'CustomerEditController'. It is not as volatile as "request scope" not as durable as the "session scope"-->
|
||||
<object type="FulfillmentResult.aspx">
|
||||
<property name="FulfillmentService" ref="FulfillmentService" />
|
||||
<property name="CustomerEditController" expression="@(convCustomer)['CustomerEditController']" />
|
||||
<property name="Conversation" ref="convCustomer"/>
|
||||
<property name="Results">
|
||||
<dictionary>
|
||||
<entry key="Back" value="redirect:CustomerOrders.aspx" />
|
||||
</dictionary>
|
||||
</property>
|
||||
</object>
|
||||
...
|
||||
<object type="Default.aspx">
|
||||
<property name="Conversation" ref="convDefault"/>
|
||||
<property name="Results">
|
||||
<dictionary>
|
||||
<entry key="CustomerList" value="redirect:CustomerList.aspx" />
|
||||
</dictionary>
|
||||
</property>
|
||||
</object>
|
||||
...
|
||||
<!--Conversation for 'Default.aspx'-->
|
||||
<!--"convDefault" will have the unique functionality: trigger the release of other conversations when started (StartResumeConversation())-->
|
||||
<object name="convDefault" type="Spring.Web.Conversation.WebConversationSpringState, Spring.Web.Conversation" scope="session">
|
||||
<property name="Id" value="convDefault"></property>
|
||||
<property name="TimeOut" value="0"></property>
|
||||
<property name="ConversationManager" ref="conversationManager"></property>
|
||||
<property name="SessionFactory" ref="NHibernateSessionFactory"/>
|
||||
<property name="DbProvider" ref="DbProvider"/>
|
||||
</object>
|
||||
|
||||
-Added "ConversationPage.cs"
|
||||
-Base page with support for conversation.
|
||||
-CustomerList.aspx
|
||||
-Allow list the "Order's" on the same page without lazy initialization error
|
||||
occurs. All objects stay attached to ISession (NHibernate).
|
||||
-CustomerList.aspx.cs:
|
||||
-Added property "IList<Customer> CustomersDetachedList". List not attached.
|
||||
Searching the database only once per conversation.
|
||||
-Changing the "Page_InitializeControls" for consider "CustomersDetachedList".
|
||||
-Change "Page_InitializeControls" to "Page_Init".
|
||||
-The method "BtnShowOrders_Click" performe a implicitly a "lazy load" on
|
||||
"Customer.Orders".
|
||||
-Change [CustomerEditor : Spring.Web.UI.Page] to [CustomerEditor : Spring.Web.UI.Page] on:
|
||||
-CustomerEditor.aspx.cs
|
||||
-CustomerList.aspx.cs
|
||||
-CustomerOrders.aspx.cs
|
||||
-CustomerView.aspx.cs
|
||||
-FullfillmentResult.aspx.cs
|
||||
-Default.aspx.cs
|
||||
-Dao.xml
|
||||
- Added [<entry key="connection.release_mode" value="on_close"/>] to avoid
|
||||
disconnection and reconnection before and after each IDbCommand execution.
|
||||
This is important because we will do more lazyload outside the transaction
|
||||
boundaries.
|
||||
- Added:
|
||||
...
|
||||
<entry key="show_sql" value="true"/>
|
||||
<entry key="format_sql" value="true"/>
|
||||
...
|
||||
-Default.aspx.cs
|
||||
-Remove (they are never used):
|
||||
-customerDao;
|
||||
-fulfillmentService;
|
||||
-CustomerDao;
|
||||
-Button1_Click(object sender, EventArgs e);
|
||||
-ProcessCustomer();
|
||||
-Config\Log4Net.xml.
|
||||
...
|
||||
<!--detail's about SQL's. For view sql commands on Logs\log.txt-->
|
||||
<logger name="NHibernate.SQL">
|
||||
<level value="DEBUG" />
|
||||
</logger>
|
||||
...
|
||||
<!--detail's about Conversation-->
|
||||
<logger name="Spring.Web.Conversation">
|
||||
<level value="DEBUG" />
|
||||
</logger>
|
||||
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 745 B |
@@ -0,0 +1 @@
|
||||
function cssLoad(css){var s=document.createElement('style');document.getElementsByTagName('head')[0].appendChild(s);if(!!window.ActiveXObject){document.styleSheets[document.styleSheets.length-1].cssText=css;}else{stylenode=document.createTextNode(css);s.appendChild(stylenode);}}function azHtmlLoad(div,content){var azDiv=document.getElementById(div);azDiv.innerHTML=content;}function azScriptSRCLoad(div,script){var newScript=document.createElement('script');newScript.type='text/javascript';newScript.src=script;var azDiv=document.getElementById(div);azDiv.appendChild(newScript);}function azScriptInlineLoad(div,script,interval){var newScript=document.createElement('script');newScript.type='text/javascript';if(/msie/.test(navigator.userAgent.toLowerCase())){newScript.text=script;}else{newScript.innerHTML=script;}var azDiv=document.getElementById(div);azDiv.appendChild(newScript);}function azLoad(div,code){var azDiv=document.getElementById(div);if(azDiv){code();}else {setTimeout(function(){azLoad(div,code)},100);}}var zItems=[];function zshow(div){if(zItems[div]){document.write(zItems[div]);}}function ados_frameLoaded(x, y) {};function ados_loadFIframe(a,b,c,d,e){adzerkDiv=document.getElementById(a);ifrm=document.createElement("iframe");ifrm.frameBorder=0;ifrm.scrolling="no";ifrm.noresize="noresize";ifrm.marginheight=0;ifrm.marginwidth=0;if(d!=0){ifrm.height=d}if(e!=0){ifrm.width=e}ifrm.onload=function(){ados_frameLoaded(a,c)};adzerkDiv.innerHtml="";adzerkDiv.appendChild(ifrm);ifrm.contentWindow.contents='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><body style="margin:0px;"><script type="text/javascript">var divName = "'+a+'";var inDapIF = true;<\/script>'+unescape(b)+"</body></html>";ifrm.src='javascript:window["contents"]'}var adzerk1func = function() { ados_loadFIframe('adzerk1', '%3Cscript%20type%3D%22text/javascript%22%20src%3D%22http%3A//static.adzerk.net/ados.js%22%3E%3C/script%3E%0A%3Cscript%20type%3D%22text/javascript%22%3E%0A%3C%21--%20load%20placement%20for%20account%3A%20New%20Relic%2C%20campaign%3A%20StackOverflow%2C%20flight%3A%20Q2%20Ads%2C%20creative%3A%20DOTNET%20728%2C%20site%3A%20StackOverflow%2C%20size%3A%20Leaderboard%20-%20728px%20by%2090px%20--%3E%0Aados_loadInline%28451%2C%2013178%2C%204%29.setFlightCreativeId%2818206%29.setClickUrl%28%27-optional-click-macro-%27%29%3B%0Aados_load%28%29%3B%0A%3C/script%3E', 11966, 90, 728); }; setTimeout(function() { azLoad('adzerk1', adzerk1func) }, 100);var adzerk2code = '<div id=\"careersadsdoublehigh\" style=\"display:none;\"></div>';var adzerk2func = function() { azHtmlLoad('adzerk2', adzerk2code); }; setTimeout(function() { azLoad('adzerk2', adzerk2func) }, 100);
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 865 B |
@@ -0,0 +1,94 @@
|
||||
'use strict';(function(e){function c(){this._events={};this._maxListeners=10}function b(a,b,d,c,e){this.type=a;this.listener=b;this.scope=d;this.once=c;this.instance=e}b.prototype.fire=function(a){this.listener.apply(this.scope||this.instance,a);if(this.once)return this.instance.removeListener(this.type,this.listener,this.scope),!1};c.prototype.eachListener=function(a,b){var d=null,c=null,e=null;if(this._events.hasOwnProperty(a)){c=this._events[a];for(d=0;d<c.length;d+=1)if(e=b.call(this,c[d],d),
|
||||
!1===e)d-=1;else if(!0===e)break}return this};c.prototype.addListener=function(a,f,d,c){this._events.hasOwnProperty(a)||(this._events[a]=[]);this._events[a].push(new b(a,f,d,c,this));this.emit("newListener",a,f,d,c);this._maxListeners&&!this._events[a].warned&&this._events[a].length>this._maxListeners&&("undefined"!==typeof console&&console.warn("Possible EventEmitter memory leak detected. "+this._events[a].length+" listeners added. Use emitter.setMaxListeners() to increase limit."),this._events[a].warned=
|
||||
!0);return this};c.prototype.on=c.prototype.addListener;c.prototype.once=function(a,b,d){return this.addListener(a,b,d,!0)};c.prototype.removeListener=function(a,b,d){this.eachListener(a,function(c,e){c.listener===b&&(!d||c.scope===d)&&this._events[a].splice(e,1)});this._events[a]&&0===this._events[a].length&&delete this._events[a];return this};c.prototype.off=c.prototype.removeListener;c.prototype.removeAllListeners=function(a){a&&this._events.hasOwnProperty(a)?delete this._events[a]:a||(this._events=
|
||||
{});return this};c.prototype.listeners=function(a){if(this._events.hasOwnProperty(a)){var b=[];this.eachListener(a,function(a){b.push(a.listener)});return b}return[]};c.prototype.emit=function(a){for(var b=[],d=null,d=1;d<arguments.length;d+=1)b.push(arguments[d]);this.eachListener(a,function(a){return a.fire(b)});return this};c.prototype.setMaxListeners=function(a){this._maxListeners=a;return this};"function"===typeof define&&define.amd?define(function(){return c}):e.EventEmitter=c})(this);
|
||||
StackExchange.realtime=function(){function e(a){StackExchange.options.user.isDeveloper&&console.log(a)}function c(){p.on("hb",function(a){l.send(a)})}function b(a){v?(e("sending: "+a),l.send(a)):u.push(a)}function a(a,b){1!=$("#vote-accepted-"+a.answerid).length&&($(".vote-accepted-on").remove(),b||$('.vote input[value="'+a.answerid+'"]').parent().append('<span class="vote-accepted-on" title="The question owner accepted this as the best answer">accepted</span>'))}function f(){$("#new-post-activity").remove();
|
||||
$("#answers-header").prepend(q)}function d(a){var b=$(".question[data-questionid="+a.id+"], .answer[data-answerid="+a.id+"]").find(".postcell, .answercell");0<b.find("#new-post-activity").length||b.prepend('<div id="new-post-activity">an edit has been made to this post: show the <a href="/posts/'+a.id+'/revisions">revision</a></div>').click(function(){$.get("/posts/"+a.id+"/ajax-load-mini",r(b,a))})}function h(a,b){return a.index<b.index?-1:a.index>b.index?1:0}function j(){$("#new-post-activity").remove();
|
||||
var a=o.sort(h),b;for(b in a){var d=a[b];$("#question-summary-"+d.id).remove();$(d.body).prependTo("#question-mini-list, #questions").hide().fadeIn()}i(0);null!=StackExchange.options.user.accountId&&StackExchange.tagPreferences.applyPrefs(!0,t);"undefined"!=typeof MathJax&&MathJax.Hub.Queue(["Typeset",MathJax.Hub]);k();o=[]}function i(a){var b=document.title.replace(/^\(\d*\*?\) /,"");0<a&&(b="("+a+") "+b);window.setTimeout(function(){$(document).attr("title",b)},200)}function k(){for(var a=$("span.relativetime"),
|
||||
b=0;b<a.length;b++)if(a[b].title){var d;d=new Date(a[b].title);d=((new Date).getTime()-d.getTime())/1E3;var c=Math.floor(d/86400);if(d=isNaN(c)||0>c||31<=c?void 0:0==c&&(2>d&&"just now"||60>d&&Math.floor(d)+(s?"s ago":" secs ago")||120>d&&(s?"1m ago":"1 min ago")||3600>d&&Math.floor(d/60)+(s?"m ago":" mins ago")||7200>d&&(s?"1h ago":"1 hour ago")||86400>d&&Math.floor(d/3600)+(s?"h ago":" hours ago")))a[b].innerHTML=d}}var g,l,o=[],n=[],m=0,u=[],v=!1,s=!1,t,p=new EventEmitter,q=function(){var a=Object.keys(n).length;
|
||||
return $('<div id="new-post-activity">'+a+" new answer"+(1<a?"s":"")+" to this question</div>").click(function(){StackExchange.realtime.expandAnswers()})},r=function(a,b){return function(d){d=$(d).find(".postcell, .answercell");a.replaceWith(d);d.hide().fadeIn(400,function(){"undefined"!=typeof MathJax&&MathJax.Hub.Queue(["Typeset",MathJax.Hub]);StackExchange.question.canViewVoteCounts()&&StackExchange.vote.bindFetchVoteCounts()});StackExchange.comments.init({post:d});StackExchange.vote.init(b.id);
|
||||
StackExchange.vote||StackExchange.question.bindAnonymousVoteDisclaimers();a.find("a[id^='link-post-']").click(function(a){if(!a.ctrlKey&&!a.metaKey)return StackExchange.question.showShareTip($(this),options.showCitation),!1});StackExchange.question.bindSuggestedEditPopupLinks();StackExchange.question.initShareLinks();window.history.pushState(b,"new post","#"+b.id)}},w=function(){var a=Object.keys(o).length;i(a);return $('<div id="new-post-activity">'+a+" question"+(1<a?"s":"")+" with new activity</div>").click(function(){StackExchange.realtime.expandActiveQuestions()})};
|
||||
return{init:function(a){g=a;if("WebSocket"in window||"MozWebSocket"in window){if(l)try{e("closing WebSocket"),l.close()}catch(b){}l||(e("opening WebSocket"),l="WebSocket"in window?new WebSocket(g):new MozWebSocket(g),l.onopen=function(){if(!v){v=!0;for(var a=0,b=u.length;a<b;a++)e("sending: "+u[a]),l.send(u[a]);u=[]}e("WebSocket opened");c();setInterval(k,6E4)},l.onmessage=function(a){a=$.parseJSON(a.data);p.emit(a.action,a.data)},l.onclose=function(){l=null;e("WebSocket closed");5>m&&(m++,e("reconnect attempt:"+
|
||||
m),setTimeout('StackExchange.realtime.init("'+g+'")',500))},l.onerror=function(){e("WebSocket failed");l=null})}},expandActiveQuestions:j,expandAnswers:function(){var a=$("#answers #answers-header .answers-subheader h2"),b=parseInt(a.text().match(/^\d*\*?/))+n.length;isNaN(b)&&(b=n.length);a.text(b+" Answer"+(1<b?"s":""));$("#new-post-activity").remove();var d=$("#answers #answers-header");$.each(n,function(a,b){$.get("/posts/"+b+"/ajax-load-mini",function(a){a=$(a);a.insertAfter(d).hide().fadeIn(400,
|
||||
function(){"undefined"!=typeof MathJax&&MathJax.Hub.Queue(["Typeset",MathJax.Hub]);StackExchange.question.canViewVoteCounts()&&StackExchange.vote.bindFetchVoteCounts()});StackExchange.comments.init({post:a});StackExchange.vote.init(b)})});StackExchange.vote||StackExchange.question.bindAnonymousVoteDisclaimers();d.find("a[id^='link-post-']").click(function(a){if(!a.ctrlKey&&!a.metaKey)return StackExchange.question.showShareTip($(this),options.showCitation),!1});StackExchange.question.bindSuggestedEditPopupLinks();
|
||||
StackExchange.question.initShareLinks();n=[]},subscribeToActiveQuestions:function(a,d,c,g,f,e,i){a=a+"-"+d;t=c;s=e;b(a);p.on(a,function(a){a=$.parseJSON(a);if(null!=f)for(var b=0;b<f.length;b++)if(-1==$.inArray(f[b],a.tags))return;null!=StackExchange.options.user.accountId&&StackExchange.tagPreferences.isIgnored(a.body)||(o[a.id]={id:a.id,body:a.body,index:(new Date).getTime(),siteid:a.siteid},$("#new-post-activity").remove(),$("#question-mini-list, #questions").prepend(w),g&&j());null!=i&&i(a)})},
|
||||
subscribeToInboxNotifications:function(){if(null!=StackExchange.options.user.accountId){var a=StackExchange.options.user.accountId+"-inbox";b(a);p.on(a,function(a){$(".unreadCount").remove();var b=$('<a class="unreadCount" title="unread messages in your inbox">'+a+"</a>").insertAfter(".genu");$("#portalLink .unreadCount").css({marginTop:b.css("margin-top"),opacity:1},2E3);genuwine.setUnreadCount(a)})}},subscribeToQuestion:function(c,g){var e=c+"-question-"+g;b(e);p.on(e,function(b){b=$.parseJSON(b);
|
||||
switch(b.a){case "score":var c=$('.vote input[value="'+b.id+'"]').siblings(".vote-count-post");c.text()!=b.score&&(c.text(b.score),0==$(":animated").length&&c.fadeTo("fast",0.7).fadeTo("fast",1),StackExchange.question.canViewVoteCounts()&&StackExchange.vote.bindFetchVoteCounts());break;case "comment-add":0==$("#comment-"+b.commentid).length&&(b=$("#comments-link-"+b.id),c=b.data("comments-count")||0,c++,b.data("comments-count",c),b.html("add / show <b>"+c+"</b> more comment"+(1<c?"s":"")).show().fadeTo("fast",
|
||||
0.7).fadeTo("fast",1));break;case "answer-add":0==$("#answer-"+b.answerid).length&&(n.push(b.answerid),StackExchange.cardiologist.isHeartBeating()?StackExchange.helpers.DelayedReaction(f,5E3).trigger():f(),StackExchange.cardiologist.notifiedOfNewAnswer());break;case "accept":a(b);break;case "unaccept":a(b,!0);break;case "post-edit":d(b)}})},subscribeToReputationNotifications:function(a){null!=StackExchange.options.user.accountId&&(a=a+"-"+StackExchange.options.user.userId+"-reputation",b(a),p.on(a,
|
||||
function(a){var b=$("#hlinks .reputation-score");b.text()!=a.score&&(0==$(":animated").length&&b.fadeTo("fast",0.8).fadeTo("fast",1),b.text(a))}))},updateRelativeDates:k}}();"use strict";StackExchange.anonymous={};
|
||||
var gauth=function(){return{informStackAuth:function(e){if(gauth.enabled()){var c=document.domain;"meta."==c.substr(0,5)&&(c=c.substr(4,c.length-4));var b=$.cookie("gauth");if(null==b)$.cookie("gauth",null,{path:"/",domain:c}),$.cookie("gauth",null,{path:"/",domain:document.domain});else{"."!=c.charAt(0)&&(c="."+c);$.cookie("gauth",null,{path:"/",domain:c});$.cookie("gauth",null,{path:"/",domain:document.domain});var a=b.indexOf(":"),c=b.substr(0,a),b=b.substr(a+1),f=e+"/auth/global/write?authToken="+
|
||||
encodeURIComponent(c)+"&nonce="+encodeURIComponent(b);$(document).ready(function(){$("#footer").append("<iframe style='display:none' src='"+f+"'></iframe>")})}}},checkStackAuth:function(e){if(gauth.enabled()&&null==$.cookie("gauthed")){$.cookie("gauthed","1",{path:"/"});var c=function(b){if(b.origin==e)if("No Local Storage"==b.data)gauth.noGAuthStorage();else if("No Session"==b.data)gauth.noGAuthSession();else{var a=b.data.substr(0,b.data.indexOf(",")),b=b.data.substr(b.data.indexOf(",")+1);$.post("/users/login/global",
|
||||
{authToken:a,nonce:b},function(a){gauth.globallyAuthed(a)},"json")}};window.attachEvent?window.attachEvent("onmessage",c):window.addEventListener("message",c,!1);$.post("/users/login/global/request","",function(b){var a=e+"/auth/global/read?request="+encodeURIComponent(b.token)+"&nonce="+encodeURIComponent(b.nonce);$(document).ready(function(){$("#footer").append("<iframe id='global-auth-frame' style='display:none' src='"+a+"'></iframe>")})},"json")}},enabled:function(){$.cookie("enabledCheck","1");
|
||||
if(null==$.cookie("enabledCheck"))return!1;$.cookie("enabledCheck",null);return"undefined"==typeof localStorage?!1:!0},noGAuthStorage:function(){},noGAuthSession:function(){},globallyAuthed:function(e){if(e&&e.Message){var e=e.Message+" ",c,b=!1,a=""+window.location,f=a.indexOf("returnurl=");if(-1!=f){var d=a.indexOf("&",f);-1==d&&(d=a.length);c=decodeURIComponent(a.substring(f+10,d));c=/^(?:http:\/\/|\/)/.test(c)?c.replace(/[^-a-z0-9+&@#\/%?=~_|!:,.;()]/g,""):null}-1!=a.indexOf("/users/login")&&
|
||||
(b=!0,c=c||"/");StackExchange.helpers.showFancyOverlay({message:b?e+"<br>You are being redirected...":e+(c?"<a href=\"javascript:window.location='"+c+"'\">Click here</a> to return to your last location.":'<a href="javascript:location.reload(true)">Click here</a> to refresh the page.'),showClose:!b,complete:function(){b&&(window.location=c)}})}}}}(),genuwine=function(){var e,c="",b,a,f=function(){return $(".genu").hasClass("genu-on")},d=function(){var d=$(".genu"),c=$("#seWrapper");if(0==c.length){j();
|
||||
var c=$("#seWrapper"),g;0<b?(g=$("#seTabInbox"),u(g)):a?(g=$("#seTabNotices"),i(g)):(g=$("#seTabHot"),l(g));g.addClass("seCurrent")}(g=d.hasClass("genu-on"))?($(".unreadCountTab").hide(),$(".itemBoxNew").removeClass("itemBoxNew"),c.fadeOut("fast")):(c.fadeIn("fast"),$(".unreadCount").hide());d.toggleClass("genu-on",!g);-1==b&&$(d).ready(function(){$("#seTabInbox").hide()});h($("#seTabInbox"),$("#seTabNotices"))},h=function(d,c){StackExchange.options.site.isNoticesTabEnabled&&a&&0==c.find(".unreadCountTab").length&&
|
||||
c.prepend('<span class="unreadCountTab newNotices">'+a+"</span>");0<b&&0==d.find(".unreadCountTab").length&&d.prepend('<span class="unreadCountTab">'+b+"</span>")},j=function(){var a='<div id="seWrapper" style="position:absolute; display:none;"><div class="seIntro"><a href="'+c+'">Stack Exchange</a> is a network of free, community-driven Q&A sites.</div><div class="seNav"><ul class="seNavLinks"><li><a id="seTabHot">Hot Questions</a></li><li><a id="seTabSites">All Sites</a></li><li><a id="seTabInbox">Inbox</a></li>'+
|
||||
(StackExchange.options.site.isNoticesTabEnabled?'<li><a id="seTabNotices">Notifications</a></li>':"")+'</ul></div><div class="seContainer"></div><div class="seFooter"><div id="seTabEmail" class="seEmailAccount"><a>email settings</a></div><a id="seClose">close</a></div></div>',b=$("#hlinks"),b=b.height()+b.offset().top+5;$(a).appendTo("#portalLink").css({top:b}).find("ul.seNavLinks a, #seTabEmail").click(function(){var a=$(this);$(".seNavLinks a").removeClass("seCurrent");a.addClass("seCurrent");switch(a.attr("id")){case "seTabHot":l(a);
|
||||
$("#seContainerSites, #seContainerInbox, #seContainerEmail, #seContainerNotices").hide();$("#seContainerHot").fadeIn("fast");break;case "seTabSites":0==$("#seContainerSites").length&&g(a);$("#seContainerHot, #seContainerInbox, #seContainerEmail, #seContainerNotices").hide();$("#seContainerSites").fadeIn("fast");break;case "seTabInbox":u(a);$("#seContainerHot, #seContainerSites, #seContainerEmail, #seContainerNotices").hide();$("#seContainerInbox").fadeIn("fast");break;case "seTabEmail":0==$("#seContainerEmail").length&&
|
||||
o(a);$("#seContainerHot, #seContainerSites, #seContainerInbox, #seContainerNotices").hide();$("#seContainerEmail").fadeIn("fast");break;case "seTabNotices":i(a),$("#seContainerHot, #seContainerSites, #seContainerInbox, #seContainerEmail").hide(),$("#seContainerNotices").fadeIn("fast")}});$("#seClose").live("click",d)},i=function(a){0==$("#seContainerNotices").length&&t(a,"/notices/genuwine?userId="+StackExchange.options.user.id,"jsonp",k,!0)},k=function(a,b){for(var d='<div id="seContainerNotices" style="display:none">',
|
||||
c=0;c<b.length;c++)var g=b[c],d=d+('<div class="noticeBox'+(g.is_unread?" itemBoxNew":"")+'"><a href="'+g.site_url+'" class="siteLinkFavicon"><img src="'+g.icon+'"></a><div class="siteInfo"><p>'+g.text+"</p></div></div>");p(a,d+"</div>")},g=function(a){t(a,c+"/genuwine/sites?callback=?&host="+document.location.host+(e?"&accountId="+e:""),"jsonp",m)},l=function(a){0==$("#seContainerHot").length&&t(a,c+"/genuwine?callback=?","jsonp",n)},o=function(a){t(a,"/accounts/email-settings","json",function(a,
|
||||
b){function d(){$("#email-save").removeAttr("disabled");$("#email-confirmation").html("")}p(a,'<div id="seContainerEmail" style="display:none; font-size:11px;"><div class="itemBox" style="border-bottom: 0px"><p>Would you like to receive unread inbox messages via email?</p><div>Email: <input id="email-notify" name="email-notify" style="width:300px;" value="'+b.verifiedEmail+'"></input></div><div><input type="radio" name="optIn" value="true" id="email-enable"'+(!0==b.optIn?'checked="checked"':"")+'"> <label for="email-enable">Email me my unread inbox messages </label> <select id="email-freq"><option value="3">every 3 hours</option><option value="24">daily</option><option value="168">weekly</option></select> </div><div><input type="radio" name="optIn" value="false" id="email-disable"'+
|
||||
(!0!=b.optIn?'checked="checked"':"")+'"> <label for="email-disable">Do not email me inbox messages</label></input></div><div><input type="button" name="save" id="email-save" value="Save" disabled="disabled"></input></div><div id="email-confirmation" style="display:none;"></div></div></div>');$("#email-freq").val(b.freq).on("click focus",function(){$("#email-enable").prop("checked",!0)});$("#email-notify").focus().keyup(d);$("#email-enable, #email-disable, #email-freq").change(d);$("#email-save").click(function(){q();
|
||||
$.post("/accounts/verified-email-set",{email:$("#email-notify").val(),fkey:StackExchange.options.user.fkey,optin:$("input[name=optIn]:checked").val(),freq:$("#email-freq").val()},function(a){StackExchange.helpers.removeSpinner();$("#email-confirmation").html(a.message).fadeIn();a.success&&$("#email-save").attr("disabled","disabled")},"json")})},!0)},n=function(a,b){for(var d=$("<div/>"),c='<div id="seContainerHot" style="display:none">',g=0;g<b.length;g++)var f=b[g],e=f.SiteId,i='href="http://'+e+
|
||||
"/q/"+f.Id+'?hq=1"',h=parseInt(f.DisplayScore,10),c=c+('<div class="itemBox"><a '+i+' class="seNumAnswer">'+h+'</a><div class="siteInfo"><p><a '+i+">"+d.text(f.Title).html()+'</a></p><a href="http://'+e+'" class="siteLink">'+e+"</a></div></div>");p(a,c+"</div>")},g=function(a){t(a,c+"/genuwine/sites?callback=?&host="+document.location.host+(e?"&accountId="+e:""),"jsonp",m)},m=function(a,b){for(var d='<div id="seContainerSites" style="display:none">',c=0;c<b.length;c++)var g=b[c],f=g.Name,e='href="http://'+
|
||||
g.Id+'?as=1"',d=d+('<div class="itemBox"><a '+e+' class="siteFavicon"><img src="'+g.FaviconUrl+'" alt="'+f+'"></a><div class="siteInfo"><p><a '+e+">"+f+"</a></p><a "+e+' class="siteLink">'+g.Description+"</a></div></div>");p(a,d+"</div>")},u=function(a){-1!=b&&0==$("#seContainerInbox").length&&t(a,"/inbox/genuwine","json",v,!0)},v=function(a,b){for(var d='<div id="seContainerInbox" style="display:none">',c=0;c<b.length;c++){var g=b[c],f='href="'+g.Url+'"',i='title="'+g.CreationDate+'"',h=g.Count,
|
||||
d=d+('<div class="itemBox'+(g.IsNew?" itemBoxNew":"")+'"><a '+f+' class="siteLinkFavicon"><img src="'+g.FaviconUrl+'" alt="'+g.SiteUrl+'"></a><div class="siteInfo">');"careers message"==g.Type?d+="<p><a "+f+' style="font-weight:normal"><b>'+g.Title+"</b> wants to contact you on <b>Stack Overflow Careers</b></a></p>":"invitation"==g.Type?(i=g.Count,d+="<p><a "+f+' style="font-weight:normal"><b>'+i+"</b> "+("invitation"+(1<i?"s":""))+" awarded on <b>Stack Overflow Careers</b></a></p>"):d+="<p>"+(1<
|
||||
h?h+" ":"")+g.Type+" on <a "+f+" "+i+">"+g.Title+"</a></p>";d+='<p class="inboxSummary">'+(g.Summary||"")+"</p></div></div>"}e&&5<=b.length&&(d+='<div class="itemMoreContainer"><div class="seIntro"><a href="http://stackexchange.com/users/'+e+'?tab=inbox">more inbox messages …</a></div></div>');p(a,d+"</div>")},s={},t=function(a,b,d,c,g){var f=a.attr("id");if(s[f])q();else{s[f]=!0;q();var e=function(){s[f]=!1;StackExchange.helpers.showErrorPopup($(".seContainer"),"An error occurred while loading - please try again.")};
|
||||
$.ajax({type:"GET",url:b,dataType:d,success:function(b){b&&(0<b.length||g)?c(a,b):e()},error:e,complete:StackExchange.helpers.removeSpinner()})}},p=function(a,b){var d=$(b);d.appendTo(".seContainer");a.hasClass("seCurrent")&&d.fadeIn("fast")},q=function(){StackExchange.helpers.removeSpinner();StackExchange.helpers.addSpinner(".seContainer",{position:"relative",left:"10px",top:"10px"})},r=function(){var a=$("#portalLink .unreadCount"),b=a.css("margin-top");a.css({marginTop:-20,opacity:0}).show().animate({marginTop:b,
|
||||
opacity:1},2E3)},w=function(d){a=d;!(0<b)&&StackExchange.options.site.isNoticesTabEnabled&&(99<a&&(a=99),0<a&&$("#portalLink .unreadCount").text(""+a).addClass("newNotices").click(function(){$(".genu").click()}).show())};return{isVisible:f,click:d,setUnreadCount:function(a){b=a;0<a?($("#portalLink .unreadCount").text(b).click(function(){$(".genu").click()}).show(),r()):$("#portalLink .unreadCount").text("").hide();$("#portalLink .unreadCount").removeClass("newNotices")},animateInbox:r,init:function(a,
|
||||
g,i){var h=$(".genu");1<=h.length&&(h[0].onclick=null);e=a;c=h.attr("href");b=g;w(i);h.removeAttr("href").add(".unreadCount").click(d);$(document).click(function(a){f()&&!$.contains($("#portalLink")[0],a.target)&&d()})}}}();
|
||||
StackExchange.notify=function(){function e(a,b){var d=$("#dismissed-messages");d.val(d.val()+"~"+a+(b?" "+b:"")+"~")}function c(a,b){var d=$("#dismissed-messages").val();return!d?!1:RegExp("~"+a+(b?" "+b:"")+"~").test(d)}function b(a,b,d){var c=parseInt($("body").css("margin-top").match(/\d+/)),a=b*c/a;d?$("body:not(.no-message-slide)").animate({marginTop:a+"px"},"fast","linear"):$("body:not(.no-message-slide)").css("marginTop",a+"px")}var a=0,f=function(d,c){var g=$("#notify-"+d+(c?"-"+c:""));-1==
|
||||
d?$.cookie("m","0",{expires:90,path:"/"}):-1<d&&$.post("/messages/mark-as-read",{messagetypeid:d,id:c?c:null});e(d,c);a--;g.fadeOut("fast",function(){b(a+1,a,!0);g.remove()})},d=function(b){if(StackExchange.options.site.isNoticesTabEnabled)return!0;a++;if(c(b.messageTypeId,b.id))return!1;var d="";b.messageTypeId&&(d=' id="notify-'+b.messageTypeId+(b.id?"-"+b.id:"")+'"');d="<div"+d+' style="display:none"><span class="notify-close"><a title="dismiss this notification">×</a></span><span class="notify-text">'+
|
||||
b.text+"</span>";if(b.showProfile)var g=encodeURIComponent("/users/"+b.userId+"?tab=badges&sort=recent"),d=d+(' See your <a href="/messages/mark-as-read?messagetypeid='+b.messageTypeId+"&returnurl="+g+'">profile</a>.');d=$(d+"</div>");d.find(".notify-close").click(function(){b.close&&b.close();f(b.messageTypeId,b.id)});$("#notify-container").append(d);return!0},h=function(){$("#notify-container div").fadeIn("slow")},j=function(a,b){var c=$('<div class="link-more"><a>view '+a+" more notification"+
|
||||
(1!=a?"s":"")+"</a></div>");$("#notify-container").append(c);c.click(function(){c.detach();for(var a=0;a<b.length;a++)d(b[a]);h()})};return{showMessages:function(c,f){for(var g=0,e=f?2:c.length,o=0;o<e&&o<c.length;o++)d(c[o])&&g++;b(a,g,!1);h();f&&g<c.length&&(e=c.slice(e),j(c.length-g,e))},show:function(a,b){$("body:not(.no-message-slide)").animate({marginTop:"2.5em"},"fast","linear");d({text:a,messageTypeId:b});h()},close:f,getMessageText:function(a){return $("#notify-"+a+" .notify-text").text()}}}();
|
||||
function moveScroller(){var e=$("#scroller").width(),c=function(){var b=$(window).scrollTop(),a=$("#scroller-anchor").offset().top,c=$("#scroller");b>a?c.height()>$(window).height()?c.css({position:"fixed",top:"",bottom:"0px",width:e}):c.css({position:"fixed",top:"0px",bottom:"",width:e}):b<=a&&c.css({position:"relative",top:"",bottom:""})};$(window).scroll(c).resize(c);c()}
|
||||
var styleCode=function(){return function(){"undefined"!=typeof MathJax&&MathJax.Hub.Queue(["Typeset",MathJax.Hub]);var e=!1;$("pre code").parent().each(function(){$(this).hasClass("prettyprint-override")&&($(this).removeClass("prettyprint-override").addClass("prettyprint"),e=!0);var c;if(c=!$(this).hasClass("prettyprint")){c=$(this);var b=$("#prettify-lang").text();""!=b?(c.addClass(b),c=!0):c=!1}c&&($(this).addClass("prettyprint"),e=!0)});e&&("undefined"!=typeof jtab?jtab.renderimplicit():StackExchange.using("prettify",
|
||||
function(){StackExchange.prettify.applyCodeStyling()}))}}();
|
||||
StackExchange.helpers.MagicPopup=function(e){function c(a,d){var c=$("<div id='"+e.id+"'/>").html(d),h=$("<div />").css({overflow:"hidden",position:"absolute",width:1,height:1,top:0,left:0}).append(c).appendTo("body"),j=e.showing(a,c),n={left:j.left};j.hasOwnProperty("bottom")?(n.bottom=j.bottom,n.top="auto"):n.top=j.top;var m;e.shown&&(m=function(){e.shown(a,c)});h.css(n).animate({height:c.outerHeight()+8,width:c.outerWidth()+8},300,m);b=function(){h.stop().remove();e.removed&&e.removed(a,c);b=f=
|
||||
null};f=StackExchange.helpers.DelayedReaction(b,5);n=h;j.additional&&(n=n.add(j.additional));n.hover(f.cancel,f.trigger)}var b,a,f,d,h={},j=StackExchange.helpers.DelayedReaction(function(a,f){if(!d&&a){var g;e.cache&&"c_"+a in h?g=$.Deferred().resolve(h["c_"+a]):(g=$.ajax({type:"GET",url:a,dataType:"html"}),e.cache&&g.done(function(b){h["c_"+a]=b}));g.done(function(a){b&&b();""!=a&&c(f,a)})}},500);$(document).delegate(e.selector,{mouseenter:function(){if(f&&this===a)f.cancel();else return a=this,
|
||||
j.trigger(e.getUrl(this),this),d=!1},mouseleave:function(){d=!0;j.cancel();f&&f.trigger()}})};
|
||||
StackExchange.tagmenu=function(){function e(a){var a=$(a),b=a.attr("href");if(!b||"/"!=b.charAt(0))return null;b=a.text();if(-1<b.indexOf("*"))return null;a.attr("title","");return"/tags/"+encodeURIComponent(b)+"/subscriber-info"}function c(a,b){var c=$(a),e=c.offset(),i=c.outerHeight(),c={left:e.left},k=e.top+i,i=e.left+b.outerWidth();b.height()+k>$(window).height()+$(window).scrollTop()?c.bottom=$(window).height()-e.top-8:c.top=k;e=Math.max(1024,$(window).width());i>e&&(c.left-=i-e);return c}var b,
|
||||
a;return{init:function(f){b=f;a||(a=!0,StackExchange.options.isMobile||(StackExchange.helpers.MagicPopup({selector:".post-tag:not(.user-tag)",id:"tag-menu",getUrl:e,showing:c,shown:function(a,c){b&&b(c,$(a).text())}}),$("#interesting-tags .post-tag").addClass("user-tag")))}}}();
|
||||
StackExchange.usermenu=function(){function e(b,d){var c=$(b).find("img:first"),e=c.offset(),i=c.height(),k=c.width(),g=Math.max(k,i),l=64*i/g,g=64*k/g,o=d.find("img:first").css({width:g,height:l}),n=o.offset();o.css("visibility","hidden");a=c.clone().css({position:"absolute",zIndex:300,left:e.left,top:e.top,width:k,height:i}).appendTo("body");var m=function(){o[0].complete?(o.css("visibility","visible"),a.fadeOutAndRemove()):setTimeout(m,500)};a.animate({width:g,height:l,top:e.top+n.top},200,m);return{top:e.top,
|
||||
left:e.left-n.left,additional:a}}function c(){a.remove()}var b,a;return{init:function(){b||(b=!0,StackExchange.options.isMobile||StackExchange.helpers.MagicPopup({selector:".user-hover .user-gravatar48, .user-hover .user-gravatar32",getUrl:function(a){a=/\/users\/([^/]+).*$/.exec($(a).closest(".user-hover").find(".user-details a").attr("href"));return!a?null:"/users/user-info/"+a[1]},cache:!0,id:"user-menu",showing:e,removed:c}))}}}();
|
||||
StackExchange.chatAd=function(){function e(){var a=$(".question .post-taglist .post-tag");return!a.length?null:a.map(function(a,b){return $(b).text()}).get().join(" ")}function c(a){return 10>a?"0"+a:a}function b(a){var b=new Date;b.setTime(1E3*a);return[b.getUTCFullYear(),"-",c(b.getUTCMonth()+1),"-",c(b.getUTCDate())," ",c(b.getUTCHours()),":",c(b.getUTCMinutes()),":",c(b.getUTCSeconds()),"Z"].join("")}function a(a){var b=Math.floor((new Date).getTime()/1E3)-a,d=b%60,g=Math.floor(b/60),e=Math.floor(b/
|
||||
3600);if(1>b)return"just now";if(60>b)return 1==d?"1 sec ago":d+" secs ago";if(3600>b)return 1==g?"1 min ago":g+" mins ago";if(86400>b)return 1==e?"1 hour ago":e+" hours ago";b=Math.floor(b/86400);if(1==b)return"yesterday";if(2>=b)return b+" days ago";a=new Date(1E3*a);return m[a.getMonth()]+" "+a.getDate()+" at "+a.getHours()+":"+c(a.getMinutes())}function f(a){var b=$("<div />");b.text(a);return b.html().replace('"',""")}function d(){$.get(g,null,function(a,b,d){i(a,b,d)})}function h(b){for(var d=
|
||||
$('<div class="ad502-users" />'),c=0;c<b.length&&7>c;c++){var g=b[c],e=g.name;g.lastPost&&(e+=": "+a(g.lastPost));var f="http://www.gravatar.com/avatar/"+g.emailhash+"?s=23&d=identicon&r=PG",g=$('<a href="'+(k+"/users/"+g.id)+'" />');$("<img />").attr("title",e).attr("src",f).appendTo(g);d.append(g)}return d}function j(a){var b=a.user;return(a=a.userid)?'<a href="'+k+"/users/"+a+'">'+f(b)+"</a>":f(b)}function i(c){var g=$("#ad502-rooms");if(!c.error){g.html("");for(var e=c.rooms,i=0;i<e.length&&2>
|
||||
i;i++){var m=e[i],q=k+"/rooms/"+m.id,r=$('<div class="ad502-room"></div>');r.append($('<h3 class="ad502-room-h3"><span class="ad502-room-title" title="'+f(m.name)+'"><a href="'+q+'">'+f(m.name)+"</a></span></h3>"));m.messages&&0<m.messages.length&&r.append($('<span title="'+b(m.lastPost)+'" class="ad502-last-message">'+a(m.lastPost)+" - "+j(m.messages[0])+"</span><br>"));m.singleImage?r.append($('<div class="ad502-users"><img src="'+k+"/rooms/users/"+m.id+'.jpeg" /></div>')):r.append(h(m.users));
|
||||
g.append(r)}1<c.activeUsers?$("#h-chat-link").text(c.activeUsers+" People Chatting"):$("#h-chat-link").text("Visit Chat");$("#h-chat-link").attr("title",c.activeUsers+" users active in "+c.activeRooms+" rooms the last 60 minutes")}l<=n&&window.setTimeout(d,1E3*l);l+=o}var k,g,l=180,o=30,n=480,m="Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(",");/^\/questions\/\d+/i.test(window.location.pathname)&&(n=0);return{init:function(a){k=a.chatUrl;g=a.reloadUrl;if(a.tagBased){var b=e();if(!b)return;
|
||||
g+=(/\?/.test(g)?"&":"?")+"tags="+encodeURIComponent(b)}null===a.preloadData?d():i(a.preloadData,null,null)}}}();
|
||||
StackExchange.helpers.noDiacritics=function(){var e={"\u00e0\u00e5\u00e1\u00e2\u00e4\u00e3\u00e5\u0105":"a","\u00e8\u00e9\u00ea\u00eb\u0119":"e","\u00ec\u00ed\u00ee\u00ef\u0131":"i","\u00f2\u00f3\u00f4\u00f5\u00f6\u00f8\u0151":"o","\u00f9\u00fa\u00fb\u00fc":"u","\u00e7\u0107\u010d":"c","\u017c\u017a\u017e":"z","\u015b\u015f\u0161":"s","\u00f1\u0144":"n","\u00fd\u0178":"y","\u0142":"l","\u0111":"d","\u00df":"ss","\u011f":"g","\u00de":"th"};return function(c){for(var b in e)e.hasOwnProperty(b)&&(c=
|
||||
c.replace(RegExp("["+b+"]"),e[b]));return c}}();function sanitizeAndSplitTags(e,c){for(var e=$.trim(e).replace(/([A-Za-z0-9])\+(?=[A-Za-z0-9])/g,"$1 "),b=e.split(/[\s|,;]+/),a=[],f=0;f<b.length;f++){var d=StackExchange.helpers.noDiacritics(b[f].toLowerCase()).replace(/_/g,"-"),d=d.replace(RegExp("[^a-z0-9.#+"+(c?"*":"")+"-]","g"),""),d=d.replace(/^[#+-]+/,""),d=d.replace(/[.-]+$/,"");0<d.length&&-1==$.inArray(d,a)&&a.push(d)}return a}
|
||||
StackExchange.question=function(){var e=function(a,b){var c=null!=a;a||(a=$('div.question div.post-menu a:contains("link")'));var d=a.closest(".post-menu, .help-menu");if(a.hasClass("share-link"))d.find(".close-share-tip").click();else{a.addClass("share-link");var e=a.attr("id").substring(10),f=a.closest(".col-section").length?"section":a.closest("div.question").length?"question":"answer",h=$('<div class="share-tip" style="display:none">share a link to this '+f+'<input type="text" value="http://'+
|
||||
document.location.host+a.attr("href")+'" style="display:block; width:292px;"><a class="close-share-tip" style="float:right">close</a></div>');b&&h.find(".close-share-tip").before('<a id="link-post-'+e+'" style="float:left">cite</a>');h.appendTo(d).fadeIn(c?"fast":0).bind("removing",function(){a.removeClass("share-link")}).find(".close-share-tip").click(function(){h.fadeOutAndRemove()}).end().find("input[type=text]").select()}},c=function(a){var b=$("#post-form h2:first"),c=b.wrap("<div />").parent(),
|
||||
d=c.wrap("<div />").parent(),e=$("<div />").prependTo(d),f=d.height(),h=$("<div />"),a=$(a),j=parseInt(b.css("margin-bottom")),i=$("#content"),k=$("#wmd-input").outerWidth(),q=i.offset().left>b.offset().left-5&&"visible"!=i.css("overflow-x");h.css({height:0,overflowY:"hidden"}).appendTo(c).append(a);d.css({height:f,position:"relative"});c.css({position:"absolute",bottom:-j,width:k});e.addClass("answer-help-background").css({position:"absolute",bottom:-j,height:0,width:k});q&&(e.css("left",0),c.animate({paddingLeft:5},
|
||||
1E3));h.animate({height:a.height()+j+10},1E3);e.animate({height:a.height()+j+10+f},1E3);$("<div style='float:right;margin-top:10px;'><a href='#'>ok</a></div>").hide().prependTo(c).fadeIn(1E3).find("a").one("click",function(a){var d=$(this).parent();setTimeout(function(){d.remove()},1);h.animate({height:0},1E3,function(){h.add(e).remove();b.unwrap().unwrap()});e.animate({height:0},1E3);q&&c.animate({paddingLeft:0},1E3);a.preventDefault()})},b=function(){$.get("/posts/answer-help").then(c)},a,f,d,h=
|
||||
function(){var a=window.location.href;0>a.indexOf("#")||(a=a.match(/#(\d+|comment(\d+)_(\d+))/i))&&(a[2]?j(a[2],a[3]):i($(".answer[data-answerid="+a[1]+"]")))},j=function(a,b){var c="#comment-"+a,d=$(c);d.length?i(d):StackExchange.comments.loadAll($("#comments-link-"+b)).done(function(){i($(c))})},i=function(b){var c=d;b.css({backgroundColor:a}).animate({backgroundColor:c},2E3,"linear",function(){$(this).css("background-color","")});b.is(".comment")&&b[0].scrollIntoView(!0)},k=function(a){a=a||{};
|
||||
$('.post-menu a:contains("link")').live("click",function(b){if(!b.ctrlKey&&!b.metaKey)return e($(this),a.showCitation),!1})};return{showShareTip:e,getQuestionId:function(a){a=(a?a.closest(".question"):$(".question")).data("questionid");if(!a)throw Error("getQuestionId could not find an id");return a},highlightComment:j,initShareLinks:k,canViewVoteCounts:function(){return f},init:function(c){StackExchange.question.fullInit?StackExchange.question.fullInit(c):StackExchange.question.bindAnonymousVoteDisclaimers();
|
||||
StackExchange.comments.init({autoShowCommentHelp:c.autoShowCommentHelp});c.showShareTip&&e();$("input.anon-vote").live("click",function(){var a=$(this),b=a.postId(),c=a.parent();c.closest(".question,.answer").unbind("mouseenter.helpful").unbind("mouseleave.helpful");c.text("sending feedback ...");setTimeout(function(){c.text("Thank you for your feedback.")},500);$.ajax({type:"POST",url:"/vote/anon/"+b,data:{votetypeid:"Yes"==a.val()?2:3},complete:function(){}})});var j=$(".was-this-helpful"),i=j.css("color"),
|
||||
n=$(".post-text").css("color");j.each(function(){var a=$(this),b=a.text();a.closest(".answer, .question").bind("mouseenter.helpful",function(){a.html("Was this post useful to you? <input style='display:none;' class='anon-vote' type='button' value='Yes'/> <input style='display:none;' class='anon-vote' type='button' value='No'/>").animate({color:n},"fast","linear").find("input").fadeIn("fast")}).bind("mouseleave.helpful",function(){a.text(b).animate({color:i},"fast","linear")})});
|
||||
k(c);if(c.showAnswerHelp)$("#wmd-input").one("focus",b);c.showCitation&&$("div.share-tip a[id^='link-post-']").live("click",function(){$(this).closest(".post-menu").find(".close-share-tip").click();citation.show($(this))});d=c.backgroundColor;a=c.highlightColor;f=c.canViewVoteCounts;h(c)}}}();
|
||||
StackExchange.question.bindAnonymousVoteDisclaimers=function(){function e(c){return function(b){var a='Please <a href="/users/login?returnurl='+escape(document.location)+'">login or register</a> to '+c+" this post.";StackExchange.helpers.showErrorPopup($(this).parent(),a);var a="",e=$(this).prop("className"),d=$(this).closest(".answer").length?"answer":"question";/vote-up/.test(e)?a="?vote=up&type="+d:/vote-down/.test(e)?a="?vote=down&type="+d:/star/.test(e)&&(a="?vote=favorite");StackExchange.helpers.fireAndForget("/analytics/user/try-vote"+
|
||||
a);b.preventDefault()}}$(".vote-up-off, .vote-down-off").click(e("vote for"));$("div.post-menu a[id^='flag-post-']").unbind("click").click(e("flag"));$(".star-off:not(.disabled)").live("click",e("favorite"))};
|
||||
StackExchange.comments=function(){function e(a,b){this.postId=a;this.jDiv=b;this.jCommentsLink=$("#comments-link-"+a)}function c(b){var c=(b.constructor===$?b:$(b)).closest(".question, .answer, div[id^='post-']").find(".comments"),b=c.attr("id").replace(/^comments-/,"");if(a[b])return a[b];c=new e(b,c);return a[b]=c}function b(){if(0!=$(".question[data-questionid]").length){var a=StackExchange.question.getQuestionId();$(".comment .comment-date > span").each(function(){var b=$(this),c=b.closest(".answer"),
|
||||
c=c&&c.length?c.data("answerid"):0,e=b.closest(".comment").attr("id").substr(8);b.wrap('<a class="comment-link" onclick="StackExchange.question.highlightComment({cid}, {aid})" href="{hash}"></a>'.format({hash:"#comment"+e+"_"+(c?c:a),cid:e,aid:c}))})}}var a={},f=function(){};e.prototype={checkDiscussion:f,ensureInput:f,commentsShown:function(){this.jCommentsLink.hide();this.jCommentsLink.data("comments-count",0)},addShow:function(a){var b=this;this.loadAllComments().done(function(){b.jCommentsLink.hide();
|
||||
b.checkDiscussion()});var c=this.ensureInput();c&&!a&&c.focus()},ajax:function(a,b,c,e){c&&!e&&StackExchange.helpers.addSpinner(c,{"margin-left":"10px"});var f=this;return $.ajax(a).fail(function(a){$(".error-notification").fadeOut("fast",function(){$(this).remove()});a=a.responseText;if(!a||100<=a.length)a="An error occured"+(b?" "+b:"");StackExchange.helpers.showErrorPopup(c||f.jDiv,a);c&&!e&&StackExchange.helpers.removeSpinner()}).done(StackExchange.helpers.removeSpinner).promise()},showComments:function(a){this.jDiv.find(" > table > tbody").html(a);
|
||||
this.jCommentsLink.text("add comment");"undefined"!=typeof MathJax&&MathJax.Hub.Queue(["Typeset",MathJax.Hub]);b();this.commentsShown()},loadAllComments:function(a){this.jDiv.removeClass("dno");if(!a&&!/more comment/.test($("#comments-link-"+this.postId).text()))return $.Deferred().resolve().promise();var b=this;return this.ajax({type:"GET",url:"/posts/"+this.postId+"/comments",dataType:"html"},"while fetching comments").done(function(a){b.showComments(a)}).promise()}};return{init:function(a){a=a&&
|
||||
a.post||document;$("a[id^='comments-link-']",a).click(function(){var a=/more comment/.test($(this).text());c(this).addShow(a)});a==document&&b()},loadAll:function(a){return c(a).loadAllComments(!0)},extendPostUi:function(a){for(var b in a)a.hasOwnProperty(b)&&(e.prototype[b]=a[b])},uiForPost:c}}();
|
||||
StackExchange.share=function(){function e(b,a,c){window.open(b,a,c)||(window.location.href=b)}function c(b,a){var c=b.indexOf("?"),d=b.indexOf("#");return-1==c?-1==d?b+"?"+a:b.substring(0,d)+"?"+a+b.substring(d):-1==d?b+"&"+a:b.substring(0,d)+"&"+a+b.substring(d)}return{gplus:function(b,a){a=c(a,"sgp=1");b.click(function(){e("https://plus.google.com/share?url="+a,"sharegplus","toolbar=1,status=1,resizable=1,scrollbars=1,width=600,height=500")})},twitter:function(b,a,f){a=c(a,"stw=1");b.click(function(){e("http://twitter.com/share?url="+
|
||||
a+"&ref=twitbtn&text="+f,"sharetwitter","toolbar=1,status=1,resizable=1,scrollbars=1,width=800,height=526")})},facebook:function(b,a,f){a=c(a,"sfb=1");b.click(function(){e("http://www.facebook.com/sharer.php?u="+a+"&ref=fbshare&t="+f,"sharefacebook","toolbar=1,status=1,resizable=1,scrollbars=1,width=626,height=436")})}}}();
|
||||
function initTagRenderer(e,c){window.tagRenderer||(window.tagRendererRaw=function(b,a){var a=a||"",f="";a||(e&&-1<$.inArray(b,e)?f=" required-tag":c&&-1<$.inArray(b,c)&&(f=" moderator-tag"));return"<a class='post-tag"+f+"' href='"+a+"/questions/tagged/"+encodeURIComponent(b)+"' title=\"show questions tagged '"+b+"'\" rel='tag'>"+b+"</a>"},window.tagRenderer=function(b,a){return $(tagRendererRaw(b,a))})}
|
||||
function showFadingHelpText(e){e.wrap('<div class="dno" />').show().parent().fadeIn("slow",function(){$(this).children().unwrap()})}
|
||||
function initFadingHelpText(){var e={"wmd-input":"#how-to-format",tagnames:"#how-to-tag","tag-editor":"#how-to-tag",title:"#how-to-title"},c=$("#wmd-input, #tagnames, #title, .tag-editor input"),b=function(a){return $(a).parent().hasClass("tag-editor")?e["tag-editor"]:e[$(a).attr("id")]};c.focus(function(){var a=b(this);c.each(function(){var c=b(this);c!=a&&$(c).hide()});var e=$(a);e.is(":visible")||showFadingHelpText(e)})}
|
||||
$.fn.extend({postId:function(){var e=this.first();if(!e.hasClass("answer")||!e.hasClass("question"))e=e.closest(".answer, .question");return parseInt(e.find(".vote input")[0].value)}});
|
||||
StackExchange.newsletterAd=function(){function e(b){b=$('<div id="lightbox-panel" class="popup" style="display:block"></div>').append('<div class="popup-close"><a title="close this popup (or hit Esc)">×</a></div>').append(b);$('<div id="lightbox"></div>').appendTo($("body")).css("height",$(document).height()).fadeIn("fast");b.appendTo($("body")).center().fadeIn("fast").find(".popup-close").click(function(){$("#lightbox, #lightbox-panel").fadeOutAndRemove()})}function c(){var b=StackExchange.options.site.name,
|
||||
a=$(['<div style="text-align: left;">','<h2 style="margin-bottom: 15px;">Subscribe to the '+b+" weekly newsletter</h2>",'<p><strong><a href="/users/login?returnurl=/newsletter/signup/redirect">Create an account on '+b+'</a> or <a href="/users/login?returnurl=/newsletter/signup/redirect">log in</a> if you already have one.</strong></p>','<form><label for="newsletter-email-input">Or, send newsletter emails to:</label> <input type="text" id="newsletter-email-input" maxlength="100" title="your email address" /> <input type="submit" value="Subscribe" id="newsletter-email-submit" /></form></div>'].join(""));
|
||||
a.find("form").submit(function(){var b=$(this),c=$.trim(a.find("#newsletter-email-input").val());if(0==c.length)return!1;StackExchange.helpers.addSpinner(b);$.ajax({url:"/newsletter/signup/anon",type:"POST",dataType:"json",data:{email:c},success:function(a){"confirmed"==a.status&&!a.error?(b.find("#newsletter-email-input").attr("disabled",!0),b.find("#newsletter-email-submit").replaceWith('<span style="line-height: 120%; text-align: center;"><strong>Subscribed!</strong></span>'),$("#newsletter-signup-container").replaceWith('<div style="line-height: 200%; text-align: center;"><strong>Subscribed!</strong></div>')):
|
||||
"unconfirmed"==a.status&&!a.error?(b.find("#newsletter-email-input").attr("disabled",!0),b.find("#newsletter-email-submit").replaceWith('<span style="line-height: 120%; text-align: center;"><strong>Subscribed!</strong></span>'),b.append("<br /><br/><p><em>Please click the link in the confirmation email to activate your subscription.</em></p>"),$("#newsletter-signup-container").replaceWith('<span style="line-height: 120%;"><strong>Success!</strong> Please click the link in the confirmation email to activate your subscription.</span>')):
|
||||
b.showErrorPopup(a.error||"there was a problem signing up for the newsletter<br />please try again later")},error:function(){b.showErrorPopup("there was a problem signing up for the newsletter<br />please try again later")},complete:function(){StackExchange.helpers.removeSpinner(b)}});return!1});e(a)}return{init:function(){$("#newsletter-signup").click(function(){var b=$(this);if(StackExchange.options.user.isAnonymous)return c(),!1;StackExchange.helpers.addSpinner("#newsletter-signup-container");
|
||||
$.ajax({url:"/newsletter/signup",type:"POST",dataType:"json",success:function(a){a.url?window.location.href=a.url:"confirmed"==a.status?$("#newsletter-signup-container").replaceWith('<div style="line-height: 200%; text-align: center;"><strong>Subscribed!</strong></div>'):"unconfirmed"==a.status?$("#newsletter-signup-container").replaceWith('<span style="line-height: 120%;"><strong>Success!</strong> Please click the link in the confirmation email to activate your subscription.</span>'):b.parent().showErrorPopup("there was a problem signing up for the newsletter<br />please try again later")},
|
||||
error:function(){b.parent().showErrorPopup("there was a problem signing up for the newsletter<br />please try again later")},complete:function(){StackExchange.helpers.removeSpinner("#newsletter-signup-container")}})});$("#newsletter-preview").click(function(){var b=$(window).height(),b=Math.min(600,b-100),b=['<div id="newsleter-preview-pane" style="overflow: hidden; width: 660px; height: ',b,'px;"><iframe src="',$(this).attr("href"),'" width="660" height="',b,'" frameborder="0"></iframe></div>'].join("");
|
||||
e(b);return!1})},loader:function(b,a){var b=a||b,c=$(".newuser-greeting");$.ajax({url:"/newsletter/targetted/ajax",data:{domain:b},success:function(a){$("#newsletter-ad").remove();c.empty().append($(a))},complete:function(){c.attr("class","").attr("style","")}});a||(window.sessionStorage.tNewsletter=b+"-continued")}}}();
|
||||
(function(e,c,b,a){e.fn.caret=function(f,d){var h,j,i=this[0],k=e.browser.msie;"object"===typeof f&&"number"===typeof f.start&&"number"===typeof f.end?(h=f.start,j=f.end):"number"===typeof f&&"number"===typeof d?(h=f,j=d):"string"===typeof f?-1<(h=i.value.indexOf(f))?j=h+f[c]:h=null:"[object RegExp]"===Object.prototype.toString.call(f)&&(f=f.exec(i.value),null!=f&&(h=f.index,j=h+f[0][c]));if("undefined"!=typeof h)return k?(k=this[0].createTextRange(),k.collapse(!0),k.moveStart("character",h),k.moveEnd("character",
|
||||
j-h),k.select()):(this[0].selectionStart=h,this[0].selectionEnd=j),this[0].focus(),this;if(k)if(j=document.selection,"textarea"!=this[0].tagName.toLowerCase()){k=this.val();h=j[b]()[a]();h.moveEnd("character",k[c]);var g=""==h.text?k[c]:k.lastIndexOf(h.text);h=j[b]()[a]();h.moveStart("character",-k[c]);var l=h.text[c]}else h=j[b](),j=h[a](),j.moveToElementText(this[0]),j.setEndPoint("EndToEnd",h),g=j.text[c]-h.text[c],l=g+h.text[c];else g=i.selectionStart,l=i.selectionEnd;h=i.value.substring(g,l);
|
||||
return{start:g,end:l,text:h,replace:function(a){return i.value.substring(0,g)+a+i.value.substring(l,i.value[c])}}}})(jQuery,"length","createRange","duplicate");
|
||||
@@ -0,0 +1,94 @@
|
||||
'use strict';(function(e){function c(){this._events={};this._maxListeners=10}function b(a,b,d,c,e){this.type=a;this.listener=b;this.scope=d;this.once=c;this.instance=e}b.prototype.fire=function(a){this.listener.apply(this.scope||this.instance,a);if(this.once)return this.instance.removeListener(this.type,this.listener,this.scope),!1};c.prototype.eachListener=function(a,b){var d=null,c=null,e=null;if(this._events.hasOwnProperty(a)){c=this._events[a];for(d=0;d<c.length;d+=1)if(e=b.call(this,c[d],d),
|
||||
!1===e)d-=1;else if(!0===e)break}return this};c.prototype.addListener=function(a,f,d,c){this._events.hasOwnProperty(a)||(this._events[a]=[]);this._events[a].push(new b(a,f,d,c,this));this.emit("newListener",a,f,d,c);this._maxListeners&&!this._events[a].warned&&this._events[a].length>this._maxListeners&&("undefined"!==typeof console&&console.warn("Possible EventEmitter memory leak detected. "+this._events[a].length+" listeners added. Use emitter.setMaxListeners() to increase limit."),this._events[a].warned=
|
||||
!0);return this};c.prototype.on=c.prototype.addListener;c.prototype.once=function(a,b,d){return this.addListener(a,b,d,!0)};c.prototype.removeListener=function(a,b,d){this.eachListener(a,function(c,e){c.listener===b&&(!d||c.scope===d)&&this._events[a].splice(e,1)});this._events[a]&&0===this._events[a].length&&delete this._events[a];return this};c.prototype.off=c.prototype.removeListener;c.prototype.removeAllListeners=function(a){a&&this._events.hasOwnProperty(a)?delete this._events[a]:a||(this._events=
|
||||
{});return this};c.prototype.listeners=function(a){if(this._events.hasOwnProperty(a)){var b=[];this.eachListener(a,function(a){b.push(a.listener)});return b}return[]};c.prototype.emit=function(a){for(var b=[],d=null,d=1;d<arguments.length;d+=1)b.push(arguments[d]);this.eachListener(a,function(a){return a.fire(b)});return this};c.prototype.setMaxListeners=function(a){this._maxListeners=a;return this};"function"===typeof define&&define.amd?define(function(){return c}):e.EventEmitter=c})(this);
|
||||
StackExchange.realtime=function(){function e(a){StackExchange.options.user.isDeveloper&&console.log(a)}function c(){p.on("hb",function(a){l.send(a)})}function b(a){v?(e("sending: "+a),l.send(a)):u.push(a)}function a(a,b){1!=$("#vote-accepted-"+a.answerid).length&&($(".vote-accepted-on").remove(),b||$('.vote input[value="'+a.answerid+'"]').parent().append('<span class="vote-accepted-on" title="The question owner accepted this as the best answer">accepted</span>'))}function f(){$("#new-post-activity").remove();
|
||||
$("#answers-header").prepend(q)}function d(a){var b=$(".question[data-questionid="+a.id+"], .answer[data-answerid="+a.id+"]").find(".postcell, .answercell");0<b.find("#new-post-activity").length||b.prepend('<div id="new-post-activity">an edit has been made to this post: show the <a href="/posts/'+a.id+'/revisions">revision</a></div>').click(function(){$.get("/posts/"+a.id+"/ajax-load-mini",r(b,a))})}function h(a,b){return a.index<b.index?-1:a.index>b.index?1:0}function j(){$("#new-post-activity").remove();
|
||||
var a=o.sort(h),b;for(b in a){var d=a[b];$("#question-summary-"+d.id).remove();$(d.body).prependTo("#question-mini-list, #questions").hide().fadeIn()}i(0);null!=StackExchange.options.user.accountId&&StackExchange.tagPreferences.applyPrefs(!0,t);"undefined"!=typeof MathJax&&MathJax.Hub.Queue(["Typeset",MathJax.Hub]);k();o=[]}function i(a){var b=document.title.replace(/^\(\d*\*?\) /,"");0<a&&(b="("+a+") "+b);window.setTimeout(function(){$(document).attr("title",b)},200)}function k(){for(var a=$("span.relativetime"),
|
||||
b=0;b<a.length;b++)if(a[b].title){var d;d=new Date(a[b].title);d=((new Date).getTime()-d.getTime())/1E3;var c=Math.floor(d/86400);if(d=isNaN(c)||0>c||31<=c?void 0:0==c&&(2>d&&"just now"||60>d&&Math.floor(d)+(s?"s ago":" secs ago")||120>d&&(s?"1m ago":"1 min ago")||3600>d&&Math.floor(d/60)+(s?"m ago":" mins ago")||7200>d&&(s?"1h ago":"1 hour ago")||86400>d&&Math.floor(d/3600)+(s?"h ago":" hours ago")))a[b].innerHTML=d}}var g,l,o=[],n=[],m=0,u=[],v=!1,s=!1,t,p=new EventEmitter,q=function(){var a=Object.keys(n).length;
|
||||
return $('<div id="new-post-activity">'+a+" new answer"+(1<a?"s":"")+" to this question</div>").click(function(){StackExchange.realtime.expandAnswers()})},r=function(a,b){return function(d){d=$(d).find(".postcell, .answercell");a.replaceWith(d);d.hide().fadeIn(400,function(){"undefined"!=typeof MathJax&&MathJax.Hub.Queue(["Typeset",MathJax.Hub]);StackExchange.question.canViewVoteCounts()&&StackExchange.vote.bindFetchVoteCounts()});StackExchange.comments.init({post:d});StackExchange.vote.init(b.id);
|
||||
StackExchange.vote||StackExchange.question.bindAnonymousVoteDisclaimers();a.find("a[id^='link-post-']").click(function(a){if(!a.ctrlKey&&!a.metaKey)return StackExchange.question.showShareTip($(this),options.showCitation),!1});StackExchange.question.bindSuggestedEditPopupLinks();StackExchange.question.initShareLinks();window.history.pushState(b,"new post","#"+b.id)}},w=function(){var a=Object.keys(o).length;i(a);return $('<div id="new-post-activity">'+a+" question"+(1<a?"s":"")+" with new activity</div>").click(function(){StackExchange.realtime.expandActiveQuestions()})};
|
||||
return{init:function(a){g=a;if("WebSocket"in window||"MozWebSocket"in window){if(l)try{e("closing WebSocket"),l.close()}catch(b){}l||(e("opening WebSocket"),l="WebSocket"in window?new WebSocket(g):new MozWebSocket(g),l.onopen=function(){if(!v){v=!0;for(var a=0,b=u.length;a<b;a++)e("sending: "+u[a]),l.send(u[a]);u=[]}e("WebSocket opened");c();setInterval(k,6E4)},l.onmessage=function(a){a=$.parseJSON(a.data);p.emit(a.action,a.data)},l.onclose=function(){l=null;e("WebSocket closed");5>m&&(m++,e("reconnect attempt:"+
|
||||
m),setTimeout('StackExchange.realtime.init("'+g+'")',500))},l.onerror=function(){e("WebSocket failed");l=null})}},expandActiveQuestions:j,expandAnswers:function(){var a=$("#answers #answers-header .answers-subheader h2"),b=parseInt(a.text().match(/^\d*\*?/))+n.length;isNaN(b)&&(b=n.length);a.text(b+" Answer"+(1<b?"s":""));$("#new-post-activity").remove();var d=$("#answers #answers-header");$.each(n,function(a,b){$.get("/posts/"+b+"/ajax-load-mini",function(a){a=$(a);a.insertAfter(d).hide().fadeIn(400,
|
||||
function(){"undefined"!=typeof MathJax&&MathJax.Hub.Queue(["Typeset",MathJax.Hub]);StackExchange.question.canViewVoteCounts()&&StackExchange.vote.bindFetchVoteCounts()});StackExchange.comments.init({post:a});StackExchange.vote.init(b)})});StackExchange.vote||StackExchange.question.bindAnonymousVoteDisclaimers();d.find("a[id^='link-post-']").click(function(a){if(!a.ctrlKey&&!a.metaKey)return StackExchange.question.showShareTip($(this),options.showCitation),!1});StackExchange.question.bindSuggestedEditPopupLinks();
|
||||
StackExchange.question.initShareLinks();n=[]},subscribeToActiveQuestions:function(a,d,c,g,f,e,i){a=a+"-"+d;t=c;s=e;b(a);p.on(a,function(a){a=$.parseJSON(a);if(null!=f)for(var b=0;b<f.length;b++)if(-1==$.inArray(f[b],a.tags))return;null!=StackExchange.options.user.accountId&&StackExchange.tagPreferences.isIgnored(a.body)||(o[a.id]={id:a.id,body:a.body,index:(new Date).getTime(),siteid:a.siteid},$("#new-post-activity").remove(),$("#question-mini-list, #questions").prepend(w),g&&j());null!=i&&i(a)})},
|
||||
subscribeToInboxNotifications:function(){if(null!=StackExchange.options.user.accountId){var a=StackExchange.options.user.accountId+"-inbox";b(a);p.on(a,function(a){$(".unreadCount").remove();var b=$('<a class="unreadCount" title="unread messages in your inbox">'+a+"</a>").insertAfter(".genu");$("#portalLink .unreadCount").css({marginTop:b.css("margin-top"),opacity:1},2E3);genuwine.setUnreadCount(a)})}},subscribeToQuestion:function(c,g){var e=c+"-question-"+g;b(e);p.on(e,function(b){b=$.parseJSON(b);
|
||||
switch(b.a){case "score":var c=$('.vote input[value="'+b.id+'"]').siblings(".vote-count-post");c.text()!=b.score&&(c.text(b.score),0==$(":animated").length&&c.fadeTo("fast",0.7).fadeTo("fast",1),StackExchange.question.canViewVoteCounts()&&StackExchange.vote.bindFetchVoteCounts());break;case "comment-add":0==$("#comment-"+b.commentid).length&&(b=$("#comments-link-"+b.id),c=b.data("comments-count")||0,c++,b.data("comments-count",c),b.html("add / show <b>"+c+"</b> more comment"+(1<c?"s":"")).show().fadeTo("fast",
|
||||
0.7).fadeTo("fast",1));break;case "answer-add":0==$("#answer-"+b.answerid).length&&(n.push(b.answerid),StackExchange.cardiologist.isHeartBeating()?StackExchange.helpers.DelayedReaction(f,5E3).trigger():f(),StackExchange.cardiologist.notifiedOfNewAnswer());break;case "accept":a(b);break;case "unaccept":a(b,!0);break;case "post-edit":d(b)}})},subscribeToReputationNotifications:function(a){null!=StackExchange.options.user.accountId&&(a=a+"-"+StackExchange.options.user.userId+"-reputation",b(a),p.on(a,
|
||||
function(a){var b=$("#hlinks .reputation-score");b.text()!=a.score&&(0==$(":animated").length&&b.fadeTo("fast",0.8).fadeTo("fast",1),b.text(a))}))},updateRelativeDates:k}}();"use strict";StackExchange.anonymous={};
|
||||
var gauth=function(){return{informStackAuth:function(e){if(gauth.enabled()){var c=document.domain;"meta."==c.substr(0,5)&&(c=c.substr(4,c.length-4));var b=$.cookie("gauth");if(null==b)$.cookie("gauth",null,{path:"/",domain:c}),$.cookie("gauth",null,{path:"/",domain:document.domain});else{"."!=c.charAt(0)&&(c="."+c);$.cookie("gauth",null,{path:"/",domain:c});$.cookie("gauth",null,{path:"/",domain:document.domain});var a=b.indexOf(":"),c=b.substr(0,a),b=b.substr(a+1),f=e+"/auth/global/write?authToken="+
|
||||
encodeURIComponent(c)+"&nonce="+encodeURIComponent(b);$(document).ready(function(){$("#footer").append("<iframe style='display:none' src='"+f+"'></iframe>")})}}},checkStackAuth:function(e){if(gauth.enabled()&&null==$.cookie("gauthed")){$.cookie("gauthed","1",{path:"/"});var c=function(b){if(b.origin==e)if("No Local Storage"==b.data)gauth.noGAuthStorage();else if("No Session"==b.data)gauth.noGAuthSession();else{var a=b.data.substr(0,b.data.indexOf(",")),b=b.data.substr(b.data.indexOf(",")+1);$.post("/users/login/global",
|
||||
{authToken:a,nonce:b},function(a){gauth.globallyAuthed(a)},"json")}};window.attachEvent?window.attachEvent("onmessage",c):window.addEventListener("message",c,!1);$.post("/users/login/global/request","",function(b){var a=e+"/auth/global/read?request="+encodeURIComponent(b.token)+"&nonce="+encodeURIComponent(b.nonce);$(document).ready(function(){$("#footer").append("<iframe id='global-auth-frame' style='display:none' src='"+a+"'></iframe>")})},"json")}},enabled:function(){$.cookie("enabledCheck","1");
|
||||
if(null==$.cookie("enabledCheck"))return!1;$.cookie("enabledCheck",null);return"undefined"==typeof localStorage?!1:!0},noGAuthStorage:function(){},noGAuthSession:function(){},globallyAuthed:function(e){if(e&&e.Message){var e=e.Message+" ",c,b=!1,a=""+window.location,f=a.indexOf("returnurl=");if(-1!=f){var d=a.indexOf("&",f);-1==d&&(d=a.length);c=decodeURIComponent(a.substring(f+10,d));c=/^(?:http:\/\/|\/)/.test(c)?c.replace(/[^-a-z0-9+&@#\/%?=~_|!:,.;()]/g,""):null}-1!=a.indexOf("/users/login")&&
|
||||
(b=!0,c=c||"/");StackExchange.helpers.showFancyOverlay({message:b?e+"<br>You are being redirected...":e+(c?"<a href=\"javascript:window.location='"+c+"'\">Click here</a> to return to your last location.":'<a href="javascript:location.reload(true)">Click here</a> to refresh the page.'),showClose:!b,complete:function(){b&&(window.location=c)}})}}}}(),genuwine=function(){var e,c="",b,a,f=function(){return $(".genu").hasClass("genu-on")},d=function(){var d=$(".genu"),c=$("#seWrapper");if(0==c.length){j();
|
||||
var c=$("#seWrapper"),g;0<b?(g=$("#seTabInbox"),u(g)):a?(g=$("#seTabNotices"),i(g)):(g=$("#seTabHot"),l(g));g.addClass("seCurrent")}(g=d.hasClass("genu-on"))?($(".unreadCountTab").hide(),$(".itemBoxNew").removeClass("itemBoxNew"),c.fadeOut("fast")):(c.fadeIn("fast"),$(".unreadCount").hide());d.toggleClass("genu-on",!g);-1==b&&$(d).ready(function(){$("#seTabInbox").hide()});h($("#seTabInbox"),$("#seTabNotices"))},h=function(d,c){StackExchange.options.site.isNoticesTabEnabled&&a&&0==c.find(".unreadCountTab").length&&
|
||||
c.prepend('<span class="unreadCountTab newNotices">'+a+"</span>");0<b&&0==d.find(".unreadCountTab").length&&d.prepend('<span class="unreadCountTab">'+b+"</span>")},j=function(){var a='<div id="seWrapper" style="position:absolute; display:none;"><div class="seIntro"><a href="'+c+'">Stack Exchange</a> is a network of free, community-driven Q&A sites.</div><div class="seNav"><ul class="seNavLinks"><li><a id="seTabHot">Hot Questions</a></li><li><a id="seTabSites">All Sites</a></li><li><a id="seTabInbox">Inbox</a></li>'+
|
||||
(StackExchange.options.site.isNoticesTabEnabled?'<li><a id="seTabNotices">Notifications</a></li>':"")+'</ul></div><div class="seContainer"></div><div class="seFooter"><div id="seTabEmail" class="seEmailAccount"><a>email settings</a></div><a id="seClose">close</a></div></div>',b=$("#hlinks"),b=b.height()+b.offset().top+5;$(a).appendTo("#portalLink").css({top:b}).find("ul.seNavLinks a, #seTabEmail").click(function(){var a=$(this);$(".seNavLinks a").removeClass("seCurrent");a.addClass("seCurrent");switch(a.attr("id")){case "seTabHot":l(a);
|
||||
$("#seContainerSites, #seContainerInbox, #seContainerEmail, #seContainerNotices").hide();$("#seContainerHot").fadeIn("fast");break;case "seTabSites":0==$("#seContainerSites").length&&g(a);$("#seContainerHot, #seContainerInbox, #seContainerEmail, #seContainerNotices").hide();$("#seContainerSites").fadeIn("fast");break;case "seTabInbox":u(a);$("#seContainerHot, #seContainerSites, #seContainerEmail, #seContainerNotices").hide();$("#seContainerInbox").fadeIn("fast");break;case "seTabEmail":0==$("#seContainerEmail").length&&
|
||||
o(a);$("#seContainerHot, #seContainerSites, #seContainerInbox, #seContainerNotices").hide();$("#seContainerEmail").fadeIn("fast");break;case "seTabNotices":i(a),$("#seContainerHot, #seContainerSites, #seContainerInbox, #seContainerEmail").hide(),$("#seContainerNotices").fadeIn("fast")}});$("#seClose").live("click",d)},i=function(a){0==$("#seContainerNotices").length&&t(a,"/notices/genuwine?userId="+StackExchange.options.user.id,"jsonp",k,!0)},k=function(a,b){for(var d='<div id="seContainerNotices" style="display:none">',
|
||||
c=0;c<b.length;c++)var g=b[c],d=d+('<div class="noticeBox'+(g.is_unread?" itemBoxNew":"")+'"><a href="'+g.site_url+'" class="siteLinkFavicon"><img src="'+g.icon+'"></a><div class="siteInfo"><p>'+g.text+"</p></div></div>");p(a,d+"</div>")},g=function(a){t(a,c+"/genuwine/sites?callback=?&host="+document.location.host+(e?"&accountId="+e:""),"jsonp",m)},l=function(a){0==$("#seContainerHot").length&&t(a,c+"/genuwine?callback=?","jsonp",n)},o=function(a){t(a,"/accounts/email-settings","json",function(a,
|
||||
b){function d(){$("#email-save").removeAttr("disabled");$("#email-confirmation").html("")}p(a,'<div id="seContainerEmail" style="display:none; font-size:11px;"><div class="itemBox" style="border-bottom: 0px"><p>Would you like to receive unread inbox messages via email?</p><div>Email: <input id="email-notify" name="email-notify" style="width:300px;" value="'+b.verifiedEmail+'"></input></div><div><input type="radio" name="optIn" value="true" id="email-enable"'+(!0==b.optIn?'checked="checked"':"")+'"> <label for="email-enable">Email me my unread inbox messages </label> <select id="email-freq"><option value="3">every 3 hours</option><option value="24">daily</option><option value="168">weekly</option></select> </div><div><input type="radio" name="optIn" value="false" id="email-disable"'+
|
||||
(!0!=b.optIn?'checked="checked"':"")+'"> <label for="email-disable">Do not email me inbox messages</label></input></div><div><input type="button" name="save" id="email-save" value="Save" disabled="disabled"></input></div><div id="email-confirmation" style="display:none;"></div></div></div>');$("#email-freq").val(b.freq).on("click focus",function(){$("#email-enable").prop("checked",!0)});$("#email-notify").focus().keyup(d);$("#email-enable, #email-disable, #email-freq").change(d);$("#email-save").click(function(){q();
|
||||
$.post("/accounts/verified-email-set",{email:$("#email-notify").val(),fkey:StackExchange.options.user.fkey,optin:$("input[name=optIn]:checked").val(),freq:$("#email-freq").val()},function(a){StackExchange.helpers.removeSpinner();$("#email-confirmation").html(a.message).fadeIn();a.success&&$("#email-save").attr("disabled","disabled")},"json")})},!0)},n=function(a,b){for(var d=$("<div/>"),c='<div id="seContainerHot" style="display:none">',g=0;g<b.length;g++)var f=b[g],e=f.SiteId,i='href="http://'+e+
|
||||
"/q/"+f.Id+'?hq=1"',h=parseInt(f.DisplayScore,10),c=c+('<div class="itemBox"><a '+i+' class="seNumAnswer">'+h+'</a><div class="siteInfo"><p><a '+i+">"+d.text(f.Title).html()+'</a></p><a href="http://'+e+'" class="siteLink">'+e+"</a></div></div>");p(a,c+"</div>")},g=function(a){t(a,c+"/genuwine/sites?callback=?&host="+document.location.host+(e?"&accountId="+e:""),"jsonp",m)},m=function(a,b){for(var d='<div id="seContainerSites" style="display:none">',c=0;c<b.length;c++)var g=b[c],f=g.Name,e='href="http://'+
|
||||
g.Id+'?as=1"',d=d+('<div class="itemBox"><a '+e+' class="siteFavicon"><img src="'+g.FaviconUrl+'" alt="'+f+'"></a><div class="siteInfo"><p><a '+e+">"+f+"</a></p><a "+e+' class="siteLink">'+g.Description+"</a></div></div>");p(a,d+"</div>")},u=function(a){-1!=b&&0==$("#seContainerInbox").length&&t(a,"/inbox/genuwine","json",v,!0)},v=function(a,b){for(var d='<div id="seContainerInbox" style="display:none">',c=0;c<b.length;c++){var g=b[c],f='href="'+g.Url+'"',i='title="'+g.CreationDate+'"',h=g.Count,
|
||||
d=d+('<div class="itemBox'+(g.IsNew?" itemBoxNew":"")+'"><a '+f+' class="siteLinkFavicon"><img src="'+g.FaviconUrl+'" alt="'+g.SiteUrl+'"></a><div class="siteInfo">');"careers message"==g.Type?d+="<p><a "+f+' style="font-weight:normal"><b>'+g.Title+"</b> wants to contact you on <b>Stack Overflow Careers</b></a></p>":"invitation"==g.Type?(i=g.Count,d+="<p><a "+f+' style="font-weight:normal"><b>'+i+"</b> "+("invitation"+(1<i?"s":""))+" awarded on <b>Stack Overflow Careers</b></a></p>"):d+="<p>"+(1<
|
||||
h?h+" ":"")+g.Type+" on <a "+f+" "+i+">"+g.Title+"</a></p>";d+='<p class="inboxSummary">'+(g.Summary||"")+"</p></div></div>"}e&&5<=b.length&&(d+='<div class="itemMoreContainer"><div class="seIntro"><a href="http://stackexchange.com/users/'+e+'?tab=inbox">more inbox messages …</a></div></div>');p(a,d+"</div>")},s={},t=function(a,b,d,c,g){var f=a.attr("id");if(s[f])q();else{s[f]=!0;q();var e=function(){s[f]=!1;StackExchange.helpers.showErrorPopup($(".seContainer"),"An error occurred while loading - please try again.")};
|
||||
$.ajax({type:"GET",url:b,dataType:d,success:function(b){b&&(0<b.length||g)?c(a,b):e()},error:e,complete:StackExchange.helpers.removeSpinner()})}},p=function(a,b){var d=$(b);d.appendTo(".seContainer");a.hasClass("seCurrent")&&d.fadeIn("fast")},q=function(){StackExchange.helpers.removeSpinner();StackExchange.helpers.addSpinner(".seContainer",{position:"relative",left:"10px",top:"10px"})},r=function(){var a=$("#portalLink .unreadCount"),b=a.css("margin-top");a.css({marginTop:-20,opacity:0}).show().animate({marginTop:b,
|
||||
opacity:1},2E3)},w=function(d){a=d;!(0<b)&&StackExchange.options.site.isNoticesTabEnabled&&(99<a&&(a=99),0<a&&$("#portalLink .unreadCount").text(""+a).addClass("newNotices").click(function(){$(".genu").click()}).show())};return{isVisible:f,click:d,setUnreadCount:function(a){b=a;0<a?($("#portalLink .unreadCount").text(b).click(function(){$(".genu").click()}).show(),r()):$("#portalLink .unreadCount").text("").hide();$("#portalLink .unreadCount").removeClass("newNotices")},animateInbox:r,init:function(a,
|
||||
g,i){var h=$(".genu");1<=h.length&&(h[0].onclick=null);e=a;c=h.attr("href");b=g;w(i);h.removeAttr("href").add(".unreadCount").click(d);$(document).click(function(a){f()&&!$.contains($("#portalLink")[0],a.target)&&d()})}}}();
|
||||
StackExchange.notify=function(){function e(a,b){var d=$("#dismissed-messages");d.val(d.val()+"~"+a+(b?" "+b:"")+"~")}function c(a,b){var d=$("#dismissed-messages").val();return!d?!1:RegExp("~"+a+(b?" "+b:"")+"~").test(d)}function b(a,b,d){var c=parseInt($("body").css("margin-top").match(/\d+/)),a=b*c/a;d?$("body:not(.no-message-slide)").animate({marginTop:a+"px"},"fast","linear"):$("body:not(.no-message-slide)").css("marginTop",a+"px")}var a=0,f=function(d,c){var g=$("#notify-"+d+(c?"-"+c:""));-1==
|
||||
d?$.cookie("m","0",{expires:90,path:"/"}):-1<d&&$.post("/messages/mark-as-read",{messagetypeid:d,id:c?c:null});e(d,c);a--;g.fadeOut("fast",function(){b(a+1,a,!0);g.remove()})},d=function(b){if(StackExchange.options.site.isNoticesTabEnabled)return!0;a++;if(c(b.messageTypeId,b.id))return!1;var d="";b.messageTypeId&&(d=' id="notify-'+b.messageTypeId+(b.id?"-"+b.id:"")+'"');d="<div"+d+' style="display:none"><span class="notify-close"><a title="dismiss this notification">×</a></span><span class="notify-text">'+
|
||||
b.text+"</span>";if(b.showProfile)var g=encodeURIComponent("/users/"+b.userId+"?tab=badges&sort=recent"),d=d+(' See your <a href="/messages/mark-as-read?messagetypeid='+b.messageTypeId+"&returnurl="+g+'">profile</a>.');d=$(d+"</div>");d.find(".notify-close").click(function(){b.close&&b.close();f(b.messageTypeId,b.id)});$("#notify-container").append(d);return!0},h=function(){$("#notify-container div").fadeIn("slow")},j=function(a,b){var c=$('<div class="link-more"><a>view '+a+" more notification"+
|
||||
(1!=a?"s":"")+"</a></div>");$("#notify-container").append(c);c.click(function(){c.detach();for(var a=0;a<b.length;a++)d(b[a]);h()})};return{showMessages:function(c,f){for(var g=0,e=f?2:c.length,o=0;o<e&&o<c.length;o++)d(c[o])&&g++;b(a,g,!1);h();f&&g<c.length&&(e=c.slice(e),j(c.length-g,e))},show:function(a,b){$("body:not(.no-message-slide)").animate({marginTop:"2.5em"},"fast","linear");d({text:a,messageTypeId:b});h()},close:f,getMessageText:function(a){return $("#notify-"+a+" .notify-text").text()}}}();
|
||||
function moveScroller(){var e=$("#scroller").width(),c=function(){var b=$(window).scrollTop(),a=$("#scroller-anchor").offset().top,c=$("#scroller");b>a?c.height()>$(window).height()?c.css({position:"fixed",top:"",bottom:"0px",width:e}):c.css({position:"fixed",top:"0px",bottom:"",width:e}):b<=a&&c.css({position:"relative",top:"",bottom:""})};$(window).scroll(c).resize(c);c()}
|
||||
var styleCode=function(){return function(){"undefined"!=typeof MathJax&&MathJax.Hub.Queue(["Typeset",MathJax.Hub]);var e=!1;$("pre code").parent().each(function(){$(this).hasClass("prettyprint-override")&&($(this).removeClass("prettyprint-override").addClass("prettyprint"),e=!0);var c;if(c=!$(this).hasClass("prettyprint")){c=$(this);var b=$("#prettify-lang").text();""!=b?(c.addClass(b),c=!0):c=!1}c&&($(this).addClass("prettyprint"),e=!0)});e&&("undefined"!=typeof jtab?jtab.renderimplicit():StackExchange.using("prettify",
|
||||
function(){StackExchange.prettify.applyCodeStyling()}))}}();
|
||||
StackExchange.helpers.MagicPopup=function(e){function c(a,d){var c=$("<div id='"+e.id+"'/>").html(d),h=$("<div />").css({overflow:"hidden",position:"absolute",width:1,height:1,top:0,left:0}).append(c).appendTo("body"),j=e.showing(a,c),n={left:j.left};j.hasOwnProperty("bottom")?(n.bottom=j.bottom,n.top="auto"):n.top=j.top;var m;e.shown&&(m=function(){e.shown(a,c)});h.css(n).animate({height:c.outerHeight()+8,width:c.outerWidth()+8},300,m);b=function(){h.stop().remove();e.removed&&e.removed(a,c);b=f=
|
||||
null};f=StackExchange.helpers.DelayedReaction(b,5);n=h;j.additional&&(n=n.add(j.additional));n.hover(f.cancel,f.trigger)}var b,a,f,d,h={},j=StackExchange.helpers.DelayedReaction(function(a,f){if(!d&&a){var g;e.cache&&"c_"+a in h?g=$.Deferred().resolve(h["c_"+a]):(g=$.ajax({type:"GET",url:a,dataType:"html"}),e.cache&&g.done(function(b){h["c_"+a]=b}));g.done(function(a){b&&b();""!=a&&c(f,a)})}},500);$(document).delegate(e.selector,{mouseenter:function(){if(f&&this===a)f.cancel();else return a=this,
|
||||
j.trigger(e.getUrl(this),this),d=!1},mouseleave:function(){d=!0;j.cancel();f&&f.trigger()}})};
|
||||
StackExchange.tagmenu=function(){function e(a){var a=$(a),b=a.attr("href");if(!b||"/"!=b.charAt(0))return null;b=a.text();if(-1<b.indexOf("*"))return null;a.attr("title","");return"/tags/"+encodeURIComponent(b)+"/subscriber-info"}function c(a,b){var c=$(a),e=c.offset(),i=c.outerHeight(),c={left:e.left},k=e.top+i,i=e.left+b.outerWidth();b.height()+k>$(window).height()+$(window).scrollTop()?c.bottom=$(window).height()-e.top-8:c.top=k;e=Math.max(1024,$(window).width());i>e&&(c.left-=i-e);return c}var b,
|
||||
a;return{init:function(f){b=f;a||(a=!0,StackExchange.options.isMobile||(StackExchange.helpers.MagicPopup({selector:".post-tag:not(.user-tag)",id:"tag-menu",getUrl:e,showing:c,shown:function(a,c){b&&b(c,$(a).text())}}),$("#interesting-tags .post-tag").addClass("user-tag")))}}}();
|
||||
StackExchange.usermenu=function(){function e(b,d){var c=$(b).find("img:first"),e=c.offset(),i=c.height(),k=c.width(),g=Math.max(k,i),l=64*i/g,g=64*k/g,o=d.find("img:first").css({width:g,height:l}),n=o.offset();o.css("visibility","hidden");a=c.clone().css({position:"absolute",zIndex:300,left:e.left,top:e.top,width:k,height:i}).appendTo("body");var m=function(){o[0].complete?(o.css("visibility","visible"),a.fadeOutAndRemove()):setTimeout(m,500)};a.animate({width:g,height:l,top:e.top+n.top},200,m);return{top:e.top,
|
||||
left:e.left-n.left,additional:a}}function c(){a.remove()}var b,a;return{init:function(){b||(b=!0,StackExchange.options.isMobile||StackExchange.helpers.MagicPopup({selector:".user-hover .user-gravatar48, .user-hover .user-gravatar32",getUrl:function(a){a=/\/users\/([^/]+).*$/.exec($(a).closest(".user-hover").find(".user-details a").attr("href"));return!a?null:"/users/user-info/"+a[1]},cache:!0,id:"user-menu",showing:e,removed:c}))}}}();
|
||||
StackExchange.chatAd=function(){function e(){var a=$(".question .post-taglist .post-tag");return!a.length?null:a.map(function(a,b){return $(b).text()}).get().join(" ")}function c(a){return 10>a?"0"+a:a}function b(a){var b=new Date;b.setTime(1E3*a);return[b.getUTCFullYear(),"-",c(b.getUTCMonth()+1),"-",c(b.getUTCDate())," ",c(b.getUTCHours()),":",c(b.getUTCMinutes()),":",c(b.getUTCSeconds()),"Z"].join("")}function a(a){var b=Math.floor((new Date).getTime()/1E3)-a,d=b%60,g=Math.floor(b/60),e=Math.floor(b/
|
||||
3600);if(1>b)return"just now";if(60>b)return 1==d?"1 sec ago":d+" secs ago";if(3600>b)return 1==g?"1 min ago":g+" mins ago";if(86400>b)return 1==e?"1 hour ago":e+" hours ago";b=Math.floor(b/86400);if(1==b)return"yesterday";if(2>=b)return b+" days ago";a=new Date(1E3*a);return m[a.getMonth()]+" "+a.getDate()+" at "+a.getHours()+":"+c(a.getMinutes())}function f(a){var b=$("<div />");b.text(a);return b.html().replace('"',""")}function d(){$.get(g,null,function(a,b,d){i(a,b,d)})}function h(b){for(var d=
|
||||
$('<div class="ad502-users" />'),c=0;c<b.length&&7>c;c++){var g=b[c],e=g.name;g.lastPost&&(e+=": "+a(g.lastPost));var f="http://www.gravatar.com/avatar/"+g.emailhash+"?s=23&d=identicon&r=PG",g=$('<a href="'+(k+"/users/"+g.id)+'" />');$("<img />").attr("title",e).attr("src",f).appendTo(g);d.append(g)}return d}function j(a){var b=a.user;return(a=a.userid)?'<a href="'+k+"/users/"+a+'">'+f(b)+"</a>":f(b)}function i(c){var g=$("#ad502-rooms");if(!c.error){g.html("");for(var e=c.rooms,i=0;i<e.length&&2>
|
||||
i;i++){var m=e[i],q=k+"/rooms/"+m.id,r=$('<div class="ad502-room"></div>');r.append($('<h3 class="ad502-room-h3"><span class="ad502-room-title" title="'+f(m.name)+'"><a href="'+q+'">'+f(m.name)+"</a></span></h3>"));m.messages&&0<m.messages.length&&r.append($('<span title="'+b(m.lastPost)+'" class="ad502-last-message">'+a(m.lastPost)+" - "+j(m.messages[0])+"</span><br>"));m.singleImage?r.append($('<div class="ad502-users"><img src="'+k+"/rooms/users/"+m.id+'.jpeg" /></div>')):r.append(h(m.users));
|
||||
g.append(r)}1<c.activeUsers?$("#h-chat-link").text(c.activeUsers+" People Chatting"):$("#h-chat-link").text("Visit Chat");$("#h-chat-link").attr("title",c.activeUsers+" users active in "+c.activeRooms+" rooms the last 60 minutes")}l<=n&&window.setTimeout(d,1E3*l);l+=o}var k,g,l=180,o=30,n=480,m="Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(",");/^\/questions\/\d+/i.test(window.location.pathname)&&(n=0);return{init:function(a){k=a.chatUrl;g=a.reloadUrl;if(a.tagBased){var b=e();if(!b)return;
|
||||
g+=(/\?/.test(g)?"&":"?")+"tags="+encodeURIComponent(b)}null===a.preloadData?d():i(a.preloadData,null,null)}}}();
|
||||
StackExchange.helpers.noDiacritics=function(){var e={"\u00e0\u00e5\u00e1\u00e2\u00e4\u00e3\u00e5\u0105":"a","\u00e8\u00e9\u00ea\u00eb\u0119":"e","\u00ec\u00ed\u00ee\u00ef\u0131":"i","\u00f2\u00f3\u00f4\u00f5\u00f6\u00f8\u0151":"o","\u00f9\u00fa\u00fb\u00fc":"u","\u00e7\u0107\u010d":"c","\u017c\u017a\u017e":"z","\u015b\u015f\u0161":"s","\u00f1\u0144":"n","\u00fd\u0178":"y","\u0142":"l","\u0111":"d","\u00df":"ss","\u011f":"g","\u00de":"th"};return function(c){for(var b in e)e.hasOwnProperty(b)&&(c=
|
||||
c.replace(RegExp("["+b+"]"),e[b]));return c}}();function sanitizeAndSplitTags(e,c){for(var e=$.trim(e).replace(/([A-Za-z0-9])\+(?=[A-Za-z0-9])/g,"$1 "),b=e.split(/[\s|,;]+/),a=[],f=0;f<b.length;f++){var d=StackExchange.helpers.noDiacritics(b[f].toLowerCase()).replace(/_/g,"-"),d=d.replace(RegExp("[^a-z0-9.#+"+(c?"*":"")+"-]","g"),""),d=d.replace(/^[#+-]+/,""),d=d.replace(/[.-]+$/,"");0<d.length&&-1==$.inArray(d,a)&&a.push(d)}return a}
|
||||
StackExchange.question=function(){var e=function(a,b){var c=null!=a;a||(a=$('div.question div.post-menu a:contains("link")'));var d=a.closest(".post-menu, .help-menu");if(a.hasClass("share-link"))d.find(".close-share-tip").click();else{a.addClass("share-link");var e=a.attr("id").substring(10),f=a.closest(".col-section").length?"section":a.closest("div.question").length?"question":"answer",h=$('<div class="share-tip" style="display:none">share a link to this '+f+'<input type="text" value="http://'+
|
||||
document.location.host+a.attr("href")+'" style="display:block; width:292px;"><a class="close-share-tip" style="float:right">close</a></div>');b&&h.find(".close-share-tip").before('<a id="link-post-'+e+'" style="float:left">cite</a>');h.appendTo(d).fadeIn(c?"fast":0).bind("removing",function(){a.removeClass("share-link")}).find(".close-share-tip").click(function(){h.fadeOutAndRemove()}).end().find("input[type=text]").select()}},c=function(a){var b=$("#post-form h2:first"),c=b.wrap("<div />").parent(),
|
||||
d=c.wrap("<div />").parent(),e=$("<div />").prependTo(d),f=d.height(),h=$("<div />"),a=$(a),j=parseInt(b.css("margin-bottom")),i=$("#content"),k=$("#wmd-input").outerWidth(),q=i.offset().left>b.offset().left-5&&"visible"!=i.css("overflow-x");h.css({height:0,overflowY:"hidden"}).appendTo(c).append(a);d.css({height:f,position:"relative"});c.css({position:"absolute",bottom:-j,width:k});e.addClass("answer-help-background").css({position:"absolute",bottom:-j,height:0,width:k});q&&(e.css("left",0),c.animate({paddingLeft:5},
|
||||
1E3));h.animate({height:a.height()+j+10},1E3);e.animate({height:a.height()+j+10+f},1E3);$("<div style='float:right;margin-top:10px;'><a href='#'>ok</a></div>").hide().prependTo(c).fadeIn(1E3).find("a").one("click",function(a){var d=$(this).parent();setTimeout(function(){d.remove()},1);h.animate({height:0},1E3,function(){h.add(e).remove();b.unwrap().unwrap()});e.animate({height:0},1E3);q&&c.animate({paddingLeft:0},1E3);a.preventDefault()})},b=function(){$.get("/posts/answer-help").then(c)},a,f,d,h=
|
||||
function(){var a=window.location.href;0>a.indexOf("#")||(a=a.match(/#(\d+|comment(\d+)_(\d+))/i))&&(a[2]?j(a[2],a[3]):i($(".answer[data-answerid="+a[1]+"]")))},j=function(a,b){var c="#comment-"+a,d=$(c);d.length?i(d):StackExchange.comments.loadAll($("#comments-link-"+b)).done(function(){i($(c))})},i=function(b){var c=d;b.css({backgroundColor:a}).animate({backgroundColor:c},2E3,"linear",function(){$(this).css("background-color","")});b.is(".comment")&&b[0].scrollIntoView(!0)},k=function(a){a=a||{};
|
||||
$('.post-menu a:contains("link")').live("click",function(b){if(!b.ctrlKey&&!b.metaKey)return e($(this),a.showCitation),!1})};return{showShareTip:e,getQuestionId:function(a){a=(a?a.closest(".question"):$(".question")).data("questionid");if(!a)throw Error("getQuestionId could not find an id");return a},highlightComment:j,initShareLinks:k,canViewVoteCounts:function(){return f},init:function(c){StackExchange.question.fullInit?StackExchange.question.fullInit(c):StackExchange.question.bindAnonymousVoteDisclaimers();
|
||||
StackExchange.comments.init({autoShowCommentHelp:c.autoShowCommentHelp});c.showShareTip&&e();$("input.anon-vote").live("click",function(){var a=$(this),b=a.postId(),c=a.parent();c.closest(".question,.answer").unbind("mouseenter.helpful").unbind("mouseleave.helpful");c.text("sending feedback ...");setTimeout(function(){c.text("Thank you for your feedback.")},500);$.ajax({type:"POST",url:"/vote/anon/"+b,data:{votetypeid:"Yes"==a.val()?2:3},complete:function(){}})});var j=$(".was-this-helpful"),i=j.css("color"),
|
||||
n=$(".post-text").css("color");j.each(function(){var a=$(this),b=a.text();a.closest(".answer, .question").bind("mouseenter.helpful",function(){a.html("Was this post useful to you? <input style='display:none;' class='anon-vote' type='button' value='Yes'/> <input style='display:none;' class='anon-vote' type='button' value='No'/>").animate({color:n},"fast","linear").find("input").fadeIn("fast")}).bind("mouseleave.helpful",function(){a.text(b).animate({color:i},"fast","linear")})});
|
||||
k(c);if(c.showAnswerHelp)$("#wmd-input").one("focus",b);c.showCitation&&$("div.share-tip a[id^='link-post-']").live("click",function(){$(this).closest(".post-menu").find(".close-share-tip").click();citation.show($(this))});d=c.backgroundColor;a=c.highlightColor;f=c.canViewVoteCounts;h(c)}}}();
|
||||
StackExchange.question.bindAnonymousVoteDisclaimers=function(){function e(c){return function(b){var a='Please <a href="/users/login?returnurl='+escape(document.location)+'">login or register</a> to '+c+" this post.";StackExchange.helpers.showErrorPopup($(this).parent(),a);var a="",e=$(this).prop("className"),d=$(this).closest(".answer").length?"answer":"question";/vote-up/.test(e)?a="?vote=up&type="+d:/vote-down/.test(e)?a="?vote=down&type="+d:/star/.test(e)&&(a="?vote=favorite");StackExchange.helpers.fireAndForget("/analytics/user/try-vote"+
|
||||
a);b.preventDefault()}}$(".vote-up-off, .vote-down-off").click(e("vote for"));$("div.post-menu a[id^='flag-post-']").unbind("click").click(e("flag"));$(".star-off:not(.disabled)").live("click",e("favorite"))};
|
||||
StackExchange.comments=function(){function e(a,b){this.postId=a;this.jDiv=b;this.jCommentsLink=$("#comments-link-"+a)}function c(b){var c=(b.constructor===$?b:$(b)).closest(".question, .answer, div[id^='post-']").find(".comments"),b=c.attr("id").replace(/^comments-/,"");if(a[b])return a[b];c=new e(b,c);return a[b]=c}function b(){if(0!=$(".question[data-questionid]").length){var a=StackExchange.question.getQuestionId();$(".comment .comment-date > span").each(function(){var b=$(this),c=b.closest(".answer"),
|
||||
c=c&&c.length?c.data("answerid"):0,e=b.closest(".comment").attr("id").substr(8);b.wrap('<a class="comment-link" onclick="StackExchange.question.highlightComment({cid}, {aid})" href="{hash}"></a>'.format({hash:"#comment"+e+"_"+(c?c:a),cid:e,aid:c}))})}}var a={},f=function(){};e.prototype={checkDiscussion:f,ensureInput:f,commentsShown:function(){this.jCommentsLink.hide();this.jCommentsLink.data("comments-count",0)},addShow:function(a){var b=this;this.loadAllComments().done(function(){b.jCommentsLink.hide();
|
||||
b.checkDiscussion()});var c=this.ensureInput();c&&!a&&c.focus()},ajax:function(a,b,c,e){c&&!e&&StackExchange.helpers.addSpinner(c,{"margin-left":"10px"});var f=this;return $.ajax(a).fail(function(a){$(".error-notification").fadeOut("fast",function(){$(this).remove()});a=a.responseText;if(!a||100<=a.length)a="An error occured"+(b?" "+b:"");StackExchange.helpers.showErrorPopup(c||f.jDiv,a);c&&!e&&StackExchange.helpers.removeSpinner()}).done(StackExchange.helpers.removeSpinner).promise()},showComments:function(a){this.jDiv.find(" > table > tbody").html(a);
|
||||
this.jCommentsLink.text("add comment");"undefined"!=typeof MathJax&&MathJax.Hub.Queue(["Typeset",MathJax.Hub]);b();this.commentsShown()},loadAllComments:function(a){this.jDiv.removeClass("dno");if(!a&&!/more comment/.test($("#comments-link-"+this.postId).text()))return $.Deferred().resolve().promise();var b=this;return this.ajax({type:"GET",url:"/posts/"+this.postId+"/comments",dataType:"html"},"while fetching comments").done(function(a){b.showComments(a)}).promise()}};return{init:function(a){a=a&&
|
||||
a.post||document;$("a[id^='comments-link-']",a).click(function(){var a=/more comment/.test($(this).text());c(this).addShow(a)});a==document&&b()},loadAll:function(a){return c(a).loadAllComments(!0)},extendPostUi:function(a){for(var b in a)a.hasOwnProperty(b)&&(e.prototype[b]=a[b])},uiForPost:c}}();
|
||||
StackExchange.share=function(){function e(b,a,c){window.open(b,a,c)||(window.location.href=b)}function c(b,a){var c=b.indexOf("?"),d=b.indexOf("#");return-1==c?-1==d?b+"?"+a:b.substring(0,d)+"?"+a+b.substring(d):-1==d?b+"&"+a:b.substring(0,d)+"&"+a+b.substring(d)}return{gplus:function(b,a){a=c(a,"sgp=1");b.click(function(){e("https://plus.google.com/share?url="+a,"sharegplus","toolbar=1,status=1,resizable=1,scrollbars=1,width=600,height=500")})},twitter:function(b,a,f){a=c(a,"stw=1");b.click(function(){e("http://twitter.com/share?url="+
|
||||
a+"&ref=twitbtn&text="+f,"sharetwitter","toolbar=1,status=1,resizable=1,scrollbars=1,width=800,height=526")})},facebook:function(b,a,f){a=c(a,"sfb=1");b.click(function(){e("http://www.facebook.com/sharer.php?u="+a+"&ref=fbshare&t="+f,"sharefacebook","toolbar=1,status=1,resizable=1,scrollbars=1,width=626,height=436")})}}}();
|
||||
function initTagRenderer(e,c){window.tagRenderer||(window.tagRendererRaw=function(b,a){var a=a||"",f="";a||(e&&-1<$.inArray(b,e)?f=" required-tag":c&&-1<$.inArray(b,c)&&(f=" moderator-tag"));return"<a class='post-tag"+f+"' href='"+a+"/questions/tagged/"+encodeURIComponent(b)+"' title=\"show questions tagged '"+b+"'\" rel='tag'>"+b+"</a>"},window.tagRenderer=function(b,a){return $(tagRendererRaw(b,a))})}
|
||||
function showFadingHelpText(e){e.wrap('<div class="dno" />').show().parent().fadeIn("slow",function(){$(this).children().unwrap()})}
|
||||
function initFadingHelpText(){var e={"wmd-input":"#how-to-format",tagnames:"#how-to-tag","tag-editor":"#how-to-tag",title:"#how-to-title"},c=$("#wmd-input, #tagnames, #title, .tag-editor input"),b=function(a){return $(a).parent().hasClass("tag-editor")?e["tag-editor"]:e[$(a).attr("id")]};c.focus(function(){var a=b(this);c.each(function(){var c=b(this);c!=a&&$(c).hide()});var e=$(a);e.is(":visible")||showFadingHelpText(e)})}
|
||||
$.fn.extend({postId:function(){var e=this.first();if(!e.hasClass("answer")||!e.hasClass("question"))e=e.closest(".answer, .question");return parseInt(e.find(".vote input")[0].value)}});
|
||||
StackExchange.newsletterAd=function(){function e(b){b=$('<div id="lightbox-panel" class="popup" style="display:block"></div>').append('<div class="popup-close"><a title="close this popup (or hit Esc)">×</a></div>').append(b);$('<div id="lightbox"></div>').appendTo($("body")).css("height",$(document).height()).fadeIn("fast");b.appendTo($("body")).center().fadeIn("fast").find(".popup-close").click(function(){$("#lightbox, #lightbox-panel").fadeOutAndRemove()})}function c(){var b=StackExchange.options.site.name,
|
||||
a=$(['<div style="text-align: left;">','<h2 style="margin-bottom: 15px;">Subscribe to the '+b+" weekly newsletter</h2>",'<p><strong><a href="/users/login?returnurl=/newsletter/signup/redirect">Create an account on '+b+'</a> or <a href="/users/login?returnurl=/newsletter/signup/redirect">log in</a> if you already have one.</strong></p>','<form><label for="newsletter-email-input">Or, send newsletter emails to:</label> <input type="text" id="newsletter-email-input" maxlength="100" title="your email address" /> <input type="submit" value="Subscribe" id="newsletter-email-submit" /></form></div>'].join(""));
|
||||
a.find("form").submit(function(){var b=$(this),c=$.trim(a.find("#newsletter-email-input").val());if(0==c.length)return!1;StackExchange.helpers.addSpinner(b);$.ajax({url:"/newsletter/signup/anon",type:"POST",dataType:"json",data:{email:c},success:function(a){"confirmed"==a.status&&!a.error?(b.find("#newsletter-email-input").attr("disabled",!0),b.find("#newsletter-email-submit").replaceWith('<span style="line-height: 120%; text-align: center;"><strong>Subscribed!</strong></span>'),$("#newsletter-signup-container").replaceWith('<div style="line-height: 200%; text-align: center;"><strong>Subscribed!</strong></div>')):
|
||||
"unconfirmed"==a.status&&!a.error?(b.find("#newsletter-email-input").attr("disabled",!0),b.find("#newsletter-email-submit").replaceWith('<span style="line-height: 120%; text-align: center;"><strong>Subscribed!</strong></span>'),b.append("<br /><br/><p><em>Please click the link in the confirmation email to activate your subscription.</em></p>"),$("#newsletter-signup-container").replaceWith('<span style="line-height: 120%;"><strong>Success!</strong> Please click the link in the confirmation email to activate your subscription.</span>')):
|
||||
b.showErrorPopup(a.error||"there was a problem signing up for the newsletter<br />please try again later")},error:function(){b.showErrorPopup("there was a problem signing up for the newsletter<br />please try again later")},complete:function(){StackExchange.helpers.removeSpinner(b)}});return!1});e(a)}return{init:function(){$("#newsletter-signup").click(function(){var b=$(this);if(StackExchange.options.user.isAnonymous)return c(),!1;StackExchange.helpers.addSpinner("#newsletter-signup-container");
|
||||
$.ajax({url:"/newsletter/signup",type:"POST",dataType:"json",success:function(a){a.url?window.location.href=a.url:"confirmed"==a.status?$("#newsletter-signup-container").replaceWith('<div style="line-height: 200%; text-align: center;"><strong>Subscribed!</strong></div>'):"unconfirmed"==a.status?$("#newsletter-signup-container").replaceWith('<span style="line-height: 120%;"><strong>Success!</strong> Please click the link in the confirmation email to activate your subscription.</span>'):b.parent().showErrorPopup("there was a problem signing up for the newsletter<br />please try again later")},
|
||||
error:function(){b.parent().showErrorPopup("there was a problem signing up for the newsletter<br />please try again later")},complete:function(){StackExchange.helpers.removeSpinner("#newsletter-signup-container")}})});$("#newsletter-preview").click(function(){var b=$(window).height(),b=Math.min(600,b-100),b=['<div id="newsleter-preview-pane" style="overflow: hidden; width: 660px; height: ',b,'px;"><iframe src="',$(this).attr("href"),'" width="660" height="',b,'" frameborder="0"></iframe></div>'].join("");
|
||||
e(b);return!1})},loader:function(b,a){var b=a||b,c=$(".newuser-greeting");$.ajax({url:"/newsletter/targetted/ajax",data:{domain:b},success:function(a){$("#newsletter-ad").remove();c.empty().append($(a))},complete:function(){c.attr("class","").attr("style","")}});a||(window.sessionStorage.tNewsletter=b+"-continued")}}}();
|
||||
(function(e,c,b,a){e.fn.caret=function(f,d){var h,j,i=this[0],k=e.browser.msie;"object"===typeof f&&"number"===typeof f.start&&"number"===typeof f.end?(h=f.start,j=f.end):"number"===typeof f&&"number"===typeof d?(h=f,j=d):"string"===typeof f?-1<(h=i.value.indexOf(f))?j=h+f[c]:h=null:"[object RegExp]"===Object.prototype.toString.call(f)&&(f=f.exec(i.value),null!=f&&(h=f.index,j=h+f[0][c]));if("undefined"!=typeof h)return k?(k=this[0].createTextRange(),k.collapse(!0),k.moveStart("character",h),k.moveEnd("character",
|
||||
j-h),k.select()):(this[0].selectionStart=h,this[0].selectionEnd=j),this[0].focus(),this;if(k)if(j=document.selection,"textarea"!=this[0].tagName.toLowerCase()){k=this.val();h=j[b]()[a]();h.moveEnd("character",k[c]);var g=""==h.text?k[c]:k.lastIndexOf(h.text);h=j[b]()[a]();h.moveStart("character",-k[c]);var l=h.text[c]}else h=j[b](),j=h[a](),j.moveToElementText(this[0]),j.setEndPoint("EndToEnd",h),g=j.text[c]-h.text[c],l=g+h.text[c];else g=i.selectionStart,l=i.selectionEnd;h=i.value.substring(g,l);
|
||||
return{start:g,end:l,text:h,replace:function(a){return i.value.substring(0,g)+a+i.value.substring(l,i.value[c])}}}})(jQuery,"length","createRange","duplicate");
|
||||
@@ -0,0 +1,61 @@
|
||||
(function(){var g=void 0,h=!0,i=null,k=!1,aa=encodeURIComponent,ba=Infinity,ea=setTimeout,fa=decodeURIComponent,l=Math;function ga(a,b){return a.name=b}
|
||||
var m="push",ha="slice",n="replace",ia="load",ja="floor",ka="charAt",la="value",p="indexOf",ma="match",na="port",oa="createElement",pa="path",q="name",t="host",u="toString",v="length",w="prototype",qa="clientWidth",x="split",ra="stopPropagation",ta="scope",y="location",ua="search",z="protocol",va="clientHeight",wa="href",A="substring",xa="apply",ya="navigator",B="join",C="toLowerCase",D;function za(a,b){switch(b){case 0:return""+a;case 1:return 1*a;case 2:return!!a;case 3:return 1E3*a}return a}function Aa(a){return"function"==typeof a}function Ba(a){return a!=g&&-1<(a.constructor+"")[p]("String")}function E(a,b){return g==a||"-"==a&&!b||""==a}function Ca(a){if(!a||""==a)return"";for(;a&&-1<" \n\r\t"[p](a[ka](0));)a=a[A](1);for(;a&&-1<" \n\r\t"[p](a[ka](a[v]-1));)a=a[A](0,a[v]-1);return a}
|
||||
function F(a){var b=1,c=0,d;if(!E(a)){b=0;for(d=a[v]-1;0<=d;d--)c=a.charCodeAt(d),b=(b<<6&268435455)+c+(c<<14),c=b&266338304,b=0!=c?b^c>>21:b}return b}function Da(){return l.round(2147483647*l.random())}function Ea(){}function G(a,b){if(aa instanceof Function)return b?encodeURI(a):aa(a);H(68);return escape(a)}function I(a){a=a[x]("+")[B](" ");if(fa instanceof Function)try{return fa(a)}catch(b){H(17)}else H(68);return unescape(a)}
|
||||
var Fa=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent&&a.attachEvent("on"+b,c)},Ga=function(a,b,c,d){a.removeEventListener?a.removeEventListener(b,c,!!d):a.detachEvent&&a.detachEvent("on"+b,c)};function Ha(a,b){if(a){var c=J[oa]("script");c.type="text/javascript";c.async=h;c.src=a;c.id=b;var d=J.getElementsByTagName("script")[0];d.parentNode.insertBefore(c,d);return c}}function K(a){return a&&0<a[v]?a[0]:""}function Ia(a){var b=a?a[v]:0;return 0<b?a[b-1]:""}
|
||||
var Ja=function(){this.prefix="ga.";this.R={}};Ja[w].set=function(a,b){this.R[this.prefix+a]=b};Ja[w].get=function(a){return this.R[this.prefix+a]};Ja[w].contains=function(a){return this.get(a)!==g};function Ka(a){0==a[p]("www.")&&(a=a[A](4));return a[C]()}function La(a,b){var c,d={url:a,protocol:"http",host:"",path:"",d:new Ja,anchor:""};if(!a)return d;c=a[p]("://");0<=c&&(d.protocol=a[A](0,c),a=a[A](c+3));c=a[ua]("/|\\?|#");if(0<=c)d.host=a[A](0,c)[C](),a=a[A](c);else return d.host=a[C](),d;c=a[p]("#");0<=c&&(d.anchor=a[A](c+1),a=a[A](0,c));c=a[p]("?");0<=c&&(Ma(d.d,a[A](c+1)),a=a[A](0,c));d.anchor&&b&&Ma(d.d,d.anchor);a&&"/"==a[ka](0)&&(a=a[A](1));d.path=a;return d}
|
||||
function Na(a,b){function c(a){var b=(a.hostname||"")[x](":")[0][C](),c=(a[z]||"")[C](),c=1*a[na]||("http:"==c?80:"https:"==c?443:""),a=a.pathname||"";0==a[p]("/")||(a="/"+a);return[b,""+c,a]}var d=b||J[oa]("a");d.href=J[y][wa];var e=(d[z]||"")[C](),f=c(d),j=d[ua]||"",o=e+"//"+f[0]+(f[1]?":"+f[1]:"");0==a[p]("//")?a=e+a:0==a[p]("/")?a=o+a:!a||0==a[p]("?")?a=o+f[2]+(a||j):0>a[x]("/")[0][p](":")&&(a=o+f[2][A](0,f[2].lastIndexOf("/"))+"/"+a);d.href=a;e=c(d);return{protocol:(d[z]||"")[C](),host:e[0],
|
||||
port:e[1],path:e[2],Ia:d[ua]||"",url:a||""}}function Ma(a,b){function c(b,c){a.contains(b)||a.set(b,[]);a.get(b)[m](c)}for(var d=Ca(b)[x]("&"),e=0;e<d[v];e++)if(d[e]){var f=d[e][p]("=");0>f?c(d[e],"1"):c(d[e][A](0,f),d[e][A](f+1))}}function Oa(a,b){if(E(a)||"["==a[ka](0)&&"]"==a[ka](a[v]-1))return"-";var c=J.domain;return a[p](c+(b&&"/"!=b?b:""))==(0==a[p]("http://")?7:0==a[p]("https://")?8:0)?"0":a};var Pa=0;function Ra(a,b,c){!(1<=Pa)&&!(1<=100*l.random())&&(a=["utmt=error","utmerr="+a,"utmwv=5.2.9","utmn="+Da(),"utmsp=1"],b&&a[m]("api="+b),c&&a[m]("msg="+G(c[A](0,100))),L.A&&a[m]("aip=1"),Sa(a[B]("&")),Pa++)};var Ta=0,Ua={};function M(a){return Va("x"+Ta++,a)}function Va(a,b){Ua[a]=!!b;return a}
|
||||
var N=M(),Wa=M(),Xa=M(),Ya=M(),Za=M(),O=M(),P=M(),$a=M(),ab=M(),bb=M(),cb=M(),db=M(),eb=M(),fb=M(),gb=M(),hb=M(),ib=M(),jb=M(),kb=M(),lb=M(),mb=M(),nb=M(),ob=M(),pb=M(),qb=M(),rb=M(),sb=M(),tb=M(),ub=M(),vb=M(),wb=M(),xb=M(),yb=M(),zb=M(),Ab=M(),Q=M(h),Bb=Va("page"),Cb=Va("title"),Db=M(),Eb=M(),Fb=M(),Gb=M(),Hb=M(),Ib=M(),Jb=M(),Kb=M(),Lb=M(),R=M(h),Mb=M(h),Nb=M(h),Qb=M(h),Rb=M(h),Sb=M(h),Tb=M(h),Ub=M(h),Vb=M(h),Wb=M(h),Xb=M(h),S=M(h),Yb=M(h),Zb=M(h),$b=M(h),ac=M(h),bc=M(h),cc=M(h),dc=M(h),ec=M(h),
|
||||
fc=M(h),gc=M(h),hc=M(h),ic=M(h),jc=M(h),kc=Va("campaignParams"),lc=M(),mc=Va("hitCallback"),nc=M();M();var oc=M(),pc=M(),qc=M(),rc=M(),sc=M(),tc=M(),uc=M(),vc=M(),wc=M(),xc=M(),yc=M(),Cc=M();M();var Dc=M(),Ec=M(),Fc=M();var Ic=function(){function a(a,c,d){T(U[w],a,c,d)}Gc("_getName",Xa,58);Gc("_getAccount",N,64);Gc("_visitCode",R,54);Gc("_getClientInfo",fb,53,1);Gc("_getDetectTitle",ib,56,1);Gc("_getDetectFlash",gb,65,1);Gc("_getLocalGifPath",sb,57);Gc("_getServiceMode",tb,59);V("_setClientInfo",fb,66,2);V("_setAccount",N,3);V("_setNamespace",Wa,48);V("_setAllowLinker",cb,11,2);V("_setDetectFlash",gb,61,2);V("_setDetectTitle",ib,62,2);V("_setLocalGifPath",sb,46,0);V("_setLocalServerMode",tb,92,g,0);V("_setRemoteServerMode",
|
||||
tb,63,g,1);V("_setLocalRemoteServerMode",tb,47,g,2);V("_setSampleRate",rb,45,1);V("_setCampaignTrack",hb,36,2);V("_setAllowAnchor",db,7,2);V("_setCampNameKey",kb,41);V("_setCampContentKey",pb,38);V("_setCampIdKey",jb,39);V("_setCampMediumKey",nb,40);V("_setCampNOKey",qb,42);V("_setCampSourceKey",mb,43);V("_setCampTermKey",ob,44);V("_setCampCIdKey",lb,37);V("_setCookiePath",P,9,0);V("_setMaxCustomVariables",ub,0,1);V("_setVisitorCookieTimeout",$a,28,1);V("_setSessionCookieTimeout",ab,26,1);V("_setCampaignCookieTimeout",
|
||||
bb,29,1);V("_setReferrerOverride",Db,49);V("_setSiteSpeedSampleRate",wc,132);a("_trackPageview",U[w].ya,1);a("_trackEvent",U[w].D,4);a("_trackPageLoadTime",U[w].xa,100);a("_trackSocial",U[w].za,104);a("_trackTrans",U[w].Ba,18);a("_sendXEvent",U[w].t,78);a("_createEventTracker",U[w].ea,74);a("_getVersion",U[w].ja,60);a("_setDomainName",U[w].C,6);a("_setAllowHash",U[w].oa,8);a("_getLinkerUrl",U[w].ia,52);a("_link",U[w].link,101);a("_linkByPost",U[w].na,102);a("_setTrans",U[w].sa,20);a("_addTrans",U[w].Y,
|
||||
21);a("_addItem",U[w].W,19);a("_setTransactionDelim",U[w].ta,82);a("_setCustomVar",U[w].pa,10);a("_deleteCustomVar",U[w].ga,35);a("_getVisitorCustomVar",U[w].ka,50);a("_setXKey",U[w].va,83);a("_setXValue",U[w].wa,84);a("_getXKey",U[w].la,76);a("_getXValue",U[w].ma,77);a("_clearXKey",U[w].ba,72);a("_clearXValue",U[w].ca,73);a("_createXObj",U[w].fa,75);a("_addIgnoredOrganic",U[w].U,15);a("_clearIgnoredOrganic",U[w].Z,97);a("_addIgnoredRef",U[w].V,31);a("_clearIgnoredRef",U[w].$,32);a("_addOrganic",
|
||||
U[w].X,14);a("_clearOrganic",U[w].aa,70);a("_cookiePathCopy",U[w].da,30);a("_get",U[w].ha,106);a("_set",U[w].qa,107);a("_addEventListener",U[w].addEventListener,108);a("_removeEventListener",U[w].removeEventListener,109);a("_addDevId",U[w].T);a("_getPlugin",Hc,122);a("_setPageGroup",U[w].ra,126);a("_trackTiming",U[w].Aa,124);a("_initData",U[w].u,2);a("_setVar",U[w].ua,22);V("_setSessionTimeout",ab,27,3);V("_setCookieTimeout",bb,25,3);V("_setCookiePersistence",$a,24,1);a("_setAutoTrackOutbound",Ea,
|
||||
79);a("_setTrackOutboundSubdomains",Ea,81);a("_setHrefExamineLimit",Ea,80)};function Hc(a){var b=this.plugins_;if(b)return b.get(a)}
|
||||
var T=function(a,b,c,d){a[b]=function(){try{return d!=g&&H(d),c[xa](this,arguments)}catch(a){throw Ra("exc",b,a&&a[q]),a;}}},Gc=function(a,b,c,d){U[w][a]=function(){try{return H(c),za(this.a.get(b),d)}catch(e){throw Ra("exc",a,e&&e[q]),e;}}},V=function(a,b,c,d,e){U[w][a]=function(f){try{H(c),e==g?this.a.set(b,za(f,d)):this.a.set(b,e)}catch(j){throw Ra("exc",a,j&&j[q]),j;}}},Jc=function(a,b){return{type:b,target:a,stopPropagation:function(){throw"aborted";}}};var Kc=function(a,b){return"/"!==b?k:(0==a[p]("www.google.")||0==a[p](".google.")||0==a[p]("google."))&&!(-1<a[p]("google.org"))?h:k},Lc=function(a){var b=a.get(Za),c=a.c(P,"/");Kc(b,c)&&a[ra]()};var Qc=function(){var a={},b={},c=new Mc;this.j=function(a,b){c.add(a,b)};var d=new Mc;this.e=function(a,b){d.add(a,b)};var e=k,f=k,j=h;this.S=function(){e=h};this.i=function(a){this[ia]();this.set(lc,a,h);a=new Nc(this);e=k;d.execute(this);e=h;b={};this.n();a.Ca()};this.load=function(){e&&(e=k,this.Da(),Oc(this),f||(f=h,c.execute(this),Pc(this),Oc(this)),e=h)};this.n=function(){if(e)if(f)e=k,Pc(this),e=h;else this[ia]()};this.get=function(c){Ua[c]&&this[ia]();return b[c]!==g?b[c]:a[c]};this.set=
|
||||
function(c,d,e){Ua[c]&&this[ia]();e?b[c]=d:a[c]=d;Ua[c]&&this.n()};this.v=function(b){a[b]=this.b(b,0)+1};this.b=function(a,b){var c=this.get(a);return c==g||""===c?b:1*c};this.c=function(a,b){var c=this.get(a);return c==g?b:c+""};this.Da=function(){if(j){var b=this.c(Za,""),c=this.c(P,"/");Kc(b,c)||(a[O]=a[eb]&&""!=b?F(b):1,j=k)}}};Qc[w].stopPropagation=function(){throw"aborted";};
|
||||
var Nc=function(a){var b=this;this.q=0;var c=a.get(mc);this.Sa=function(){0<b.q&&c&&(b.q--,b.q||c())};this.Ca=function(){!b.q&&c&&ea(c,10)};a.set(nc,b,h)};function Rc(a,b){for(var b=b||[],c=0;c<b[v];c++){var d=b[c];if(""+a==d||0==d[p](a+"."))return d}return"-"}
|
||||
var Tc=function(a,b,c){c=c?"":a.c(O,"1");b=b[x](".");if(6!==b[v]||Sc(b[0],c))return k;var c=1*b[1],d=1*b[2],e=1*b[3],f=1*b[4],b=1*b[5];if(!(0<=c&&0<d&&0<e&&0<f&&0<=b))return H(110),k;a.set(R,c);a.set(Rb,d);a.set(Sb,e);a.set(Tb,f);a.set(Ub,b);return h},Uc=function(a){var b=a.get(R),c=a.get(Rb),d=a.get(Sb),e=a.get(Tb),f=a.b(Ub,1);b==g?H(113):NaN==b&&H(114);0<=b&&0<c&&0<d&&0<e&&0<=f||H(115);return[a.b(O,1),b!=g?b:"-",c||"-",d||"-",e||"-",f][B](".")},Vc=function(a){return[a.b(O,1),a.b(Xb,0),a.b(S,1),
|
||||
a.b(Yb,0)][B](".")},Wc=function(a,b,c){var c=c?"":a.c(O,"1"),d=b[x](".");if(4!==d[v]||Sc(d[0],c))d=i;a.set(Xb,d?1*d[1]:0);a.set(S,d?1*d[2]:10);a.set(Yb,d?1*d[3]:a.get(Ya));return d!=i||!Sc(b,c)},Xc=function(a,b){var c=G(a.c(Nb,"")),d=[],e=a.get(Q);if(!b&&e){for(var f=0;f<e[v];f++){var j=e[f];j&&1==j[ta]&&d[m](f+"="+G(j[q])+"="+G(j[la])+"=1")}0<d[v]&&(c+="|"+d[B]("^"))}return c?a.b(O,1)+"."+c:i},Yc=function(a,b,c){c=c?"":a.c(O,"1");b=b[x](".");if(2>b[v]||Sc(b[0],c))return k;b=b[ha](1)[B](".")[x]("|");
|
||||
0<b[v]&&a.set(Nb,I(b[0]));if(1>=b[v])return h;b=b[1][x](-1==b[1][p](",")?"^":",");for(c=0;c<b[v];c++){var d=b[c][x]("=");if(4==d[v]){var e={};ga(e,I(d[1]));e.value=I(d[2]);e.scope=1;a.get(Q)[d[0]]=e}}return h},$c=function(a,b){var c=Zc(a,b);return c?[a.b(O,1),a.b(Zb,0),a.b($b,1),a.b(ac,1),c][B]("."):""},Zc=function(a){function b(b,e){if(!E(a.get(b))){var f=a.c(b,""),f=f[x](" ")[B]("%20"),f=f[x]("+")[B]("%20");c[m](e+"="+f)}}var c=[];b(cc,"utmcid");b(gc,"utmcsr");b(ec,"utmgclid");b(fc,"utmdclid");
|
||||
b(dc,"utmccn");b(hc,"utmcmd");b(ic,"utmctr");b(jc,"utmcct");return c[B]("|")},bd=function(a,b,c){c=c?"":a.c(O,"1");b=b[x](".");if(5>b[v]||Sc(b[0],c))return a.set(Zb,g),a.set($b,g),a.set(ac,g),a.set(cc,g),a.set(dc,g),a.set(gc,g),a.set(hc,g),a.set(ic,g),a.set(jc,g),a.set(ec,g),a.set(fc,g),k;a.set(Zb,1*b[1]);a.set($b,1*b[2]);a.set(ac,1*b[3]);ad(a,b[ha](4)[B]("."));return h},ad=function(a,b){function c(a){return(a=b[ma](a+"=(.*?)(?:\\|utm|$)"))&&2==a[v]?a[1]:g}function d(b,c){c&&(c=e?I(c):c[x]("%20")[B](" "),
|
||||
a.set(b,c))}-1==b[p]("=")&&(b=I(b));var e="2"==c("utmcvr");d(cc,c("utmcid"));d(dc,c("utmccn"));d(gc,c("utmcsr"));d(hc,c("utmcmd"));d(ic,c("utmctr"));d(jc,c("utmcct"));d(ec,c("utmgclid"));d(fc,c("utmdclid"))},Sc=function(a,b){return b?a!=b:!/^\d+$/.test(a)};var Mc=function(){this.B=[]};Mc[w].add=function(a,b){this.B[m]({name:a,r:b})};Mc[w].execute=function(a){try{for(var b=0;b<this.B[v];b++)this.B[b].r.call(W,a)}catch(c){}};function cd(a){100!=a.get(rb)&&a.get(R)%1E4>=100*a.get(rb)&&a[ra]()}function dd(a){ed(a.get(N))&&a[ra]()}function fd(a){"file:"==J[y][z]&&a[ra]()}function gd(a){a.get(Cb)||a.set(Cb,J.title,h);a.get(Bb)||a.set(Bb,J[y].pathname+J[y][ua],h)};var hd=new function(){var a=[];this.set=function(b){a[b]=h};this.Va=function(){for(var b=[],c=0;c<a[v];c++)a[c]&&(b[l[ja](c/6)]=b[l[ja](c/6)]^1<<c%6);for(c=0;c<b[v];c++)b[c]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"[ka](b[c]||0);return b[B]("")+"~"}};function H(a){hd.set(a)};var W=window,J=document,ed=function(a){var b=W._gaUserPrefs;return b&&b.ioo&&b.ioo()||!!a&&W["ga-disable-"+a]===h},id=function(a,b){ea(a,b)},jd=function(a){for(var b=[],c=J.cookie[x](";"),a=RegExp("^\\s*"+a+"=\\s*(.*?)\\s*$"),d=0;d<c[v];d++){var e=c[d][ma](a);e&&b[m](e[1])}return b},X=function(a,b,c,d,e,f){e=ed(e)?k:Kc(d,c)?k:h;if(e){if(b&&0<=W[ya].userAgent[p]("Firefox"))for(var b=b[n](/\n|\r/g," "),e=0,j=b[v];e<j;++e){var o=b.charCodeAt(e)&255;if(10==o||13==o)b=b[A](0,e)+"?"+b[A](e+1)}b&&2E3<b[v]&&
|
||||
(b=b[A](0,2E3),H(69));a=a+"="+b+"; path="+c+"; ";f&&(a+="expires="+(new Date((new Date).getTime()+f)).toGMTString()+"; ");d&&(a+="domain="+d+";");J.cookie=a}};var kd,ld,md=function(){if(!kd){var a={},b=W[ya],c=W.screen;a.Q=c?c.width+"x"+c.height:"-";a.P=c?c.colorDepth+"-bit":"-";a.language=(b&&(b.language||b.browserLanguage)||"-")[C]();a.javaEnabled=b&&b.javaEnabled()?1:0;a.characterSet=J.characterSet||J.charset||"-";try{var d=J.documentElement,e=J.body,f=e&&e[qa]&&e[va],b=[];d&&(d[qa]&&d[va])&&("CSS1Compat"===J.compatMode||!f)?b=[d[qa],d[va]]:f&&(b=[e[qa],e[va]]);a.Ua=b[B]("x")}catch(j){H(135)}kd=a}},nd=function(){md();for(var a=kd,b=W[ya],a=b.appName+
|
||||
b.version+a.language+b.platform+b.userAgent+a.javaEnabled+a.Q+a.P+(J.cookie?J.cookie:"")+(J.referrer?J.referrer:""),b=a[v],c=W.history[v];0<c;)a+=c--^b++;return F(a)},od=function(a){md();var b=kd;a.set(Fb,b.Q);a.set(Gb,b.P);a.set(Jb,b.language);a.set(Kb,b.characterSet);a.set(Hb,b.javaEnabled);a.set(Lb,b.Ua);if(a.get(fb)&&a.get(gb)){if(!(b=ld)){var c,d,e;d="ShockwaveFlash";if((b=(b=W[ya])?b.plugins:g)&&0<b[v])for(c=0;c<b[v]&&!e;c++)d=b[c],-1<d[q][p]("Shockwave Flash")&&(e=d.description[x]("Shockwave Flash ")[1]);
|
||||
else{d=d+"."+d;try{c=new ActiveXObject(d+".7"),e=c.GetVariable("$version")}catch(f){}if(!e)try{c=new ActiveXObject(d+".6"),e="WIN 6,0,21,0",c.AllowScriptAccess="always",e=c.GetVariable("$version")}catch(j){}if(!e)try{c=new ActiveXObject(d),e=c.GetVariable("$version")}catch(o){}e&&(e=e[x](" ")[1][x](","),e=e[0]+"."+e[1]+" r"+e[2])}b=e?e:"-"}ld=b;a.set(Ib,ld)}else a.set(Ib,"-")};var pd=function(a){if(Aa(a))this.r=a;else{var b=a[0],c=b.lastIndexOf(":"),d=b.lastIndexOf(".");this.g=this.h=this.l="";-1==c&&-1==d?this.g=b:-1==c&&-1!=d?(this.h=b[A](0,d),this.g=b[A](d+1)):-1!=c&&-1==d?(this.l=b[A](0,c),this.g=b[A](c+1)):c>d?(this.h=b[A](0,d),this.l=b[A](d+1,c),this.g=b[A](c+1)):(this.h=b[A](0,d),this.g=b[A](d+1));this.k=a[ha](1);this.Fa=!this.l&&"_require"==this.g;this.H=!this.h&&!this.l&&"_provide"==this.g}},Y=function(){T(Y[w],"push",Y[w][m],5);T(Y[w],"_getPlugin",Hc,121);T(Y[w],
|
||||
"_createAsyncTracker",Y[w].Qa,33);T(Y[w],"_getAsyncTracker",Y[w].Ra,34);this.G=new Ja;this.p=[]};D=Y[w];D.Ha=function(a,b,c){var d=this.G.get(a);if(!Aa(d))return k;b.plugins_=b.plugins_||new Ja;b.plugins_.set(a,new d(b,c||{}));return h};D.push=function(a){var b=Z.Ta[xa](this,arguments),b=Z.p.concat(b);for(Z.p=[];0<b[v]&&!Z.O(b[0])&&!(b.shift(),0<Z.p[v]););Z.p=Z.p.concat(b);return 0};D.Ta=function(a){for(var b=[],c=0;c<arguments[v];c++)try{var d=new pd(arguments[c]);d.H?this.O(d):b[m](d)}catch(e){}return b};
|
||||
D.O=function(a){try{if(a.r)a.r[xa](W);else if(a.H)this.G.set(a.k[0],a.k[1]);else{var b="_gat"==a.h?L:"_gaq"==a.h?Z:L.w(a.h);if(a.Fa){if(!this.Ha(a.k[0],b,a.k[2])){if(!a.Ja){var c=Na(""+a.k[1]);var d=c[z],e=J[y][z];var f;if(f="https:"==d||d==e?h:"http:"!=d?k:"http:"==e){var j;a:{var o=Na(J[y][wa]);if(!(c.Ia||0<=c.url[p]("?")||0<=c[pa][p]("://")||c[t]==o[t]&&c[na]==o[na]))for(var r="http:"==c[z]?80:443,s=L.Ea,b=0;b<s[v];b++)if(c[t]==s[b][0]&&(c[na]||r)==(s[b][1]||r)&&0==c[pa][p](s[b][2])){j=h;break a}j=
|
||||
k}f=j&&!ed()}f&&(a.Ja=Ha(c.url))}return h}}else a.l&&(b=b.plugins_.get(a.l)),b[a.g][xa](b,a.k)}}catch(Qa){}};D.Qa=function(a,b){return L.s(a,b||"")};D.Ra=function(a){return L.w(a)};var td=function(){function a(a,b,c,d){g==f[a]&&(f[a]={});g==f[a][b]&&(f[a][b]=[]);f[a][b][c]=d}function b(a,b,c){if(g!=f[a]&&g!=f[a][b])return f[a][b][c]}function c(a,b){if(g!=f[a]&&g!=f[a][b]){f[a][b]=g;var c=h,d;for(d=0;d<j[v];d++)if(g!=f[a][j[d]]){c=k;break}c&&(f[a]=g)}}function d(a){var b="",c=k,d,e;for(d=0;d<j[v];d++)if(e=a[j[d]],g!=e){c&&(b+=j[d]);for(var c=[],f=g,da=g,da=0;da<e[v];da++)if(g!=e[da]){f="";da!=Ob&&g==e[da-1]&&(f+=da[u]()+Qa);for(var sd=e[da],zc="",Pb=g,Ac=g,Bc=g,Pb=0;Pb<sd[v];Pb++)Ac=
|
||||
sd[ka](Pb),Bc=sa[Ac],zc+=g!=Bc?Bc:Ac;f+=zc;c[m](f)}b+=o+c[B](s)+r;c=k}else c=h;return b}var e=this,f=[],j=["k","v"],o="(",r=")",s="*",Qa="!",sa={"'":"'0"};sa[r]="'1";sa[s]="'2";sa[Qa]="'3";var Ob=1;e.La=function(a){return g!=f[a]};e.z=function(){for(var a="",b=0;b<f[v];b++)g!=f[b]&&(a+=b[u]()+d(f[b]));return a};e.Ka=function(a){if(a==g)return e.z();for(var b=a.z(),c=0;c<f[v];c++)g!=f[c]&&!a.La(c)&&(b+=c[u]()+d(f[c]));return b};e.f=function(b,c,d){if(!qd(d))return k;a(b,"k",c,d);return h};e.o=function(b,
|
||||
c,d){if(!rd(d))return k;a(b,"v",c,d[u]());return h};e.getKey=function(a,c){return b(a,"k",c)};e.L=function(a,c){return b(a,"v",c)};e.J=function(a){c(a,"k")};e.K=function(a){c(a,"v")};T(e,"_setKey",e.f,89);T(e,"_setValue",e.o,90);T(e,"_getKey",e.getKey,87);T(e,"_getValue",e.L,88);T(e,"_clearKey",e.J,85);T(e,"_clearValue",e.K,86)};function qd(a){return"string"==typeof a}function rd(a){return"number"!=typeof a&&(g==Number||!(a instanceof Number))||l.round(a)!=a||NaN==a||a==ba?k:h};var ud=function(a){var b=W.gaGlobal;a&&!b&&(W.gaGlobal=b={});return b},vd=function(){var a=ud(h).hid;a==i&&(a=Da(),ud(h).hid=a);return a},wd=function(a){a.set(Eb,vd());var b=ud();if(b&&b.dh==a.get(O)){var c=b.sid;c&&("0"==c&&H(112),a.set(Tb,c),a.get(Mb)&&a.set(Sb,c));b=b.vid;a.get(Mb)&&b&&(b=b[x]("."),1*b[1]||H(112),a.set(R,1*b[0]),a.set(Rb,1*b[1]))}};var xd,yd=function(a,b,c){var d=a.c(Za,""),e=a.c(P,"/"),f=a.b($a,0),a=a.c(N,"");X(b,c,e,d,a,f)},Pc=function(a){var b=a.c(Za,"");a.b(O,1);var c=a.c(P,"/"),d=a.c(N,"");X("__utma",Uc(a),c,b,d,a.get($a));X("__utmb",Vc(a),c,b,d,a.get(ab));X("__utmc",""+a.b(O,1),c,b,d);var e=$c(a,h);e?X("__utmz",e,c,b,d,a.get(bb)):X("__utmz","",c,b,"",-1);(e=Xc(a,k))?X("__utmv",e,c,b,d,a.get($a)):X("__utmv","",c,b,"",-1)},Oc=function(a){var b=a.b(O,1);if(!Tc(a,Rc(b,jd("__utma"))))return a.set(Qb,h),k;var c=!Wc(a,Rc(b,jd("__utmb")));
|
||||
a.set(Wb,c);bd(a,Rc(b,jd("__utmz")));Yc(a,Rc(b,jd("__utmv")));xd=!c;return h},zd=function(a){!xd&&!(0<jd("__utmb")[v])&&(X("__utmd","1",a.c(P,"/"),a.c(Za,""),a.c(N,""),1E4),0==jd("__utmd")[v]&&a[ra]())};var Cd=function(a){a.get(R)==g?Ad(a):a.get(Qb)&&!a.get(Dc)?Ad(a):a.get(Wb)&&Bd(a)},Dd=function(a){a.get(bc)&&!a.get(Vb)&&(Bd(a),a.set($b,a.get(Ub)))},Ad=function(a){var b=a.get(Ya);a.set(Mb,h);a.set(R,Da()^nd(a)&2147483647);a.set(Nb,"");a.set(Rb,b);a.set(Sb,b);a.set(Tb,b);a.set(Ub,1);a.set(Vb,h);a.set(Xb,0);a.set(S,10);a.set(Yb,b);a.set(Q,[]);a.set(Qb,k);a.set(Wb,k)},Bd=function(a){a.set(Sb,a.get(Tb));a.set(Tb,a.get(Ya));a.v(Ub);a.set(Vb,h);a.set(Xb,0);a.set(S,10);a.set(Yb,a.get(Ya));a.set(Wb,k)};var Ed="daum:q,eniro:search_word,naver:query,pchome:q,images.google:q,google:q,yahoo:p,yahoo:q,msn:q,bing:q,aol:query,aol:q,lycos:q,lycos:query,ask:q,netscape:query,cnn:query,about:terms,mamma:q,voila:rdata,virgilio:qs,live:q,baidu:wd,alice:qs,yandex:text,najdi:q,seznam:q,rakuten:qt,biglobe:q,goo.ne:MT,wp:szukaj,onet:qt,yam:k,kvasir:q,ozu:q,terra:query,rambler:query,conduit:q,babylon:q,search-results:q,avg:q,comcast:q,incredimail:q,startsiden:q".split(","),Kd=function(a){if(a.get(hb)&&!a.get(Dc)){for(var b=
|
||||
!E(a.get(cc))||!E(a.get(gc))||!E(a.get(ec))||!E(a.get(fc)),c={},d=0;d<Fd[v];d++){var e=Fd[d];c[e]=a.get(e)}(d=a.get(kc))?(H(149),e=new Ja,Ma(e,d),d=e):d=La(J[y][wa],a.get(db)).d;if(!("1"==Ia(d.get(a.get(qb)))&&b)&&(d=Gd(a,d)||Hd(a),!d&&(!b&&a.get(Vb))&&(Id(a,g,"(direct)",g,g,"(direct)","(none)",g,g),d=h),d))if(a.set(bc,Jd(a,c)),b="(direct)"==a.get(gc)&&"(direct)"==a.get(dc)&&"(none)"==a.get(hc),a.get(bc)||a.get(Vb)&&!b)a.set(Zb,a.get(Ya)),a.set($b,a.get(Ub)),a.v(ac)}},Gd=function(a,b){function c(c,
|
||||
d){var d=d||"-",e=Ia(b.get(a.get(c)));return e&&"-"!=e?I(e):d}var d=Ia(b.get(a.get(jb)))||"-",e=Ia(b.get(a.get(mb)))||"-",f=Ia(b.get(a.get(lb)))||"-",j=Ia(b.get("dclid"))||"-",o=c(kb,"(not set)"),r=c(nb,"(not set)"),s=c(ob),Qa=c(pb);if(E(d)&&E(f)&&E(j)&&E(e))return k;var sa=!E(j)&&E(e),Ob=E(s);if(sa||Ob){var ca=Ld(a),ca=La(ca,h);if((ca=Md(a,ca))&&!E(ca[1]&&!ca[2]))sa&&(e=ca[0]),Ob&&(s=ca[1])}Id(a,d,e,f,j,o,r,s,Qa);return h},Hd=function(a){var b=Ld(a),c=La(b,h);if(!(b!=g&&b!=i&&""!=b&&"0"!=b&&"-"!=
|
||||
b&&0<=b[p]("://"))||c&&-1<c[t][p]("google")&&c.d.contains("q")&&"cse"==c[pa])return k;if((b=Md(a,c))&&!b[2])return Id(a,g,b[0],g,g,"(organic)","organic",b[1],g),h;if(b||!a.get(Vb))return k;a:{for(var b=a.get(xb),d=Ka(c[t]),e=0;e<b[v];++e)if(-1<d[p](b[e])){a=k;break a}Id(a,g,d,g,g,"(referral)","referral",g,"/"+c[pa]);a=h}return a},Md=function(a,b){for(var c=a.get(vb),d=0;d<c[v];++d){var e=c[d][x](":");if(-1<b[t][p](e[0][C]())){var f=b.d.get(e[1]);if(f&&(f=K(f),!f&&-1<b[t][p]("google.")&&(f="(not provided)"),
|
||||
!e[3]||-1<b.url[p](e[3]))){a:{for(var c=f,d=a.get(wb),c=I(c)[C](),j=0;j<d[v];++j)if(c==d[j]){c=h;break a}c=k}return[e[2]||e[0],f,c]}}}return i},Id=function(a,b,c,d,e,f,j,o,r){a.set(cc,b);a.set(gc,c);a.set(ec,d);a.set(fc,e);a.set(dc,f);a.set(hc,j);a.set(ic,o);a.set(jc,r)},Fd=[dc,cc,ec,fc,gc,hc,ic,jc],Jd=function(a,b){function c(a){a=(""+a)[x]("+")[B]("%20");return a=a[x](" ")[B]("%20")}function d(c){var d=""+(a.get(c)||""),c=""+(b[c]||"");return 0<d[v]&&d==c}if(d(ec)||d(fc))return H(131),k;for(var e=
|
||||
0;e<Fd[v];e++){var f=Fd[e],j=b[f]||"-",f=a.get(f)||"-";if(c(j)!=c(f))return h}return k},Nd=RegExp(/^https:\/\/(www\.)?google(\.com?)?(\.[a-z]{2}t?)?\/?$/i),Ld=function(a){a=Oa(a.get(Db),a.get(P));try{if(Nd.test(a))return H(136),a+"?q="}catch(b){H(145)}return a};var Pd=function(a){Od(a,J[y][wa])?(a.set(Dc,h),H(12)):a.set(Dc,k)},Od=function(a,b){if(!a.get(cb))return k;var c=La(b,a.get(db)),d=K(c.d.get("__utma")),e=K(c.d.get("__utmb")),f=K(c.d.get("__utmc")),j=K(c.d.get("__utmx")),o=K(c.d.get("__utmz")),r=K(c.d.get("__utmv")),c=K(c.d.get("__utmk"));if(F(""+d+e+f+j+o+r)!=c){d=I(d);e=I(e);f=I(f);j=I(j);f=Qd(d+e+f+j,o,r,c);if(!f)return k;o=f[0];r=f[1]}if(!Tc(a,d,h))return k;Wc(a,e,h);bd(a,o,h);Yc(a,r,h);Rd(a,j,h);return h},Td=function(a,b,c){var d;d=Uc(a)||"-";
|
||||
var e=Vc(a)||"-",f=""+a.b(O,1)||"-",j=Sd(a)||"-",o=$c(a,k)||"-",a=Xc(a,k)||"-",r=F(""+d+e+f+j+o+a),s=[];s[m]("__utma="+d);s[m]("__utmb="+e);s[m]("__utmc="+f);s[m]("__utmx="+j);s[m]("__utmz="+o);s[m]("__utmv="+a);s[m]("__utmk="+r);d=s[B]("&");if(!d)return b;e=b[p]("#");if(c)return 0>e?b+"#"+d:b+"&"+d;c="";f=b[p]("?");0<e&&(c=b[A](e),b=b[A](0,e));return 0>f?b+"?"+d+c:b+"&"+d+c},Qd=function(a,b,c,d){for(var e=0;3>e;e++){for(var f=0;3>f;f++){if(d==F(a+b+c))return H(127),[b,c];var j=b[n](/ /g,"%20"),o=
|
||||
c[n](/ /g,"%20");if(d==F(a+j+o))return H(128),[j,o];j=j[n](/\+/g,"%20");o=o[n](/\+/g,"%20");if(d==F(a+j+o))return H(129),[j,o];try{var r=b[ma]("utmctr=(.*?)(?:\\|utm|$)");if(r&&2==r[v]&&(j=b[n](r[1],G(I(r[1]))),d==F(a+j+c)))return H(139),[j,c]}catch(s){}b=I(b)}c=I(c)}};var Ud="|",Wd=function(a,b,c,d,e,f,j,o,r){var s=Vd(a,b);s||(s={},a.get(yb)[m](s));s.id_=b;s.affiliation_=c;s.total_=d;s.tax_=e;s.shipping_=f;s.city_=j;s.state_=o;s.country_=r;s.items_=s.items_||[];return s},Xd=function(a,b,c,d,e,f,j){var a=Vd(a,b)||Wd(a,b,"",0,0,0,"","",""),o;a:{if(a&&a.items_){o=a.items_;for(var r=0;r<o[v];r++)if(o[r].sku_==c){o=o[r];break a}}o=i}r=o||{};r.transId_=b;r.sku_=c;r.name_=d;r.category_=e;r.price_=f;r.quantity_=j;o||a.items_[m](r);return r},Vd=function(a,b){for(var c=
|
||||
a.get(yb),d=0;d<c[v];d++)if(c[d].id_==b)return c[d];return i};var Yd,Zd=function(a){if(!Yd){var b;b=J[y].hash;var c=W[q],d=/^#?gaso=([^&]*)/;if(c=(b=(b=b&&b[ma](d)||c&&c[ma](d))?b[1]:K(jd("GASO")))&&b[ma](/^(?:[|!]([-0-9a-z.]{1,40})[|!])?([-.\w]{10,1200})$/i))yd(a,"GASO",""+b),L._gasoDomain=a.get(Za),L._gasoCPath=a.get(P),a=c[1],Ha("https://www.google.com/analytics/web/inpage/pub/inpage.js?"+(a?"prefix="+a+"&":"")+Da(),"_gasojs");Yd=h}};var Rd=function(a,b,c){c&&(b=I(b));c=a.b(O,1);b=b[x](".");!(2>b[v])&&/^\d+$/.test(b[0])&&(b[0]=""+c,yd(a,"__utmx",b[B](".")))},Sd=function(a,b){var c=Rc(a.get(O),jd("__utmx"));"-"==c&&(c="");return b?G(c):c},$d=function(a){try{var b=La(J[y][wa],k),c=fa(Ia(b.d.get("utm_referrer")))||"";c&&a.set(Db,c);var d=fa(K(b.d.get("utm_expid")));d&&a.set(Fc,d)}catch(e){H(146)}};var ee=function(a,b){var c=l.min(a.b(wc,0),100);if(a.b(R,0)%100>=c)return k;c=ae()||be();if(c==g)return k;var d=c[0];if(d==g||d==ba||isNaN(d))return k;0<d?ce(c)?b(de(c)):b(de(c[ha](0,1))):Fa(W,"load",function(){ee(a,b)},k);return h},ge=function(a,b,c,d){var e=new td;e.f(14,90,b[A](0,64));e.f(14,91,a[A](0,64));e.f(14,92,""+fe(c));d!=g&&e.f(14,93,d[A](0,64));e.o(14,90,c);return e},ce=function(a){for(var b=1;b<a[v];b++)if(isNaN(a[b])||a[b]==ba||0>a[b])return k;return h},fe=function(a){return isNaN(a)||
|
||||
0>a?0:5E3>a?10*l[ja](a/10):5E4>a?100*l[ja](a/100):41E5>a?1E3*l[ja](a/1E3):41E5},de=function(a){for(var b=new td,c=0;c<a[v];c++)b.f(14,c+1,""+fe(a[c])),b.o(14,c+1,a[c]);return b},ae=function(){var a=W.performance||W.webkitPerformance;if(a=a&&a.timing){var b=a.navigationStart;if(0==b)H(133);else return[a.loadEventStart-b,a.domainLookupEnd-a.domainLookupStart,a.connectEnd-a.connectStart,a.responseStart-a.requestStart,a.responseEnd-a.responseStart,a.fetchStart-b]}},be=function(){if(W.top==W){var a=W.external,
|
||||
b=a&&a.onloadT;a&&!a.isValidLoadTime&&(b=g);2147483648<b&&(b=g);0<b&&a.setPageReadyTime();return b==g?g:[b]}};var U=function(a,b,c){function d(a){return function(b){if((b=b.get(Ec)[a])&&b[v])for(var c=Jc(e,a),d=0;d<b[v];d++)b[d].call(e,c)}}var e=this;this.a=new Qc;this.get=function(a){return this.a.get(a)};this.set=function(a,b,c){this.a.set(a,b,c)};this.set(N,b||"UA-XXXXX-X");this.set(Xa,a||"");this.set(Wa,c||"");this.set(Ya,l.round((new Date).getTime()/1E3));this.set(P,"/");this.set($a,63072E6);this.set(bb,15768E6);this.set(ab,18E5);this.set(cb,k);this.set(ub,50);this.set(db,k);this.set(eb,h);this.set(fb,
|
||||
h);this.set(gb,h);this.set(hb,h);this.set(ib,h);this.set(kb,"utm_campaign");this.set(jb,"utm_id");this.set(lb,"gclid");this.set(mb,"utm_source");this.set(nb,"utm_medium");this.set(ob,"utm_term");this.set(pb,"utm_content");this.set(qb,"utm_nooverride");this.set(rb,100);this.set(wc,1);this.set(xc,k);this.set(sb,"/__utm.gif");this.set(tb,1);this.set(yb,[]);this.set(Q,[]);this.set(vb,Ed[ha](0));this.set(wb,[]);this.set(xb,[]);this.C("auto");this.set(Db,J.referrer);$d(this.a);this.set(Ec,{hit:[],load:[]});
|
||||
this.a.j("0",Pd);this.a.j("1",Cd);this.a.j("2",Kd);this.a.j("3",Dd);this.a.j("4",d("load"));this.a.j("5",Zd);this.a.e("A",dd);this.a.e("B",fd);this.a.e("C",Cd);this.a.e("D",cd);this.a.e("E",Lc);this.a.e("F",he);this.a.e("G",zd);this.a.e("H",gd);this.a.e("I",od);this.a.e("J",wd);this.a.e("K",d("hit"));this.a.e("L",ie);this.a.e("M",je);0===this.get(Ya)&&H(111);this.a.S();this.F=g};D=U[w];D.m=function(){var a=this.get(zb);a||(a=new td,this.set(zb,a));return a};
|
||||
D.Ga=function(a){for(var b in a){var c=a[b];a.hasOwnProperty(b)&&this.set(b,c,h)}};D.I=function(a){if(this.get(xc))return k;var b=this,c=ee(this.a,function(c){b.set(Bb,a,h);b.t(c)});this.set(xc,c);return c};D.ya=function(a){a&&Ba(a)?(H(13),this.set(Bb,a,h)):"object"===typeof a&&a!==i&&this.Ga(a);this.F=a=this.get(Bb);this.a.i("page");this.I(a)};
|
||||
D.D=function(a,b,c,d,e){if(""==a||(!qd(a)||""==b||!qd(b))||c!=g&&!qd(c)||d!=g&&!rd(d))return k;this.set(pc,a,h);this.set(qc,b,h);this.set(rc,c,h);this.set(sc,d,h);this.set(oc,!!e,h);this.a.i("event");return h};D.Aa=function(a,b,c,d,e){var f=this.a.b(wc,0);1*e===e&&(f=e);if(this.a.b(R,0)%100>=f)return k;c=1*(""+c);if(""==a||(!qd(a)||""==b||!qd(b)||!rd(c)||isNaN(c)||0>c||0>f||100<f)||d!=g&&(""==d||!qd(d)))return k;this.t(ge(a,b,c,d));return h};
|
||||
D.za=function(a,b,c,d){if(!a||!b)return k;this.set(tc,a,h);this.set(uc,b,h);this.set(vc,c||J[y][wa],h);d&&this.set(Bb,d,h);this.a.i("social");return h};D.xa=function(){this.set(wc,10);this.I(this.F)};D.Ba=function(){this.a.i("trans")};D.t=function(a){this.set(Ab,a,h);this.a.i("event")};D.ea=function(a){this.u();var b=this;return{_trackEvent:function(c,d,e){H(91);b.D(a,c,d,e)}}};D.ha=function(a){return this.get(a)};
|
||||
D.qa=function(a,b){if(a)if(Ba(a))this.set(a,b);else if("object"==typeof a)for(var c in a)a.hasOwnProperty(c)&&this.set(c,a[c])};D.addEventListener=function(a,b){var c=this.get(Ec)[a];c&&c[m](b)};D.removeEventListener=function(a,b){for(var c=this.get(Ec)[a],d=0;c&&d<c[v];d++)if(c[d]==b){c.splice(d,1);break}};D.ja=function(){return"5.2.9"};D.C=function(a){this.get(eb);a="auto"==a?Ka(J.domain):!a||"-"==a||"none"==a?"":a[C]();this.set(Za,a)};D.oa=function(a){this.set(eb,!!a)};
|
||||
D.ia=function(a,b){return Td(this.a,a,b)};D.link=function(a,b){if(this.a.get(cb)&&a){var c=Td(this.a,a,b);J[y].href=c}};D.na=function(a,b){this.a.get(cb)&&(a&&a.action)&&(a.action=Td(this.a,a.action,b))};
|
||||
D.sa=function(){this.u();var a=this.a,b=J.getElementById?J.getElementById("utmtrans"):J.utmform&&J.utmform.utmtrans?J.utmform.utmtrans:i;if(b&&b[la]){a.set(yb,[]);for(var b=b[la][x]("UTM:"),c=0;c<b[v];c++){b[c]=Ca(b[c]);for(var d=b[c][x](Ud),e=0;e<d[v];e++)d[e]=Ca(d[e]);"T"==d[0]?Wd(a,d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8]):"I"==d[0]&&Xd(a,d[1],d[2],d[3],d[4],d[5],d[6])}}};D.Y=function(a,b,c,d,e,f,j,o){return Wd(this.a,a,b,c,d,e,f,j,o)};D.W=function(a,b,c,d,e,f){return Xd(this.a,a,b,c,d,e,f)};
|
||||
D.ta=function(a){Ud=a||"|"};D.pa=function(a,b,c,d){var e=this.a;if(0>=a||a>e.get(ub))a=k;else if(!b||!c||128<b[v]+c[v])a=k;else{1!=d&&2!=d&&(d=3);var f={};ga(f,b);f.value=c;f.scope=d;e.get(Q)[a]=f;a=h}a&&this.a.n();return a};D.ga=function(a){this.a.get(Q)[a]=g;this.a.n()};D.ka=function(a){return(a=this.a.get(Q)[a])&&1==a[ta]?a[la]:g};D.va=function(a,b,c){this.m().f(a,b,c)};D.wa=function(a,b,c){this.m().o(a,b,c)};D.la=function(a,b){return this.m().getKey(a,b)};
|
||||
D.ma=function(a,b){return this.m().L(a,b)};D.ba=function(a){this.m().J(a)};D.ca=function(a){this.m().K(a)};D.fa=function(){return new td};D.U=function(a){a&&this.get(wb)[m](a[C]())};D.Z=function(){this.set(wb,[])};D.V=function(a){a&&this.get(xb)[m](a[C]())};D.$=function(){this.set(xb,[])};D.X=function(a,b,c,d,e){if(a&&b){a=[a,b[C]()][B](":");if(d||e)a=[a,d,e][B](":");d=this.get(vb);d.splice(c?0:d[v],0,a)}};D.aa=function(){this.set(vb,[])};
|
||||
D.da=function(a){this.a[ia]();var b=this.get(P),c=Sd(this.a);this.set(P,a);this.a.n();Rd(this.a,c);this.set(P,b)};D.ra=function(a,b){if(0<a&&5>=a&&Ba(b)&&""!=b){var c=this.get(yc)||[];c[a]=b;this.set(yc,c)}};D.T=function(a){a=""+a;if(a[ma](/^[A-Za-z0-9]{1,5}$/)){var b=this.get(Cc)||[];b[m](a);this.set(Cc,b)}};D.u=function(){this.a[ia]()};D.ua=function(a){a&&""!=a&&(this.set(Nb,a),this.a.i("var"))};var he=function(a){"trans"!==a.get(lc)&&500<=a.b(Xb,0)&&a[ra]();if("event"===a.get(lc)){var b=(new Date).getTime(),c=a.b(Yb,0),d=a.b(Tb,0),c=l[ja](1*((b-(c!=d?c:1E3*c))/1E3));0<c&&(a.set(Yb,b),a.set(S,l.min(10,a.b(S,0)+c)));0>=a.b(S,0)&&a[ra]()}},je=function(a){"event"===a.get(lc)&&a.set(S,l.max(0,a.b(S,10)-1))};var ke=function(){var a=[];this.add=function(b,c,d){d&&(c=G(""+c));a[m](b+"="+c)};this.toString=function(){return a[B]("&")}},le=function(a,b){(b||2!=a.get(tb))&&a.v(Xb)},me=function(a,b){b.add("utmwv","5.2.9");b.add("utms",a.get(Xb));b.add("utmn",Da());var c=J[y].hostname;E(c)||b.add("utmhn",c,h);c=a.get(rb);100!=c&&b.add("utmsp",c,h)},oe=function(a,b){b.add("utmac",Ca(a.get(N)));a.get(Fc)&&b.add("utmxkey",a.get(Fc),h);a.get(oc)&&b.add("utmni",1);var c=a.get(Cc);c&&0<c[v]&&b.add("utmdid",c[B]("."));
|
||||
ne(a,b);L.A&&b.add("aip",1);b.add("utmu",hd.Va())},pe=function(a,b){for(var c=a.get(yc)||[],d=[],e=1;e<c[v];e++)c[e]&&d[m](e+":"+G(c[e][n](/%/g,"%25")[n](/:/g,"%3A")[n](/,/g,"%2C")));d[v]&&b.add("utmpg",d[B](","))},ne=function(a,b){function c(a,b){b&&d[m](a+"="+b+";")}var d=[];c("__utma",Uc(a));c("__utmz",$c(a,k));c("__utmv",Xc(a,h));c("__utmx",Sd(a));b.add("utmcc",d[B]("+"),h)},qe=function(a,b){a.get(fb)&&(b.add("utmcs",a.get(Kb),h),b.add("utmsr",a.get(Fb)),a.get(Lb)&&b.add("utmvp",a.get(Lb)),b.add("utmsc",
|
||||
a.get(Gb)),b.add("utmul",a.get(Jb)),b.add("utmje",a.get(Hb)),b.add("utmfl",a.get(Ib),h))},re=function(a,b){a.get(ib)&&a.get(Cb)&&b.add("utmdt",a.get(Cb),h);b.add("utmhid",a.get(Eb));b.add("utmr",Oa(a.get(Db),a.get(P)),h);b.add("utmp",G(a.get(Bb),h),h)},se=function(a,b){for(var c=a.get(zb),d=a.get(Ab),e=a.get(Q)||[],f=0;f<e[v];f++){var j=e[f];j&&(c||(c=new td),c.f(8,f,j[q]),c.f(9,f,j[la]),3!=j[ta]&&c.f(11,f,""+j[ta]))}!E(a.get(pc))&&!E(a.get(qc),h)&&(c||(c=new td),c.f(5,1,a.get(pc)),c.f(5,2,a.get(qc)),
|
||||
e=a.get(rc),e!=g&&c.f(5,3,e),e=a.get(sc),e!=g&&c.o(5,1,e));c?b.add("utme",c.Ka(d),h):d&&b.add("utme",d.z(),h)},te=function(a,b,c){var d=new ke;le(a,c);me(a,d);d.add("utmt","tran");d.add("utmtid",b.id_,h);d.add("utmtst",b.affiliation_,h);d.add("utmtto",b.total_,h);d.add("utmttx",b.tax_,h);d.add("utmtsp",b.shipping_,h);d.add("utmtci",b.city_,h);d.add("utmtrg",b.state_,h);d.add("utmtco",b.country_,h);c||(pe(a,d),oe(a,d));return d[u]()},ue=function(a,b,c){var d=new ke;le(a,c);me(a,d);d.add("utmt","item");
|
||||
d.add("utmtid",b.transId_,h);d.add("utmipc",b.sku_,h);d.add("utmipn",b.name_,h);d.add("utmiva",b.category_,h);d.add("utmipr",b.price_,h);d.add("utmiqt",b.quantity_,h);c||(pe(a,d),oe(a,d));return d[u]()},ve=function(a,b){var c=a.get(lc);if("page"==c)c=new ke,le(a,b),me(a,c),se(a,c),qe(a,c),re(a,c),b||(pe(a,c),oe(a,c)),c=[c[u]()];else if("event"==c)c=new ke,le(a,b),me(a,c),c.add("utmt","event"),se(a,c),qe(a,c),re(a,c),b||(pe(a,c),oe(a,c)),c=[c[u]()];else if("var"==c)c=new ke,le(a,b),me(a,c),c.add("utmt",
|
||||
"var"),!b&&oe(a,c),c=[c[u]()];else if("trans"==c)for(var c=[],d=a.get(yb),e=0;e<d[v];++e){c[m](te(a,d[e],b));for(var f=d[e].items_,j=0;j<f[v];++j)c[m](ue(a,f[j],b))}else"social"==c?b?c=[]:(c=new ke,le(a,b),me(a,c),c.add("utmt","social"),c.add("utmsn",a.get(tc),h),c.add("utmsa",a.get(uc),h),c.add("utmsid",a.get(vc),h),se(a,c),qe(a,c),re(a,c),pe(a,c),oe(a,c),c=[c[u]()]):c=[];return c},ie=function(a){var b,c=a.get(tb),d=a.get(nc),e=d&&d.Sa,f=0;if(0==c||2==c){var j=a.get(sb)+"?";b=ve(a,h);for(var o=0,
|
||||
r=b[v];o<r;o++)Sa(b[o],e,j,h),f++}if(1==c||2==c){b=ve(a);o=0;for(r=b[v];o<r;o++)try{Sa(b[o],e),f++}catch(s){s&&Ra(s[q],g,s.message)}}d&&(d.q=f)};var we="https:"==J[y][z]?"https://ssl.google-analytics.com":"http://www.google-analytics.com",xe=function(a){ga(this,"len");this.message=a+"-8192"},ye=function(a){ga(this,"ff2post");this.message=a+"-2036"},Sa=function(a,b,c,d){b=b||Ea;if(d||2036>=a[v])ze(a,b,c);else if(8192>=a[v]){if(0<=W[ya].userAgent[p]("Firefox")&&![].reduce)throw new ye(a[v]);Ae(a,b)||Be(a,b)}else throw new xe(a[v]);},ze=function(a,b,c){var c=c||we+"/__utm.gif?",d=new Image(1,1);d.src=c+a;d.onload=function(){d.onload=i;d.onerror=
|
||||
i;b()};d.onerror=function(){d.onload=i;d.onerror=i;b()}},Ae=function(a,b){var c,d=we+"/p/__utm.gif",e=W.XDomainRequest;if(e)c=new e,c.open("POST",d);else if(e=W.XMLHttpRequest)e=new e,"withCredentials"in e&&(c=e,c.open("POST",d,h),c.setRequestHeader("Content-Type","text/plain"));if(c)return c.onreadystatechange=function(){4==c.readyState&&(b(),c=i)},c.send(a),h},Be=function(a,b){if(J.body){a=aa(a);try{var c=J[oa]('<iframe name="'+a+'"></iframe>')}catch(d){c=J[oa]("iframe"),ga(c,a)}c.height="0";c.width=
|
||||
"0";c.style.display="none";c.style.visibility="hidden";var e=J[y],e=we+"/u/post_iframe.html#"+aa(e[z]+"//"+e[t]+"/favicon.ico"),f=function(){c.src="";c.parentNode&&c.parentNode.removeChild(c)};Fa(W,"beforeunload",f);var j=k,o=0,r=function(){if(!j){try{if(9<o||c.contentWindow[y][t]==J[y][t]){j=h;f();Ga(W,"beforeunload",f);b();return}}catch(a){}o++;ea(r,200)}};Fa(c,"load",r);J.body.appendChild(c);c.src=e}else id(function(){Be(a,b)},100)};var $=function(){this.A=k;this.M={};this.N=[];this.Ma=0;this.Ea=[["www.google-analytics.com","","/plugins/"]];this._gasoCPath=this._gasoDomain=g;T($[w],"_createTracker",$[w].s,55);T($[w],"_getTracker",$[w].Oa,0);T($[w],"_getTrackerByName",$[w].w,51);T($[w],"_getTrackers",$[w].Pa,130);T($[w],"_anonymizeIp",$[w].Na,16);T($[w],"_getPlugin",Hc,120);Ic()};D=$[w];D.Oa=function(a,b){return this.s(a,g,b)};D.s=function(a,b,c){b&&H(23);c&&H(67);b==g&&(b="~"+L.Ma++);a=new U(b,a,c);L.M[b]=a;L.N[m](a);return a};
|
||||
D.w=function(a){a=a||"";return L.M[a]||L.s(g,a)};D.Pa=function(){return L.N[ha](0)};D.Na=function(){this.A=h};var Ce=function(a){if("prerender"==J.webkitVisibilityState)return k;a();return h};var L=new $;var De=W._gat;De&&Aa(De._getTracker)?L=De:W._gat=L;var Z=new Y;(function(a){if(!Ce(a)){H(123);var b=k,c=function(){!b&&Ce(a)&&(b=h,Ga(J,"webkitvisibilitychange",c))};Fa(J,"webkitvisibilitychange",c)}})(function(){var a=W._gaq,b=k;if(a&&Aa(a[m])&&(b="[object Array]"==Object[w][u].call(Object(a)),!b)){Z=a;return}W._gaq=Z;b&&Z[m][xa](Z,a)});})();
|
||||
@@ -0,0 +1,61 @@
|
||||
(function(){var g=void 0,h=!0,i=null,k=!1,aa=encodeURIComponent,ba=Infinity,ea=setTimeout,fa=decodeURIComponent,l=Math;function ga(a,b){return a.name=b}
|
||||
var m="push",ha="slice",n="replace",ia="load",ja="floor",ka="charAt",la="value",p="indexOf",ma="match",na="port",oa="createElement",pa="path",q="name",t="host",u="toString",v="length",w="prototype",qa="clientWidth",x="split",ra="stopPropagation",ta="scope",y="location",ua="search",z="protocol",va="clientHeight",wa="href",A="substring",xa="apply",ya="navigator",B="join",C="toLowerCase",D;function za(a,b){switch(b){case 0:return""+a;case 1:return 1*a;case 2:return!!a;case 3:return 1E3*a}return a}function Aa(a){return"function"==typeof a}function Ba(a){return a!=g&&-1<(a.constructor+"")[p]("String")}function E(a,b){return g==a||"-"==a&&!b||""==a}function Ca(a){if(!a||""==a)return"";for(;a&&-1<" \n\r\t"[p](a[ka](0));)a=a[A](1);for(;a&&-1<" \n\r\t"[p](a[ka](a[v]-1));)a=a[A](0,a[v]-1);return a}
|
||||
function F(a){var b=1,c=0,d;if(!E(a)){b=0;for(d=a[v]-1;0<=d;d--)c=a.charCodeAt(d),b=(b<<6&268435455)+c+(c<<14),c=b&266338304,b=0!=c?b^c>>21:b}return b}function Da(){return l.round(2147483647*l.random())}function Ea(){}function G(a,b){if(aa instanceof Function)return b?encodeURI(a):aa(a);H(68);return escape(a)}function I(a){a=a[x]("+")[B](" ");if(fa instanceof Function)try{return fa(a)}catch(b){H(17)}else H(68);return unescape(a)}
|
||||
var Fa=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent&&a.attachEvent("on"+b,c)},Ga=function(a,b,c,d){a.removeEventListener?a.removeEventListener(b,c,!!d):a.detachEvent&&a.detachEvent("on"+b,c)};function Ha(a,b){if(a){var c=J[oa]("script");c.type="text/javascript";c.async=h;c.src=a;c.id=b;var d=J.getElementsByTagName("script")[0];d.parentNode.insertBefore(c,d);return c}}function K(a){return a&&0<a[v]?a[0]:""}function Ia(a){var b=a?a[v]:0;return 0<b?a[b-1]:""}
|
||||
var Ja=function(){this.prefix="ga.";this.R={}};Ja[w].set=function(a,b){this.R[this.prefix+a]=b};Ja[w].get=function(a){return this.R[this.prefix+a]};Ja[w].contains=function(a){return this.get(a)!==g};function Ka(a){0==a[p]("www.")&&(a=a[A](4));return a[C]()}function La(a,b){var c,d={url:a,protocol:"http",host:"",path:"",d:new Ja,anchor:""};if(!a)return d;c=a[p]("://");0<=c&&(d.protocol=a[A](0,c),a=a[A](c+3));c=a[ua]("/|\\?|#");if(0<=c)d.host=a[A](0,c)[C](),a=a[A](c);else return d.host=a[C](),d;c=a[p]("#");0<=c&&(d.anchor=a[A](c+1),a=a[A](0,c));c=a[p]("?");0<=c&&(Ma(d.d,a[A](c+1)),a=a[A](0,c));d.anchor&&b&&Ma(d.d,d.anchor);a&&"/"==a[ka](0)&&(a=a[A](1));d.path=a;return d}
|
||||
function Na(a,b){function c(a){var b=(a.hostname||"")[x](":")[0][C](),c=(a[z]||"")[C](),c=1*a[na]||("http:"==c?80:"https:"==c?443:""),a=a.pathname||"";0==a[p]("/")||(a="/"+a);return[b,""+c,a]}var d=b||J[oa]("a");d.href=J[y][wa];var e=(d[z]||"")[C](),f=c(d),j=d[ua]||"",o=e+"//"+f[0]+(f[1]?":"+f[1]:"");0==a[p]("//")?a=e+a:0==a[p]("/")?a=o+a:!a||0==a[p]("?")?a=o+f[2]+(a||j):0>a[x]("/")[0][p](":")&&(a=o+f[2][A](0,f[2].lastIndexOf("/"))+"/"+a);d.href=a;e=c(d);return{protocol:(d[z]||"")[C](),host:e[0],
|
||||
port:e[1],path:e[2],Ia:d[ua]||"",url:a||""}}function Ma(a,b){function c(b,c){a.contains(b)||a.set(b,[]);a.get(b)[m](c)}for(var d=Ca(b)[x]("&"),e=0;e<d[v];e++)if(d[e]){var f=d[e][p]("=");0>f?c(d[e],"1"):c(d[e][A](0,f),d[e][A](f+1))}}function Oa(a,b){if(E(a)||"["==a[ka](0)&&"]"==a[ka](a[v]-1))return"-";var c=J.domain;return a[p](c+(b&&"/"!=b?b:""))==(0==a[p]("http://")?7:0==a[p]("https://")?8:0)?"0":a};var Pa=0;function Ra(a,b,c){!(1<=Pa)&&!(1<=100*l.random())&&(a=["utmt=error","utmerr="+a,"utmwv=5.2.9","utmn="+Da(),"utmsp=1"],b&&a[m]("api="+b),c&&a[m]("msg="+G(c[A](0,100))),L.A&&a[m]("aip=1"),Sa(a[B]("&")),Pa++)};var Ta=0,Ua={};function M(a){return Va("x"+Ta++,a)}function Va(a,b){Ua[a]=!!b;return a}
|
||||
var N=M(),Wa=M(),Xa=M(),Ya=M(),Za=M(),O=M(),P=M(),$a=M(),ab=M(),bb=M(),cb=M(),db=M(),eb=M(),fb=M(),gb=M(),hb=M(),ib=M(),jb=M(),kb=M(),lb=M(),mb=M(),nb=M(),ob=M(),pb=M(),qb=M(),rb=M(),sb=M(),tb=M(),ub=M(),vb=M(),wb=M(),xb=M(),yb=M(),zb=M(),Ab=M(),Q=M(h),Bb=Va("page"),Cb=Va("title"),Db=M(),Eb=M(),Fb=M(),Gb=M(),Hb=M(),Ib=M(),Jb=M(),Kb=M(),Lb=M(),R=M(h),Mb=M(h),Nb=M(h),Qb=M(h),Rb=M(h),Sb=M(h),Tb=M(h),Ub=M(h),Vb=M(h),Wb=M(h),Xb=M(h),S=M(h),Yb=M(h),Zb=M(h),$b=M(h),ac=M(h),bc=M(h),cc=M(h),dc=M(h),ec=M(h),
|
||||
fc=M(h),gc=M(h),hc=M(h),ic=M(h),jc=M(h),kc=Va("campaignParams"),lc=M(),mc=Va("hitCallback"),nc=M();M();var oc=M(),pc=M(),qc=M(),rc=M(),sc=M(),tc=M(),uc=M(),vc=M(),wc=M(),xc=M(),yc=M(),Cc=M();M();var Dc=M(),Ec=M(),Fc=M();var Ic=function(){function a(a,c,d){T(U[w],a,c,d)}Gc("_getName",Xa,58);Gc("_getAccount",N,64);Gc("_visitCode",R,54);Gc("_getClientInfo",fb,53,1);Gc("_getDetectTitle",ib,56,1);Gc("_getDetectFlash",gb,65,1);Gc("_getLocalGifPath",sb,57);Gc("_getServiceMode",tb,59);V("_setClientInfo",fb,66,2);V("_setAccount",N,3);V("_setNamespace",Wa,48);V("_setAllowLinker",cb,11,2);V("_setDetectFlash",gb,61,2);V("_setDetectTitle",ib,62,2);V("_setLocalGifPath",sb,46,0);V("_setLocalServerMode",tb,92,g,0);V("_setRemoteServerMode",
|
||||
tb,63,g,1);V("_setLocalRemoteServerMode",tb,47,g,2);V("_setSampleRate",rb,45,1);V("_setCampaignTrack",hb,36,2);V("_setAllowAnchor",db,7,2);V("_setCampNameKey",kb,41);V("_setCampContentKey",pb,38);V("_setCampIdKey",jb,39);V("_setCampMediumKey",nb,40);V("_setCampNOKey",qb,42);V("_setCampSourceKey",mb,43);V("_setCampTermKey",ob,44);V("_setCampCIdKey",lb,37);V("_setCookiePath",P,9,0);V("_setMaxCustomVariables",ub,0,1);V("_setVisitorCookieTimeout",$a,28,1);V("_setSessionCookieTimeout",ab,26,1);V("_setCampaignCookieTimeout",
|
||||
bb,29,1);V("_setReferrerOverride",Db,49);V("_setSiteSpeedSampleRate",wc,132);a("_trackPageview",U[w].ya,1);a("_trackEvent",U[w].D,4);a("_trackPageLoadTime",U[w].xa,100);a("_trackSocial",U[w].za,104);a("_trackTrans",U[w].Ba,18);a("_sendXEvent",U[w].t,78);a("_createEventTracker",U[w].ea,74);a("_getVersion",U[w].ja,60);a("_setDomainName",U[w].C,6);a("_setAllowHash",U[w].oa,8);a("_getLinkerUrl",U[w].ia,52);a("_link",U[w].link,101);a("_linkByPost",U[w].na,102);a("_setTrans",U[w].sa,20);a("_addTrans",U[w].Y,
|
||||
21);a("_addItem",U[w].W,19);a("_setTransactionDelim",U[w].ta,82);a("_setCustomVar",U[w].pa,10);a("_deleteCustomVar",U[w].ga,35);a("_getVisitorCustomVar",U[w].ka,50);a("_setXKey",U[w].va,83);a("_setXValue",U[w].wa,84);a("_getXKey",U[w].la,76);a("_getXValue",U[w].ma,77);a("_clearXKey",U[w].ba,72);a("_clearXValue",U[w].ca,73);a("_createXObj",U[w].fa,75);a("_addIgnoredOrganic",U[w].U,15);a("_clearIgnoredOrganic",U[w].Z,97);a("_addIgnoredRef",U[w].V,31);a("_clearIgnoredRef",U[w].$,32);a("_addOrganic",
|
||||
U[w].X,14);a("_clearOrganic",U[w].aa,70);a("_cookiePathCopy",U[w].da,30);a("_get",U[w].ha,106);a("_set",U[w].qa,107);a("_addEventListener",U[w].addEventListener,108);a("_removeEventListener",U[w].removeEventListener,109);a("_addDevId",U[w].T);a("_getPlugin",Hc,122);a("_setPageGroup",U[w].ra,126);a("_trackTiming",U[w].Aa,124);a("_initData",U[w].u,2);a("_setVar",U[w].ua,22);V("_setSessionTimeout",ab,27,3);V("_setCookieTimeout",bb,25,3);V("_setCookiePersistence",$a,24,1);a("_setAutoTrackOutbound",Ea,
|
||||
79);a("_setTrackOutboundSubdomains",Ea,81);a("_setHrefExamineLimit",Ea,80)};function Hc(a){var b=this.plugins_;if(b)return b.get(a)}
|
||||
var T=function(a,b,c,d){a[b]=function(){try{return d!=g&&H(d),c[xa](this,arguments)}catch(a){throw Ra("exc",b,a&&a[q]),a;}}},Gc=function(a,b,c,d){U[w][a]=function(){try{return H(c),za(this.a.get(b),d)}catch(e){throw Ra("exc",a,e&&e[q]),e;}}},V=function(a,b,c,d,e){U[w][a]=function(f){try{H(c),e==g?this.a.set(b,za(f,d)):this.a.set(b,e)}catch(j){throw Ra("exc",a,j&&j[q]),j;}}},Jc=function(a,b){return{type:b,target:a,stopPropagation:function(){throw"aborted";}}};var Kc=function(a,b){return"/"!==b?k:(0==a[p]("www.google.")||0==a[p](".google.")||0==a[p]("google."))&&!(-1<a[p]("google.org"))?h:k},Lc=function(a){var b=a.get(Za),c=a.c(P,"/");Kc(b,c)&&a[ra]()};var Qc=function(){var a={},b={},c=new Mc;this.j=function(a,b){c.add(a,b)};var d=new Mc;this.e=function(a,b){d.add(a,b)};var e=k,f=k,j=h;this.S=function(){e=h};this.i=function(a){this[ia]();this.set(lc,a,h);a=new Nc(this);e=k;d.execute(this);e=h;b={};this.n();a.Ca()};this.load=function(){e&&(e=k,this.Da(),Oc(this),f||(f=h,c.execute(this),Pc(this),Oc(this)),e=h)};this.n=function(){if(e)if(f)e=k,Pc(this),e=h;else this[ia]()};this.get=function(c){Ua[c]&&this[ia]();return b[c]!==g?b[c]:a[c]};this.set=
|
||||
function(c,d,e){Ua[c]&&this[ia]();e?b[c]=d:a[c]=d;Ua[c]&&this.n()};this.v=function(b){a[b]=this.b(b,0)+1};this.b=function(a,b){var c=this.get(a);return c==g||""===c?b:1*c};this.c=function(a,b){var c=this.get(a);return c==g?b:c+""};this.Da=function(){if(j){var b=this.c(Za,""),c=this.c(P,"/");Kc(b,c)||(a[O]=a[eb]&&""!=b?F(b):1,j=k)}}};Qc[w].stopPropagation=function(){throw"aborted";};
|
||||
var Nc=function(a){var b=this;this.q=0;var c=a.get(mc);this.Sa=function(){0<b.q&&c&&(b.q--,b.q||c())};this.Ca=function(){!b.q&&c&&ea(c,10)};a.set(nc,b,h)};function Rc(a,b){for(var b=b||[],c=0;c<b[v];c++){var d=b[c];if(""+a==d||0==d[p](a+"."))return d}return"-"}
|
||||
var Tc=function(a,b,c){c=c?"":a.c(O,"1");b=b[x](".");if(6!==b[v]||Sc(b[0],c))return k;var c=1*b[1],d=1*b[2],e=1*b[3],f=1*b[4],b=1*b[5];if(!(0<=c&&0<d&&0<e&&0<f&&0<=b))return H(110),k;a.set(R,c);a.set(Rb,d);a.set(Sb,e);a.set(Tb,f);a.set(Ub,b);return h},Uc=function(a){var b=a.get(R),c=a.get(Rb),d=a.get(Sb),e=a.get(Tb),f=a.b(Ub,1);b==g?H(113):NaN==b&&H(114);0<=b&&0<c&&0<d&&0<e&&0<=f||H(115);return[a.b(O,1),b!=g?b:"-",c||"-",d||"-",e||"-",f][B](".")},Vc=function(a){return[a.b(O,1),a.b(Xb,0),a.b(S,1),
|
||||
a.b(Yb,0)][B](".")},Wc=function(a,b,c){var c=c?"":a.c(O,"1"),d=b[x](".");if(4!==d[v]||Sc(d[0],c))d=i;a.set(Xb,d?1*d[1]:0);a.set(S,d?1*d[2]:10);a.set(Yb,d?1*d[3]:a.get(Ya));return d!=i||!Sc(b,c)},Xc=function(a,b){var c=G(a.c(Nb,"")),d=[],e=a.get(Q);if(!b&&e){for(var f=0;f<e[v];f++){var j=e[f];j&&1==j[ta]&&d[m](f+"="+G(j[q])+"="+G(j[la])+"=1")}0<d[v]&&(c+="|"+d[B]("^"))}return c?a.b(O,1)+"."+c:i},Yc=function(a,b,c){c=c?"":a.c(O,"1");b=b[x](".");if(2>b[v]||Sc(b[0],c))return k;b=b[ha](1)[B](".")[x]("|");
|
||||
0<b[v]&&a.set(Nb,I(b[0]));if(1>=b[v])return h;b=b[1][x](-1==b[1][p](",")?"^":",");for(c=0;c<b[v];c++){var d=b[c][x]("=");if(4==d[v]){var e={};ga(e,I(d[1]));e.value=I(d[2]);e.scope=1;a.get(Q)[d[0]]=e}}return h},$c=function(a,b){var c=Zc(a,b);return c?[a.b(O,1),a.b(Zb,0),a.b($b,1),a.b(ac,1),c][B]("."):""},Zc=function(a){function b(b,e){if(!E(a.get(b))){var f=a.c(b,""),f=f[x](" ")[B]("%20"),f=f[x]("+")[B]("%20");c[m](e+"="+f)}}var c=[];b(cc,"utmcid");b(gc,"utmcsr");b(ec,"utmgclid");b(fc,"utmdclid");
|
||||
b(dc,"utmccn");b(hc,"utmcmd");b(ic,"utmctr");b(jc,"utmcct");return c[B]("|")},bd=function(a,b,c){c=c?"":a.c(O,"1");b=b[x](".");if(5>b[v]||Sc(b[0],c))return a.set(Zb,g),a.set($b,g),a.set(ac,g),a.set(cc,g),a.set(dc,g),a.set(gc,g),a.set(hc,g),a.set(ic,g),a.set(jc,g),a.set(ec,g),a.set(fc,g),k;a.set(Zb,1*b[1]);a.set($b,1*b[2]);a.set(ac,1*b[3]);ad(a,b[ha](4)[B]("."));return h},ad=function(a,b){function c(a){return(a=b[ma](a+"=(.*?)(?:\\|utm|$)"))&&2==a[v]?a[1]:g}function d(b,c){c&&(c=e?I(c):c[x]("%20")[B](" "),
|
||||
a.set(b,c))}-1==b[p]("=")&&(b=I(b));var e="2"==c("utmcvr");d(cc,c("utmcid"));d(dc,c("utmccn"));d(gc,c("utmcsr"));d(hc,c("utmcmd"));d(ic,c("utmctr"));d(jc,c("utmcct"));d(ec,c("utmgclid"));d(fc,c("utmdclid"))},Sc=function(a,b){return b?a!=b:!/^\d+$/.test(a)};var Mc=function(){this.B=[]};Mc[w].add=function(a,b){this.B[m]({name:a,r:b})};Mc[w].execute=function(a){try{for(var b=0;b<this.B[v];b++)this.B[b].r.call(W,a)}catch(c){}};function cd(a){100!=a.get(rb)&&a.get(R)%1E4>=100*a.get(rb)&&a[ra]()}function dd(a){ed(a.get(N))&&a[ra]()}function fd(a){"file:"==J[y][z]&&a[ra]()}function gd(a){a.get(Cb)||a.set(Cb,J.title,h);a.get(Bb)||a.set(Bb,J[y].pathname+J[y][ua],h)};var hd=new function(){var a=[];this.set=function(b){a[b]=h};this.Va=function(){for(var b=[],c=0;c<a[v];c++)a[c]&&(b[l[ja](c/6)]=b[l[ja](c/6)]^1<<c%6);for(c=0;c<b[v];c++)b[c]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"[ka](b[c]||0);return b[B]("")+"~"}};function H(a){hd.set(a)};var W=window,J=document,ed=function(a){var b=W._gaUserPrefs;return b&&b.ioo&&b.ioo()||!!a&&W["ga-disable-"+a]===h},id=function(a,b){ea(a,b)},jd=function(a){for(var b=[],c=J.cookie[x](";"),a=RegExp("^\\s*"+a+"=\\s*(.*?)\\s*$"),d=0;d<c[v];d++){var e=c[d][ma](a);e&&b[m](e[1])}return b},X=function(a,b,c,d,e,f){e=ed(e)?k:Kc(d,c)?k:h;if(e){if(b&&0<=W[ya].userAgent[p]("Firefox"))for(var b=b[n](/\n|\r/g," "),e=0,j=b[v];e<j;++e){var o=b.charCodeAt(e)&255;if(10==o||13==o)b=b[A](0,e)+"?"+b[A](e+1)}b&&2E3<b[v]&&
|
||||
(b=b[A](0,2E3),H(69));a=a+"="+b+"; path="+c+"; ";f&&(a+="expires="+(new Date((new Date).getTime()+f)).toGMTString()+"; ");d&&(a+="domain="+d+";");J.cookie=a}};var kd,ld,md=function(){if(!kd){var a={},b=W[ya],c=W.screen;a.Q=c?c.width+"x"+c.height:"-";a.P=c?c.colorDepth+"-bit":"-";a.language=(b&&(b.language||b.browserLanguage)||"-")[C]();a.javaEnabled=b&&b.javaEnabled()?1:0;a.characterSet=J.characterSet||J.charset||"-";try{var d=J.documentElement,e=J.body,f=e&&e[qa]&&e[va],b=[];d&&(d[qa]&&d[va])&&("CSS1Compat"===J.compatMode||!f)?b=[d[qa],d[va]]:f&&(b=[e[qa],e[va]]);a.Ua=b[B]("x")}catch(j){H(135)}kd=a}},nd=function(){md();for(var a=kd,b=W[ya],a=b.appName+
|
||||
b.version+a.language+b.platform+b.userAgent+a.javaEnabled+a.Q+a.P+(J.cookie?J.cookie:"")+(J.referrer?J.referrer:""),b=a[v],c=W.history[v];0<c;)a+=c--^b++;return F(a)},od=function(a){md();var b=kd;a.set(Fb,b.Q);a.set(Gb,b.P);a.set(Jb,b.language);a.set(Kb,b.characterSet);a.set(Hb,b.javaEnabled);a.set(Lb,b.Ua);if(a.get(fb)&&a.get(gb)){if(!(b=ld)){var c,d,e;d="ShockwaveFlash";if((b=(b=W[ya])?b.plugins:g)&&0<b[v])for(c=0;c<b[v]&&!e;c++)d=b[c],-1<d[q][p]("Shockwave Flash")&&(e=d.description[x]("Shockwave Flash ")[1]);
|
||||
else{d=d+"."+d;try{c=new ActiveXObject(d+".7"),e=c.GetVariable("$version")}catch(f){}if(!e)try{c=new ActiveXObject(d+".6"),e="WIN 6,0,21,0",c.AllowScriptAccess="always",e=c.GetVariable("$version")}catch(j){}if(!e)try{c=new ActiveXObject(d),e=c.GetVariable("$version")}catch(o){}e&&(e=e[x](" ")[1][x](","),e=e[0]+"."+e[1]+" r"+e[2])}b=e?e:"-"}ld=b;a.set(Ib,ld)}else a.set(Ib,"-")};var pd=function(a){if(Aa(a))this.r=a;else{var b=a[0],c=b.lastIndexOf(":"),d=b.lastIndexOf(".");this.g=this.h=this.l="";-1==c&&-1==d?this.g=b:-1==c&&-1!=d?(this.h=b[A](0,d),this.g=b[A](d+1)):-1!=c&&-1==d?(this.l=b[A](0,c),this.g=b[A](c+1)):c>d?(this.h=b[A](0,d),this.l=b[A](d+1,c),this.g=b[A](c+1)):(this.h=b[A](0,d),this.g=b[A](d+1));this.k=a[ha](1);this.Fa=!this.l&&"_require"==this.g;this.H=!this.h&&!this.l&&"_provide"==this.g}},Y=function(){T(Y[w],"push",Y[w][m],5);T(Y[w],"_getPlugin",Hc,121);T(Y[w],
|
||||
"_createAsyncTracker",Y[w].Qa,33);T(Y[w],"_getAsyncTracker",Y[w].Ra,34);this.G=new Ja;this.p=[]};D=Y[w];D.Ha=function(a,b,c){var d=this.G.get(a);if(!Aa(d))return k;b.plugins_=b.plugins_||new Ja;b.plugins_.set(a,new d(b,c||{}));return h};D.push=function(a){var b=Z.Ta[xa](this,arguments),b=Z.p.concat(b);for(Z.p=[];0<b[v]&&!Z.O(b[0])&&!(b.shift(),0<Z.p[v]););Z.p=Z.p.concat(b);return 0};D.Ta=function(a){for(var b=[],c=0;c<arguments[v];c++)try{var d=new pd(arguments[c]);d.H?this.O(d):b[m](d)}catch(e){}return b};
|
||||
D.O=function(a){try{if(a.r)a.r[xa](W);else if(a.H)this.G.set(a.k[0],a.k[1]);else{var b="_gat"==a.h?L:"_gaq"==a.h?Z:L.w(a.h);if(a.Fa){if(!this.Ha(a.k[0],b,a.k[2])){if(!a.Ja){var c=Na(""+a.k[1]);var d=c[z],e=J[y][z];var f;if(f="https:"==d||d==e?h:"http:"!=d?k:"http:"==e){var j;a:{var o=Na(J[y][wa]);if(!(c.Ia||0<=c.url[p]("?")||0<=c[pa][p]("://")||c[t]==o[t]&&c[na]==o[na]))for(var r="http:"==c[z]?80:443,s=L.Ea,b=0;b<s[v];b++)if(c[t]==s[b][0]&&(c[na]||r)==(s[b][1]||r)&&0==c[pa][p](s[b][2])){j=h;break a}j=
|
||||
k}f=j&&!ed()}f&&(a.Ja=Ha(c.url))}return h}}else a.l&&(b=b.plugins_.get(a.l)),b[a.g][xa](b,a.k)}}catch(Qa){}};D.Qa=function(a,b){return L.s(a,b||"")};D.Ra=function(a){return L.w(a)};var td=function(){function a(a,b,c,d){g==f[a]&&(f[a]={});g==f[a][b]&&(f[a][b]=[]);f[a][b][c]=d}function b(a,b,c){if(g!=f[a]&&g!=f[a][b])return f[a][b][c]}function c(a,b){if(g!=f[a]&&g!=f[a][b]){f[a][b]=g;var c=h,d;for(d=0;d<j[v];d++)if(g!=f[a][j[d]]){c=k;break}c&&(f[a]=g)}}function d(a){var b="",c=k,d,e;for(d=0;d<j[v];d++)if(e=a[j[d]],g!=e){c&&(b+=j[d]);for(var c=[],f=g,da=g,da=0;da<e[v];da++)if(g!=e[da]){f="";da!=Ob&&g==e[da-1]&&(f+=da[u]()+Qa);for(var sd=e[da],zc="",Pb=g,Ac=g,Bc=g,Pb=0;Pb<sd[v];Pb++)Ac=
|
||||
sd[ka](Pb),Bc=sa[Ac],zc+=g!=Bc?Bc:Ac;f+=zc;c[m](f)}b+=o+c[B](s)+r;c=k}else c=h;return b}var e=this,f=[],j=["k","v"],o="(",r=")",s="*",Qa="!",sa={"'":"'0"};sa[r]="'1";sa[s]="'2";sa[Qa]="'3";var Ob=1;e.La=function(a){return g!=f[a]};e.z=function(){for(var a="",b=0;b<f[v];b++)g!=f[b]&&(a+=b[u]()+d(f[b]));return a};e.Ka=function(a){if(a==g)return e.z();for(var b=a.z(),c=0;c<f[v];c++)g!=f[c]&&!a.La(c)&&(b+=c[u]()+d(f[c]));return b};e.f=function(b,c,d){if(!qd(d))return k;a(b,"k",c,d);return h};e.o=function(b,
|
||||
c,d){if(!rd(d))return k;a(b,"v",c,d[u]());return h};e.getKey=function(a,c){return b(a,"k",c)};e.L=function(a,c){return b(a,"v",c)};e.J=function(a){c(a,"k")};e.K=function(a){c(a,"v")};T(e,"_setKey",e.f,89);T(e,"_setValue",e.o,90);T(e,"_getKey",e.getKey,87);T(e,"_getValue",e.L,88);T(e,"_clearKey",e.J,85);T(e,"_clearValue",e.K,86)};function qd(a){return"string"==typeof a}function rd(a){return"number"!=typeof a&&(g==Number||!(a instanceof Number))||l.round(a)!=a||NaN==a||a==ba?k:h};var ud=function(a){var b=W.gaGlobal;a&&!b&&(W.gaGlobal=b={});return b},vd=function(){var a=ud(h).hid;a==i&&(a=Da(),ud(h).hid=a);return a},wd=function(a){a.set(Eb,vd());var b=ud();if(b&&b.dh==a.get(O)){var c=b.sid;c&&("0"==c&&H(112),a.set(Tb,c),a.get(Mb)&&a.set(Sb,c));b=b.vid;a.get(Mb)&&b&&(b=b[x]("."),1*b[1]||H(112),a.set(R,1*b[0]),a.set(Rb,1*b[1]))}};var xd,yd=function(a,b,c){var d=a.c(Za,""),e=a.c(P,"/"),f=a.b($a,0),a=a.c(N,"");X(b,c,e,d,a,f)},Pc=function(a){var b=a.c(Za,"");a.b(O,1);var c=a.c(P,"/"),d=a.c(N,"");X("__utma",Uc(a),c,b,d,a.get($a));X("__utmb",Vc(a),c,b,d,a.get(ab));X("__utmc",""+a.b(O,1),c,b,d);var e=$c(a,h);e?X("__utmz",e,c,b,d,a.get(bb)):X("__utmz","",c,b,"",-1);(e=Xc(a,k))?X("__utmv",e,c,b,d,a.get($a)):X("__utmv","",c,b,"",-1)},Oc=function(a){var b=a.b(O,1);if(!Tc(a,Rc(b,jd("__utma"))))return a.set(Qb,h),k;var c=!Wc(a,Rc(b,jd("__utmb")));
|
||||
a.set(Wb,c);bd(a,Rc(b,jd("__utmz")));Yc(a,Rc(b,jd("__utmv")));xd=!c;return h},zd=function(a){!xd&&!(0<jd("__utmb")[v])&&(X("__utmd","1",a.c(P,"/"),a.c(Za,""),a.c(N,""),1E4),0==jd("__utmd")[v]&&a[ra]())};var Cd=function(a){a.get(R)==g?Ad(a):a.get(Qb)&&!a.get(Dc)?Ad(a):a.get(Wb)&&Bd(a)},Dd=function(a){a.get(bc)&&!a.get(Vb)&&(Bd(a),a.set($b,a.get(Ub)))},Ad=function(a){var b=a.get(Ya);a.set(Mb,h);a.set(R,Da()^nd(a)&2147483647);a.set(Nb,"");a.set(Rb,b);a.set(Sb,b);a.set(Tb,b);a.set(Ub,1);a.set(Vb,h);a.set(Xb,0);a.set(S,10);a.set(Yb,b);a.set(Q,[]);a.set(Qb,k);a.set(Wb,k)},Bd=function(a){a.set(Sb,a.get(Tb));a.set(Tb,a.get(Ya));a.v(Ub);a.set(Vb,h);a.set(Xb,0);a.set(S,10);a.set(Yb,a.get(Ya));a.set(Wb,k)};var Ed="daum:q,eniro:search_word,naver:query,pchome:q,images.google:q,google:q,yahoo:p,yahoo:q,msn:q,bing:q,aol:query,aol:q,lycos:q,lycos:query,ask:q,netscape:query,cnn:query,about:terms,mamma:q,voila:rdata,virgilio:qs,live:q,baidu:wd,alice:qs,yandex:text,najdi:q,seznam:q,rakuten:qt,biglobe:q,goo.ne:MT,wp:szukaj,onet:qt,yam:k,kvasir:q,ozu:q,terra:query,rambler:query,conduit:q,babylon:q,search-results:q,avg:q,comcast:q,incredimail:q,startsiden:q".split(","),Kd=function(a){if(a.get(hb)&&!a.get(Dc)){for(var b=
|
||||
!E(a.get(cc))||!E(a.get(gc))||!E(a.get(ec))||!E(a.get(fc)),c={},d=0;d<Fd[v];d++){var e=Fd[d];c[e]=a.get(e)}(d=a.get(kc))?(H(149),e=new Ja,Ma(e,d),d=e):d=La(J[y][wa],a.get(db)).d;if(!("1"==Ia(d.get(a.get(qb)))&&b)&&(d=Gd(a,d)||Hd(a),!d&&(!b&&a.get(Vb))&&(Id(a,g,"(direct)",g,g,"(direct)","(none)",g,g),d=h),d))if(a.set(bc,Jd(a,c)),b="(direct)"==a.get(gc)&&"(direct)"==a.get(dc)&&"(none)"==a.get(hc),a.get(bc)||a.get(Vb)&&!b)a.set(Zb,a.get(Ya)),a.set($b,a.get(Ub)),a.v(ac)}},Gd=function(a,b){function c(c,
|
||||
d){var d=d||"-",e=Ia(b.get(a.get(c)));return e&&"-"!=e?I(e):d}var d=Ia(b.get(a.get(jb)))||"-",e=Ia(b.get(a.get(mb)))||"-",f=Ia(b.get(a.get(lb)))||"-",j=Ia(b.get("dclid"))||"-",o=c(kb,"(not set)"),r=c(nb,"(not set)"),s=c(ob),Qa=c(pb);if(E(d)&&E(f)&&E(j)&&E(e))return k;var sa=!E(j)&&E(e),Ob=E(s);if(sa||Ob){var ca=Ld(a),ca=La(ca,h);if((ca=Md(a,ca))&&!E(ca[1]&&!ca[2]))sa&&(e=ca[0]),Ob&&(s=ca[1])}Id(a,d,e,f,j,o,r,s,Qa);return h},Hd=function(a){var b=Ld(a),c=La(b,h);if(!(b!=g&&b!=i&&""!=b&&"0"!=b&&"-"!=
|
||||
b&&0<=b[p]("://"))||c&&-1<c[t][p]("google")&&c.d.contains("q")&&"cse"==c[pa])return k;if((b=Md(a,c))&&!b[2])return Id(a,g,b[0],g,g,"(organic)","organic",b[1],g),h;if(b||!a.get(Vb))return k;a:{for(var b=a.get(xb),d=Ka(c[t]),e=0;e<b[v];++e)if(-1<d[p](b[e])){a=k;break a}Id(a,g,d,g,g,"(referral)","referral",g,"/"+c[pa]);a=h}return a},Md=function(a,b){for(var c=a.get(vb),d=0;d<c[v];++d){var e=c[d][x](":");if(-1<b[t][p](e[0][C]())){var f=b.d.get(e[1]);if(f&&(f=K(f),!f&&-1<b[t][p]("google.")&&(f="(not provided)"),
|
||||
!e[3]||-1<b.url[p](e[3]))){a:{for(var c=f,d=a.get(wb),c=I(c)[C](),j=0;j<d[v];++j)if(c==d[j]){c=h;break a}c=k}return[e[2]||e[0],f,c]}}}return i},Id=function(a,b,c,d,e,f,j,o,r){a.set(cc,b);a.set(gc,c);a.set(ec,d);a.set(fc,e);a.set(dc,f);a.set(hc,j);a.set(ic,o);a.set(jc,r)},Fd=[dc,cc,ec,fc,gc,hc,ic,jc],Jd=function(a,b){function c(a){a=(""+a)[x]("+")[B]("%20");return a=a[x](" ")[B]("%20")}function d(c){var d=""+(a.get(c)||""),c=""+(b[c]||"");return 0<d[v]&&d==c}if(d(ec)||d(fc))return H(131),k;for(var e=
|
||||
0;e<Fd[v];e++){var f=Fd[e],j=b[f]||"-",f=a.get(f)||"-";if(c(j)!=c(f))return h}return k},Nd=RegExp(/^https:\/\/(www\.)?google(\.com?)?(\.[a-z]{2}t?)?\/?$/i),Ld=function(a){a=Oa(a.get(Db),a.get(P));try{if(Nd.test(a))return H(136),a+"?q="}catch(b){H(145)}return a};var Pd=function(a){Od(a,J[y][wa])?(a.set(Dc,h),H(12)):a.set(Dc,k)},Od=function(a,b){if(!a.get(cb))return k;var c=La(b,a.get(db)),d=K(c.d.get("__utma")),e=K(c.d.get("__utmb")),f=K(c.d.get("__utmc")),j=K(c.d.get("__utmx")),o=K(c.d.get("__utmz")),r=K(c.d.get("__utmv")),c=K(c.d.get("__utmk"));if(F(""+d+e+f+j+o+r)!=c){d=I(d);e=I(e);f=I(f);j=I(j);f=Qd(d+e+f+j,o,r,c);if(!f)return k;o=f[0];r=f[1]}if(!Tc(a,d,h))return k;Wc(a,e,h);bd(a,o,h);Yc(a,r,h);Rd(a,j,h);return h},Td=function(a,b,c){var d;d=Uc(a)||"-";
|
||||
var e=Vc(a)||"-",f=""+a.b(O,1)||"-",j=Sd(a)||"-",o=$c(a,k)||"-",a=Xc(a,k)||"-",r=F(""+d+e+f+j+o+a),s=[];s[m]("__utma="+d);s[m]("__utmb="+e);s[m]("__utmc="+f);s[m]("__utmx="+j);s[m]("__utmz="+o);s[m]("__utmv="+a);s[m]("__utmk="+r);d=s[B]("&");if(!d)return b;e=b[p]("#");if(c)return 0>e?b+"#"+d:b+"&"+d;c="";f=b[p]("?");0<e&&(c=b[A](e),b=b[A](0,e));return 0>f?b+"?"+d+c:b+"&"+d+c},Qd=function(a,b,c,d){for(var e=0;3>e;e++){for(var f=0;3>f;f++){if(d==F(a+b+c))return H(127),[b,c];var j=b[n](/ /g,"%20"),o=
|
||||
c[n](/ /g,"%20");if(d==F(a+j+o))return H(128),[j,o];j=j[n](/\+/g,"%20");o=o[n](/\+/g,"%20");if(d==F(a+j+o))return H(129),[j,o];try{var r=b[ma]("utmctr=(.*?)(?:\\|utm|$)");if(r&&2==r[v]&&(j=b[n](r[1],G(I(r[1]))),d==F(a+j+c)))return H(139),[j,c]}catch(s){}b=I(b)}c=I(c)}};var Ud="|",Wd=function(a,b,c,d,e,f,j,o,r){var s=Vd(a,b);s||(s={},a.get(yb)[m](s));s.id_=b;s.affiliation_=c;s.total_=d;s.tax_=e;s.shipping_=f;s.city_=j;s.state_=o;s.country_=r;s.items_=s.items_||[];return s},Xd=function(a,b,c,d,e,f,j){var a=Vd(a,b)||Wd(a,b,"",0,0,0,"","",""),o;a:{if(a&&a.items_){o=a.items_;for(var r=0;r<o[v];r++)if(o[r].sku_==c){o=o[r];break a}}o=i}r=o||{};r.transId_=b;r.sku_=c;r.name_=d;r.category_=e;r.price_=f;r.quantity_=j;o||a.items_[m](r);return r},Vd=function(a,b){for(var c=
|
||||
a.get(yb),d=0;d<c[v];d++)if(c[d].id_==b)return c[d];return i};var Yd,Zd=function(a){if(!Yd){var b;b=J[y].hash;var c=W[q],d=/^#?gaso=([^&]*)/;if(c=(b=(b=b&&b[ma](d)||c&&c[ma](d))?b[1]:K(jd("GASO")))&&b[ma](/^(?:[|!]([-0-9a-z.]{1,40})[|!])?([-.\w]{10,1200})$/i))yd(a,"GASO",""+b),L._gasoDomain=a.get(Za),L._gasoCPath=a.get(P),a=c[1],Ha("https://www.google.com/analytics/web/inpage/pub/inpage.js?"+(a?"prefix="+a+"&":"")+Da(),"_gasojs");Yd=h}};var Rd=function(a,b,c){c&&(b=I(b));c=a.b(O,1);b=b[x](".");!(2>b[v])&&/^\d+$/.test(b[0])&&(b[0]=""+c,yd(a,"__utmx",b[B](".")))},Sd=function(a,b){var c=Rc(a.get(O),jd("__utmx"));"-"==c&&(c="");return b?G(c):c},$d=function(a){try{var b=La(J[y][wa],k),c=fa(Ia(b.d.get("utm_referrer")))||"";c&&a.set(Db,c);var d=fa(K(b.d.get("utm_expid")));d&&a.set(Fc,d)}catch(e){H(146)}};var ee=function(a,b){var c=l.min(a.b(wc,0),100);if(a.b(R,0)%100>=c)return k;c=ae()||be();if(c==g)return k;var d=c[0];if(d==g||d==ba||isNaN(d))return k;0<d?ce(c)?b(de(c)):b(de(c[ha](0,1))):Fa(W,"load",function(){ee(a,b)},k);return h},ge=function(a,b,c,d){var e=new td;e.f(14,90,b[A](0,64));e.f(14,91,a[A](0,64));e.f(14,92,""+fe(c));d!=g&&e.f(14,93,d[A](0,64));e.o(14,90,c);return e},ce=function(a){for(var b=1;b<a[v];b++)if(isNaN(a[b])||a[b]==ba||0>a[b])return k;return h},fe=function(a){return isNaN(a)||
|
||||
0>a?0:5E3>a?10*l[ja](a/10):5E4>a?100*l[ja](a/100):41E5>a?1E3*l[ja](a/1E3):41E5},de=function(a){for(var b=new td,c=0;c<a[v];c++)b.f(14,c+1,""+fe(a[c])),b.o(14,c+1,a[c]);return b},ae=function(){var a=W.performance||W.webkitPerformance;if(a=a&&a.timing){var b=a.navigationStart;if(0==b)H(133);else return[a.loadEventStart-b,a.domainLookupEnd-a.domainLookupStart,a.connectEnd-a.connectStart,a.responseStart-a.requestStart,a.responseEnd-a.responseStart,a.fetchStart-b]}},be=function(){if(W.top==W){var a=W.external,
|
||||
b=a&&a.onloadT;a&&!a.isValidLoadTime&&(b=g);2147483648<b&&(b=g);0<b&&a.setPageReadyTime();return b==g?g:[b]}};var U=function(a,b,c){function d(a){return function(b){if((b=b.get(Ec)[a])&&b[v])for(var c=Jc(e,a),d=0;d<b[v];d++)b[d].call(e,c)}}var e=this;this.a=new Qc;this.get=function(a){return this.a.get(a)};this.set=function(a,b,c){this.a.set(a,b,c)};this.set(N,b||"UA-XXXXX-X");this.set(Xa,a||"");this.set(Wa,c||"");this.set(Ya,l.round((new Date).getTime()/1E3));this.set(P,"/");this.set($a,63072E6);this.set(bb,15768E6);this.set(ab,18E5);this.set(cb,k);this.set(ub,50);this.set(db,k);this.set(eb,h);this.set(fb,
|
||||
h);this.set(gb,h);this.set(hb,h);this.set(ib,h);this.set(kb,"utm_campaign");this.set(jb,"utm_id");this.set(lb,"gclid");this.set(mb,"utm_source");this.set(nb,"utm_medium");this.set(ob,"utm_term");this.set(pb,"utm_content");this.set(qb,"utm_nooverride");this.set(rb,100);this.set(wc,1);this.set(xc,k);this.set(sb,"/__utm.gif");this.set(tb,1);this.set(yb,[]);this.set(Q,[]);this.set(vb,Ed[ha](0));this.set(wb,[]);this.set(xb,[]);this.C("auto");this.set(Db,J.referrer);$d(this.a);this.set(Ec,{hit:[],load:[]});
|
||||
this.a.j("0",Pd);this.a.j("1",Cd);this.a.j("2",Kd);this.a.j("3",Dd);this.a.j("4",d("load"));this.a.j("5",Zd);this.a.e("A",dd);this.a.e("B",fd);this.a.e("C",Cd);this.a.e("D",cd);this.a.e("E",Lc);this.a.e("F",he);this.a.e("G",zd);this.a.e("H",gd);this.a.e("I",od);this.a.e("J",wd);this.a.e("K",d("hit"));this.a.e("L",ie);this.a.e("M",je);0===this.get(Ya)&&H(111);this.a.S();this.F=g};D=U[w];D.m=function(){var a=this.get(zb);a||(a=new td,this.set(zb,a));return a};
|
||||
D.Ga=function(a){for(var b in a){var c=a[b];a.hasOwnProperty(b)&&this.set(b,c,h)}};D.I=function(a){if(this.get(xc))return k;var b=this,c=ee(this.a,function(c){b.set(Bb,a,h);b.t(c)});this.set(xc,c);return c};D.ya=function(a){a&&Ba(a)?(H(13),this.set(Bb,a,h)):"object"===typeof a&&a!==i&&this.Ga(a);this.F=a=this.get(Bb);this.a.i("page");this.I(a)};
|
||||
D.D=function(a,b,c,d,e){if(""==a||(!qd(a)||""==b||!qd(b))||c!=g&&!qd(c)||d!=g&&!rd(d))return k;this.set(pc,a,h);this.set(qc,b,h);this.set(rc,c,h);this.set(sc,d,h);this.set(oc,!!e,h);this.a.i("event");return h};D.Aa=function(a,b,c,d,e){var f=this.a.b(wc,0);1*e===e&&(f=e);if(this.a.b(R,0)%100>=f)return k;c=1*(""+c);if(""==a||(!qd(a)||""==b||!qd(b)||!rd(c)||isNaN(c)||0>c||0>f||100<f)||d!=g&&(""==d||!qd(d)))return k;this.t(ge(a,b,c,d));return h};
|
||||
D.za=function(a,b,c,d){if(!a||!b)return k;this.set(tc,a,h);this.set(uc,b,h);this.set(vc,c||J[y][wa],h);d&&this.set(Bb,d,h);this.a.i("social");return h};D.xa=function(){this.set(wc,10);this.I(this.F)};D.Ba=function(){this.a.i("trans")};D.t=function(a){this.set(Ab,a,h);this.a.i("event")};D.ea=function(a){this.u();var b=this;return{_trackEvent:function(c,d,e){H(91);b.D(a,c,d,e)}}};D.ha=function(a){return this.get(a)};
|
||||
D.qa=function(a,b){if(a)if(Ba(a))this.set(a,b);else if("object"==typeof a)for(var c in a)a.hasOwnProperty(c)&&this.set(c,a[c])};D.addEventListener=function(a,b){var c=this.get(Ec)[a];c&&c[m](b)};D.removeEventListener=function(a,b){for(var c=this.get(Ec)[a],d=0;c&&d<c[v];d++)if(c[d]==b){c.splice(d,1);break}};D.ja=function(){return"5.2.9"};D.C=function(a){this.get(eb);a="auto"==a?Ka(J.domain):!a||"-"==a||"none"==a?"":a[C]();this.set(Za,a)};D.oa=function(a){this.set(eb,!!a)};
|
||||
D.ia=function(a,b){return Td(this.a,a,b)};D.link=function(a,b){if(this.a.get(cb)&&a){var c=Td(this.a,a,b);J[y].href=c}};D.na=function(a,b){this.a.get(cb)&&(a&&a.action)&&(a.action=Td(this.a,a.action,b))};
|
||||
D.sa=function(){this.u();var a=this.a,b=J.getElementById?J.getElementById("utmtrans"):J.utmform&&J.utmform.utmtrans?J.utmform.utmtrans:i;if(b&&b[la]){a.set(yb,[]);for(var b=b[la][x]("UTM:"),c=0;c<b[v];c++){b[c]=Ca(b[c]);for(var d=b[c][x](Ud),e=0;e<d[v];e++)d[e]=Ca(d[e]);"T"==d[0]?Wd(a,d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8]):"I"==d[0]&&Xd(a,d[1],d[2],d[3],d[4],d[5],d[6])}}};D.Y=function(a,b,c,d,e,f,j,o){return Wd(this.a,a,b,c,d,e,f,j,o)};D.W=function(a,b,c,d,e,f){return Xd(this.a,a,b,c,d,e,f)};
|
||||
D.ta=function(a){Ud=a||"|"};D.pa=function(a,b,c,d){var e=this.a;if(0>=a||a>e.get(ub))a=k;else if(!b||!c||128<b[v]+c[v])a=k;else{1!=d&&2!=d&&(d=3);var f={};ga(f,b);f.value=c;f.scope=d;e.get(Q)[a]=f;a=h}a&&this.a.n();return a};D.ga=function(a){this.a.get(Q)[a]=g;this.a.n()};D.ka=function(a){return(a=this.a.get(Q)[a])&&1==a[ta]?a[la]:g};D.va=function(a,b,c){this.m().f(a,b,c)};D.wa=function(a,b,c){this.m().o(a,b,c)};D.la=function(a,b){return this.m().getKey(a,b)};
|
||||
D.ma=function(a,b){return this.m().L(a,b)};D.ba=function(a){this.m().J(a)};D.ca=function(a){this.m().K(a)};D.fa=function(){return new td};D.U=function(a){a&&this.get(wb)[m](a[C]())};D.Z=function(){this.set(wb,[])};D.V=function(a){a&&this.get(xb)[m](a[C]())};D.$=function(){this.set(xb,[])};D.X=function(a,b,c,d,e){if(a&&b){a=[a,b[C]()][B](":");if(d||e)a=[a,d,e][B](":");d=this.get(vb);d.splice(c?0:d[v],0,a)}};D.aa=function(){this.set(vb,[])};
|
||||
D.da=function(a){this.a[ia]();var b=this.get(P),c=Sd(this.a);this.set(P,a);this.a.n();Rd(this.a,c);this.set(P,b)};D.ra=function(a,b){if(0<a&&5>=a&&Ba(b)&&""!=b){var c=this.get(yc)||[];c[a]=b;this.set(yc,c)}};D.T=function(a){a=""+a;if(a[ma](/^[A-Za-z0-9]{1,5}$/)){var b=this.get(Cc)||[];b[m](a);this.set(Cc,b)}};D.u=function(){this.a[ia]()};D.ua=function(a){a&&""!=a&&(this.set(Nb,a),this.a.i("var"))};var he=function(a){"trans"!==a.get(lc)&&500<=a.b(Xb,0)&&a[ra]();if("event"===a.get(lc)){var b=(new Date).getTime(),c=a.b(Yb,0),d=a.b(Tb,0),c=l[ja](1*((b-(c!=d?c:1E3*c))/1E3));0<c&&(a.set(Yb,b),a.set(S,l.min(10,a.b(S,0)+c)));0>=a.b(S,0)&&a[ra]()}},je=function(a){"event"===a.get(lc)&&a.set(S,l.max(0,a.b(S,10)-1))};var ke=function(){var a=[];this.add=function(b,c,d){d&&(c=G(""+c));a[m](b+"="+c)};this.toString=function(){return a[B]("&")}},le=function(a,b){(b||2!=a.get(tb))&&a.v(Xb)},me=function(a,b){b.add("utmwv","5.2.9");b.add("utms",a.get(Xb));b.add("utmn",Da());var c=J[y].hostname;E(c)||b.add("utmhn",c,h);c=a.get(rb);100!=c&&b.add("utmsp",c,h)},oe=function(a,b){b.add("utmac",Ca(a.get(N)));a.get(Fc)&&b.add("utmxkey",a.get(Fc),h);a.get(oc)&&b.add("utmni",1);var c=a.get(Cc);c&&0<c[v]&&b.add("utmdid",c[B]("."));
|
||||
ne(a,b);L.A&&b.add("aip",1);b.add("utmu",hd.Va())},pe=function(a,b){for(var c=a.get(yc)||[],d=[],e=1;e<c[v];e++)c[e]&&d[m](e+":"+G(c[e][n](/%/g,"%25")[n](/:/g,"%3A")[n](/,/g,"%2C")));d[v]&&b.add("utmpg",d[B](","))},ne=function(a,b){function c(a,b){b&&d[m](a+"="+b+";")}var d=[];c("__utma",Uc(a));c("__utmz",$c(a,k));c("__utmv",Xc(a,h));c("__utmx",Sd(a));b.add("utmcc",d[B]("+"),h)},qe=function(a,b){a.get(fb)&&(b.add("utmcs",a.get(Kb),h),b.add("utmsr",a.get(Fb)),a.get(Lb)&&b.add("utmvp",a.get(Lb)),b.add("utmsc",
|
||||
a.get(Gb)),b.add("utmul",a.get(Jb)),b.add("utmje",a.get(Hb)),b.add("utmfl",a.get(Ib),h))},re=function(a,b){a.get(ib)&&a.get(Cb)&&b.add("utmdt",a.get(Cb),h);b.add("utmhid",a.get(Eb));b.add("utmr",Oa(a.get(Db),a.get(P)),h);b.add("utmp",G(a.get(Bb),h),h)},se=function(a,b){for(var c=a.get(zb),d=a.get(Ab),e=a.get(Q)||[],f=0;f<e[v];f++){var j=e[f];j&&(c||(c=new td),c.f(8,f,j[q]),c.f(9,f,j[la]),3!=j[ta]&&c.f(11,f,""+j[ta]))}!E(a.get(pc))&&!E(a.get(qc),h)&&(c||(c=new td),c.f(5,1,a.get(pc)),c.f(5,2,a.get(qc)),
|
||||
e=a.get(rc),e!=g&&c.f(5,3,e),e=a.get(sc),e!=g&&c.o(5,1,e));c?b.add("utme",c.Ka(d),h):d&&b.add("utme",d.z(),h)},te=function(a,b,c){var d=new ke;le(a,c);me(a,d);d.add("utmt","tran");d.add("utmtid",b.id_,h);d.add("utmtst",b.affiliation_,h);d.add("utmtto",b.total_,h);d.add("utmttx",b.tax_,h);d.add("utmtsp",b.shipping_,h);d.add("utmtci",b.city_,h);d.add("utmtrg",b.state_,h);d.add("utmtco",b.country_,h);c||(pe(a,d),oe(a,d));return d[u]()},ue=function(a,b,c){var d=new ke;le(a,c);me(a,d);d.add("utmt","item");
|
||||
d.add("utmtid",b.transId_,h);d.add("utmipc",b.sku_,h);d.add("utmipn",b.name_,h);d.add("utmiva",b.category_,h);d.add("utmipr",b.price_,h);d.add("utmiqt",b.quantity_,h);c||(pe(a,d),oe(a,d));return d[u]()},ve=function(a,b){var c=a.get(lc);if("page"==c)c=new ke,le(a,b),me(a,c),se(a,c),qe(a,c),re(a,c),b||(pe(a,c),oe(a,c)),c=[c[u]()];else if("event"==c)c=new ke,le(a,b),me(a,c),c.add("utmt","event"),se(a,c),qe(a,c),re(a,c),b||(pe(a,c),oe(a,c)),c=[c[u]()];else if("var"==c)c=new ke,le(a,b),me(a,c),c.add("utmt",
|
||||
"var"),!b&&oe(a,c),c=[c[u]()];else if("trans"==c)for(var c=[],d=a.get(yb),e=0;e<d[v];++e){c[m](te(a,d[e],b));for(var f=d[e].items_,j=0;j<f[v];++j)c[m](ue(a,f[j],b))}else"social"==c?b?c=[]:(c=new ke,le(a,b),me(a,c),c.add("utmt","social"),c.add("utmsn",a.get(tc),h),c.add("utmsa",a.get(uc),h),c.add("utmsid",a.get(vc),h),se(a,c),qe(a,c),re(a,c),pe(a,c),oe(a,c),c=[c[u]()]):c=[];return c},ie=function(a){var b,c=a.get(tb),d=a.get(nc),e=d&&d.Sa,f=0;if(0==c||2==c){var j=a.get(sb)+"?";b=ve(a,h);for(var o=0,
|
||||
r=b[v];o<r;o++)Sa(b[o],e,j,h),f++}if(1==c||2==c){b=ve(a);o=0;for(r=b[v];o<r;o++)try{Sa(b[o],e),f++}catch(s){s&&Ra(s[q],g,s.message)}}d&&(d.q=f)};var we="https:"==J[y][z]?"https://ssl.google-analytics.com":"http://www.google-analytics.com",xe=function(a){ga(this,"len");this.message=a+"-8192"},ye=function(a){ga(this,"ff2post");this.message=a+"-2036"},Sa=function(a,b,c,d){b=b||Ea;if(d||2036>=a[v])ze(a,b,c);else if(8192>=a[v]){if(0<=W[ya].userAgent[p]("Firefox")&&![].reduce)throw new ye(a[v]);Ae(a,b)||Be(a,b)}else throw new xe(a[v]);},ze=function(a,b,c){var c=c||we+"/__utm.gif?",d=new Image(1,1);d.src=c+a;d.onload=function(){d.onload=i;d.onerror=
|
||||
i;b()};d.onerror=function(){d.onload=i;d.onerror=i;b()}},Ae=function(a,b){var c,d=we+"/p/__utm.gif",e=W.XDomainRequest;if(e)c=new e,c.open("POST",d);else if(e=W.XMLHttpRequest)e=new e,"withCredentials"in e&&(c=e,c.open("POST",d,h),c.setRequestHeader("Content-Type","text/plain"));if(c)return c.onreadystatechange=function(){4==c.readyState&&(b(),c=i)},c.send(a),h},Be=function(a,b){if(J.body){a=aa(a);try{var c=J[oa]('<iframe name="'+a+'"></iframe>')}catch(d){c=J[oa]("iframe"),ga(c,a)}c.height="0";c.width=
|
||||
"0";c.style.display="none";c.style.visibility="hidden";var e=J[y],e=we+"/u/post_iframe.html#"+aa(e[z]+"//"+e[t]+"/favicon.ico"),f=function(){c.src="";c.parentNode&&c.parentNode.removeChild(c)};Fa(W,"beforeunload",f);var j=k,o=0,r=function(){if(!j){try{if(9<o||c.contentWindow[y][t]==J[y][t]){j=h;f();Ga(W,"beforeunload",f);b();return}}catch(a){}o++;ea(r,200)}};Fa(c,"load",r);J.body.appendChild(c);c.src=e}else id(function(){Be(a,b)},100)};var $=function(){this.A=k;this.M={};this.N=[];this.Ma=0;this.Ea=[["www.google-analytics.com","","/plugins/"]];this._gasoCPath=this._gasoDomain=g;T($[w],"_createTracker",$[w].s,55);T($[w],"_getTracker",$[w].Oa,0);T($[w],"_getTrackerByName",$[w].w,51);T($[w],"_getTrackers",$[w].Pa,130);T($[w],"_anonymizeIp",$[w].Na,16);T($[w],"_getPlugin",Hc,120);Ic()};D=$[w];D.Oa=function(a,b){return this.s(a,g,b)};D.s=function(a,b,c){b&&H(23);c&&H(67);b==g&&(b="~"+L.Ma++);a=new U(b,a,c);L.M[b]=a;L.N[m](a);return a};
|
||||
D.w=function(a){a=a||"";return L.M[a]||L.s(g,a)};D.Pa=function(){return L.N[ha](0)};D.Na=function(){this.A=h};var Ce=function(a){if("prerender"==J.webkitVisibilityState)return k;a();return h};var L=new $;var De=W._gat;De&&Aa(De._getTracker)?L=De:W._gat=L;var Z=new Y;(function(a){if(!Ce(a)){H(123);var b=k,c=function(){!b&&Ce(a)&&(b=h,Ga(J,"webkitvisibilitychange",c))};Fa(J,"webkitvisibilitychange",c)}})(function(){var a=W._gaq,b=k;if(a&&Aa(a[m])&&(b="[object Array]"==Object[w][u].call(Object(a)),!b)){Z=a;return}W._gaq=Z;b&&Z[m][xa](Z,a)});})();
|
||||
@@ -0,0 +1,50 @@
|
||||
'use strict';window.PR_SHOULD_USE_CONTINUATION=!0;window.PR_TAB_WIDTH=8;window.PR_normalizedHtml=window.PR=window.prettyPrintOne=window.prettyPrint=void 0;window._pr_isIE6=function(){var y=navigator&&navigator.userAgent&&navigator.userAgent.match(/\bMSIE ([6789])\./),y=y?+y[1]:!1;window._pr_isIE6=function(){return y};return y};
|
||||
(function(){function y(a){return a.replace(H,"&").replace(I,"<").replace(J,">")}function D(a,c,h){switch(a.nodeType){case 1:var l=a.tagName.toLowerCase();c.push("<",l);var g=a.attributes,k=g.length;if(k){if(h){for(var s=[],j=k;0<=--j;)s[j]=g[j];s.sort(function(a,c){return a.name<c.name?-1:a.name===c.name?0:1});g=s}for(j=0;j<k;++j)s=g[j],s.specified&&c.push(" ",s.name.toLowerCase(),'="',s.value.replace(H,"&").replace(I,"<").replace(J,">").replace(S,"""),'"')}c.push(">");for(g=
|
||||
a.firstChild;g;g=g.nextSibling)D(g,c,h);(a.firstChild||!/^(?:br|link|img)$/.test(l))&&c.push("</",l,">");break;case 3:case 4:c.push(y(a.nodeValue))}}function K(a){function c(a){if("\\"!==a.charAt(0))return a.charCodeAt(0);switch(a.charAt(1)){case "b":return 8;case "t":return 9;case "n":return 10;case "v":return 11;case "f":return 12;case "r":return 13;case "u":case "x":return parseInt(a.substring(2),16)||a.charCodeAt(1);case "0":case "1":case "2":case "3":case "4":case "5":case "6":case "7":return parseInt(a.substring(1),
|
||||
8);default:return a.charCodeAt(1)}}function h(a){if(32>a)return(16>a?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if("\\"===a||"-"===a||"["===a||"]"===a)a="\\"+a;return a}function l(a){for(var f=a.substring(1,a.length-1).match(/\\u[0-9A-Fa-f]{4}|\\x[0-9A-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\s\S]|-|[^-\\]/g),a=[],b=[],j="^"===f[0],e=j?1:0,n=f.length;e<n;++e){var i=f[e];switch(i){case "\\B":case "\\b":case "\\D":case "\\d":case "\\S":case "\\s":case "\\W":case "\\w":a.push(i);continue}var i=
|
||||
c(i),d;e+2<n&&"-"===f[e+1]?(d=c(f[e+2]),e+=2):d=i;b.push([i,d]);65>d||122<i||(65>d||90<i||b.push([Math.max(65,i)|32,Math.min(d,90)|32]),97>d||122<i||b.push([Math.max(97,i)&-33,Math.min(d,122)&-33]))}b.sort(function(a,b){return a[0]-b[0]||b[1]-a[1]});f=[];i=[NaN,NaN];for(e=0;e<b.length;++e)n=b[e],n[0]<=i[1]+1?i[1]=Math.max(i[1],n[1]):f.push(i=n);b=["["];j&&b.push("^");b.push.apply(b,a);for(e=0;e<f.length;++e)n=f[e],b.push(h(n[0])),n[1]>n[0]&&(n[1]+1>n[0]&&b.push("-"),b.push(h(n[1])));b.push("]");return b.join("")}
|
||||
function g(a){for(var f=a.source.match(RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g")),b=f.length,c=[],e=0,d=0;e<b;++e){var i=f[e];"("===i?++d:"\\"===i.charAt(0)&&(i=+i.substring(1))&&i<=d&&(c[i]=-1)}for(e=1;e<c.length;++e)-1===c[e]&&(c[e]=++k);for(d=e=0;e<b;++e)i=f[e],"("===i?(++d,void 0===c[d]&&(f[e]="(?:")):"\\"===i.charAt(0)&&(i=+i.substring(1))&&i<=d&&(f[e]="\\"+c[d]);for(d=
|
||||
e=0;e<b;++e)"^"===f[e]&&"^"!==f[e+1]&&(f[e]="");if(a.ignoreCase&&s)for(e=0;e<b;++e)i=f[e],a=i.charAt(0),2<=i.length&&"["===a?f[e]=l(i):"\\"!==a&&(f[e]=i.replace(/[a-zA-Z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var k=0,s=!1,j=!1,q=0,d=a.length;q<d;++q){var w=a[q];if(w.ignoreCase)j=!0;else if(/[a-z]/i.test(w.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){s=!0;j=!1;break}}for(var p=[],q=0,d=a.length;q<d;++q){w=a[q];if(w.global||
|
||||
w.multiline)throw Error(""+w);p.push("(?:"+g(w)+")")}return RegExp(p.join("|"),j?"gi":"g")}function T(a){var c=0;return function(h){for(var l=null,g=0,k=0,s=h.length;k<s;++k)switch(h.charAt(k)){case "\t":l||(l=[]);l.push(h.substring(g,k));g=a-c%a;for(c+=g;0<=g;g-=16)l.push(" ".substring(0,g));g=k+1;break;case "\n":c=0;break;default:++c}if(!l)return h;l.push(h.substring(g));return l.join("")}}function E(a,c,h,l){c&&(a={source:c,basePos:a},h(a),l.push.apply(l,a.decorations))}function A(a,
|
||||
c){var h={},l;(function(){for(var g=a.concat(c),j=[],k={},d=0,w=g.length;d<w;++d){var p=g[d],m=p[3];if(m)for(var f=m.length;0<=--f;)h[m.charAt(f)]=p;p=p[1];m=""+p;k.hasOwnProperty(m)||(j.push(p),k[m]=null)}j.push(/[\0-\uffff]/);l=K(j)})();var g=c.length,k=function(a){for(var j=a.basePos,q=[j,x],d=0,w=a.source.match(l)||[],p={},m=0,f=w.length;m<f;++m){var b=w[m],r=p[b],e=void 0,n;if("string"===typeof r)n=!1;else{var i=h[b.charAt(0)];if(i)e=b.match(i[1]),r=i[0];else{for(n=0;n<g;++n)if(i=c[n],e=b.match(i[1])){r=
|
||||
i[0];break}e||(r=x)}if((n=5<=r.length&&"lang-"===r.substring(0,5))&&!(e&&"string"===typeof e[1]))n=!1,r=L;n||(p[b]=r)}i=d;d+=b.length;if(n){n=e[1];var u=b.indexOf(n),o=u+n.length;e[2]&&(o=b.length-e[2].length,u=o-n.length);r=r.substring(5);E(j+i,b.substring(0,u),k,q);E(j+i+u,n,M(r,n),q);E(j+i+o,b.substring(o),k,q)}else q.push(j+i,r)}a.decorations=q};return k}function t(a){var c=[],h=[];a.tripleQuotedStrings?c.push([v,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
|
||||
null,"'\""]):a.multiLineStrings?c.push([v,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"]):c.push([v,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"]);a.verbatimStrings&&h.push([v,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null]);var l=a.hashComments;l&&(a.cStyleComments?(1<l?c.push([z,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"]):c.push([z,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,
|
||||
null,"#"]),h.push([v,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])):c.push([z,/^#[^\r\n]*/,null,"#"]));a.cStyleComments&&(h.push([z,/^\/\/[^\r\n]*/,null]),h.push([z,/^\/\*[\s\S]*?(?:\*\/|$)/,null]));a.regexLiterals&&h.push(["lang-regex",RegExp("^"+U+"(/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/)")]);a=a.keywords.replace(/^\s+|\s+$/g,"");a.length&&h.push([N,RegExp("^(?:"+a.replace(/\s+/g,"|")+")\\b"),null]);c.push([x,
|
||||
/^\s+/,null," \r\n\t\u00a0"]);h.push([F,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^@?[A-Z]+[a-z][A-Za-z_$@0-9]*/,null],[x,/^[a-z_$][a-z_$@0-9]*/i,null],[F,/^(?:0x[a-f0-9]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+\-]?\d+)?)[a-z]*/i,null,"0123456789"],[B,/^.[^\s\w\.$@\'\"\`\/\#]*/,null]);return A(c,h)}function V(a){function c(a){if(a>q){d&&d!==o&&(j.push("</span>"),d=null);!d&&o&&(d=o,j.push('<span class="',d,'">'));var c=y(f(h.substring(q,a))).replace(i?r:b,"$1 ");i=n.test(c);j.push(c.replace(e,t));
|
||||
q=a}}var h=a.source,l=a.extractedTags,g=a.decorations,k=a.numberLines,s=a.sourceNode,j=[],q=0,d=null,o=null,p=0,m=0,f=T(window.PR_TAB_WIDTH),b=/([\r\n ]) /g,r=/(^| ) /gm,e=/\r\n?|\n/g,n=/[ \r\n]$/,i=!0,u=window._pr_isIE6(),s=u?s&&"PRE"===s.tagName?6===u?" \r\n":7===u?" <br />\r":8===u?" <br />":" \r":" <br />":"<br />",t;if(k){for(var x=[],u=0;10>u;++u)x[u]=s+'</li><li class="L'+u+'">';var v="number"===typeof k?k-1:0;j.push('<ol class="linenums"><li class="L',v%10,'"');v&&
|
||||
j.push(' value="',v+1,'"');j.push(">");t=function(){var a=x[++v%10];return d?"</span>"+a+'<span class="'+d+'">':a}}else t=s;for(;;)if(p<l.length&&(m<g.length?l[p]<=g[m]:1))c(l[p]),d&&(j.push("</span>"),d=null),j.push(l[p+1]),p+=2;else if(m<g.length)c(g[m]),o=g[m+1],m+=2;else break;c(h.length);d&&j.push("</span>");k&&j.push("</li></ol>");a.prettyPrintedHtml=j.join("")}function o(a,c){for(var h=c.length;0<=--h;){var l=c[h];C.hasOwnProperty(l)?"console"in window&&console.warn("cannot override language handler %s",
|
||||
l):C[l]=a}}function M(a,c){if(!a||!C.hasOwnProperty(a))a=/^\s*</.test(c)?"default-markup":"default-code";return C[a]}function P(a){var c,h=a.sourceCodeHtml,l=a.langExtension;a.prettyPrintedHtml=h;try{var g=h.match(W),h=[],k=0,o=[];if(g)for(var j=0,q=g.length;j<q;++j){var d=g[j];if(1<d.length&&"<"===d.charAt(0)){if(!X.test(d))if(Y.test(d))h.push(d.substring(9,d.length-3)),k+=d.length-12;else if(Z.test(d))h.push("\n"),++k;else if(0<=d.indexOf(Q)&&d.replace(/\s(\w+)\s*=\s*(?:\"([^\"]*)\"|'([^\']*)'|(\S+))/g,
|
||||
' $1="$2$3$4"').match(/[cC][lL][aA][sS][sS]=\"[^\"]*\bnocode\b/)){var t=d.match(R)[2],p=1,m;m=j+1;a:for(;m<q;++m){var f=g[m].match(R);if(f&&f[2]===t)if("/"===f[1]){if(0===--p)break a}else++p}m<q?(o.push(k,g.slice(j,m+1).join("")),j=m):o.push(k,d)}else o.push(k,d)}else{var b;var p=d,r=p.indexOf("&");if(0>r)b=p;else{for(--r;0<=(r=p.indexOf("&#",r+1));){var e=p.indexOf(";",r);if(0<=e){var n=p.substring(r+3,e),i=10;n&&"x"===n.charAt(0)&&(n=n.substring(1),i=16);var u=parseInt(n,i);isNaN(u)||(p=p.substring(0,
|
||||
r)+String.fromCharCode(u)+p.substring(e+1))}}b=p.replace($,"<").replace(aa,">").replace(ba,"'").replace(ca,'"').replace(da," ").replace(ea,"&")}h.push(b);k+=b.length}}c=h.join("");a.source=c;a.basePos=0;a.extractedTags=o;M(l,c)(a);V(a)}catch(v){"console"in window&&console.log(v&&v.stack?v.stack:v)}}var v="str",N="kwd",z="com",O="typ",F="lit",B="pun",x="pln",L="src",Q="nocode",U=function(){for(var a="! != !== # % %= & && &&= &= ( * *= += , -= -> / /= : :: ; < << <<= <= = == === > >= >> >>= >>> >>>= ? @ [ ^ ^= ^^ ^^= { | |= || ||= ~ break case continue delete do else finally instanceof return throw try typeof".split(" "),
|
||||
c="(?:^^|[+-]",h=0;h<a.length;++h)c+="|"+a[h].replace(/([^=<>:&a-z])/g,"\\$1");return c+")\\s*"}(),H=/&/g,I=/</g,J=/>/g,S=/\"/g,$=/</g,aa=/>/g,ba=/'/g,ca=/"/g,ea=/&/g,da=/ /g,fa=/[\r\n]/g,G=null,W=/[^<]+|<\!--[\s\S]*?--\>|<!\[CDATA\[[\s\S]*?\]\]>|<\/?[a-zA-Z](?:[^>"']|'[^']*'|"[^"]*")*>|</g,X=/^<\!--/,Y=/^<!\[CDATA\[/,Z=/^<br\b/i,R=/^<(\/?)([a-zA-Z][a-zA-Z0-9]*)/,ga=t({keywords:"break continue do else for if return while auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile catch class delete false import new operator private protected public this throw true try typeof alignof align_union asm axiom bool concept concept_map const_cast constexpr decltype dynamic_cast explicit export friend inline late_check mutable namespace nullptr reinterpret_cast static_assert static_cast template typeid typename using virtual wchar_t where break continue do else for if return while auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile catch class delete false import new operator private protected public this throw true try typeof abstract boolean byte extends final finally implements import instanceof null native package strictfp super synchronized throws transient as base by checked decimal delegate descending dynamic event fixed foreach from group implicit in interface internal into is lock object out override orderby params partial readonly ref sbyte sealed stackalloc string select uint ulong unchecked unsafe ushort var break continue do else for if return while auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile catch class delete false import new operator private protected public this throw true try typeof debugger eval export function get null set undefined var with Infinity NaN caller delete die do dump elsif eval exit foreach for goto if import last local my next no our print package redo require sub undef unless until use wantarray while BEGIN END break continue do else for if return while and as assert class def del elif except exec finally from global import in is lambda nonlocal not or pass print raise try with yield False True None break continue do else for if return while alias and begin case class def defined elsif end ensure false in module next nil not or redo rescue retry self super then true undef unless until when yield BEGIN END break continue do else for if return while case done elif esac eval fi function in local set then until ",
|
||||
hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),C={};o(ga,["default-code"]);o(A([],[[x,/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],[z,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[B,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),"default-markup,htm,html,mxml,xhtml,xml,xsl".split(","));
|
||||
o(A([[x,/^[\s]+/,null," \t\r\n"],["atv",/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[B,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),
|
||||
["in.tag"]);o(A([],[["atv",/^[\s\S]+/]]),["uq.val"]);o(t({keywords:"break continue do else for if return while auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile catch class delete false import new operator private protected public this throw true try typeof alignof align_union asm axiom bool concept concept_map const_cast constexpr decltype dynamic_cast explicit export friend inline late_check mutable namespace nullptr reinterpret_cast static_assert static_cast template typeid typename using virtual wchar_t where ",
|
||||
hashComments:!0,cStyleComments:!0}),"c,cc,cpp,cxx,cyc,m".split(","));o(t({keywords:"null true false"}),["json"]);o(t({keywords:"break continue do else for if return while auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile catch class delete false import new operator private protected public this throw true try typeof abstract boolean byte extends final finally implements import instanceof null native package strictfp super synchronized throws transient as base by checked decimal delegate descending dynamic event fixed foreach from group implicit in interface internal into is lock object out override orderby params partial readonly ref sbyte sealed stackalloc string select uint ulong unchecked unsafe ushort var ",
|
||||
hashComments:!0,cStyleComments:!0,verbatimStrings:!0}),["cs"]);o(t({keywords:"break continue do else for if return while auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile catch class delete false import new operator private protected public this throw true try typeof abstract boolean byte extends final finally implements import instanceof null native package strictfp super synchronized throws transient ",
|
||||
cStyleComments:!0}),["java"]);o(t({keywords:"break continue do else for if return while case done elif esac eval fi function in local set then until ",hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);o(t({keywords:"break continue do else for if return while and as assert class def del elif except exec finally from global import in is lambda nonlocal not or pass print raise try with yield False True None ",hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py"]);o(t({keywords:"caller delete die do dump elsif eval exit foreach for goto if import last local my next no our print package redo require sub undef unless until use wantarray while BEGIN END ",
|
||||
hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);o(t({keywords:"break continue do else for if return while alias and begin case class def defined elsif end ensure false in module next nil not or redo rescue retry self super then true undef unless until when yield BEGIN END ",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);o(t({keywords:"break continue do else for if return while auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile catch class delete false import new operator private protected public this throw true try typeof debugger eval export function get null set undefined var with Infinity NaN ",
|
||||
cStyleComments:!0,regexLiterals:!0}),["js"]);o(t({keywords:"all and by catch class else extends false finally for if in is isnt loop new no not null of off on or return super then true try unless until when while yes ",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);o(A([],[[v,/^[\s\S]+/]]),["regex"]);window.PR_normalizedHtml=D;window.prettyPrintOne=function(a,c,h){a={sourceCodeHtml:a,langExtension:c,numberLines:h};P(a);return a.prettyPrintedHtml};
|
||||
window.prettyPrint=function(a){function c(){for(var h=window.PR_SHOULD_USE_CONTINUATION?j.now()+250:Infinity;q<l.length&&j.now()<h;q++){var g=l[q];if(g.className&&0<=g.className.indexOf("prettyprint")){var m=g.className.match(/\blang-(\w+)\b/);m&&(m=m[1]);for(var f=!1,b=g.parentNode;b;b=b.parentNode)if(("pre"===b.tagName||"code"===b.tagName||"xmp"===b.tagName)&&b.className&&0<=b.className.indexOf("prettyprint")){f=!0;break}if(!f){b=g;null===G&&(f=document.createElement("PRE"),f.appendChild(document.createTextNode('<!DOCTYPE foo PUBLIC "foo bar">\n<foo />')),
|
||||
G=!/</.test(f.innerHTML));if(G)if(f=b.innerHTML,"XMP"===b.tagName)f=y(f);else{if("PRE"===b.tagName||!fa.test(f))b=!0;else{var k="";b.currentStyle?k=b.currentStyle.whiteSpace:window.getComputedStyle&&(k=window.getComputedStyle(b,null).whiteSpace);b=!k||"pre"===k}b||(f=f.replace(/(<br\s*\/?>)[\r\n]+/g,"$1").replace(/(?:[\r\n]+[ \t]*)+/g," "))}else{f=[];for(b=b.firstChild;b;b=b.nextSibling)D(b,f);f=f.join("")}f=f.replace(/(?:\r\n?|\n)$/,"");b=g.className.match(/\blinenums\b(?::(\d+))?/);d={sourceCodeHtml:f,
|
||||
langExtension:m,sourceNode:g,numberLines:b?b[1]&&b[1].length?+b[1]:!0:!1};P(d);if(g=d.prettyPrintedHtml)if(m=d.sourceNode,"XMP"===m.tagName){f=document.createElement("PRE");for(b=0;b<m.attributes.length;++b)k=m.attributes[b],k.specified&&("class"===k.name.toLowerCase()?f.className=k.value:f.setAttribute(k.name,k.value));f.innerHTML=g;m.parentNode.replaceChild(f,m)}else m.innerHTML=g}}}q<l.length?setTimeout(c,250):a&&a()}for(var h=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),
|
||||
document.getElementsByTagName("xmp")],l=[],g=0;g<h.length;++g)for(var k=0,o=h[g].length;k<o;++k)l.push(h[g][k]);var h=null,j=Date;j.now||(j={now:function(){return(new Date).getTime()}});var q=0,d;c()};window.PR={combinePrefixPatterns:K,createSimpleLexer:A,registerLangHandler:o,sourceDecorator:t,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:z,PR_DECLARATION:"dec",PR_KEYWORD:N,PR_LITERAL:F,PR_NOCODE:Q,PR_PLAIN:x,PR_PUNCTUATION:B,PR_SOURCE:L,PR_STRING:v,PR_TAG:"tag",PR_TYPE:O}})();
|
||||
PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\u000c"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],
|
||||
[PR.PR_COMMENT,/^(?:<\!--|--\>)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]);
|
||||
PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[\t\n\x0B\x0C\r ]+/,null,"\t\n\x0B\u000c\r "],[PR.PR_STRING,/^\"(?:[^\"\\\n\x0C\r]|\\[\s\S])*(?:\"|$)/,null,'"'],[PR.PR_STRING,/^\'(?:[^\'\\\n\x0C\r]|\\[^&])\'?/,null,"'"],[PR.PR_LITERAL,/^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+\-]?\d+)?)/i,null,"0123456789"]],[[PR.PR_COMMENT,/^(?:(?:--+(?:[^\r\n\x0C]*)?)|(?:\{-(?:[^-]|-+[^-\}])*-\}))/],[PR.PR_KEYWORD,/^(?:case|class|data|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|then|type|where|_)(?=[^a-zA-Z0-9\']|$)/,
|
||||
null],[PR.PR_PLAIN,/^(?:[A-Z][\w\']*\.)*[a-zA-Z][\w\']*/],[PR.PR_PUNCTUATION,/^[^\t\n\x0B\x0C\r a-zA-Z0-9\'\"]+/]]),["hs"]);
|
||||
PR.registerLangHandler(PR.createSimpleLexer([["opn",/^\(+/,null,"("],["clo",/^\)+/,null,")"],[PR.PR_COMMENT,/^;[^\r\n]*/,null,";"],[PR.PR_PLAIN,/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],[PR.PR_STRING,/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/,null,'"']],[[PR.PR_KEYWORD,/^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/,null],
|
||||
[PR.PR_LITERAL,/^[+\-]?(?:[0#]x[0-9a-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[ed][+\-]?\d+)?)/i],[PR.PR_LITERAL,/^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],[PR.PR_PLAIN,/^-*(?:[a-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],[PR.PR_PUNCTUATION,/^[^\w\t\n\r \xA0()\"\\\';]+/]]),["cl","el","lisp","scm"]);
|
||||
PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],[PR.PR_STRING,/^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])*(?:\'|$))/,null,"\"'"]],[[PR.PR_COMMENT,/^--(?:\[(=*)\[[\s\S]*?(?:\]\1\]|$)|[^\r\n]*)/],[PR.PR_STRING,/^\[(=*)\[[\s\S]*?(?:\]\1\]|$)/],[PR.PR_KEYWORD,/^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,null],[PR.PR_LITERAL,/^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],
|
||||
[PR.PR_PLAIN,/^[a-z_]\w*/i],[PR.PR_PUNCTUATION,/^[^\w\t\n\r \xA0][^\w\t\n\r \xA0\"\'\-\+=]*/]]),["lua"]);
|
||||
PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],[PR.PR_COMMENT,/^#(?:if[\t\n\r \xA0]+(?:[a-z_$][\w\']*|``[^\r\n\t`]*(?:``|$))|else|endif|light)/i,null,"#"],[PR.PR_STRING,/^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])(?:\'|$))/,null,"\"'"]],[[PR.PR_COMMENT,/^(?:\/\/[^\r\n]*|\(\*[\s\S]*?\*\))/],[PR.PR_KEYWORD,/^(?:abstract|and|as|assert|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|if|in|inherit|inline|interface|internal|lazy|let|match|member|module|mutable|namespace|new|null|of|open|or|override|private|public|rec|return|static|struct|then|to|true|try|type|upcast|use|val|void|when|while|with|yield|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|global|include|method|mixin|object|parallel|process|protected|pure|sealed|trait|virtual|volatile)\b/],[PR.PR_LITERAL,
|
||||
/^[+\-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],[PR.PR_PLAIN,/^(?:[a-z_][\w']*[!?#]?|``[^\r\n\t`]*(?:``|$))/i],[PR.PR_PUNCTUATION,/^[^\t\n\r \xA0\"\'\w]+/]]),["fs","ml"]);PR.registerLangHandler(PR.createSimpleLexer([],[]),["none"]);
|
||||
PR.registerLangHandler(PR.sourceDecorator({keywords:"bool bytes default double enum extend extensions false fixed32 fixed64 float group import int32 int64 max message option optional package repeated required returns rpc service sfixed32 sfixed64 sint32 sint64 string syntax to true uint32 uint64",cStyleComments:!0}),["proto"]);
|
||||
PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],[PR.PR_STRING,/^(?:"(?:(?:""(?:""?(?!")|[^\\"]|\\.)*"{0,3})|(?:[^"\r\n\\]|\\.)*"?))/,null,'"'],[PR.PR_LITERAL,/^`(?:[^\r\n\\`]|\\.)*`?/,null,"`"],[PR.PR_PUNCTUATION,/^[!#%&()*+,\-:;<=>?@\[\\\]^{|}~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[[PR.PR_STRING,/^'(?:[^\r\n\\']|\\(?:'|[^\r\n']+))'/],[PR.PR_LITERAL,/^'[a-zA-Z_$][\w$]*(?!['$\w])/],[PR.PR_KEYWORD,/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\b/],
|
||||
[PR.PR_LITERAL,/^(?:true|false|null|this)\b/],[PR.PR_LITERAL,/^(?:(?:0(?:[0-7]+|X[0-9A-F]+))L?|(?:(?:0|[1-9][0-9]*)(?:(?:\.[0-9]+)?(?:E[+\-]?[0-9]+)?F?|L?))|\\.[0-9]+(?:E[+\-]?[0-9]+)?F?)/i],[PR.PR_TYPE,/^[$_]*[A-Z][_$A-Z0-9]*[a-z][\w$]*/],[PR.PR_PLAIN,/^[$a-zA-Z_][\w$]*/],[PR.PR_COMMENT,/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],[PR.PR_PUNCTUATION,/^(?:\.+|\/)/]]),["scala"]);
|
||||
PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],[PR.PR_STRING,/^(?:"(?:[^\"\\]|\\.)*"|'(?:[^\'\\]|\\.)*')/,null,"\"'"]],[[PR.PR_COMMENT,/^(?:--[^\r\n]*|\/\*[\s\S]*?(?:\*\/|$))/],[PR.PR_KEYWORD,/^(?:ADD|ALL|ALTER|AND|ANY|AS|ASC|AUTHORIZATION|BACKUP|BEGIN|BETWEEN|BREAK|BROWSE|BULK|BY|CASCADE|CASE|CHECK|CHECKPOINT|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMN|COMMIT|COMPUTE|CONSTRAINT|CONTAINS|CONTAINSTABLE|CONTINUE|CONVERT|CREATE|CROSS|CURRENT|CURRENT_DATE|CURRENT_TIME|CURRENT_TIMESTAMP|CURRENT_USER|CURSOR|DATABASE|DBCC|DEALLOCATE|DECLARE|DEFAULT|DELETE|DENY|DESC|DISK|DISTINCT|DISTRIBUTED|DOUBLE|DROP|DUMMY|DUMP|ELSE|END|ERRLVL|ESCAPE|EXCEPT|EXEC|EXECUTE|EXISTS|EXIT|FETCH|FILE|FILLFACTOR|FOR|FOREIGN|FREETEXT|FREETEXTTABLE|FROM|FULL|FUNCTION|GOTO|GRANT|GROUP|HAVING|HOLDLOCK|IDENTITY|IDENTITYCOL|IDENTITY_INSERT|IF|IN|INDEX|INNER|INSERT|INTERSECT|INTO|IS|JOIN|KEY|KILL|LEFT|LIKE|LINENO|LOAD|NATIONAL|NOCHECK|NONCLUSTERED|NOT|NULL|NULLIF|OF|OFF|OFFSETS|ON|OPEN|OPENDATASOURCE|OPENQUERY|OPENROWSET|OPENXML|OPTION|OR|ORDER|OUTER|OVER|PERCENT|PLAN|PRECISION|PRIMARY|PRINT|PROC|PROCEDURE|PUBLIC|RAISERROR|READ|READTEXT|RECONFIGURE|REFERENCES|REPLICATION|RESTORE|RESTRICT|RETURN|REVOKE|RIGHT|ROLLBACK|ROWCOUNT|ROWGUIDCOL|RULE|SAVE|SCHEMA|SELECT|SESSION_USER|SET|SETUSER|SHUTDOWN|SOME|STATISTICS|SYSTEM_USER|TABLE|TEXTSIZE|THEN|TO|TOP|TRAN|TRANSACTION|TRIGGER|TRUNCATE|TSEQUAL|UNION|UNIQUE|UPDATE|UPDATETEXT|USE|USER|VALUES|VARYING|VIEW|WAITFOR|WHEN|WHERE|WHILE|WITH|WRITETEXT)(?=[^\w-]|$)/i,
|
||||
null],[PR.PR_LITERAL,/^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],[PR.PR_PLAIN,/^[a-z_][\w-]*/i],[PR.PR_PUNCTUATION,/^[^\w\t\n\r \xA0\"\'][^\w\t\n\r \xA0+\-\"\']*/]]),["sql"]);
|
||||
PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[\t\n\r \xA0]+/,null,"\t\n\r \u00a0"],[PR.PR_COMMENT,/^%[^\r\n]*/,null,"%"]],[[PR.PR_DECLARATION,/^\\([egx]?def|(new|renew|provide)(command|environment))\b/],[PR.PR_KEYWORD,/^\\[a-zA-Z@:]+/],[PR.PR_KEYWORD,/^\\./],[PR.PR_TYPE,/^[$&]/],[PR.PR_LITERAL,/[+-]?(?:\.\d+|\d+(?:\.\d*)?)(cm|em|ex|in|pc|pt|bp|mm)/i],[PR.PR_PUNCTUATION,/^[{}()\[\]=]+/]]),["latex","tex"]);
|
||||
PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[\t\n\r \xA0\u2028\u2029]+/,null,"\t\n\r \u00a0\u2028\u2029"],[PR.PR_STRING,/^(?:[\"\u201C\u201D](?:[^\"\u201C\u201D]|[\"\u201C\u201D]{2})(?:[\"\u201C\u201D]c|$)|[\"\u201C\u201D](?:[^\"\u201C\u201D]|[\"\u201C\u201D]{2})*(?:[\"\u201C\u201D]|$))/i,null,'"\u201c\u201d'],[PR.PR_COMMENT,/^[\'\u2018\u2019][^\r\n\u2028\u2029]*/,null,"'\u2018\u2019"]],[[PR.PR_KEYWORD,/^(?:AddHandler|AddressOf|Alias|And|AndAlso|Ansi|As|Assembly|Auto|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|CBool|CByte|CChar|CDate|CDbl|CDec|Char|CInt|Class|CLng|CObj|Const|CShort|CSng|CStr|CType|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else|ElseIf|End|EndIf|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get|GetType|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|Let|Lib|Like|Long|Loop|Me|Mod|Module|MustInherit|MustOverride|MyBase|MyClass|Namespace|New|Next|Not|NotInheritable|NotOverridable|Object|On|Option|Optional|Or|OrElse|Overloads|Overridable|Overrides|ParamArray|Preserve|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|Select|Set|Shadows|Shared|Short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TypeOf|Unicode|Until|Variant|Wend|When|While|With|WithEvents|WriteOnly|Xor|EndIf|GoSub|Let|Variant|Wend)\b/i,
|
||||
null],[PR.PR_COMMENT,/^REM[^\r\n\u2028\u2029]*/i],[PR.PR_LITERAL,/^(?:True\b|False\b|Nothing\b|\d+(?:E[+\-]?\d+[FRD]?|[FRDSIL])?|(?:&H[0-9A-F]+|&O[0-7]+)[SIL]?|\d*\.\d+(?:E[+\-]?\d+)?[FRD]?|#\s+(?:\d+[\-\/]\d+[\-\/]\d+(?:\s+\d+:\d+(?::\d+)?(\s*(?:AM|PM))?)?|\d+:\d+(?::\d+)?(\s*(?:AM|PM))?)\s+#)/i],[PR.PR_PLAIN,/^(?:(?:[a-z]|_\w)\w*|\[(?:[a-z]|_\w)\w*\])/i],[PR.PR_PUNCTUATION,/^[^\w\t\n\r \"\'\[\]\xA0\u2018\u2019\u201C\u201D\u2028\u2029]+/],[PR.PR_PUNCTUATION,/^(?:\[|\])/]]),["vb","vbs"]);
|
||||
StackExchange.prettify={applyCodeStyling:window.prettyPrint};
|
||||
@@ -0,0 +1,28 @@
|
||||
if(!__qc){var __qc={qcdst:function(){if(__qc.qctzoff(0)!=__qc.qctzoff(6))return 1;return 0;},qctzoff:function(m){var d1=new Date(2000,m,1,0,0,0,0);var t=d1.toGMTString();var d3=new Date(t.substring(0,t.lastIndexOf(" ")-1));return d1-d3;},qceuc:function(s){if(typeof(encodeURIComponent)=='function'){return encodeURIComponent(s);}
|
||||
else{return escape(s);}},qcrnd:function(){return Math.round(Math.random()*2147483647);},qcgc:function(n){var v='';var c=document.cookie;if(!c)return v;var i=c.indexOf(n+"=");var len=i+n.length+1;if(i>-1){var end=c.indexOf(";",len);if(end<0)end=c.length;v=c.substring(len,end);}
|
||||
return v;},qcdomain:function(){var d=document.domain;if(d.substring(0,4)=="www.")d=d.substring(4,d.length);var a=d.split(".");var len=a.length;if(len<3)return d;var e=a[len-1];if(e.length<3)return d;d=a[len-2]+"."+a[len-1];return d;},qhash2:function(h,s){for(var i=0;i<s.length;i++){h^=s.charCodeAt(i);h+=(h<<1)+(h<<4)+(h<<7)+(h<<8)+(h<<24);}
|
||||
return h;},qhash:function(s){var h1=0x811c9dc5,h2=0xc9dc5118;var hash1=__qc.qhash2(h1,s);var hash2=__qc.qhash2(h2,s);return(Math.round(Math.abs(hash1*hash2)/65536)).toString(16);},sd:["4dcfa7079941","127fdf7967f31","588ab9292a3f","32f92b0727e5","22f9aa38dfd3","a4abfe8f3e04","18b66bc1325c","958e70ea2f28","bdbf0cb4bbb","65118a0d557","40a1d9db1864","18ae3d985046","3b26460f55d"],qcsc:function(){var s="";var d=__qc.qcdomain();if(__qc.qad==1)return";fpan=u;fpa=";var qh=__qc.qhash(d);for(var i=0;i<__qc.sd.length;i++){if(__qc.sd[i]==qh)return";fpan=u;fpa=";}
|
||||
var u=document;var a=__qc.qcgc("__qca");if(a.length>0){s+=";fpan=0;fpa="+a;}
|
||||
else{var da=new Date();var db=new Date(da.getTime()+157680000000);a='P0-'+__qc.qcrnd()+'-'+da.getTime();u.cookie="__qca="+a+"; expires="+db.toGMTString()+"; path=/; domain="+d;a=__qc.qcgc("__qca");if(a.length>0){s+=";fpan=1;fpa="+a;}
|
||||
else{s+=";fpan=u;fpa=";}}
|
||||
return s;},qcdc:function(n){document.cookie=n+"=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain="+__qc.qcdomain();},qpxload:function(img){if(img&&typeof(img.width)=="number"&&img.width==3){__qc.qcdc("__qca");}},qcp:function(p,myqo){var s='',a=null;var media='webpage',event='load';if(myqo!=null){for(var k in myqo){if(typeof(k)!='string'){continue;}
|
||||
if(typeof(myqo[k])!='string'){continue;}
|
||||
if(k=='qacct'){a=myqo[k];continue;}
|
||||
s+=';'+k+p+'='+__qc.qceuc(myqo[k]);if(k=='media'){media=myqo[k];}
|
||||
if(k=='event'){event=myqo[k];}}}
|
||||
if(typeof a!="string"){if((typeof _qacct=="undefined")||(_qacct.length==0))return'';a=_qacct;}
|
||||
if(media=='webpage'&&event=='load'){for(var i=0;i<__qc.qpixelsent.length;i++){if(__qc.qpixelsent[i]==a)return'';}
|
||||
__qc.qpixelsent.push(a);}
|
||||
if(media=='ad'){__qc.qad=1;}
|
||||
s=';a'+p+'='+a+s;return s;},qcesc:function(s){return s.replace(/\./g,'%2E').replace(/,/g,'%2C');},qcd:function(o){return(typeof(o)!="undefined"&&o!=null);},qcogl:function(){var m=document.getElementsByTagName('meta');var o='';for(var i=0;i<m.length;i++){if(o.length>=1000)return o;if(__qc.qcd(m[i])&&__qc.qcd(m[i].attributes)&&__qc.qcd(m[i].attributes.property)&&__qc.qcd(m[i].attributes.property.value)&&__qc.qcd(m[i].content)){var p=m[i].attributes.property.value;var c=m[i].content;if(p.length>3&&p.substring(0,3)=='og:'){if(o.length>0)o+=',';var l=(c.length>80)?80:c.length;o+=__qc.qcesc(p.substring(3,p.length))+'.'+__qc.qcesc(c.substring(0,l));}}}
|
||||
return __qc.qceuc(o);},firepixel:function(qoptions){var e=(typeof(encodeURIComponent)=='function')?"n":"s";var r=__qc.qcrnd();var sr='',qo='',qm='',url='',ref='',je='u',ns='1';var qocount=0;__qc.qad=0;if(typeof __qc.qpixelsent=="undefined"){__qc.qpixelsent=new Array();}
|
||||
if(typeof qoptions!="undefined"&&qoptions!=null){__qc.qopts=qoptions;for(var k in __qc.qopts){if(typeof(__qc.qopts[k])=='string'){qo=__qc.qcp("",__qc.qopts);break;}else if(typeof(__qc.qopts[k])=='object'&&__qc.qopts[k]!=null){++qocount;qo+=__qc.qcp("."+qocount,__qc.qopts[k]);}}}else if(typeof _qacct=="string"){qo=__qc.qcp("",null);}
|
||||
if(qo.length==0)return;var ce=(navigator.cookieEnabled)?"1":"0";if(typeof navigator.javaEnabled!='undefined')je=(navigator.javaEnabled())?"1":"0";if(typeof _qmeta!="undefined"&&_qmeta!=null){qm=';m='+__qc.qceuc(_qmeta);_qmeta=null;}
|
||||
if(self.screen){sr=screen.width+"x"+screen.height+"x"+screen.colorDepth;}
|
||||
var d=new Date();var dst=__qc.qcdst();var qs='http';if(window.location.protocol=='https:'){qs+='s';}
|
||||
qs+="://pixel.quantserve.com";var fp=__qc.qcsc();if(window.location&&window.location.href)url=__qc.qceuc(window.location.href);if(window.document&&window.document.referrer)ref=__qc.qceuc(window.document.referrer);if(self==top)ns='0';var ogl=__qc.qcogl();var img=new Image();img.alt="";img.src=qs+'/pixel'+';r='+r+qo+fp+';ns='+ns+';ce='+ce+';je='+je+';sr='+sr+';enc='+e+';dst='+dst+';et='+d.getTime()+';tzo='+d.getTimezoneOffset()+qm+';ref='+ref+';url='+url+';ogl='+ogl;img.onload=function(){__qc.qpxload(img);}},quantserve:function(){if(typeof _qevents=='undefined'){_qevents=[];}
|
||||
if(typeof _qoptions!="undefined"&&_qoptions!=null){__qc.firepixel(_qoptions);_qoptions=null;}else if(!_qevents.length&&typeof _qacct!="undefined"){__qc.firepixel(null);}
|
||||
if(!__qc.evts){for(var k in _qevents){__qc.firepixel(_qevents[k]);}
|
||||
_qevents={push:function(){var a=arguments;for(var i=0;i<a.length;i++){__qc.firepixel(a[i]);}}};__qc.evts=1;}}};}
|
||||
function quantserve(){__qc.quantserve();}
|
||||
quantserve();
|
||||
@@ -0,0 +1,28 @@
|
||||
if(!__qc){var __qc={qcdst:function(){if(__qc.qctzoff(0)!=__qc.qctzoff(6))return 1;return 0;},qctzoff:function(m){var d1=new Date(2000,m,1,0,0,0,0);var t=d1.toGMTString();var d3=new Date(t.substring(0,t.lastIndexOf(" ")-1));return d1-d3;},qceuc:function(s){if(typeof(encodeURIComponent)=='function'){return encodeURIComponent(s);}
|
||||
else{return escape(s);}},qcrnd:function(){return Math.round(Math.random()*2147483647);},qcgc:function(n){var v='';var c=document.cookie;if(!c)return v;var i=c.indexOf(n+"=");var len=i+n.length+1;if(i>-1){var end=c.indexOf(";",len);if(end<0)end=c.length;v=c.substring(len,end);}
|
||||
return v;},qcdomain:function(){var d=document.domain;if(d.substring(0,4)=="www.")d=d.substring(4,d.length);var a=d.split(".");var len=a.length;if(len<3)return d;var e=a[len-1];if(e.length<3)return d;d=a[len-2]+"."+a[len-1];return d;},qhash2:function(h,s){for(var i=0;i<s.length;i++){h^=s.charCodeAt(i);h+=(h<<1)+(h<<4)+(h<<7)+(h<<8)+(h<<24);}
|
||||
return h;},qhash:function(s){var h1=0x811c9dc5,h2=0xc9dc5118;var hash1=__qc.qhash2(h1,s);var hash2=__qc.qhash2(h2,s);return(Math.round(Math.abs(hash1*hash2)/65536)).toString(16);},sd:["4dcfa7079941","127fdf7967f31","588ab9292a3f","32f92b0727e5","22f9aa38dfd3","a4abfe8f3e04","18b66bc1325c","958e70ea2f28","bdbf0cb4bbb","65118a0d557","40a1d9db1864","18ae3d985046","3b26460f55d"],qcsc:function(){var s="";var d=__qc.qcdomain();if(__qc.qad==1)return";fpan=u;fpa=";var qh=__qc.qhash(d);for(var i=0;i<__qc.sd.length;i++){if(__qc.sd[i]==qh)return";fpan=u;fpa=";}
|
||||
var u=document;var a=__qc.qcgc("__qca");if(a.length>0){s+=";fpan=0;fpa="+a;}
|
||||
else{var da=new Date();var db=new Date(da.getTime()+157680000000);a='P0-'+__qc.qcrnd()+'-'+da.getTime();u.cookie="__qca="+a+"; expires="+db.toGMTString()+"; path=/; domain="+d;a=__qc.qcgc("__qca");if(a.length>0){s+=";fpan=1;fpa="+a;}
|
||||
else{s+=";fpan=u;fpa=";}}
|
||||
return s;},qcdc:function(n){document.cookie=n+"=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/; domain="+__qc.qcdomain();},qpxload:function(img){if(img&&typeof(img.width)=="number"&&img.width==3){__qc.qcdc("__qca");}},qcp:function(p,myqo){var s='',a=null;var media='webpage',event='load';if(myqo!=null){for(var k in myqo){if(typeof(k)!='string'){continue;}
|
||||
if(typeof(myqo[k])!='string'){continue;}
|
||||
if(k=='qacct'){a=myqo[k];continue;}
|
||||
s+=';'+k+p+'='+__qc.qceuc(myqo[k]);if(k=='media'){media=myqo[k];}
|
||||
if(k=='event'){event=myqo[k];}}}
|
||||
if(typeof a!="string"){if((typeof _qacct=="undefined")||(_qacct.length==0))return'';a=_qacct;}
|
||||
if(media=='webpage'&&event=='load'){for(var i=0;i<__qc.qpixelsent.length;i++){if(__qc.qpixelsent[i]==a)return'';}
|
||||
__qc.qpixelsent.push(a);}
|
||||
if(media=='ad'){__qc.qad=1;}
|
||||
s=';a'+p+'='+a+s;return s;},qcesc:function(s){return s.replace(/\./g,'%2E').replace(/,/g,'%2C');},qcd:function(o){return(typeof(o)!="undefined"&&o!=null);},qcogl:function(){var m=document.getElementsByTagName('meta');var o='';for(var i=0;i<m.length;i++){if(o.length>=1000)return o;if(__qc.qcd(m[i])&&__qc.qcd(m[i].attributes)&&__qc.qcd(m[i].attributes.property)&&__qc.qcd(m[i].attributes.property.value)&&__qc.qcd(m[i].content)){var p=m[i].attributes.property.value;var c=m[i].content;if(p.length>3&&p.substring(0,3)=='og:'){if(o.length>0)o+=',';var l=(c.length>80)?80:c.length;o+=__qc.qcesc(p.substring(3,p.length))+'.'+__qc.qcesc(c.substring(0,l));}}}
|
||||
return __qc.qceuc(o);},firepixel:function(qoptions){var e=(typeof(encodeURIComponent)=='function')?"n":"s";var r=__qc.qcrnd();var sr='',qo='',qm='',url='',ref='',je='u',ns='1';var qocount=0;__qc.qad=0;if(typeof __qc.qpixelsent=="undefined"){__qc.qpixelsent=new Array();}
|
||||
if(typeof qoptions!="undefined"&&qoptions!=null){__qc.qopts=qoptions;for(var k in __qc.qopts){if(typeof(__qc.qopts[k])=='string'){qo=__qc.qcp("",__qc.qopts);break;}else if(typeof(__qc.qopts[k])=='object'&&__qc.qopts[k]!=null){++qocount;qo+=__qc.qcp("."+qocount,__qc.qopts[k]);}}}else if(typeof _qacct=="string"){qo=__qc.qcp("",null);}
|
||||
if(qo.length==0)return;var ce=(navigator.cookieEnabled)?"1":"0";if(typeof navigator.javaEnabled!='undefined')je=(navigator.javaEnabled())?"1":"0";if(typeof _qmeta!="undefined"&&_qmeta!=null){qm=';m='+__qc.qceuc(_qmeta);_qmeta=null;}
|
||||
if(self.screen){sr=screen.width+"x"+screen.height+"x"+screen.colorDepth;}
|
||||
var d=new Date();var dst=__qc.qcdst();var qs='http';if(window.location.protocol=='https:'){qs+='s';}
|
||||
qs+="://pixel.quantserve.com";var fp=__qc.qcsc();if(window.location&&window.location.href)url=__qc.qceuc(window.location.href);if(window.document&&window.document.referrer)ref=__qc.qceuc(window.document.referrer);if(self==top)ns='0';var ogl=__qc.qcogl();var img=new Image();img.alt="";img.src=qs+'/pixel'+';r='+r+qo+fp+';ns='+ns+';ce='+ce+';je='+je+';sr='+sr+';enc='+e+';dst='+dst+';et='+d.getTime()+';tzo='+d.getTimezoneOffset()+qm+';ref='+ref+';url='+url+';ogl='+ogl;img.onload=function(){__qc.qpxload(img);}},quantserve:function(){if(typeof _qevents=='undefined'){_qevents=[];}
|
||||
if(typeof _qoptions!="undefined"&&_qoptions!=null){__qc.firepixel(_qoptions);_qoptions=null;}else if(!_qevents.length&&typeof _qacct!="undefined"){__qc.firepixel(null);}
|
||||
if(!__qc.evts){for(var k in _qevents){__qc.firepixel(_qevents[k]);}
|
||||
_qevents={push:function(){var a=arguments;for(var i=0;i<a.length;i++){__qc.firepixel(a[i]);}}};__qc.evts=1;}}};}
|
||||
function quantserve(){__qc.quantserve();}
|
||||
quantserve();
|
||||
@@ -0,0 +1 @@
|
||||
div.hireme,div#hireme{border:1px solid #b5b5b5;background:#fff url(img/careers2-ad-header-so-crop.png) 1px 1px no-repeat;color:#333;font-family:Arial,Helvetica,sans-serif;font-size:12px;text-align:left;line-height:130%;padding:0;margin:12px 0;width:218px;min-height:220px;clear:both}div.hireme.codinghorror,div#hireme.codinghorror{background-image:url(img/careers2-ad-header-so-crop-codinghorror.png);width:206px;min-height:200px}div.hireme>a.top,div#hireme>a.top{width:218px;height:45px;display:inline-block}div.hireme>ul,div#hireme>ul{margin:0;padding:0;list-style:none}div.hireme>ul>li,div#hireme>ul>li{padding:0;margin:12px!important}div.hireme>ul>li>a,div#hireme>ul>li>a{display:block;cursor:pointer;text-decoration:none}div.hireme>ul>li>a>span,div#hireme>ul>li>a>span{color:#666;float:none;display:block}div.hireme>ul>li>a>span.company,div#hireme>ul>li>a>span.company{font-weight:bold}div.hireme>ul>img.impression,div#hireme>ul>img.impression{display:none}div.hireme>ul>a>img.careers-hed,div#hireme>ul>a>img.careers-hed{width:100%;min-height:40px;border:0;margin-bottom:-2px}div.hireme span.post-tag,div#hireme span.post-tag{font:11px/24px Tahoma,Arial,Verdana,Sans-Serif;background-color:#e0eaf1;color:#3e6d8e;padding:3px 3px 3px 4px;border:0;border-bottom:1px solid #3e6d8e;border-right:1px solid #7f9fb6}div.hireme span.post-tag:hover,div#hireme span.post-tag:hover{background-color:#e0eaf1;color:#3e6d8e}
|
||||
@@ -0,0 +1,43 @@
|
||||
'use strict';window.StackExchange={};function CTIsPlayback(){try{return parent&&parent.WebPlayer}catch(g){return!1}}if(!CTIsPlayback()&&top!=self)throw top.location.replace(document.location),$(function(){$("head").add("body").remove()}),alert("For security reasons, framing is not allowed; click OK to remove the frames."),Error();
|
||||
StackExchange.init=function(){var g=function(a){if(!window.jQuery)if("complete"!=document.readyState)setTimeout(function(){g(a)},1E3);else{var d=document.createElement("div");d.id="noscript-padding";var c=document.createElement("div");c.id="noscript-warning";c.innerHTML=a+" requires external JavaScript from another domain, which is blocked or failed to load.";document.body.insertBefore(d,document.body.firstChild);document.body.appendChild(c)}},a=function(){$(document).keyup(function(a){27==a.which&&
|
||||
($("#lightbox:not(.no-esc-remove), .error-notification, .popup, .share-tip, .esc-remove").fadeOutAndRemove(),$(".esc-hide").fadeOut(),window.genuwine&&genuwine.isVisible()&&genuwine.click(),window.profileLink&&profileLink.hide())})},e=function(){var a=$("#hlinks"),d=$("#search input[name=q]"),c=d.width(),e=2.5*c,g,h=function(c){d.queue("expand",c)},k=!1,l=!("placeholder"in document.createElement("input"));l&&!StackExchange.options.isMobile&&(""==d[0].value&&(d[0].value="search"),d.bind({focus:function(){"search"==
|
||||
this.value&&(this.value="")}}));d.keydown(function(c){if(k||46>c.keyCode&&8!=c.keyCode&&32!=c.keyCode)return!0;k=!0;clearTimeout(g);d.clearQueue("expand");h(function(c){d[0].placeholder="";a.fadeOut(100,c)});h(function(c){d.animate({width:e,"max-width":e},100,c)});h(function(){0==d.parent().find(".search-prompt").length&&d.before('<span class="search-prompt">search:</span>')});3==d.queue("expand").length&&d.dequeue("expand")}).focusout(function(){g=setTimeout(function(){h(function(c){d.parent().find(".search-prompt").remove();
|
||||
c()});h(function(a){d.animate({width:c,"max-width":c},100,a)});h(function(c){l&&""==d[0].value&&(d[0].value="search");d[0].placeholder="search";a.fadeIn(100,c)});3==d.queue("expand").length&&d.dequeue("expand");k=!1},200)});$("#search").keydown(function(c){if(13==c.which&&c.ctrlKey&&d.val())return window.open("/search?q="+encodeURIComponent(d.val()),"_newtab"),!1})};return function(f){StackExchange.options=f;var d=f.serverTime-(new Date).getTime()/1E3;g(f.site.name);$.ajaxSetup({cache:!1});StackExchange.init.createJqueryExtensions();
|
||||
$(function(){a();e();StackExchange.using(StackExchange.options.user.isAnonymous?"anonymous":"loggedIn",function(){StackExchange.initialized.resolve()},!0,f.fullPostfix);StackExchange.ready(function(){genuwine.init(f.user.accountId||null,f.user.inboxUnviewedCount,f.user.notificationsUnviewedCount);f.user.messages&&StackExchange.notify.showMessages(f.user.messages,f.isMobile);f.site.globalAuthDisabled||(!f.site.isChildMeta&&f.user.isAnonymous&&gauth.checkStackAuth(f.stackAuthUrl),gauth.informStackAuth(f.stackAuthUrl));
|
||||
f.user.isAnonymous||profileLink.init(f.user.gravatar,f.isMobile,f.user.profileUrl+"?tab=activity",d);f.enableUserHovercards&&StackExchange.usermenu.init();StackExchange.tagPreferences?StackExchange.tagPreferences.init():StackExchange.tagmenu.init()})})}}();
|
||||
StackExchange.debug={log:function(){},init:function(){this.log=function(g){$(function(){var a=$("#debug-messages");a.length||(a=$("<div id='debug-messages' style='text-align:left;position:fixed;top:50px;left:50px;z-index:1000;background:white;border:2px solid black;width:300px;padding:10px;' />").append($("<span style='cursor:pointer;color:#999'>(close debug messages)</span>").click(function(){$("#debug-messages").remove()})).appendTo("body"));$("<div style='margin-top:10px' />").text(g).appendTo(a)})}}};
|
||||
StackExchange.initialized=$.Deferred();StackExchange.ready=function(g){StackExchange.initialized.done(g)};if(window.serq)for(var i=0;i<window.serq.length;i++)StackExchange.ready(window.serq[i]);
|
||||
(function(){var g={anonymous:"full-anon.js",loggedIn:"full.js",prettify:"prettify-full.js",pseudoModerator:"moderator.js",inlineEditing:"full.js",editor:"wmd.js",autocomplete:"third-party/jquery.autocomplete.min.js",tagAutocomplete:"tageditor.js",tagEditor:"tageditornew.js",mobile:"mobile.js",help:"help.js",inlineTagEditing:"inline-tag-editing.js",mathjaxEditing:"mathjax-editing.js",mathjaxEditingNew:"mathjax-editing-new.js",revisions:"revisions.js",suggestedEdits:"suggested-edits.js",mockups:"mockups.js"},
|
||||
a={},e={},f,d={},c=function(c,a){return function(d){var e=c[d];e||(e=c[d]=a(d));return e}},o=function(c){var c=a[c],d,e=$.Deferred(),f=$.when(e),g;if(c)for(d=0;d<c.length;d++)(g=c[d].call(null))&&$.isFunction(g.promise)&&(f=$.when(f,g));e.resolve();return f},j=function(){if(!f){var c=$("script[src*='/stub.js']:first");0==c.length?(StackExchange.debug.log("couldn't figure out location of stub.js"),f="/content/js/"):f=c.attr("src").replace(/\/stub\.js.*$/,"/")}return f},h=function(c){var a=d["js/"+
|
||||
c];return!a?(StackExchange.debug.log("no cache breaker for "+c),""):"?v="+a},k=function(c){c=g[c];return!c?$.Deferred().reject().promise():l(c)},l=c({},function(c){var a=$.Deferred(),d=document.createElement("script");d.async="async";d.type="text/javascript";d.src=j()+c+h(c);d.onload=d.onreadystatechange=function(c,e){if(!d.readyState||/loaded|complete/.test(d.readyState))e?a.reject():a.resolve()};d.onerror=function(){a.reject()};$("head")[0].appendChild(d);return a.promise()}),n=c({},function(c){function a(){(e=
|
||||
StackExchange[c])?o(c).done(function(){d.resolve()}):0<f?(f--,StackExchange.debug.log("retrying "+c),setTimeout(a,20)):(StackExchange.debug.log("object "+c+" not available although file was loaded"),d.reject())}var d=$.Deferred(),e=StackExchange[c],f=3;e?d.resolve():k(c).done(a).fail(d.reject);return d.promise()}),p=$.Deferred(),q=function(c,d,a,e){if(!a&&!p.isResolved())p.done(function(){q(c,d)});else{if(a)for(var f in g)g.hasOwnProperty(f)&&(g[f]=g[f].replace(/^(full(?:-anon)?).js$/,"$1"+(e||"")+
|
||||
".js"));e=n(c);a?p.resolve():e=$.when(e,StackExchange.initialized);e.done(function(){d()}).fail(function(){StackExchange.debug.log("failed to provide object "+c)});return e}};q.setCacheBreakers=function(c){for(var a in c)c.hasOwnProperty(a)&&(d[a]=c[a])};StackExchange.using=q;StackExchange.ifUsing=function(c,d,f){if("undefined"!==typeof f){if(e["u_"+f])return;e["u_"+f]=!0}StackExchange[c]?d():((f=a[c])||(f=a[c]=[]),f.push(d))}})();
|
||||
String.prototype.format=function(){var g=this.toString();if(!arguments.length)return g;var a="string"==typeof arguments[0]?arguments:arguments[0],e;for(e in a)g=g.replace(RegExp("\\{"+e+"\\}","gi"),a[e]);return g};String.prototype.truncate=function(g,a){var e=this.toString();g&&e.length>g&&(e=e.substr(0,g)+a);return e};
|
||||
StackExchange.init.createJqueryExtensions=function(){var g=StackExchange.helpers;$.fn.extend({fadeOutAndRemove:function(){return this.each(function(){var a=$(this);a.fadeOut("fast",function(){a.trigger("removing").remove()})})},charCounter:function(a){return this.each(function(){var e=a.target?$(a.target):$(this).parents("form").find("span.text-counter"),f=this;$(this).bind("blur focus keyup paste",g.DelayedReaction(function(){var d=a.min,c=a.max,g=a.setIsValid||function(){},j=f.value?f.value.length:
|
||||
0,h=j>0.8*c?"supernova":j>0.6*c?"hot":j>0.4*c?"warm":"cool",k="";0==j?(k="enter at least "+d+" characters",g(!1)):j<d?(k=d-j+" more to go...",g(!1)):(k=c-j+" character"+(1!=c-j?"s":"")+" left",g(j<=c));e.text(k);e.hasClass(h)||e.removeClass("supernova hot warm cool").addClass(h)},100,{sliding:!0}).trigger)})},selectRange:function(a,e){return this.each(function(){if(this.setSelectionRange)this.focus(),this.setSelectionRange(a,e);else if(this.createTextRange){var f=this.createTextRange();f.collapse(!0);
|
||||
f.moveEnd("character",e);f.moveStart("character",a);f.select()}})},addSpinner:function(a){return this.each(function(){g.addSpinner(this,a)})},addSpinnerAfter:function(a){return this.each(function(){$(this).after(g.getSpinnerImg(a))})},removeSpinner:function(){return this.each(function(){$(this).find("img.ajax-loader").remove()})},showErrorPopup:function(a,e,f){return this.each(function(){g.showErrorPopup(this,a,e,f)})},center:function(){var a=this.parent();"static"===a.css("position")&&(a=a.offsetParent());
|
||||
var a=a.offset(),e=$(window);this.css("position","absolute");this.css("top",(e.height()-this.height())/2+e.scrollTop()-a.top+"px");this.css("left",(e.width()-this.width())/2+e.scrollLeft()-a.left+"px");return this},helpOverlay:function(){g.bindHelpOverlayEvents(this);return this},hideHelpOverlay:function(){g.hideHelpOverlay(this);return this},enable:function(){0==arguments.length||arguments[0]?this.removeAttr("disabled").css("cursor","pointer"):this.attr("disabled","disabled").css("cursor","default");
|
||||
return this},disable:function(){return this.enable(!1)},loadPopup:function(a){var e=this;e.addSpinnerAfter({padding:"0 3px"});$.ajax({type:"GET",url:a.url,dataType:"html",success:function(f){var d=$(f);d.find(".popup-actions-cancel, .popup-close a").click(function(){d.fadeOutAndRemove()});d.find("input:radio[disabled=disabled] + label.action-label").addClass("action-disabled");a.hideDescriptions&&d.find("ul.action-list > li:not(.action-selected) .action-desc").hide();f=d.find("input:radio:not(.action-subform input)");
|
||||
f.closest("li").bind("hide-action",function(){var c=$(this),d=".action-subform"+(a.hideDescriptions?", .action-desc":"");c.removeClass("action-selected").find(d).slideUp("fast")}).bind("show-action",function(){var c=$(this);c.hasClass("action-selected")||(c.siblings(".action-selected").trigger("hide-action"),c.addClass("action-selected").find(".action-subform").slideDown("fast",function(){a.subformShow&&a.subformShow($(this));if(a.subformFocusInput){var c=$(this).find("input[type=text], textarea").not(".actual-edit-overlay").eq(0);
|
||||
c.length&&c.focus()}}),a.hideDescriptions&&c.find(".action-desc").slideDown("fast"),a.actionSelected&&a.actionSelected(c),d.find(".popup-submit").enable())});f.click(function(){$(this).closest("li").trigger("show-action")});d.appendTo(e.parent());a.loaded&&a.loaded(d);f=function(){};if(a.subformShow){var c=d.find("li.action-selected .action-subform");0<c.length&&(f=function(){c.each(function(){a.subformShow($(this))})})}a.dontCenter||d.center().fadeIn("fast",f)},error:function(){e.parent().showErrorPopup("Unable to load popup - please try again")},
|
||||
complete:g.removeSpinner});return e}})};
|
||||
StackExchange.helpers=function(){function g(c,d,a){for(var e=0;e<a.length;e++){var g=a[e];try{if(/\*/.test(g))for(var l=0;4>l;l++){var n=g.replace(/\*/g,f[l]),p=c.css(n);d.css(n,p)}else d.css(g,c.css(g))}catch(q){}}}function a(c,d,a,e){if(c.is(":visible")){var f=$.browser.msie?0:0.4;a()?(c.css("opacity",f+(e?0.2:0)),c.addClass("edit-field-overlayed"),a=c.prev(".actual-edit-overlay"),0==a.length&&(e=c.parent().find("span.edit-field-overlay").text(),a=c.width(),f=c.height(),a=c.clone().prop("className",
|
||||
"actual-edit-overlay").attr("name",null).attr("id",null).attr("disabled","disabled").css({position:"absolute",backgroundColor:"white",color:"black","-webkit-text-fill-color":"black",opacity:1,width:a,height:f}),a.is("textarea,input")?(a.val(e),g(d,a,["line-height"])):a.text(e).css("line-height",f+"px").prepend(" "),g(d,a,["font-family","font-size","text-align"]),g(c,a,["border-*-style","border-*-color","border-*-width"]),c.css({zIndex:1,position:"relative"}),a.insertBefore(c),e=c.offset().top-
|
||||
a.offset().top,0!=e&&(d=parseInt(a.css("margin-top")),e=d+e,c.is("textarea")||(e=parseInt(a.prevAll(":visible").eq(0).css("margin-bottom"))+d),a.css("margin-top",e)),c=c.offset().left-a.offset().left,0!=c&&(d=parseInt(a.css("margin-left")),a.css("margin-left",d+c)))):c.css("opacity",1).css("filter","").removeClass("edit-field-overlayed")}}function e(c,a){$(c).find("input[type='submit']").prop("disabled",a)}var f=["left","right","top","bottom"],d={genericBindOverlayEvents:function(c,e,f){StackExchange.options.isMobile||
|
||||
e.bind("keydown contextmenu",function(){d.hideHelpOverlay(c)}).focus(function(){a(c,e,f,!0)}).blur(function(){a(c,e,f)}).each(function(){a(c,e,f)})},bindHelpOverlayEvents:function(c){c.each(function(){var c=$(this);d.genericBindOverlayEvents(c,c,function(){return""===c.val()})})},hideHelpOverlay:function(c){c.css("opacity",1);c.css("filter","");c.removeClass("edit-field-overlayed")},onClickDraftSave:function(c){$(c).click(function(){var c=this.href;StackExchange.cardiologist.ensureDraftSaved(function(){window.onbeforeunload=
|
||||
null;window.location.href=c});return!1});return!0},showErrorPopup:function(c,a,d,e){$(".error-notification").remove();var f=$('<div class="error-notification supernovabg"><h2>'+a+"</h2>"+(d?"":'<span class="error-close">(click on this box to dismiss)</span>')+"</div>"),g=function(){f.fadeOutAndRemove();e&&e()};$(c).append(f);f.click(g).fadeIn("fast");setTimeout(g,d?Math.max(2500,40*a.length):3E4)},removeErrorPopup:function(){$(".error-notification").fadeOutAndRemove()},addSpinner:function(c,a){$(c).append(d.getSpinnerImg(a))},
|
||||
getSpinnerImg:function(c){var a=$('<img class="ajax-loader" src="/content/img/progress-dots.gif" title="loading..." alt="loading..." />');c&&a.css(c);return a},removeSpinner:function(){$("img.ajax-loader").remove()},enableSubmitButton:function(c){e(c,!1)},disableSubmitButton:function(c){e(c,!0)},loadTicks:function(c){var a;a=c?c.find(".edit-block"):$(".edit-block");0==a.find("input[name=i1l]").length&&!a.data("loading-ticks")&&(a.data("loading-ticks",!0),$.ajax({url:"/questions/ticks",cache:!1,success:function(c){a.append("<input type='hidden' name='i1l' value='"+
|
||||
c+"' />")},complete:function(){a.data("loading-ticks",!1)}}))},showFancyOverlay:function(c){var c=c||{},a=$("#overlay-header"),d=c.message||"",e=$.browser.msie?{background:"#fff",opacity:0}:{};!1!==c.showClose&&(d+='<br><a class="close-overlay">close this message</a>');a.html(d).css(e).animate({opacity:"1",height:"show"},"slow",c.complete).find(".close-overlay").click(function(){a.animate({opacity:"0",height:"hide"},"fast")})},DelayedReaction:function(c,a,d){var d=d||{},e,f,g=d.always,n=function(){e=
|
||||
null;c.apply(null,f)};return{trigger:function(){f=arguments;g&&g.apply(null,f);e?d.sliding&&(clearTimeout(e),e=setTimeout(n,a)):e=setTimeout(n,a)},cancel:function(){e&&(clearTimeout(e),e=null)}}},fireAndForget:function(c){$.ajax({type:"POST",url:c,async:!0})}};return d}();
|
||||
function prepareEditor(g){var a=g.postfix||"",e=function(){setTimeout(function(){StackExchange.editor.initIfShown(g)},1)};if(g.onDemand){for(var f="bold-button,italic-button,spacer1,link-button,quote-button,code-button,image-button,spacer2,olist-button,ulist-button,heading-button,hr-button,spacer3,undo-button,redo-button".split(","),d=$('<ul id="wmd-button-row'+a+'" class="wmd-button-row" />').appendTo(".wmd-button-bar"),c=0,o=0;o<f.length;o++){var j=f[o],h=/spacer/.test(j),j=$("<li id='wmd-"+j+a+
|
||||
"' />").prop("className","wmd-"+(h?"spacer":"button")).css("left",25*o).appendTo(d);$("<span />").css("background-position",c+"px -20px").appendTo(j);h||(c-=20)}var k=!1;$("#wmd-input, #title, #tagnames, #edit-comment, #m-address, #display-name").one("focus click keydown",function(){k||(k=!0,d.addSpinner({"float":"right"}),StackExchange.using("editor",function(){d.remove();g.autoShowMarkdownHelp&&(g.immediatelyShowMarkdownHelp=!0);e()}))})}else StackExchange.using("editor",e)}
|
||||
StackExchange.switchMobile=function(g,a){$.post("/mobile/"+g,{returnurl:a},function(a){window.location=a})};
|
||||
jQuery.cookie=function(g,a,e){if("undefined"!=typeof a){e=e||{};null===a&&(a="",e.expires=-1);var f="";if(e.expires&&("number"==typeof e.expires||e.expires.toUTCString))"number"==typeof e.expires?(f=new Date,f.setTime(f.getTime()+864E5*e.expires)):f=e.expires,f="; expires="+f.toUTCString();var d=e.path?"; path="+e.path:"",c=e.domain?"; domain="+e.domain:"",e=e.secure?"; secure":"";document.cookie=[g,"=",encodeURIComponent(a),f,d,c,e].join("")}else{a=null;if(document.cookie&&""!=document.cookie){e=
|
||||
document.cookie.split(";");for(f=0;f<e.length;f++)if(d=jQuery.trim(e[f]),d.substring(0,g.length+1)==g+"="){a=decodeURIComponent(d.substring(g.length+1));break}}return a}};jQuery.expr[":"].regex=function(g,a,e){var a=e[3].split(","),f=/^(data|css):/,e=a[0].match(f)?a[0].split(":")[0]:"attr",f=a.shift().replace(f,"");return RegExp(a.join("").replace(/^\s+|\s+$/g,""),"ig").test(jQuery(g)[e](f))};
|
||||
$.extend($.expr[":"],{containsExact:function(g,a,e){return $.trim(g.innerHTML.toLowerCase())===e[3].toLowerCase()},containsExactCase:function(g,a,e){return $.trim(g.innerHTML)===e[3]},containsRegex:function(g,a,e){a=/^\/((?:\\\/|[^\/])+)\/([mig]{0,3})$/.exec(e[3]);return RegExp(a[1],a[2]).test($.trim(g.innerHTML))}});
|
||||
$.extend({URLEncode:function(g){for(var a="",e=0,g=g.toString(),f=/(^[a-zA-Z0-9_.]*)/;e<g.length;){var d=f.exec(g.substr(e));null!=d&&1<d.length&&""!=d[1]?(a+=d[1],e+=d[1].length):(" "==g[e]?a+="+":(d=g.charCodeAt(e).toString(16),a+="%"+(2>d.length?"0":"")+d.toUpperCase()),e++)}return a},URLDecode:function(g){for(var a,e=/(%[^%]{2})/;null!=(m=e.exec(g))&&1<m.length&&""!=m[1];)b=parseInt(m[1].substr(1),16),a=String.fromCharCode(b),g=g.replace(m[1],a);return g}});
|
||||
(function(g){g.fn.typeWatch=function(a){function e(a){if("TEXT"==a.type.toUpperCase()||"TEXTAREA"==a.nodeName.toUpperCase()){var c={timer:null,text:g(a).val().toUpperCase(),cb:f.callback,el:a,wait:f.wait};f.highlight&&g(a).focus(function(){this.select()});var e=function(a){var d=c.wait,e=!1;13==a.keyCode&&"TEXT"==this.type.toUpperCase()&&(d=1,e=!0);clearTimeout(c.timer);c.timer=setTimeout(function(){var a=e,d=g(c.el).val();if(d.length>f.captureLength&&d.toUpperCase()!=c.text||a&&d.length>f.captureLength)c.text=
|
||||
d.toUpperCase(),c.cb(d)},d)};g(a).keydown(e).bind("paste",null,function(c){c.which||e(this)})}}var f=g.extend({wait:750,callback:function(){},highlight:!0,captureLength:2},a);return this.each(function(){e(this)})}})(jQuery);
|
||||
(function(g){function a(a){var d;return a&&a.constructor==Array&&3==a.length?a:(d=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(a))?[parseInt(d[1]),parseInt(d[2]),parseInt(d[3])]:(d=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(a))?[2.55*parseFloat(d[1]),2.55*parseFloat(d[2]),2.55*parseFloat(d[3])]:(d=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(a))?[parseInt(d[1],16),parseInt(d[2],16),parseInt(d[3],16)]:
|
||||
(d=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(a))?[parseInt(d[1]+d[1],16),parseInt(d[2]+d[2],16),parseInt(d[3]+d[3],16)]:/rgba\(0, 0, 0, 0\)/.exec(a)?e.transparent:e[g.trim(a).toLowerCase()]}g.each("backgroundColor,borderBottomColor,borderLeftColor,borderRightColor,borderTopColor,color,outlineColor".split(","),function(e,d){g.fx.step[d]=function(c){if(!c.colorInit){var e;e=c.elem;var f=d,h;do{h=g.curCSS(e,f);if(""!=h&&"transparent"!=h||g.nodeName(e,"body"))break;f="backgroundColor"}while(e=e.parentNode);
|
||||
e=a(h);c.start=e;c.end=a(c.end);c.colorInit=!0}c.elem.style[d]="rgb("+[Math.max(Math.min(parseInt(c.pos*(c.end[0]-c.start[0])+c.start[0]),255),0),Math.max(Math.min(parseInt(c.pos*(c.end[1]-c.start[1])+c.start[1]),255),0),Math.max(Math.min(parseInt(c.pos*(c.end[2]-c.start[2])+c.start[2]),255),0)].join()+")"}});var e={transparent:[255,255,255]}})(jQuery);
|
||||
@@ -1,222 +1,231 @@
|
||||
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{2967CA64-7352-46E3-89C0-6BB3A0A13FC1}</ProjectGuid>
|
||||
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Spring.Northwind.Web</RootNamespace>
|
||||
<AssemblyName>Spring.Northwind.Web</AssemblyName>
|
||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Common.Logging, Version=1.2.0.0, Culture=neutral, PublicKeyToken=af08829b84f0328e">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Common.Logging.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Common.Logging.Log4Net, Version=1.2.0.2, Culture=neutral, PublicKeyToken=af08829b84f0328e, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\net\2.0\Common.Logging.Log4Net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\lib\NHibernate32\net\3.5\Iesi.Collections.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\net\2.0\log4net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NHibernate, Version=3.2.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\lib\NHibernate32\net\3.5\NHibernate.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Aop, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Spring.Aop.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Core, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Spring.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Data, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Spring.Data.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Data.NHibernate32, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Spring.Data.NHibernate32.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Web, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Spring.Web.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Core">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Data.DataSetExtensions">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Data.SQLite, Version=1.0.65.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\net\2.0\System.Data.SQLite.DLL</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Web.Extensions">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Xml.Linq">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Web" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Web.Services" />
|
||||
<Reference Include="System.EnterpriseServices" />
|
||||
<Reference Include="System.Web.Mobile" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="CSS\style.css" />
|
||||
<Content Include="CustomerEditor.aspx" />
|
||||
<Content Include="CustomerList.aspx" />
|
||||
<Content Include="CustomerOrders.aspx" />
|
||||
<Content Include="CustomerView.aspx" />
|
||||
<Content Include="Default.aspx" />
|
||||
<Content Include="FulfillmentResult.aspx" />
|
||||
<Content Include="Global.asax" />
|
||||
<Content Include="Img\bg-spring.png" />
|
||||
<Content Include="Img\footern.gif" />
|
||||
<Content Include="Img\header-spring.png" />
|
||||
<Content Include="Img\logo.png" />
|
||||
<Content Include="Img\springNet_release.png" />
|
||||
<Content Include="Logs\log.txt" />
|
||||
<Content Include="Web.config" />
|
||||
<Content Include="Web.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="CustomerEditor.aspx.designer.cs">
|
||||
<DependentUpon>CustomerEditor.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerList.aspx.designer.cs">
|
||||
<DependentUpon>CustomerList.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerOrders.aspx.designer.cs">
|
||||
<DependentUpon>CustomerOrders.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerView.aspx.designer.cs">
|
||||
<DependentUpon>CustomerView.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Default.aspx.designer.cs">
|
||||
<DependentUpon>Default.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="FulfillmentResult.aspx.designer.cs">
|
||||
<DependentUpon>FulfillmentResult.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Controller\ICustomerEditController.cs" />
|
||||
<Compile Include="Controller\NHibernateCustomerEditController.cs" />
|
||||
<Compile Include="CustomerEditor.aspx.cs">
|
||||
<DependentUpon>CustomerEditor.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerList.aspx.cs">
|
||||
<DependentUpon>CustomerList.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerOrders.aspx.cs">
|
||||
<DependentUpon>CustomerOrders.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerView.aspx.cs">
|
||||
<DependentUpon>CustomerView.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Default.aspx.cs">
|
||||
<DependentUpon>Default.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="FulfillmentResult.aspx.cs">
|
||||
<DependentUpon>FulfillmentResult.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Shared\MasterPage.master.cs">
|
||||
<DependentUpon>MasterPage.master</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Shared\MasterPage.master.designer.cs">
|
||||
<DependentUpon>MasterPage.master</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="App_Themes\Spring\Spring.skin" />
|
||||
<Content Include="Config\Aspects.xml" />
|
||||
<Content Include="Config\Log4Net.xml" />
|
||||
<Content Include="Shared\MasterPage.master" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Spring.Northwind.Dao.NHibernate\Spring.Northwind.Dao.NHibernate.2008.csproj">
|
||||
<Project>{6E4F55A0-C281-4706-A08B-BDEC2D2FBDA4}</Project>
|
||||
<Name>Spring.Northwind.Dao.NHibernate.2008</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Northwind.Dao\Spring.Northwind.Dao.2008.csproj">
|
||||
<Project>{7F45EEA2-50AC-44E2-85A6-2FFB02E38C44}</Project>
|
||||
<Name>Spring.Northwind.Dao.2008</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Northwind.Service\Spring.Northwind.Service.2008.csproj">
|
||||
<Project>{9E15876F-E9E0-43B7-9874-B54F163757D6}</Project>
|
||||
<Name>Spring.Northwind.Service.2008</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="App_Data\" />
|
||||
<Folder Include="Properties\" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" />
|
||||
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{2967CA64-7352-46E3-89C0-6BB3A0A13FC1}</ProjectGuid>
|
||||
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Spring.Northwind.Web</RootNamespace>
|
||||
<AssemblyName>Spring.Northwind.Web</AssemblyName>
|
||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Common.Logging, Version=1.2.0.0, Culture=neutral, PublicKeyToken=af08829b84f0328e">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Common.Logging.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Common.Logging.Log4Net, Version=1.2.0.2, Culture=neutral, PublicKeyToken=af08829b84f0328e, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\net\2.0\Common.Logging.Log4Net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\lib\NHibernate32\net\3.5\Iesi.Collections.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\net\2.0\log4net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NHibernate, Version=3.2.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\lib\NHibernate32\net\3.5\NHibernate.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Aop, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Spring.Aop.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Core, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Spring.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Data, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Spring.Data.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Data.NHibernate32, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Spring.Data.NHibernate32.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Web, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\3.5\debug\Spring.Web.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Core">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Data.DataSetExtensions">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Data.SQLite, Version=1.0.65.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\net\2.0\System.Data.SQLite.DLL</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Web.Extensions">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Xml.Linq">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Web" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Web.Services" />
|
||||
<Reference Include="System.EnterpriseServices" />
|
||||
<Reference Include="System.Web.Mobile" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="CSS\style.css" />
|
||||
<Content Include="CustomerEditor.aspx" />
|
||||
<Content Include="CustomerList.aspx" />
|
||||
<Content Include="CustomerOrders.aspx" />
|
||||
<Content Include="CustomerView.aspx" />
|
||||
<Content Include="Default.aspx" />
|
||||
<Content Include="FulfillmentResult.aspx" />
|
||||
<Content Include="Global.asax" />
|
||||
<Content Include="Img\bg-spring.png" />
|
||||
<Content Include="Img\footern.gif" />
|
||||
<Content Include="Img\header-spring.png" />
|
||||
<Content Include="Img\logo.png" />
|
||||
<Content Include="Img\springNet_release.png" />
|
||||
<Content Include="Logs\log.txt" />
|
||||
<Content Include="Web.net40.config" />
|
||||
<Content Include="Web.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="CustomerEditor.aspx.designer.cs">
|
||||
<DependentUpon>CustomerEditor.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerList.aspx.designer.cs">
|
||||
<DependentUpon>CustomerList.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerOrders.aspx.designer.cs">
|
||||
<DependentUpon>CustomerOrders.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerView.aspx.designer.cs">
|
||||
<DependentUpon>CustomerView.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Default.aspx.designer.cs">
|
||||
<DependentUpon>Default.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="FulfillmentResult.aspx.designer.cs">
|
||||
<DependentUpon>FulfillmentResult.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Controller\ICustomerEditController.cs" />
|
||||
<Compile Include="Controller\NHibernateCustomerEditController.cs" />
|
||||
<Compile Include="CustomerEditor.aspx.cs">
|
||||
<DependentUpon>CustomerEditor.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerList.aspx.cs">
|
||||
<DependentUpon>CustomerList.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerOrders.aspx.cs">
|
||||
<DependentUpon>CustomerOrders.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerView.aspx.cs">
|
||||
<DependentUpon>CustomerView.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Default.aspx.cs">
|
||||
<DependentUpon>Default.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="FulfillmentResult.aspx.cs">
|
||||
<DependentUpon>FulfillmentResult.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Shared\MasterPage.master.cs">
|
||||
<DependentUpon>MasterPage.master</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Shared\MasterPage.master.designer.cs">
|
||||
<DependentUpon>MasterPage.master</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="App_Themes\Spring\Spring.skin" />
|
||||
<Content Include="Config\Aspects.xml" />
|
||||
<Content Include="Config\Log4Net.xml" />
|
||||
<Content Include="Shared\MasterPage.master" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Spring.Northwind.Dao.NHibernate\Spring.Northwind.Dao.NHibernate.2008.csproj">
|
||||
<Project>{6E4F55A0-C281-4706-A08B-BDEC2D2FBDA4}</Project>
|
||||
<Name>Spring.Northwind.Dao.NHibernate.2008</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Northwind.Dao\Spring.Northwind.Dao.2008.csproj">
|
||||
<Project>{7F45EEA2-50AC-44E2-85A6-2FFB02E38C44}</Project>
|
||||
<Name>Spring.Northwind.Dao.2008</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Northwind.Service\Spring.Northwind.Service.2008.csproj">
|
||||
<Project>{9E15876F-E9E0-43B7-9874-B54F163757D6}</Project>
|
||||
<Name>Spring.Northwind.Service.2008</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Web.net30.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Web.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="App_Data\" />
|
||||
<Folder Include="Properties\" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v9.0\WebApplications\Microsoft.WebApplication.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
<ProjectExtensions>
|
||||
<VisualStudio>
|
||||
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
|
||||
<WebProjectProperties>
|
||||
<UseIIS>False</UseIIS>
|
||||
<AutoAssignPort>True</AutoAssignPort>
|
||||
<DevelopmentServerPort>60934</DevelopmentServerPort>
|
||||
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
||||
<IISUrl>
|
||||
</IISUrl>
|
||||
<NTLMAuthentication>False</NTLMAuthentication>
|
||||
<UseCustomServer>False</UseCustomServer>
|
||||
<CustomServerUrl>
|
||||
</CustomServerUrl>
|
||||
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
|
||||
</WebProjectProperties>
|
||||
</FlavorProperties>
|
||||
</VisualStudio>
|
||||
</ProjectExtensions>
|
||||
-->
|
||||
<ProjectExtensions>
|
||||
<VisualStudio>
|
||||
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
|
||||
<WebProjectProperties>
|
||||
<UseIIS>False</UseIIS>
|
||||
<AutoAssignPort>True</AutoAssignPort>
|
||||
<DevelopmentServerPort>2937</DevelopmentServerPort>
|
||||
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
||||
<IISUrl>
|
||||
</IISUrl>
|
||||
<NTLMAuthentication>False</NTLMAuthentication>
|
||||
<UseCustomServer>False</UseCustomServer>
|
||||
<CustomServerUrl>
|
||||
</CustomServerUrl>
|
||||
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
|
||||
</WebProjectProperties>
|
||||
</FlavorProperties>
|
||||
</VisualStudio>
|
||||
</ProjectExtensions>
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>copy "$(ProjectDir)Web.net30.config" "$(ProjectDir)Web.config" /Y</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@@ -1,223 +1,222 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{2967CA64-7352-46E3-89C0-6BB3A0A13FC1}</ProjectGuid>
|
||||
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Spring.Northwind.Web</RootNamespace>
|
||||
<AssemblyName>Spring.Northwind.Web</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
<OldToolsVersion>3.5</OldToolsVersion>
|
||||
<UpgradeBackupLocation />
|
||||
<TargetFrameworkProfile />
|
||||
<UseIISExpress>false</UseIISExpress>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Common.Logging, Version=1.2.0.0, Culture=neutral, PublicKeyToken=af08829b84f0328e">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Common.Logging.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Common.Logging.Log4Net, Version=1.2.0.2, Culture=neutral, PublicKeyToken=af08829b84f0328e, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\net\2.0\Common.Logging.Log4Net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\lib\NHibernate32\net\4.0\Iesi.Collections.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\net\2.0\log4net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NHibernate, Version=3.2.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\lib\NHibernate32\net\4.0\NHibernate.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Aop, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Spring.Aop.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Core, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Spring.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Data, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Spring.Data.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Data.NHibernate32, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Spring.Data.NHibernate32.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Web, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Spring.Web.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="System.Data.SQLite, Version=1.0.65.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\net\2.0\System.Data.SQLite.DLL</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Web.ApplicationServices" />
|
||||
<Reference Include="System.Web.DynamicData" />
|
||||
<Reference Include="System.Web.Entity" />
|
||||
<Reference Include="System.Web.Extensions" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Web" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Web.Services" />
|
||||
<Reference Include="System.EnterpriseServices" />
|
||||
<Reference Include="System.Web.Mobile" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="CSS\style.css" />
|
||||
<Content Include="CustomerEditor.aspx" />
|
||||
<Content Include="CustomerList.aspx" />
|
||||
<Content Include="CustomerOrders.aspx" />
|
||||
<Content Include="CustomerView.aspx" />
|
||||
<Content Include="Default.aspx" />
|
||||
<Content Include="FulfillmentResult.aspx" />
|
||||
<Content Include="Global.asax" />
|
||||
<Content Include="Img\bg-spring.png" />
|
||||
<Content Include="Img\footern.gif" />
|
||||
<Content Include="Img\header-spring.png" />
|
||||
<Content Include="Img\logo.png" />
|
||||
<Content Include="Img\springNet_release.png" />
|
||||
<Content Include="Logs\log.txt" />
|
||||
<Content Include="Web.config" />
|
||||
<Content Include="Web.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="CustomerEditor.aspx.designer.cs">
|
||||
<DependentUpon>CustomerEditor.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerList.aspx.designer.cs">
|
||||
<DependentUpon>CustomerList.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerOrders.aspx.designer.cs">
|
||||
<DependentUpon>CustomerOrders.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerView.aspx.designer.cs">
|
||||
<DependentUpon>CustomerView.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Default.aspx.designer.cs">
|
||||
<DependentUpon>Default.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="FulfillmentResult.aspx.designer.cs">
|
||||
<DependentUpon>FulfillmentResult.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Controller\ICustomerEditController.cs" />
|
||||
<Compile Include="Controller\NHibernateCustomerEditController.cs" />
|
||||
<Compile Include="CustomerEditor.aspx.cs">
|
||||
<DependentUpon>CustomerEditor.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerList.aspx.cs">
|
||||
<DependentUpon>CustomerList.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerOrders.aspx.cs">
|
||||
<DependentUpon>CustomerOrders.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerView.aspx.cs">
|
||||
<DependentUpon>CustomerView.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Default.aspx.cs">
|
||||
<DependentUpon>Default.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="FulfillmentResult.aspx.cs">
|
||||
<DependentUpon>FulfillmentResult.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Shared\MasterPage.master.cs">
|
||||
<DependentUpon>MasterPage.master</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Shared\MasterPage.master.designer.cs">
|
||||
<DependentUpon>MasterPage.master</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="App_Themes\Spring\Spring.skin" />
|
||||
<Content Include="Config\Aspects.xml" />
|
||||
<Content Include="Config\Log4Net.xml" />
|
||||
<Content Include="Shared\MasterPage.master" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Spring.Northwind.Dao.NHibernate\Spring.Northwind.Dao.NHibernate.2010.csproj">
|
||||
<Project>{6E4F55A0-C281-4706-A08B-BDEC2D2FBDA4}</Project>
|
||||
<Name>Spring.Northwind.Dao.NHibernate.2010</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Northwind.Dao\Spring.Northwind.Dao.2010.csproj">
|
||||
<Project>{7F45EEA2-50AC-44E2-85A6-2FFB02E38C44}</Project>
|
||||
<Name>Spring.Northwind.Dao.2010</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Northwind.Service\Spring.Northwind.Service.2010.csproj">
|
||||
<Project>{9E15876F-E9E0-43B7-9874-B54F163757D6}</Project>
|
||||
<Name>Spring.Northwind.Service.2010</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="App_Data\" />
|
||||
<Folder Include="Properties\" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{2967CA64-7352-46E3-89C0-6BB3A0A13FC1}</ProjectGuid>
|
||||
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Spring.Northwind.Web</RootNamespace>
|
||||
<AssemblyName>Spring.Northwind.Web</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
<OldToolsVersion>3.5</OldToolsVersion>
|
||||
<UpgradeBackupLocation />
|
||||
<TargetFrameworkProfile />
|
||||
<UseIISExpress>false</UseIISExpress>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Common.Logging, Version=1.2.0.0, Culture=neutral, PublicKeyToken=af08829b84f0328e">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Common.Logging.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Common.Logging.Log4Net1210">
|
||||
<HintPath>..\..\lib\net\2.0\Common.Logging.Log4Net1210.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\lib\NHibernate32\net\4.0\Iesi.Collections.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\net\2.0\log4net.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NHibernate, Version=3.2.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\lib\NHibernate32\net\4.0\NHibernate.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Aop, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Spring.Aop.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Core, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Spring.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Data, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Spring.Data.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Data.NHibernate32, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Spring.Data.NHibernate32.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Spring.Web, Version=0.0.0.35000, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\bin\net\4.0\debug\Spring.Web.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="System.Data.SQLite, Version=1.0.65.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\lib\net\2.0\System.Data.SQLite.DLL</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Web.ApplicationServices" />
|
||||
<Reference Include="System.Web.DynamicData" />
|
||||
<Reference Include="System.Web.Entity" />
|
||||
<Reference Include="System.Web.Extensions" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Web" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Web.Services" />
|
||||
<Reference Include="System.EnterpriseServices" />
|
||||
<Reference Include="System.Web.Mobile" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="CSS\style.css" />
|
||||
<Content Include="CustomerEditor.aspx" />
|
||||
<Content Include="CustomerList.aspx" />
|
||||
<Content Include="CustomerOrders.aspx" />
|
||||
<Content Include="CustomerView.aspx" />
|
||||
<Content Include="Default.aspx" />
|
||||
<Content Include="FulfillmentResult.aspx" />
|
||||
<Content Include="Global.asax" />
|
||||
<Content Include="Img\bg-spring.png" />
|
||||
<Content Include="Img\footern.gif" />
|
||||
<Content Include="Img\header-spring.png" />
|
||||
<Content Include="Img\logo.png" />
|
||||
<Content Include="Img\springNet_release.png" />
|
||||
<Content Include="Logs\log.txt" />
|
||||
<Content Include="Web.config" />
|
||||
<Content Include="Web.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="CustomerEditor.aspx.designer.cs">
|
||||
<DependentUpon>CustomerEditor.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerList.aspx.designer.cs">
|
||||
<DependentUpon>CustomerList.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerOrders.aspx.designer.cs">
|
||||
<DependentUpon>CustomerOrders.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="CustomerView.aspx.designer.cs">
|
||||
<DependentUpon>CustomerView.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Default.aspx.designer.cs">
|
||||
<DependentUpon>Default.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="FulfillmentResult.aspx.designer.cs">
|
||||
<DependentUpon>FulfillmentResult.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Controller\ICustomerEditController.cs" />
|
||||
<Compile Include="Controller\NHibernateCustomerEditController.cs" />
|
||||
<Compile Include="CustomerEditor.aspx.cs">
|
||||
<DependentUpon>CustomerEditor.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerList.aspx.cs">
|
||||
<DependentUpon>CustomerList.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerOrders.aspx.cs">
|
||||
<DependentUpon>CustomerOrders.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CustomerView.aspx.cs">
|
||||
<DependentUpon>CustomerView.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Default.aspx.cs">
|
||||
<DependentUpon>Default.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="FulfillmentResult.aspx.cs">
|
||||
<DependentUpon>FulfillmentResult.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Shared\MasterPage.master.cs">
|
||||
<DependentUpon>MasterPage.master</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Shared\MasterPage.master.designer.cs">
|
||||
<DependentUpon>MasterPage.master</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="App_Themes\Spring\Spring.skin" />
|
||||
<Content Include="Config\Aspects.xml" />
|
||||
<Content Include="Config\Log4Net.xml" />
|
||||
<Content Include="Shared\MasterPage.master" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Spring.Northwind.Dao.NHibernate\Spring.Northwind.Dao.NHibernate.2010.csproj">
|
||||
<Project>{6E4F55A0-C281-4706-A08B-BDEC2D2FBDA4}</Project>
|
||||
<Name>Spring.Northwind.Dao.NHibernate.2010</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Northwind.Dao\Spring.Northwind.Dao.2010.csproj">
|
||||
<Project>{7F45EEA2-50AC-44E2-85A6-2FFB02E38C44}</Project>
|
||||
<Name>Spring.Northwind.Dao.2010</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Northwind.Service\Spring.Northwind.Service.2010.csproj">
|
||||
<Project>{9E15876F-E9E0-43B7-9874-B54F163757D6}</Project>
|
||||
<Name>Spring.Northwind.Service.2010</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="App_Data\" />
|
||||
<Folder Include="Properties\" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
<ProjectExtensions>
|
||||
<VisualStudio>
|
||||
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
|
||||
<WebProjectProperties>
|
||||
<UseIIS>False</UseIIS>
|
||||
<AutoAssignPort>True</AutoAssignPort>
|
||||
<DevelopmentServerPort>60934</DevelopmentServerPort>
|
||||
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
||||
<IISUrl>
|
||||
</IISUrl>
|
||||
<NTLMAuthentication>False</NTLMAuthentication>
|
||||
<UseCustomServer>False</UseCustomServer>
|
||||
<CustomServerUrl>
|
||||
</CustomServerUrl>
|
||||
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
|
||||
</WebProjectProperties>
|
||||
</FlavorProperties>
|
||||
</VisualStudio>
|
||||
</ProjectExtensions>
|
||||
-->
|
||||
<ProjectExtensions>
|
||||
<VisualStudio>
|
||||
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
|
||||
<WebProjectProperties>
|
||||
<UseIIS>False</UseIIS>
|
||||
<AutoAssignPort>True</AutoAssignPort>
|
||||
<DevelopmentServerPort>2431</DevelopmentServerPort>
|
||||
<DevelopmentServerVPath>/</DevelopmentServerVPath>
|
||||
<IISUrl>
|
||||
</IISUrl>
|
||||
<NTLMAuthentication>False</NTLMAuthentication>
|
||||
<UseCustomServer>False</UseCustomServer>
|
||||
<CustomServerUrl>
|
||||
</CustomServerUrl>
|
||||
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
|
||||
</WebProjectProperties>
|
||||
</FlavorProperties>
|
||||
</VisualStudio>
|
||||
</ProjectExtensions>
|
||||
</Project>
|
||||
@@ -20,7 +20,7 @@
|
||||
</configSections>
|
||||
<common>
|
||||
<logging>
|
||||
<factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
|
||||
<factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net1210">
|
||||
<!-- choices are INLINE, FILE, FILE-WATCH, EXTERNAL-->
|
||||
<!-- otherwise BasicConfigurer.Configure is used -->
|
||||
<!-- log4net configuration file is specified with key configFile-->
|
||||
@@ -61,8 +61,8 @@
|
||||
<add verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web"/>
|
||||
<add verb="*" path="ContextMonitor.ashx" type="Spring.Web.Support.ContextMonitor, Spring.Web"/>
|
||||
</httpHandlers>
|
||||
<compilation debug="true" targetFramework="4.0"/>
|
||||
<pages theme="Spring" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
|
||||
<compilation debug="true"/>
|
||||
<pages theme="Spring">
|
||||
<controls>
|
||||
<add tagPrefix="spring" namespace="Spring.Web.UI.Controls" assembly="Spring.Web"/>
|
||||
</controls>
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
<?xml version="1.0"?>
|
||||
<!--
|
||||
Note: As an alternative to hand editing this file you can use the
|
||||
web admin tool to configure settings for your application. Use
|
||||
the Website->Asp.Net Configuration option in Visual Studio.
|
||||
A full list of settings and comments can be found in
|
||||
machine.config.comments usually located in
|
||||
\Windows\Microsoft.Net\Framework\v2.x\Config
|
||||
-->
|
||||
<configuration>
|
||||
<configSections>
|
||||
<sectionGroup name="common">
|
||||
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
|
||||
</sectionGroup>
|
||||
<sectionGroup name="spring">
|
||||
<section name="context" type="Spring.Context.Support.WebContextHandler, Spring.Web"/>
|
||||
<section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/>
|
||||
</sectionGroup>
|
||||
<section name="databaseSettings" type="System.Configuration.NameValueSectionHandler"/>
|
||||
</configSections>
|
||||
<common>
|
||||
<logging>
|
||||
<factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
|
||||
<!-- choices are INLINE, FILE, FILE-WATCH, EXTERNAL-->
|
||||
<!-- otherwise BasicConfigurer.Configure is used -->
|
||||
<!-- log4net configuration file is specified with key configFile-->
|
||||
<arg key="configType" value="FILE-WATCH"/>
|
||||
<arg key="configFile" value="~/Config/Log4Net.xml"/>
|
||||
</factoryAdapter>
|
||||
</logging>
|
||||
</common>
|
||||
<spring>
|
||||
<parsers>
|
||||
<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data"/>
|
||||
<parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data"/>
|
||||
</parsers>
|
||||
<context>
|
||||
<resource uri="~/Config/Aspects.xml"/>
|
||||
<resource uri="assembly://Spring.Northwind.Dao.NHibernate/Spring.Northwind.Dao/Dao.xml"/>
|
||||
<resource uri="assembly://Spring.Northwind.Service/Spring.Northwind.Service/Services.xml"/>
|
||||
<resource uri="~/Web.xml"/>
|
||||
</context>
|
||||
</spring>
|
||||
<!-- These properties are referenced in Dao.xml -->
|
||||
<databaseSettings>
|
||||
<add key="db.datasource" value=".\SQLEXPRESS; Integrated Security=true; AttachDbFilename=|DataDirectory|northwnd.mdf; User Instance=true;"/>
|
||||
<add key="db.user" value="springqa"/>
|
||||
<add key="db.password" value="springqa"/>
|
||||
<add key="db.database" value="Northwind"/>
|
||||
</databaseSettings>
|
||||
<appSettings>
|
||||
<add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="NHibernateSessionFactory"/>
|
||||
</appSettings>
|
||||
<connectionStrings/>
|
||||
<system.web>
|
||||
<httpModules>
|
||||
<add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/>
|
||||
<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate32"/>
|
||||
</httpModules>
|
||||
<httpHandlers>
|
||||
<add verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web"/>
|
||||
<add verb="*" path="ContextMonitor.ashx" type="Spring.Web.Support.ContextMonitor, Spring.Web"/>
|
||||
</httpHandlers>
|
||||
<compilation debug="true"/>
|
||||
<pages theme="Spring">
|
||||
<controls>
|
||||
<add tagPrefix="spring" namespace="Spring.Web.UI.Controls" assembly="Spring.Web"/>
|
||||
</controls>
|
||||
</pages>
|
||||
</system.web>
|
||||
</configuration>
|
||||
@@ -0,0 +1,71 @@
|
||||
<?xml version="1.0"?>
|
||||
<!--
|
||||
Note: As an alternative to hand editing this file you can use the
|
||||
web admin tool to configure settings for your application. Use
|
||||
the Website->Asp.Net Configuration option in Visual Studio.
|
||||
A full list of settings and comments can be found in
|
||||
machine.config.comments usually located in
|
||||
\Windows\Microsoft.Net\Framework\v2.x\Config
|
||||
-->
|
||||
<configuration>
|
||||
<configSections>
|
||||
<sectionGroup name="common">
|
||||
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
|
||||
</sectionGroup>
|
||||
<sectionGroup name="spring">
|
||||
<section name="context" type="Spring.Context.Support.WebContextHandler, Spring.Web"/>
|
||||
<section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/>
|
||||
</sectionGroup>
|
||||
<section name="databaseSettings" type="System.Configuration.NameValueSectionHandler"/>
|
||||
</configSections>
|
||||
<common>
|
||||
<logging>
|
||||
<factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
|
||||
<!-- choices are INLINE, FILE, FILE-WATCH, EXTERNAL-->
|
||||
<!-- otherwise BasicConfigurer.Configure is used -->
|
||||
<!-- log4net configuration file is specified with key configFile-->
|
||||
<arg key="configType" value="FILE-WATCH"/>
|
||||
<arg key="configFile" value="~/Config/Log4Net.xml"/>
|
||||
</factoryAdapter>
|
||||
</logging>
|
||||
</common>
|
||||
<spring>
|
||||
<parsers>
|
||||
<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data"/>
|
||||
<parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data"/>
|
||||
</parsers>
|
||||
<context>
|
||||
<resource uri="~/Config/Aspects.xml"/>
|
||||
<resource uri="assembly://Spring.Northwind.Dao.NHibernate/Spring.Northwind.Dao/Dao.xml"/>
|
||||
<resource uri="assembly://Spring.Northwind.Service/Spring.Northwind.Service/Services.xml"/>
|
||||
<resource uri="~/Web.xml"/>
|
||||
</context>
|
||||
</spring>
|
||||
<!-- These properties are referenced in Dao.xml -->
|
||||
<databaseSettings>
|
||||
<add key="db.datasource" value=".\SQLEXPRESS; Integrated Security=true; AttachDbFilename=|DataDirectory|northwnd.mdf; User Instance=true;"/>
|
||||
<add key="db.user" value="springqa"/>
|
||||
<add key="db.password" value="springqa"/>
|
||||
<add key="db.database" value="Northwind"/>
|
||||
</databaseSettings>
|
||||
<appSettings>
|
||||
<add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="NHibernateSessionFactory"/>
|
||||
</appSettings>
|
||||
<connectionStrings/>
|
||||
<system.web>
|
||||
<httpModules>
|
||||
<add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/>
|
||||
<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate32"/>
|
||||
</httpModules>
|
||||
<httpHandlers>
|
||||
<add verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web"/>
|
||||
<add verb="*" path="ContextMonitor.ashx" type="Spring.Web.Support.ContextMonitor, Spring.Web"/>
|
||||
</httpHandlers>
|
||||
<compilation debug="true" targetFramework="4.0"/>
|
||||
<pages theme="Spring" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID">
|
||||
<controls>
|
||||
<add tagPrefix="spring" namespace="Spring.Web.UI.Controls" assembly="Spring.Web"/>
|
||||
</controls>
|
||||
</pages>
|
||||
</system.web>
|
||||
</configuration>
|
||||
@@ -2811,6 +2811,7 @@ namespace Spring.Objects.Factory.Support
|
||||
/// naturally implement <see cref="IDisposable"/>).
|
||||
public void RegisterDisposableObject(String objectName, IDisposable instance)
|
||||
{
|
||||
if (disposableObjects.ContainsKey(objectName)) return;
|
||||
disposableObjects.Add(objectName, instance);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
#region License
|
||||
|
||||
/*
|
||||
* Copyright <20> 2002-2011 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: AssemblyTitle("Spring.Web.Conversation.NHibernate32. NHibernate 3.2 support.")]
|
||||
[assembly: AssemblyDescription("Interfaces and classes that provide 'Long-Running Conversation' support in Spring.Net")]
|
||||
@@ -0,0 +1,450 @@
|
||||
#region License
|
||||
|
||||
/*
|
||||
* Copyright <20> 2002-2011 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#endregion
|
||||
|
||||
#region Imports
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using Common.Logging;
|
||||
using NHibernate;
|
||||
using Spring.Threading;
|
||||
using Spring.Transaction.Support;
|
||||
using Spring.Util;
|
||||
using System.Data;
|
||||
using System.Collections.Generic;
|
||||
using Spring.Web.Conversation;
|
||||
|
||||
#endregion
|
||||
|
||||
namespace Spring.Data.NHibernate.Support
|
||||
{
|
||||
///<summary>
|
||||
///Based on <see cref="Spring.Data.NHibernate.Support.SessionScope"/>
|
||||
/// for support of 'session-per-conversation' pattern.
|
||||
///</summary>
|
||||
///<author>Hailton de Castro</author>
|
||||
[Serializable]
|
||||
public class SessionPerConversationScope : IDisposable
|
||||
{
|
||||
#region Fields
|
||||
|
||||
/// <summary>
|
||||
/// The logging instance.
|
||||
/// </summary>
|
||||
protected readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private readonly SessionPerConversationScopeSettings settings;
|
||||
|
||||
// Keys into LogicalThreadContext for runtime values.
|
||||
private readonly string ISOPEN_KEY;
|
||||
private readonly string OPENER_CONVERSATION_ID_KEY;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructor (s)
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="SessionPerConversationScopeSettings"/> class.
|
||||
/// Uses default values for <see cref="SessionPerConversationScopeSettings"/>
|
||||
/// </summary>
|
||||
public SessionPerConversationScope()
|
||||
: this(new SessionPerConversationScopeSettings())
|
||||
{
|
||||
// noop
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="SessionPerConversationScopeSettings"/> class.
|
||||
/// </summary>
|
||||
/// <param name="entityInterceptor">Specify the <see cref="IInterceptor"/> to be set on each session provided by this <see cref="SessionPerConversationScope"/> instance.</param>
|
||||
/// <param name="defaultFlushMode">Specify the flushmode to be applied on each session provided by this <see cref="SessionPerConversationScope"/> instance.
|
||||
/// </param>
|
||||
public SessionPerConversationScope(IInterceptor entityInterceptor, FlushMode defaultFlushMode)
|
||||
: this(new SessionPerConversationScopeSettings(entityInterceptor, defaultFlushMode))
|
||||
{
|
||||
// noop
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="SessionScope"/> class.
|
||||
/// </summary>
|
||||
/// <param name="settings">An <see cref="SessionPerConversationScopeSettings"/> instance holding the scope configuration</param>
|
||||
public SessionPerConversationScope(SessionPerConversationScopeSettings settings)
|
||||
{
|
||||
log = LogManager.GetLogger(this.GetType());
|
||||
this.settings = settings;
|
||||
|
||||
ISOPEN_KEY = UniqueKey.GetInstanceScopedString(this, "IsOpen");
|
||||
OPENER_CONVERSATION_ID_KEY = UniqueKey.GetInstanceScopedString(this, "OpenerConversationId");
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
|
||||
/// <summary>
|
||||
/// Gets the flushmode to be applied on each newly created session.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This property defaults to <see cref="FlushMode.Never"/> to ensure that modifying objects outside the boundaries
|
||||
/// of a transaction will not be persisted. It is recommended to not change this value but wrap any modifying operation
|
||||
/// within a transaction.
|
||||
/// </remarks>
|
||||
public FlushMode DefaultFlushMode
|
||||
{
|
||||
get { return settings.DefaultFlushMode; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the configured EntityInterceptor
|
||||
/// </summary>
|
||||
public IInterceptor EntityInterceptor
|
||||
{
|
||||
get
|
||||
{
|
||||
return settings.EntityInterceptor;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Id for conversation that open the Session.
|
||||
/// </summary>
|
||||
public String OpenerConversationId
|
||||
{
|
||||
get
|
||||
{
|
||||
return (String)LogicalThreadContext.GetData(OPENER_CONVERSATION_ID_KEY);
|
||||
}
|
||||
set
|
||||
{
|
||||
LogicalThreadContext.SetData(OPENER_CONVERSATION_ID_KEY, value);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a flag, whether this scope is in "open" state on the current logical thread.
|
||||
/// </summary>
|
||||
public bool IsOpen
|
||||
{
|
||||
get
|
||||
{
|
||||
return (null != LogicalThreadContext.GetData(ISOPEN_KEY));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets a flag, whether this scope is in "open" state on the current logical thread.
|
||||
/// </summary>
|
||||
/// <param name="isOpen"></param>
|
||||
private void SetOpen(bool isOpen)
|
||||
{
|
||||
if (isOpen)
|
||||
{
|
||||
LogicalThreadContext.SetData(ISOPEN_KEY, ISOPEN_KEY);
|
||||
}
|
||||
else
|
||||
{
|
||||
LogicalThreadContext.FreeNamedDataSlot(ISOPEN_KEY);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IDisposable Members
|
||||
|
||||
/// <summary>
|
||||
/// NOOP.
|
||||
/// </summary>
|
||||
public virtual void Dispose()
|
||||
{
|
||||
//no OP
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
|
||||
/// <summary>
|
||||
/// Open a new session or reconect the
|
||||
/// <see cref="IConversationState.RootSessionPerConversation"/> in <paramref name="activeConversation"/>.
|
||||
/// Participating in an existing session registed with <see cref="TransactionSynchronizationManager"/>
|
||||
/// is not alowed.
|
||||
/// </summary>
|
||||
/// <param name="activeConversation"></param>
|
||||
/// <param name="allManagedConversation"></param>
|
||||
/// <exception cref="InvalidOperationException">
|
||||
/// <list type="bullet">
|
||||
/// <item>If there is another conversation with a <see cref="ISession"/> with opened
|
||||
/// <see cref="IDbConnection"/>.</item>
|
||||
/// <item>If attempting to participate in an existing NHibernate <see cref="ISessionFactory"/>
|
||||
/// managed by <see cref="TransactionSynchronizationManager"/>.
|
||||
/// </item>
|
||||
/// </list>
|
||||
/// </exception>
|
||||
public void Open(IConversationState activeConversation, ICollection<IConversationState> allManagedConversation)
|
||||
{
|
||||
bool isDebugEnabled = log.IsDebugEnabled;
|
||||
|
||||
if (IsOpen)
|
||||
{
|
||||
if (activeConversation.Id != this.OpenerConversationId)
|
||||
{
|
||||
throw new InvalidOperationException("There is another conversation with a ISession with opened IDbConnection.");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (isDebugEnabled) log.Debug(String.Format("SessionPerConversationScope is already open for this conversation: Id:'{0}'.", activeConversation.Id));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (activeConversation.SessionFactory != null)
|
||||
{
|
||||
if (isDebugEnabled) log.Debug(String.Format("activeConversation with 'session-per-conversation': Id:'{0}'.", activeConversation.Id));
|
||||
|
||||
// single session mode
|
||||
if (TransactionSynchronizationManager.HasResource(activeConversation.SessionFactory))
|
||||
{
|
||||
// Do not modify the Session: just set the participate flag.
|
||||
if (isDebugEnabled) log.Debug("Participating in existing NHibernate SessionFactory IS NOT ALLOWED.");
|
||||
throw new InvalidOperationException("Participating in existing NHibernate SessionFactory IS NOT ALLOWED.");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (isDebugEnabled) log.Debug("Opening single NHibernate Session in SessionPerConversationScope");
|
||||
TransactionSynchronizationManager.BindResource(activeConversation.SessionFactory, new LazySessionPerConversationHolder(this, activeConversation, allManagedConversation));
|
||||
|
||||
SetOpen(true);
|
||||
this.OpenerConversationId = activeConversation.Id;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (isDebugEnabled) log.Debug(String.Format("activeConversation with NO 'session-per-conversation': Id:'{0}'.", activeConversation.Id));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Close the current view's session and unregisters
|
||||
/// from <see cref="TransactionSynchronizationManager"/>.
|
||||
/// </summary>
|
||||
/// <param name="sessionFactory">The session factory that <see cref="IConversationState"/> on <paramref name="allManagedConversation"/> use</param>
|
||||
/// <param name="allManagedConversation">A list of conversations which the session can be closed or disconnected</param>
|
||||
/// <exception cref="InvalidOperationException">
|
||||
/// <list type="bullet">
|
||||
/// <item>If start/resume a conversation from a
|
||||
/// <see cref="IConversationManager"/> when exists a different <see cref="IConversationManager"/>
|
||||
/// with open <see cref="ISession"/> registered on <see cref="TransactionSynchronizationManager"/>
|
||||
/// </item>
|
||||
/// <item>If the holder on <see cref="TransactionSynchronizationManager"/>, is not a <see cref="LazySessionPerConversationHolder"/>.</item>
|
||||
/// </list>
|
||||
/// </exception>
|
||||
public void Close(ISessionFactory sessionFactory, ICollection<IConversationState> allManagedConversation)
|
||||
{
|
||||
bool isDebugEnabled = log.IsDebugEnabled;
|
||||
if (isDebugEnabled) log.Debug("Trying to close SessionPerConversationScope");
|
||||
|
||||
if (IsOpen)
|
||||
{
|
||||
try
|
||||
{
|
||||
DoClose(sessionFactory, allManagedConversation, isDebugEnabled);
|
||||
}
|
||||
finally
|
||||
{
|
||||
SetOpen(false);
|
||||
this.OpenerConversationId = null;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (isDebugEnabled) log.Debug("No open conversation - doing nothing");
|
||||
}
|
||||
}
|
||||
|
||||
private void DoClose(ISessionFactory sessionFactory, ICollection<IConversationState> allManagedConversation, bool isLogDebugEnabled)
|
||||
{
|
||||
// single session mode
|
||||
if (isLogDebugEnabled) log.Debug("DoClose: Closing SessionPerConversationScope");
|
||||
Object holderObj = TransactionSynchronizationManager.UnbindResource(sessionFactory);
|
||||
if (holderObj != null)
|
||||
{
|
||||
if (holderObj is LazySessionPerConversationHolder)
|
||||
{
|
||||
LazySessionPerConversationHolder holder = (LazySessionPerConversationHolder)holderObj;
|
||||
if (holder.Owner == this)
|
||||
{
|
||||
holder.CloseAll();
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
"Can not close session beacause 'holder owner' is not 'this'." +
|
||||
" You are trying to start/resume a conversation from a" +
|
||||
" IConversationManager when exists a diferent IConversationManager " +
|
||||
" with open ISession registered on TransactionSynchronizationManager.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidOperationException("Can not close session beacause holder, on TransactionSynchronizationManager, is not a LazySessionPerConversationHolder.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (isLogDebugEnabled) log.Warn("DoClose: TransactionSynchronizationManager.UnbindResource(sessionFactory) has no SessionHolder. Should I throw error?");
|
||||
}
|
||||
}
|
||||
|
||||
private void DoOpenSession(IConversationState conversation)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
ISession session = null;
|
||||
if (conversation.RootSessionPerConversation == null)
|
||||
{
|
||||
//new session
|
||||
session = (
|
||||
(EntityInterceptor != null)
|
||||
? conversation.SessionFactory.OpenSession(EntityInterceptor)
|
||||
: conversation.SessionFactory.OpenSession()
|
||||
);
|
||||
conversation.RootSessionPerConversation = session;
|
||||
}
|
||||
else
|
||||
{
|
||||
//reconnect existing one.
|
||||
if (conversation.DbProvider != null)
|
||||
{
|
||||
if (log.IsDebugEnabled) log.Debug(String.Format("DoOpenSession: Conversation has a DbProvider: Id='{0}'", conversation.Id));
|
||||
if (!conversation.RootSessionPerConversation.IsConnected)
|
||||
{
|
||||
if (log.IsDebugEnabled) log.Debug(String.Format("DoOpenSession: Conversation is not Connected: Id='{0}'", conversation.Id));
|
||||
|
||||
IDbConnection connection = conversation.DbProvider.CreateConnection();
|
||||
connection.Open();
|
||||
|
||||
conversation.RootSessionPerConversation.Reconnect(connection);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (log.IsDebugEnabled) log.Debug(String.Format("DoOpenSession: Conversation is already Connected: Id='{0}'", conversation.Id));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (log.IsDebugEnabled) log.Debug(String.Format("DoOpenSession: Conversation has NO DbProvider: Id='{0}'", conversation.Id));
|
||||
conversation.RootSessionPerConversation.Reconnect();
|
||||
}
|
||||
session = conversation.RootSessionPerConversation;
|
||||
}
|
||||
session.FlushMode = DefaultFlushMode;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region LazySessionPerConversationHolder utility class
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// This sessionHolder creates a session for the active conversation only if it is
|
||||
/// needed (<see cref="IConversationState.StartResumeConversation"/>).
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Although a NHibernateSession defers creation of db-connections until they are really
|
||||
/// needed, instantiation a session is still more expensive than using LazySessionHolder.
|
||||
/// </remarks>
|
||||
private class LazySessionPerConversationHolder : SessionHolder
|
||||
{
|
||||
private readonly ILog log = LogManager.GetLogger(typeof(LazySessionPerConversationHolder));
|
||||
private SessionPerConversationScope owner;
|
||||
public SessionPerConversationScope Owner
|
||||
{
|
||||
get { return owner; }
|
||||
}
|
||||
IConversationState activeConversation;
|
||||
ICollection<IConversationState> allManagedConversation;
|
||||
|
||||
/// <summary>
|
||||
/// Initialize a new instance.
|
||||
/// </summary>
|
||||
public LazySessionPerConversationHolder(SessionPerConversationScope owner, IConversationState activeConversation, ICollection<IConversationState> allManagedConversation)
|
||||
{
|
||||
if (log.IsDebugEnabled) log.Debug("Created LazyReconnectableSessionHolder");
|
||||
this.owner = owner;
|
||||
this.activeConversation = activeConversation;
|
||||
this.allManagedConversation = allManagedConversation;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create a new session on demand
|
||||
/// </summary>
|
||||
protected override void EnsureInitialized()
|
||||
{
|
||||
if (this.activeConversation.RootSessionPerConversation == null || !this.activeConversation.RootSessionPerConversation.IsConnected)
|
||||
{
|
||||
if (log.IsDebugEnabled) log.Debug("EnsureInitialized: 'session-per-conversation' instance requested - opening new session");
|
||||
owner.DoOpenSession(this.activeConversation);
|
||||
AddSession(this.activeConversation.RootSessionPerConversation);
|
||||
}
|
||||
}
|
||||
|
||||
public void CloseAll()
|
||||
{
|
||||
foreach (IConversationState conversation in this.allManagedConversation)
|
||||
{
|
||||
this.CloseConversation(conversation);
|
||||
}
|
||||
owner = null;
|
||||
this.activeConversation = null;
|
||||
this.allManagedConversation = null;
|
||||
|
||||
if (log.IsDebugEnabled) log.Debug("CloseAll LazySessionPerConversationHolder");
|
||||
}
|
||||
|
||||
private void CloseConversation(IConversationState conversation)
|
||||
{
|
||||
if (log.IsDebugEnabled) log.Debug(String.Format("CloseConversation: Id='{0}'", conversation.Id));
|
||||
if (conversation.RootSessionPerConversation != null)
|
||||
{
|
||||
ISession tmpSession = conversation.RootSessionPerConversation;
|
||||
if (conversation.Ended)
|
||||
{
|
||||
SessionFactoryUtils.CloseSession(tmpSession);
|
||||
conversation.RootSessionPerConversation = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (tmpSession.IsConnected)
|
||||
tmpSession.Disconnect();
|
||||
}
|
||||
RemoveSession(tmpSession);
|
||||
}
|
||||
if (log.IsDebugEnabled) log.Debug("Closed LazySessionPerConversationHolder");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
#region License
|
||||
|
||||
/*
|
||||
* Copyright <20> 2002-2011 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using NHibernate;
|
||||
using Spring.Util;
|
||||
|
||||
namespace Spring.Data.NHibernate.Support
|
||||
{
|
||||
/// <summary>
|
||||
/// Setting for <see cref="SessionPerConversationScope"/>
|
||||
/// </summary>
|
||||
/// <author>Hailton de Castro</author>
|
||||
[Serializable]
|
||||
public class SessionPerConversationScopeSettings
|
||||
{
|
||||
/// <summary>
|
||||
/// Default value for <see cref="DefaultFlushMode"/> property.
|
||||
/// </summary>
|
||||
public static readonly FlushMode FLUSHMODE_DEFAULT = FlushMode.Never;
|
||||
|
||||
private IInterceptor entityInterceptor;
|
||||
private FlushMode defaultFlushMode;
|
||||
|
||||
/// <summary>
|
||||
/// Initialize a new instance of <see cref="SessionScopeSettings"/> with default values.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Calling this constructor from your derived class leaves <see cref="EntityInterceptor"/>
|
||||
/// uninitialized. See <see cref="ResolveEntityInterceptor"/> for more.
|
||||
/// </remarks>
|
||||
public SessionPerConversationScopeSettings()
|
||||
{
|
||||
this.entityInterceptor = null;
|
||||
this.defaultFlushMode = FLUSHMODE_DEFAULT;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initialize a new instance of <see cref="SessionPerConversationScopeSettings"/> with the given values and references.
|
||||
/// </summary>
|
||||
/// <param name="entityInterceptor">
|
||||
/// Specify the <see cref="IInterceptor"/> to be set on each session provided by the <see cref="SessionPerConversationScope"/> instance.
|
||||
/// </param>
|
||||
/// <param name="defaultFlushMode">
|
||||
/// Specify the flushmode to be applied on each session provided by the <see cref="SessionScope"/> instance.
|
||||
/// </param>
|
||||
/// <remarks>
|
||||
/// Calling this constructor marks all properties initialized.
|
||||
/// </remarks>
|
||||
public SessionPerConversationScopeSettings(IInterceptor entityInterceptor, FlushMode defaultFlushMode)
|
||||
{
|
||||
this.entityInterceptor = entityInterceptor;
|
||||
this.defaultFlushMode = defaultFlushMode;
|
||||
}
|
||||
|
||||
#region Properties
|
||||
|
||||
/// <summary>
|
||||
/// Gets the configured <see cref="IInterceptor"/> instance to be used.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// </remarks>
|
||||
public virtual IInterceptor EntityInterceptor
|
||||
{
|
||||
get
|
||||
{
|
||||
return entityInterceptor;
|
||||
}
|
||||
set
|
||||
{
|
||||
entityInterceptor = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or Sets the flushmode to be applied on each newly created session.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This property defaults to <see cref="FlushMode.Never"/> to ensure that modifying objects outside the boundaries
|
||||
/// of a transaction will not be persisted. It is recommended to not change this value but wrap any modifying operation
|
||||
/// within a transaction.
|
||||
/// </remarks>
|
||||
public FlushMode DefaultFlushMode
|
||||
{
|
||||
get { return defaultFlushMode; }
|
||||
set { defaultFlushMode = value; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Override this method to resolve an <see cref="IInterceptor"/> instance according to your chosen strategy.
|
||||
/// </summary>
|
||||
protected virtual IInterceptor ResolveEntityInterceptor()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Spring</RootNamespace>
|
||||
<AssemblyName>Spring.Web.Conversation.NHibernate32</AssemblyName>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
<OldToolsVersion>2.0</OldToolsVersion>
|
||||
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
|
||||
<UpgradeBackupLocation>
|
||||
</UpgradeBackupLocation>
|
||||
<TargetFrameworkSubset>
|
||||
</TargetFrameworkSubset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>..\..\..\build\VS.Net.2008\Spring.Web.Conversation.NHibernate32\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<DocumentationFile>bin\Debug\Spring.Web.Conversation.NHibernate32.xml</DocumentationFile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Common.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=af08829b84f0328e, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\lib\Net\2.0\Common.Logging.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\lib\NHibernate32\net\3.5\Iesi.Collections.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NHibernate, Version=3.2.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\lib\NHibernate32\net\3.5\NHibernate.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Web" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="..\CommonAssemblyInfo.cs">
|
||||
<Link>CommonAssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="AssemblyInfo.cs" />
|
||||
<Compile Include="Data\NHibernate\Support\SessionPerConversationScope.cs" />
|
||||
<Compile Include="Data\NHibernate\Support\SessionPerConversationSettings.cs" />
|
||||
<Compile Include="Web\Conversation\HttpModule\ConversationModule.cs" />
|
||||
<Compile Include="Web\Conversation\IConversationManager.cs" />
|
||||
<Compile Include="Web\Conversation\IConversationState.cs" />
|
||||
<Compile Include="Web\Conversation\InnerConversationList.cs" />
|
||||
<Compile Include="Web\Conversation\WebConversationManager.cs" />
|
||||
<Compile Include="Web\Conversation\WebConversationSpringState.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\..\..\build-support\tools\nant\schema\nant.xsd">
|
||||
<Link>nant.xsd</Link>
|
||||
</None>
|
||||
<None Include="app.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Spring.Core\Spring.Core.2008.csproj">
|
||||
<Project>{710961A3-0DF4-49E4-A26E-F5B9C044AC84}</Project>
|
||||
<Name>Spring.Core.2008</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Data.NHibernate32\Spring.Data.NHibernate32.2008.csproj">
|
||||
<Project>{1C8E0481-A70D-445E-AB4D-4A963CF7DC83}</Project>
|
||||
<Name>Spring.Data.NHibernate32.2008</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Data\Spring.Data.2008.csproj">
|
||||
<Project>{AE00E5AB-C39A-436F-86D2-33BFE33E2E40}</Project>
|
||||
<Name>Spring.Data.2008</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Properties\" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
@@ -0,0 +1,101 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{64400FF8-2E9F-4809-B5F4-0C7EB8ABFF87}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Spring</RootNamespace>
|
||||
<AssemblyName>Spring.Web.Conversation.NHibernate32</AssemblyName>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
<OldToolsVersion>3.5</OldToolsVersion>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<UpgradeBackupLocation>
|
||||
</UpgradeBackupLocation>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>..\..\..\build\VS.Net.2010\Spring.Web.Conversation.NHibernate32\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<DocumentationFile>Spring.Web.Conversation.NHibernate32.xml</DocumentationFile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Common.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=af08829b84f0328e, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\lib\Net\2.0\Common.Logging.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\lib\NHibernate32\net\3.5\Iesi.Collections.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NHibernate, Version=3.2.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\lib\NHibernate32\net\3.5\NHibernate.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Web" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="..\CommonAssemblyInfo.cs">
|
||||
<Link>CommonAssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="AssemblyInfo.cs" />
|
||||
<Compile Include="Data\NHibernate\Support\SessionPerConversationScope.cs" />
|
||||
<Compile Include="Data\NHibernate\Support\SessionPerConversationSettings.cs" />
|
||||
<Compile Include="Web\Conversation\HttpModule\ConversationModule.cs" />
|
||||
<Compile Include="Web\Conversation\IConversationManager.cs" />
|
||||
<Compile Include="Web\Conversation\IConversationState.cs" />
|
||||
<Compile Include="Web\Conversation\InnerConversationList.cs" />
|
||||
<Compile Include="Web\Conversation\WebConversationManager.cs" />
|
||||
<Compile Include="Web\Conversation\WebConversationSpringState.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\..\..\build-support\tools\nant\schema\nant.xsd">
|
||||
<Link>nant.xsd</Link>
|
||||
</None>
|
||||
<None Include="app.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Spring.Core\Spring.Core.2010.csproj">
|
||||
<Project>{710961A3-0DF4-49E4-A26E-F5B9C044AC84}</Project>
|
||||
<Name>Spring.Core.2010</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Data.NHibernate32\Spring.Data.NHibernate32.2010.csproj">
|
||||
<Project>{1C8E0481-A70D-445E-AB4D-4A963CF7DC83}</Project>
|
||||
<Name>Spring.Data.NHibernate32.2010</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Data\Spring.Data.2010.csproj">
|
||||
<Project>{AE00E5AB-C39A-436F-86D2-33BFE33E2E40}</Project>
|
||||
<Name>Spring.Data.2010</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Properties\" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" ?>
|
||||
<project name="Spring.Web.Conversation.NHibernate32" default="build" xmlns="http://nant.sf.net/release/0.91-alpha2/nant.xsd">
|
||||
<!--
|
||||
Required properties:
|
||||
* current.bin.dir - (path) root level to build to
|
||||
* current.build.debug - (true|false) debug build?
|
||||
* current.build.defines.csc - framework-specific build defines for C# compiler
|
||||
-->
|
||||
<target name="build">
|
||||
|
||||
<!-- copy nh libs -->
|
||||
<echo message="NH Libs: ${nh32.lib.dir}" />
|
||||
<copy todir="${current.bin.dir}" overwrite="true">
|
||||
<fileset basedir="${nh32.lib.dir}">
|
||||
<include name="**/*.dll" />
|
||||
</fileset>
|
||||
</copy>
|
||||
|
||||
<!-- build Spring.Data.NHibernate -->
|
||||
<csc target="library" define="${current.build.defines.csc}"
|
||||
warnaserror="true"
|
||||
optimize="${build.optimize}"
|
||||
debug="${current.build.debug}"
|
||||
output="${current.bin.dir}/${project::get-name()}.dll"
|
||||
doc="${current.bin.dir}/${project::get-name()}.xml">
|
||||
<arg line="${compiler.args}"/>
|
||||
<nowarn>
|
||||
<warning number="${nowarn.numbers}" />
|
||||
</nowarn>
|
||||
<sources failonempty="true">
|
||||
<include name="**/*.cs" />
|
||||
<include name="../GenCommonAssemblyInfo.cs" />
|
||||
</sources>
|
||||
<references basedir="${current.bin.dir}">
|
||||
<include name="System.Data.dll" />
|
||||
<include name="System.Web.dll" />
|
||||
<include name="System.EnterpriseServices.dll" />
|
||||
<include name="*.dll" />
|
||||
<exclude name="${project::get-name()}.dll" />
|
||||
<exclude name="Spring.Web.Conversation.NHibernate*.dll" />
|
||||
<exclude name="Spring.Data.NHibernate33.dll" />
|
||||
</references>
|
||||
</csc>
|
||||
</target>
|
||||
</project>
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0"?>
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>Spring.Web.Conversation.NHibernate32</id>
|
||||
<projectUrl>http://www.springframework.net/</projectUrl>
|
||||
<licenseUrl>http://www.springframework.net/license.html</licenseUrl>
|
||||
<iconUrl>http://springframework.net/images/SpringSource_Leaves32x32.png</iconUrl>
|
||||
<version>0.0.0</version>
|
||||
<!-- this value is a placeholder replaced by build script -->
|
||||
<authors>SpringSource</authors>
|
||||
<description>Conversation-Per-Business-Transaction support for Spring.Net using NHibernate</description>
|
||||
<summary>Conversation-Per-Business-Transaction support for Spring.Net using NHibernate</summary>
|
||||
<language>en-US</language>
|
||||
<dependencies>
|
||||
<dependency id="Common.Logging" version="1.2.0" />
|
||||
<dependency id="Spring.Data.NHibernate32" version="2.0.0" />
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
<file src="build\net\3.5\release\Spring.Web.Conversation.NHibernate32.dll" target="lib\net35" />
|
||||
<file src="build\net\3.5\release\Spring.Web.Conversation.NHibernate32.pdb" target="lib\net35" />
|
||||
<file src="build\net\3.5\release\Spring.Web.Conversation.NHibernate32.xml" target="lib\net35" />
|
||||
<file src="build\net\4.0\release\Spring.Web.Conversation.NHibernate32.dll" target="lib\net40" />
|
||||
<file src="build\net\4.0\release\Spring.Web.Conversation.NHibernate32.pdb" target="lib\net40" />
|
||||
<file src="build\net\4.0\release\Spring.Web.Conversation.NHibernate32.xml" target="lib\net40" />
|
||||
</files>
|
||||
</package>
|
||||
@@ -0,0 +1,958 @@
|
||||
<?xml version="1.0"?>
|
||||
<doc>
|
||||
<assembly>
|
||||
<name>Spring.Web.Conversation.NHibernate32</name>
|
||||
</assembly>
|
||||
<members>
|
||||
<member name="T:Spring.Data.NHibernate.Support.SessionPerConversationScope">
|
||||
<summary>
|
||||
Based on <see cref="T:Spring.Data.NHibernate.Support.SessionScope"/>
|
||||
for support of 'session-per-conversation' pattern.
|
||||
</summary>
|
||||
<author>Hailton de Castro</author>
|
||||
</member>
|
||||
<member name="F:Spring.Data.NHibernate.Support.SessionPerConversationScope.log">
|
||||
<summary>
|
||||
The logging instance.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.#ctor">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings"/> class.
|
||||
Uses default values for <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.#ctor(NHibernate.IInterceptor,NHibernate.FlushMode)">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings"/> class.
|
||||
</summary>
|
||||
<param name="entityInterceptor">Specify the <see cref="T:NHibernate.IInterceptor"/> to be set on each session provided by this <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScope"/> instance.</param>
|
||||
<param name="defaultFlushMode">Specify the flushmode to be applied on each session provided by this <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScope"/> instance.
|
||||
</param>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.#ctor(Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings)">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:Spring.Data.NHibernate.Support.SessionScope"/> class.
|
||||
</summary>
|
||||
<param name="settings">An <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings"/> instance holding the scope configuration</param>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.SetOpen(System.Boolean)">
|
||||
<summary>
|
||||
Sets a flag, whether this scope is in "open" state on the current logical thread.
|
||||
</summary>
|
||||
<param name="isOpen"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.Dispose">
|
||||
<summary>
|
||||
NOOP.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.Open(Spring.Web.Conversation.IConversationState,System.Collections.Generic.ICollection{Spring.Web.Conversation.IConversationState})">
|
||||
<summary>
|
||||
Open a new session or reconect the
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.RootSessionPerConversation"/> in <paramref name="activeConversation"/>.
|
||||
Participating in an existing session registed with <see cref="T:Spring.Transaction.Support.TransactionSynchronizationManager"/>
|
||||
is not alowed.
|
||||
</summary>
|
||||
<param name="activeConversation"></param>
|
||||
<param name="allManagedConversation"></param>
|
||||
<exception cref="T:System.InvalidOperationException">
|
||||
<list type="bullet">
|
||||
<item>If there is another conversation with a <see cref="T:NHibernate.ISession"/> with opened
|
||||
<see cref="T:System.Data.IDbConnection"/>.</item>
|
||||
<item>If attempting to participate in an existing NHibernate <see cref="T:NHibernate.ISessionFactory"/>
|
||||
managed by <see cref="T:Spring.Transaction.Support.TransactionSynchronizationManager"/>.
|
||||
</item>
|
||||
</list>
|
||||
</exception>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.Close(NHibernate.ISessionFactory,System.Collections.Generic.ICollection{Spring.Web.Conversation.IConversationState})">
|
||||
<summary>
|
||||
Close the current view's session and unregisters
|
||||
from <see cref="T:Spring.Transaction.Support.TransactionSynchronizationManager"/>.
|
||||
</summary>
|
||||
<param name="sessionFactory">The session factory that <see cref="T:Spring.Web.Conversation.IConversationState"/> on <paramref name="allManagedConversation"/> use</param>
|
||||
<param name="allManagedConversation">A list of conversations which the session can be closed or disconnected</param>
|
||||
<exception cref="T:System.InvalidOperationException">
|
||||
<list type="bullet">
|
||||
<item>If start/resume a conversation from a
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/> when exists a different <see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
with open <see cref="T:NHibernate.ISession"/> registered on <see cref="T:Spring.Transaction.Support.TransactionSynchronizationManager"/>
|
||||
</item>
|
||||
<item>If the holder on <see cref="T:Spring.Transaction.Support.TransactionSynchronizationManager"/>, is not a <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScope.LazySessionPerConversationHolder"/>.</item>
|
||||
</list>
|
||||
</exception>
|
||||
</member>
|
||||
<member name="P:Spring.Data.NHibernate.Support.SessionPerConversationScope.DefaultFlushMode">
|
||||
<summary>
|
||||
Gets the flushmode to be applied on each newly created session.
|
||||
</summary>
|
||||
<remarks>
|
||||
This property defaults to <see cref="F:NHibernate.FlushMode.Never"/> to ensure that modifying objects outside the boundaries
|
||||
of a transaction will not be persisted. It is recommended to not change this value but wrap any modifying operation
|
||||
within a transaction.
|
||||
</remarks>
|
||||
</member>
|
||||
<member name="P:Spring.Data.NHibernate.Support.SessionPerConversationScope.EntityInterceptor">
|
||||
<summary>
|
||||
Get the configured EntityInterceptor
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Data.NHibernate.Support.SessionPerConversationScope.OpenerConversationId">
|
||||
<summary>
|
||||
Id for conversation that open the Session.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Data.NHibernate.Support.SessionPerConversationScope.IsOpen">
|
||||
<summary>
|
||||
Gets a flag, whether this scope is in "open" state on the current logical thread.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:Spring.Data.NHibernate.Support.SessionPerConversationScope.LazySessionPerConversationHolder">
|
||||
<summary>
|
||||
This sessionHolder creates a session for the active conversation only if it is
|
||||
needed (<see cref="M:Spring.Web.Conversation.IConversationState.StartResumeConversation"/>).
|
||||
</summary>
|
||||
<remarks>
|
||||
Although a NHibernateSession defers creation of db-connections until they are really
|
||||
needed, instantiation a session is still more expensive than using LazySessionHolder.
|
||||
</remarks>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.LazySessionPerConversationHolder.#ctor(Spring.Data.NHibernate.Support.SessionPerConversationScope,Spring.Web.Conversation.IConversationState,System.Collections.Generic.ICollection{Spring.Web.Conversation.IConversationState})">
|
||||
<summary>
|
||||
Initialize a new instance.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.LazySessionPerConversationHolder.EnsureInitialized">
|
||||
<summary>
|
||||
Create a new session on demand
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings">
|
||||
<summary>
|
||||
Setting for <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScope"/>
|
||||
</summary>
|
||||
<author>Hailton de Castro</author>
|
||||
</member>
|
||||
<member name="F:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.FLUSHMODE_DEFAULT">
|
||||
<summary>
|
||||
Default value for <see cref="P:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.DefaultFlushMode"/> property.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.#ctor">
|
||||
<summary>
|
||||
Initialize a new instance of <see cref="T:Spring.Data.NHibernate.Support.SessionScopeSettings"/> with default values.
|
||||
</summary>
|
||||
<remarks>
|
||||
Calling this constructor from your derived class leaves <see cref="P:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.EntityInterceptor"/>
|
||||
uninitialized. See <see cref="M:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.ResolveEntityInterceptor"/> for more.
|
||||
</remarks>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.#ctor(NHibernate.IInterceptor,NHibernate.FlushMode)">
|
||||
<summary>
|
||||
Initialize a new instance of <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings"/> with the given values and references.
|
||||
</summary>
|
||||
<param name="entityInterceptor">
|
||||
Specify the <see cref="T:NHibernate.IInterceptor"/> to be set on each session provided by the <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScope"/> instance.
|
||||
</param>
|
||||
<param name="defaultFlushMode">
|
||||
Specify the flushmode to be applied on each session provided by the <see cref="T:Spring.Data.NHibernate.Support.SessionScope"/> instance.
|
||||
</param>
|
||||
<remarks>
|
||||
Calling this constructor marks all properties initialized.
|
||||
</remarks>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.ResolveEntityInterceptor">
|
||||
<summary>
|
||||
Override this method to resolve an <see cref="T:NHibernate.IInterceptor"/> instance according to your chosen strategy.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.EntityInterceptor">
|
||||
<summary>
|
||||
Gets the configured <see cref="T:NHibernate.IInterceptor"/> instance to be used.
|
||||
</summary>
|
||||
<remarks>
|
||||
</remarks>
|
||||
</member>
|
||||
<member name="P:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.DefaultFlushMode">
|
||||
<summary>
|
||||
Gets or Sets the flushmode to be applied on each newly created session.
|
||||
</summary>
|
||||
<remarks>
|
||||
This property defaults to <see cref="F:NHibernate.FlushMode.Never"/> to ensure that modifying objects outside the boundaries
|
||||
of a transaction will not be persisted. It is recommended to not change this value but wrap any modifying operation
|
||||
within a transaction.
|
||||
</remarks>
|
||||
</member>
|
||||
<member name="T:Spring.Web.Conversation.IConversationState">
|
||||
<summary>
|
||||
Port to conversation. If the object is not found in the current
|
||||
conversation, will be tried on the parent if the parent is
|
||||
not null.
|
||||
</summary>
|
||||
<exception cref="T:System.InvalidOperationException">
|
||||
If <see cref="P:Spring.Web.Conversation.IConversationState.Id"/> is different from spring name for this instance.
|
||||
</exception>
|
||||
<author>Hailton de Castro</author>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationState.StartResumeConversation">
|
||||
<summary>
|
||||
Starts or resumes the conversation and the <see cref="P:Spring.Web.Conversation.IConversationState.ParentConversation"/>.
|
||||
<para>If <see cref="P:Spring.Web.Conversation.IConversationState.RootSessionPerConversation"/> is not null, so
|
||||
<see cref="M:NHibernate.ISessionFactory.GetCurrentSession"/> is called to
|
||||
Raise SessionHolder for make the reconnection.
|
||||
</para>
|
||||
<para>Make <see cref="P:Spring.Web.Conversation.IConversationState.IsNew"/> return false.
|
||||
</para>
|
||||
<para>Update the <see cref="P:Spring.Web.Conversation.IConversationState.LastAccess"/>.
|
||||
</para>
|
||||
</summary>
|
||||
<exception cref="T:System.InvalidOperationException">
|
||||
<list type="bullet">
|
||||
<item>If this conversation is ended.
|
||||
</item>
|
||||
<item>If <see cref="P:Spring.Web.Conversation.IConversationState.RootSessionPerConversation"/> is not null and
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.RootSessionPerConversation"/> different from
|
||||
<see cref="M:NHibernate.ISessionFactory.GetCurrentSession"/>
|
||||
</item>
|
||||
</list>
|
||||
</exception>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationState.EndConversation">
|
||||
<summary>
|
||||
Ends the conversation. End each of the 'inner conversations' in
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.InnerConversations"/>. Returns false if the
|
||||
conversation and all <see cref="T:Spring.Web.Conversation.IConversationState"/> of
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.InnerConversations"/> has already been ended.
|
||||
</summary>
|
||||
<returns></returns>
|
||||
<exception cref="T:System.InvalidOperationException">
|
||||
<list type="bullet">
|
||||
<item>If <see cref="P:System.Web.HttpContext.Current"/>.
|
||||
<see cref="T:System.Web.SessionState.HttpSessionState">Session</see>["spring.objects"]
|
||||
is null.
|
||||
</item>
|
||||
<item>The 'spring session scopes' are not located in the key
|
||||
'spring.objects' of HttpSessionState.
|
||||
</item>
|
||||
</list>
|
||||
</exception>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationState.PauseConversation">
|
||||
<summary>
|
||||
Starts or resumes the conversation and each 'inner conversation' in
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.InnerConversations"/>.
|
||||
It is not about 'Session-per-conversation' because it is done by
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.Id">
|
||||
<summary>
|
||||
Conversation id.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.IsNew">
|
||||
<summary>
|
||||
Return true until <see cref="M:Spring.Web.Conversation.IConversationState.StartResumeConversation"/> is called.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.Ended">
|
||||
<summary>
|
||||
Return true if this conversation is ended.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.InnerConversations">
|
||||
<summary>
|
||||
Inner conversation. After added if the <see cref="P:Spring.Web.Conversation.IConversationState.ParentConversation"/>
|
||||
is null it will resolve to 'this'.
|
||||
</summary>
|
||||
<exception cref="T:System.InvalidOperationException">at
|
||||
<see cref="T:System.Collections.Generic.ICollection`1.Add(T)"/>,
|
||||
<see cref="T:System.Collections.Generic.IList`1.this[int]"/>,
|
||||
<see cref="T:System.Collections.Generic.IList`1.Insert(int, T)"/>
|
||||
if Circular Dependency is detected.</exception>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.ParentConversation">
|
||||
<summary>
|
||||
Conversation parent.
|
||||
</summary>
|
||||
<exception cref="T:System.InvalidOperationException">
|
||||
<list type="bullet">
|
||||
<item>If this conversation already has a different parent.
|
||||
</item>
|
||||
<item>If this Conversation is not new.
|
||||
</item>
|
||||
<item>If Circular Dependency is detected.
|
||||
</item>
|
||||
<item>The Parent conversation is not new.
|
||||
</item>
|
||||
</list>
|
||||
</exception>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.TimeOut">
|
||||
<summary>
|
||||
TimeOut for the conversation in milliseconds.
|
||||
If <c>0</c> TimeOut will be ignored.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.LastAccess">
|
||||
<summary>
|
||||
Last acces for a value into this Conversation or Inner Conversation.
|
||||
Reset to DateTime.Now each time <see cref="M:Spring.Web.Conversation.IConversationState.StartResumeConversation"/>
|
||||
is called.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.ConversationManager">
|
||||
<summary>
|
||||
Conversation Manager. When this is setted if
|
||||
<see cref="M:Spring.Web.Conversation.IConversationManager.GetConversationById(System.String)"/>
|
||||
returns null so AddConversation is called.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.RootSessionPerConversation">
|
||||
<summary>
|
||||
<para><see cref="T:NHibernate.ISession"/> that is stored in the root conversation.
|
||||
</para>
|
||||
<para>
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.ConversationManager"/> must support 'session-per-conversation'.
|
||||
</para>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.SessionFactory">
|
||||
<summary>
|
||||
<para>If this is non-null run pattern 'session-per-conversation'.
|
||||
It also depends on <see cref="P:Spring.Web.Conversation.IConversationState.DbProvider"/> and <see cref="P:Spring.Web.Conversation.IConversationState.ConversationManager"/>.
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.ConversationManager"/> must support ConversationManager.
|
||||
</para>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.DbProvider">
|
||||
<summary>
|
||||
<para>If this is non-null run pattern 'session-per-conversation'.
|
||||
It also depends on <see cref="P:Spring.Web.Conversation.IConversationState.SessionFactory"/> and <see cref="P:Spring.Web.Conversation.IConversationState.ConversationManager"/>.
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.ConversationManager"/> must support ConversationManager.
|
||||
</para>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.IsPaused">
|
||||
<summary>
|
||||
Indicates that the conversation is paused.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:Spring.Web.Conversation.IConversationManager">
|
||||
<summary>
|
||||
manager for Conversations.
|
||||
</summary>
|
||||
<author>Hailton de Castro</author>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationManager.GetConversationById(System.String)">
|
||||
<summary>
|
||||
Returns the conversation if it is still alive, otherwise it returns null.
|
||||
</summary>
|
||||
<param name="id"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationManager.EndOnTimeOut">
|
||||
<summary>
|
||||
Ends all conversations with the timeout exceeded.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationManager.PauseConversations">
|
||||
<summary>
|
||||
Close IDbConnections for <see cref="T:Spring.Web.Conversation.IConversationState"/> that
|
||||
use 'session-per-conversation'. It calls
|
||||
<see cref="M:Spring.Web.Conversation.IConversationState.PauseConversation"/> in all conversations.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationManager.FreeEnded">
|
||||
<summary>
|
||||
Release the ended conversations And removes them.
|
||||
If the conversation supports 'session-per-conversation', also close the session.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationManager.AddConversation(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
Add conversation. If <see cref="T:Spring.Web.Conversation.IConversationManager"/> is null
|
||||
it resolves to 'this'.
|
||||
</summary>
|
||||
<param name="conversation"></param>
|
||||
<exception cref="T:System.InvalidOperationException">
|
||||
If <paramref name="conversation"/> already has another manager.
|
||||
</exception>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationManager.SetActiveConversation(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
Makes the 'root conversation' of <paramref name="conversation"/>
|
||||
the current active conversation and open/reopen the
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.RootSessionPerConversation"/> if
|
||||
the conversation supports 'session-per-conversation'. Close all
|
||||
the connection for all session before.
|
||||
If <see cref="P:Spring.Web.Conversation.IConversationManager.EndPaused"/> is <c>true</c> will end all
|
||||
paused conversations.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationManager.ActiveConversation">
|
||||
<summary>
|
||||
Returns the active conversation if exists, otherwise returns null.
|
||||
It depends on <see cref="M:Spring.Web.Conversation.IConversationManager.SetActiveConversation(Spring.Web.Conversation.IConversationState)"/>
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationManager.SessionFactory">
|
||||
<summary>
|
||||
<para>If this is non-null run pattern 'session-per-conversation'.
|
||||
Must be the same SessionFactory of the managed conversations.
|
||||
</para>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationManager.EndPaused">
|
||||
<summary>
|
||||
Ends the "paused conversations" in call to <see cref="P:Spring.Web.Conversation.IConversationManager.ActiveConversation"/>.
|
||||
Important: Unexpected behavior may occur if there are nested conversations,
|
||||
as in <see cref="M:Spring.Web.Conversation.IConversationState.StartResumeConversation"/> only the current conversation and its parents
|
||||
are started, the 'conversations children' remain paused, so these will be ended.
|
||||
Defaul value: <c>false</c>.
|
||||
</summary>
|
||||
<remarks>
|
||||
<para>When it is true, "start/resume a conversation" will cause the other to be
|
||||
ended and cleaned up.
|
||||
</para>
|
||||
<para>This is useful to avoid memory leak where there are many conversations.
|
||||
This leak can be very considerable, as the conversation may keep a "NHibernate session"
|
||||
that can contain many objects in its cache from the database queries.
|
||||
</para>
|
||||
</remarks>
|
||||
</member>
|
||||
<member name="T:Spring.Web.Conversation.HttpModule.ConversationModule">
|
||||
<summary>
|
||||
HttpModule for ending Conversations with Timeout exceeded.
|
||||
</summary>
|
||||
<author>Hailton de Castro</author>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.HttpModule.ConversationModule.Init(System.Web.HttpApplication)">
|
||||
<summary>
|
||||
Add PostRequestHandlerExecute event to clear conversations with timeout exceeded.
|
||||
</summary>
|
||||
<param name="context"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.HttpModule.ConversationModule.Dispose">
|
||||
<summary>
|
||||
Disposes of the resources (other than memory) used by the module that implements <see cref="T:System.Web.IHttpModule"/>.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.HttpModule.ConversationModule.page_Unload(System.Object,System.EventArgs)">
|
||||
<summary>
|
||||
Handles the Unload event of the page control.
|
||||
</summary>
|
||||
<param name="sender">The source of the event.</param>
|
||||
<param name="e">The <see cref="T:System.EventArgs"/> instance containing the event data.</param>
|
||||
<remarks>
|
||||
Necessary for Redirect or Abort for any reason.
|
||||
</remarks>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.HttpModule.ConversationModule.ConversationManagerNameList">
|
||||
<summary>
|
||||
The Names of the <see cref="T:Spring.Web.Conversation.IConversationManager"/>s in the <see cref="T:Spring.Context.IApplicationContext"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.HttpModule.ConversationModule.ApplicationContext">
|
||||
<summary>
|
||||
Sets the <see cref="T:Spring.Context.IApplicationContext"/> that this
|
||||
object runs in.
|
||||
</summary>
|
||||
<value></value>
|
||||
<remarks>
|
||||
<p>
|
||||
Used to obtain the instances of <see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</p>
|
||||
<p>
|
||||
Invoked after population of normal object properties but before an
|
||||
init callback such as
|
||||
<see cref="T:Spring.Objects.Factory.IInitializingObject"/>'s
|
||||
<see cref="M:Spring.Objects.Factory.IInitializingObject.AfterPropertiesSet"/>
|
||||
or a custom init-method. Invoked after the setting of any
|
||||
<see cref="T:Spring.Context.IResourceLoaderAware"/>'s
|
||||
<see cref="P:Spring.Context.IResourceLoaderAware.ResourceLoader"/>
|
||||
property.
|
||||
</p>
|
||||
</remarks>
|
||||
<exception cref="T:Spring.Context.ApplicationContextException">
|
||||
In the case of application context initialization errors.
|
||||
</exception>
|
||||
<exception cref="T:Spring.Objects.ObjectsException">
|
||||
If thrown by any application context methods.
|
||||
</exception>
|
||||
<exception cref="T:Spring.Objects.Factory.ObjectInitializationException"/>
|
||||
</member>
|
||||
<member name="T:Spring.Web.Conversation.InnerConversationList">
|
||||
<summary>
|
||||
List that make validation for Circular Dependency for <see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
<author>Hailton de Castro</author>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.#ctor(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
Contructor.
|
||||
</summary>
|
||||
<param name="conversationOwner">The <see cref="T:Spring.Web.Conversation.IConversationState"/> that owns this <see cref="T:Spring.Web.Conversation.InnerConversationList"/>.</param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.PreAddProcessor(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
Common Helper to be run before insert.
|
||||
</summary>
|
||||
<param name="itemAdded"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.PostAddProcessor(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
Common Helper to be run after insert.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.IndexOf(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="item"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Insert(System.Int32,Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="index"></param>
|
||||
<param name="item"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.RemoveAt(System.Int32)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="index"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Add(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
<param name="item"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Clear">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Contains(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
<param name="item"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.CopyTo(Spring.Web.Conversation.IConversationState[],System.Int32)">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
<param name="array"></param>
|
||||
<param name="arrayIndex"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Remove(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
<param name="item"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.GetEnumerator">
|
||||
<summary>
|
||||
<see cref="T:IEnumerable`1"/>
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.System#Collections#IEnumerable#GetEnumerator">
|
||||
<summary>
|
||||
<see cref="T:System.Collections.IEnumerable"/>
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Add(System.Object)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="value"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Contains(System.Object)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="value"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.IndexOf(System.Object)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="value"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Insert(System.Int32,System.Object)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="index"></param>
|
||||
<param name="value"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Remove(System.Object)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="value"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.CopyTo(System.Array,System.Int32)">
|
||||
<summary>
|
||||
<see cref="T:System.Collections.ICollection"/>
|
||||
</summary>
|
||||
<param name="array"></param>
|
||||
<param name="index"></param>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.InnerConversationList.Item(System.Int32)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="index"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.InnerConversationList.Count">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.InnerConversationList.IsReadOnly">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.InnerConversationList.IsFixedSize">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.InnerConversationList.System#Collections#IList#Item(System.Int32)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="index"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.InnerConversationList.IsSynchronized">
|
||||
<summary>
|
||||
<see cref="T:System.Collections.ICollection"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.InnerConversationList.SyncRoot">
|
||||
<summary>
|
||||
<see cref="T:System.Collections.ICollection"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:Spring.Web.Conversation.WebConversationSpringState">
|
||||
<summary>
|
||||
Implementation of conversation in the infrastructure of Spring.
|
||||
It avoid Circular Dependencies.
|
||||
</summary>
|
||||
<author>Hailton de Castro</author>
|
||||
</member>
|
||||
<member name="F:Spring.Web.Conversation.WebConversationSpringState.MSG_CONVERSATION_ALREADY_HAS_PARENT">
|
||||
<summary>
|
||||
Default message for "CONVERSATION ALREADY HAS A PARENT" error.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.EndConversation">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.StartResumeConversation">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.PauseConversation">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.Add(System.String,System.Object)">
|
||||
<summary>
|
||||
<see cref="T:IDictionary`2"/>
|
||||
</summary>
|
||||
<param name="key"></param>
|
||||
<param name="value"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.ContainsKey(System.String)">
|
||||
<summary>
|
||||
<see cref="T:IDictionary`2"/>
|
||||
</summary>
|
||||
<param name="key"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.Remove(System.String)">
|
||||
<summary>
|
||||
<see cref="T:IDictionary`2"/>
|
||||
</summary>
|
||||
<param name="key"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.TryGetValue(System.String,System.Object@)">
|
||||
<summary>
|
||||
<see cref="T:IDictionary`2"/>
|
||||
</summary>
|
||||
<param name="key"></param>
|
||||
<param name="value"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.Add(System.Collections.Generic.KeyValuePair{System.String,System.Object})">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
<param name="item"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.Clear">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.Contains(System.Collections.Generic.KeyValuePair{System.String,System.Object})">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
<param name="item"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.CopyTo(System.Collections.Generic.KeyValuePair{System.String,System.Object}[],System.Int32)">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
<param name="array"></param>
|
||||
<param name="arrayIndex"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.Remove(System.Collections.Generic.KeyValuePair{System.String,System.Object})">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
<param name="item"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.GetEnumerator">
|
||||
<summary>
|
||||
<see cref="T:IEnumerable`1"/>
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.System#Collections#IEnumerable#GetEnumerator">
|
||||
<summary>
|
||||
<see cref="T:System.Collections.IEnumerable"/>
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.ToString">
|
||||
<summary>
|
||||
A String representation from conversation.
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.Id">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.Ended">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.TimeOut">
|
||||
<summary>
|
||||
Default 180000.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.InnerConversations">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.ParentConversation">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.LastAccess">
|
||||
<summary>
|
||||
<see cref="P:Spring.Web.Conversation.WebConversationSpringState.LastAccess"/>.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.ConversationManager">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.RootSessionPerConversation">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.SessionFactoryName">
|
||||
<summary>
|
||||
"SessionFactory" name in the current context.
|
||||
This approach is required to support serialization.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.SessionFactory">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.DbProviderName">
|
||||
<summary>
|
||||
"DbProvider" name in the current context.
|
||||
This approach is required to support serialization.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.DbProvider">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.IsNew">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.IsPaused">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.ObjectName">
|
||||
<summary>
|
||||
<see cref="T:Spring.Objects.Factory.IObjectNameAware"/>. It is used to valddate <see cref="P:Spring.Web.Conversation.WebConversationSpringState.Id"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.Keys">
|
||||
<summary>
|
||||
<see cref="T:IDictionary`2"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.Values">
|
||||
<summary>
|
||||
<see cref="T:IDictionary`2"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.Item(System.String)">
|
||||
<summary>
|
||||
<see cref="T:IDictionary`2"/>
|
||||
</summary>
|
||||
<param name="key"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.Count">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.IsReadOnly">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.ApplicationContext">
|
||||
<summary>
|
||||
Returns the current context. Supports serialization and deserialization.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:Spring.Web.Conversation.WebConversationManager">
|
||||
<summary>
|
||||
This was made to stay under session scope.
|
||||
</summary>
|
||||
<author>Hailton de Castro</author>
|
||||
</member>
|
||||
<member name="F:Spring.Web.Conversation.WebConversationManager.mutexEditDic">
|
||||
<summary>
|
||||
Semaphore to synchronize writes to the dictionary.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.GetConversationById(System.String)">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
<param name="id"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.EndOnTimeOut">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.PauseConversations">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.FreeEnded">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.AddConversation(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
<param name="conversation"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.SetActiveConversation(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
<param name="conversation"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.LoadActiveConversation">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.Dispose">
|
||||
<summary>
|
||||
Ends all conversations and Closes all their Session.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.RemoveConversation(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
Remove conversation.
|
||||
</summary>
|
||||
<param name="conversation"></param>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationManager.ActiveConversation">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationManager.SessionFactoryName">
|
||||
<summary>
|
||||
"SessionFactory" name in the current context.
|
||||
This approach is required to support serialization.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationManager.SessionFactory">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationManager.EndPaused">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationManager.ApplicationContext">
|
||||
<summary>
|
||||
Returns the current context. Supports serialization and deserialization.
|
||||
</summary>
|
||||
</member>
|
||||
</members>
|
||||
</doc>
|
||||
@@ -0,0 +1,170 @@
|
||||
#region License
|
||||
|
||||
/*
|
||||
* Copyright <20> 2002-2011 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Web;
|
||||
using System.Web.UI;
|
||||
using Common.Logging;
|
||||
using Spring.Context;
|
||||
|
||||
namespace Spring.Web.Conversation.HttpModule
|
||||
{
|
||||
/// <summary>
|
||||
/// HttpModule for ending Conversations with Timeout exceeded.
|
||||
/// </summary>
|
||||
/// <author>Hailton de Castro</author>
|
||||
public class ConversationModule : IHttpModule, IApplicationContextAware
|
||||
{
|
||||
private static readonly ILog LOG = LogManager.GetLogger(typeof(ConversationModule));
|
||||
|
||||
private IList<string> conversationManagerName;
|
||||
|
||||
/// <summary>
|
||||
/// The Names of the <see cref="IConversationManager"/>s in the <see cref="IApplicationContext"/>
|
||||
/// </summary>
|
||||
public IList<string> ConversationManagerNameList
|
||||
{
|
||||
get { return conversationManagerName; }
|
||||
set { conversationManagerName = value; }
|
||||
}
|
||||
|
||||
#region IHttpModule Members
|
||||
|
||||
/// <summary>
|
||||
/// Add PostRequestHandlerExecute event to clear conversations with timeout exceeded.
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
public void Init(HttpApplication context)
|
||||
{
|
||||
context.PreRequestHandlerExecute += context_PreRequestHandlerExecute;
|
||||
context.PostRequestHandlerExecute += context_PostRequestHandlerExecute;
|
||||
context.EndRequest += context_EndRequest;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Disposes of the resources (other than memory) used by the module that implements <see cref="T:System.Web.IHttpModule"/>.
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{
|
||||
//noop
|
||||
}
|
||||
|
||||
void context_PreRequestHandlerExecute(object sender, EventArgs e)
|
||||
{
|
||||
if (HttpContext.Current.Handler is Page)
|
||||
{
|
||||
Page page = (Page)HttpContext.Current.Handler;
|
||||
page.Unload += new EventHandler(page_Unload);
|
||||
|
||||
if (HttpContext.Current.Session != null)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug("context_PreRequestHandlerExecute: Processing HttpContext.Current.Session");
|
||||
foreach (String convMngName in this.ConversationManagerNameList)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(string.Format("context_PreRequestHandlerExecute: Processing ConversationManager: {0}", convMngName));
|
||||
IConversationManager convMng = (IConversationManager)this.applicationContext.GetObject(convMngName);
|
||||
convMng.EndOnTimeOut();
|
||||
convMng.FreeEnded();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug("context_PreRequestHandlerExecute: no HttpContext.Current.Session found.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Handles the Unload event of the page control.
|
||||
/// </summary>
|
||||
/// <param name="sender">The source of the event.</param>
|
||||
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
|
||||
/// <remarks>
|
||||
/// Necessary for Redirect or Abort for any reason.
|
||||
/// </remarks>
|
||||
void page_Unload(object sender, EventArgs e)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug("page_Unload HttpContext.Current.Session is null: " + (HttpContext.Current.Session == null));
|
||||
foreach (String convMngName in this.ConversationManagerNameList)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(string.Format("page_Unload: Processing ConversationManager: {0}", convMngName));
|
||||
IConversationManager convMng = (IConversationManager)this.applicationContext.GetObject(convMngName);
|
||||
convMng.EndOnTimeOut();
|
||||
convMng.FreeEnded();
|
||||
convMng.PauseConversations();
|
||||
}
|
||||
}
|
||||
|
||||
void context_EndRequest(object sender, EventArgs e)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug("context_EndRequest HttpContext.Current.Session is null: " + (HttpContext.Current.Session == null));
|
||||
}
|
||||
|
||||
void context_PostRequestHandlerExecute(object sender, EventArgs e)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug("context_PostRequestHandlerExecute HttpContext.Current.Session is null: " + (HttpContext.Current.Session == null));
|
||||
if (HttpContext.Current.Session != null)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IApplicationContextAware Members
|
||||
private IApplicationContext applicationContext;
|
||||
|
||||
/// <summary>
|
||||
/// Sets the <see cref="Spring.Context.IApplicationContext"/> that this
|
||||
/// object runs in.
|
||||
/// </summary>
|
||||
/// <value></value>
|
||||
/// <remarks>
|
||||
/// <p>
|
||||
/// Used to obtain the instances of <see cref="IConversationManager"/>
|
||||
/// </p>
|
||||
/// <p>
|
||||
/// Invoked after population of normal object properties but before an
|
||||
/// init callback such as
|
||||
/// <see cref="Spring.Objects.Factory.IInitializingObject"/>'s
|
||||
/// <see cref="Spring.Objects.Factory.IInitializingObject.AfterPropertiesSet"/>
|
||||
/// or a custom init-method. Invoked after the setting of any
|
||||
/// <see cref="Spring.Context.IResourceLoaderAware"/>'s
|
||||
/// <see cref="Spring.Context.IResourceLoaderAware.ResourceLoader"/>
|
||||
/// property.
|
||||
/// </p>
|
||||
/// </remarks>
|
||||
/// <exception cref="Spring.Context.ApplicationContextException">
|
||||
/// In the case of application context initialization errors.
|
||||
/// </exception>
|
||||
/// <exception cref="Spring.Objects.ObjectsException">
|
||||
/// If thrown by any application context methods.
|
||||
/// </exception>
|
||||
/// <exception cref="Spring.Objects.Factory.ObjectInitializationException"/>
|
||||
public IApplicationContext ApplicationContext
|
||||
{
|
||||
set { this.applicationContext = value; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
#region License
|
||||
|
||||
/*
|
||||
* Copyright <20> 2002-2011 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using NHibernate;
|
||||
|
||||
namespace Spring.Web.Conversation
|
||||
{
|
||||
/// <summary>
|
||||
/// manager for Conversations.
|
||||
/// </summary>
|
||||
/// <author>Hailton de Castro</author>
|
||||
public interface IConversationManager
|
||||
{
|
||||
/// <summary>
|
||||
/// Returns the conversation if it is still alive, otherwise it returns null.
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
IConversationState GetConversationById(String id);
|
||||
|
||||
/// <summary>
|
||||
/// Ends all conversations with the timeout exceeded.
|
||||
/// </summary>
|
||||
void EndOnTimeOut();
|
||||
|
||||
/// <summary>
|
||||
/// Close IDbConnections for <see cref="IConversationState"/> that
|
||||
/// use 'session-per-conversation'. It calls
|
||||
/// <see cref="IConversationState.PauseConversation"/> in all conversations.
|
||||
/// </summary>
|
||||
void PauseConversations();
|
||||
|
||||
/// <summary>
|
||||
/// Release the ended conversations And removes them.
|
||||
/// If the conversation supports 'session-per-conversation', also close the session.
|
||||
/// </summary>
|
||||
void FreeEnded();
|
||||
|
||||
/// <summary>
|
||||
/// Add conversation. If <see cref="IConversationManager"/> is null
|
||||
/// it resolves to 'this'.
|
||||
/// </summary>
|
||||
/// <param name="conversation"></param>
|
||||
/// <exception cref="InvalidOperationException">
|
||||
/// If <paramref name="conversation"/> already has another manager.
|
||||
/// </exception>
|
||||
void AddConversation(IConversationState conversation);
|
||||
|
||||
/// <summary>
|
||||
/// Makes the 'root conversation' of <paramref name="conversation"/>
|
||||
/// the current active conversation and open/reopen the
|
||||
/// <see cref="IConversationState.RootSessionPerConversation"/> if
|
||||
/// the conversation supports 'session-per-conversation'. Close all
|
||||
/// the connection for all session before.
|
||||
/// If <see cref="EndPaused"/> is <c>true</c> will end all
|
||||
/// paused conversations.
|
||||
/// </summary>
|
||||
void SetActiveConversation(IConversationState conversation);
|
||||
|
||||
/// <summary>
|
||||
/// Returns the active conversation if exists, otherwise returns null.
|
||||
/// It depends on <see cref="SetActiveConversation"/>
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
IConversationState ActiveConversation{ get; }
|
||||
|
||||
/// <summary>
|
||||
/// <para>If this is non-null run pattern 'session-per-conversation'.
|
||||
/// Must be the same SessionFactory of the managed conversations.
|
||||
/// </para>
|
||||
/// </summary>
|
||||
ISessionFactory SessionFactory { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Ends the "paused conversations" in call to <see cref="ActiveConversation"/>.
|
||||
/// Important: Unexpected behavior may occur if there are nested conversations,
|
||||
/// as in <see cref="IConversationState.StartResumeConversation"/> only the current conversation and its parents
|
||||
/// are started, the 'conversations children' remain paused, so these will be ended.
|
||||
/// Defaul value: <c>false</c>.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// <para>When it is true, "start/resume a conversation" will cause the other to be
|
||||
/// ended and cleaned up.
|
||||
/// </para>
|
||||
/// <para>This is useful to avoid memory leak where there are many conversations.
|
||||
/// This leak can be very considerable, as the conversation may keep a "NHibernate session"
|
||||
/// that can contain many objects in its cache from the database queries.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
bool EndPaused { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,183 @@
|
||||
#region License
|
||||
|
||||
/*
|
||||
* Copyright <20> 2002-2011 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using NHibernate;
|
||||
using Spring.Data.Common;
|
||||
|
||||
namespace Spring.Web.Conversation
|
||||
{
|
||||
/// <summary>
|
||||
/// Port to conversation. If the object is not found in the current
|
||||
/// conversation, will be tried on the parent if the parent is
|
||||
/// not null.
|
||||
/// </summary>
|
||||
/// <exception cref="InvalidOperationException">
|
||||
/// If <see cref="Id"/> is different from spring name for this instance.
|
||||
/// </exception>
|
||||
/// <author>Hailton de Castro</author>
|
||||
public interface IConversationState: IDictionary<string, object>
|
||||
{
|
||||
/// <summary>
|
||||
/// Conversation id.
|
||||
/// </summary>
|
||||
String Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Starts or resumes the conversation and the <see cref="ParentConversation"/>.
|
||||
/// <para>If <see cref="RootSessionPerConversation"/> is not null, so
|
||||
/// <see cref="ISessionFactory.GetCurrentSession"/> is called to
|
||||
/// Raise SessionHolder for make the reconnection.
|
||||
/// </para>
|
||||
/// <para>Make <see cref="IsNew"/> return false.
|
||||
/// </para>
|
||||
/// <para>Update the <see cref="LastAccess"/>.
|
||||
/// </para>
|
||||
/// </summary>
|
||||
/// <exception cref="InvalidOperationException">
|
||||
/// <list type="bullet">
|
||||
/// <item>If this conversation is ended.
|
||||
/// </item>
|
||||
/// <item>If <see cref="RootSessionPerConversation"/> is not null and
|
||||
/// <see cref="RootSessionPerConversation"/> different from
|
||||
/// <see cref="ISessionFactory.GetCurrentSession"/>
|
||||
/// </item>
|
||||
/// </list>
|
||||
/// </exception>
|
||||
void StartResumeConversation();
|
||||
|
||||
/// <summary>
|
||||
/// Return true until <see cref="StartResumeConversation"/> is called.
|
||||
/// </summary>
|
||||
bool IsNew { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Ends the conversation. End each of the 'inner conversations' in
|
||||
/// <see cref="InnerConversations"/>. Returns false if the
|
||||
/// conversation and all <see cref="IConversationState"/> of
|
||||
/// <see cref="InnerConversations"/> has already been ended.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="InvalidOperationException">
|
||||
/// <list type="bullet">
|
||||
/// <item>If <see cref="System.Web.HttpContext.Current"/>.
|
||||
/// <see cref="System.Web.SessionState.HttpSessionState">Session</see>["spring.objects"]
|
||||
/// is null.
|
||||
/// </item>
|
||||
/// <item>The 'spring session scopes' are not located in the key
|
||||
/// 'spring.objects' of HttpSessionState.
|
||||
/// </item>
|
||||
/// </list>
|
||||
/// </exception>
|
||||
void EndConversation();
|
||||
|
||||
/// <summary>
|
||||
/// Return true if this conversation is ended.
|
||||
/// </summary>
|
||||
bool Ended { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Inner conversation. After added if the <see cref="ParentConversation"/>
|
||||
/// is null it will resolve to 'this'.
|
||||
/// </summary>
|
||||
/// <exception cref="InvalidOperationException">at
|
||||
/// <see cref="T:System.Collections.Generic.ICollection`1.Add(T)"/>,
|
||||
/// <see cref="T:System.Collections.Generic.IList`1.this[int]"/>,
|
||||
/// <see cref="T:System.Collections.Generic.IList`1.Insert(int, T)"/>
|
||||
/// if Circular Dependency is detected.</exception>
|
||||
IList<IConversationState> InnerConversations { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Conversation parent.
|
||||
/// </summary>
|
||||
/// <exception cref="InvalidOperationException">
|
||||
/// <list type="bullet">
|
||||
/// <item>If this conversation already has a different parent.
|
||||
/// </item>
|
||||
/// <item>If this Conversation is not new.
|
||||
/// </item>
|
||||
/// <item>If Circular Dependency is detected.
|
||||
/// </item>
|
||||
/// <item>The Parent conversation is not new.
|
||||
/// </item>
|
||||
/// </list>
|
||||
/// </exception>
|
||||
IConversationState ParentConversation { get; set;}
|
||||
|
||||
/// <summary>
|
||||
/// TimeOut for the conversation in milliseconds.
|
||||
/// If <c>0</c> TimeOut will be ignored.
|
||||
/// </summary>
|
||||
Int32 TimeOut { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Last acces for a value into this Conversation or Inner Conversation.
|
||||
/// Reset to DateTime.Now each time <see cref="StartResumeConversation()"/>
|
||||
/// is called.
|
||||
/// </summary>
|
||||
DateTime LastAccess { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Conversation Manager. When this is setted if
|
||||
/// <see cref="IConversationManager.GetConversationById(String)"/>
|
||||
/// returns null so AddConversation is called.
|
||||
/// </summary>
|
||||
IConversationManager ConversationManager { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// <para><see cref="ISession"/> that is stored in the root conversation.
|
||||
/// </para>
|
||||
/// <para>
|
||||
/// <see cref="ConversationManager"/> must support 'session-per-conversation'.
|
||||
/// </para>
|
||||
/// </summary>
|
||||
ISession RootSessionPerConversation { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// <para>If this is non-null run pattern 'session-per-conversation'.
|
||||
/// It also depends on <see cref="DbProvider"/> and <see cref="ConversationManager"/>.
|
||||
/// <see cref="ConversationManager"/> must support ConversationManager.
|
||||
/// </para>
|
||||
/// </summary>
|
||||
ISessionFactory SessionFactory { get; }
|
||||
|
||||
/// <summary>
|
||||
/// <para>If this is non-null run pattern 'session-per-conversation'.
|
||||
/// It also depends on <see cref="SessionFactory"/> and <see cref="ConversationManager"/>.
|
||||
/// <see cref="ConversationManager"/> must support ConversationManager.
|
||||
/// </para>
|
||||
/// </summary>
|
||||
IDbProvider DbProvider { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Indicates that the conversation is paused.
|
||||
/// </summary>
|
||||
bool IsPaused { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Starts or resumes the conversation and each 'inner conversation' in
|
||||
/// <see cref="InnerConversations"/>.
|
||||
/// It is not about 'Session-per-conversation' because it is done by
|
||||
/// <see cref="IConversationManager"/>.
|
||||
/// </summary>
|
||||
void PauseConversation();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,376 @@
|
||||
#region License
|
||||
|
||||
/*
|
||||
* Copyright <20> 2002-2011 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Common.Logging;
|
||||
using Iesi.Collections.Generic;
|
||||
|
||||
namespace Spring.Web.Conversation
|
||||
{
|
||||
/// <summary>
|
||||
/// List that make validation for Circular Dependency for <see cref="IConversationState"/>
|
||||
/// </summary>
|
||||
/// <author>Hailton de Castro</author>
|
||||
[Serializable]
|
||||
public class InnerConversationList: IList<IConversationState>, IList
|
||||
{
|
||||
private static readonly ILog LOG = LogManager.GetLogger(typeof(InnerConversationList));
|
||||
|
||||
private IConversationState conversationOwner;
|
||||
|
||||
private IList<IConversationState> innerList = new List<IConversationState>();
|
||||
|
||||
/// <summary>
|
||||
/// Contructor.
|
||||
/// </summary>
|
||||
/// <param name="conversationOwner">The <see cref="IConversationState"/> that owns this <see cref="InnerConversationList"/>.</param>
|
||||
public InnerConversationList(IConversationState conversationOwner)
|
||||
{
|
||||
if (conversationOwner == null)
|
||||
{
|
||||
String message = "'conversationOwner' can not be null";
|
||||
|
||||
LOG.Error(message);
|
||||
throw new InvalidOperationException(message);
|
||||
}
|
||||
if (LOG.IsDebugEnabled) LOG.Error(String.Format("Creating InnerConversationList for '{0}'", conversationOwner.Id));
|
||||
this.conversationOwner = conversationOwner;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Common Helper to be run before insert.
|
||||
/// </summary>
|
||||
/// <param name="itemAdded"></param>
|
||||
private void PreAddProcessor(IConversationState itemAdded)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("PreAddProcessor: added={0} into {1}", itemAdded, this.conversationOwner));
|
||||
this.ValidateCircularDependency(itemAdded);
|
||||
if (itemAdded.ParentConversation != null && itemAdded.ParentConversation != this.conversationOwner)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
String.Format(WebConversationSpringState.MSG_CONVERSATION_ALREADY_HAS_PARENT, itemAdded.ParentConversation.Id, this.conversationOwner.Id));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Common Helper to be run after insert.
|
||||
/// </summary>
|
||||
private void PostAddProcessor(IConversationState itemAdded)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("PostAddProcessor: added={0} into {1}", itemAdded, this.conversationOwner));
|
||||
if (itemAdded.ParentConversation == null)
|
||||
{
|
||||
itemAdded.ParentConversation = this.conversationOwner;
|
||||
}
|
||||
}
|
||||
|
||||
private void ValidateCircularDependency(IConversationState itemAdded)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("Validating Circular Dependency: added={0} into {1}", itemAdded, this.conversationOwner));
|
||||
|
||||
ICollection<IConversationState> visitedColl = new HashedSet<IConversationState>();
|
||||
visitedColl.Add(conversationOwner);
|
||||
|
||||
IConversationState parentAncestor = this.conversationOwner;
|
||||
String path = this.conversationOwner.Id;
|
||||
//string conectorPath = "";
|
||||
|
||||
this.ValidateCircularDependencyRecursive(itemAdded, visitedColl, path + "->" + itemAdded.Id);
|
||||
}
|
||||
|
||||
private void ValidateCircularDependencyRecursive(IConversationState currentConv, ICollection<IConversationState> visitedColl, String path)
|
||||
{
|
||||
foreach (IConversationState convItem in currentConv.InnerConversations)
|
||||
{
|
||||
if (visitedColl.Contains(convItem))
|
||||
{
|
||||
String exMsgStr =
|
||||
"ConversationState Circular Dependency detected: " +
|
||||
path + "->" + convItem.Id;
|
||||
|
||||
LOG.Error(exMsgStr);
|
||||
throw new InvalidOperationException(exMsgStr);
|
||||
}
|
||||
|
||||
visitedColl.Add(convItem);
|
||||
|
||||
this.ValidateCircularDependencyRecursive(convItem, visitedColl, path + "->" + convItem.Id);
|
||||
}
|
||||
}
|
||||
|
||||
#region IList<IConversationState> Members
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:IList`1"/>
|
||||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
/// <returns></returns>
|
||||
public int IndexOf(IConversationState item)
|
||||
{
|
||||
return this.innerList.IndexOf(item);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:IList`1"/>
|
||||
/// </summary>
|
||||
/// <param name="index"></param>
|
||||
/// <param name="item"></param>
|
||||
public void Insert(int index, IConversationState item)
|
||||
{
|
||||
this.PreAddProcessor(item);
|
||||
this.innerList.Insert(index, item);
|
||||
this.PostAddProcessor(item);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:IList`1"/>
|
||||
/// </summary>
|
||||
/// <param name="index"></param>
|
||||
public void RemoveAt(int index)
|
||||
{
|
||||
this.innerList.RemoveAt(index);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:IList`1"/>
|
||||
/// </summary>
|
||||
/// <param name="index"></param>
|
||||
/// <returns></returns>
|
||||
public IConversationState this[int index]
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.innerList[index];
|
||||
}
|
||||
set
|
||||
{
|
||||
this.PreAddProcessor(value);
|
||||
this.innerList[index] = value;
|
||||
this.PostAddProcessor(value);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region ICollection<IConversationState> Members
|
||||
/// <summary>
|
||||
/// <see cref="T:ICollection`1"/>
|
||||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
public void Add(IConversationState item)
|
||||
{
|
||||
this.PreAddProcessor(item);
|
||||
this.innerList.Add(item);
|
||||
this.PostAddProcessor(item);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:ICollection`1"/>
|
||||
/// </summary>
|
||||
public void Clear()
|
||||
{
|
||||
this.innerList.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:ICollection`1"/>
|
||||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
/// <returns></returns>
|
||||
public bool Contains(IConversationState item)
|
||||
{
|
||||
return this.innerList.Contains(item);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:ICollection`1"/>
|
||||
/// </summary>
|
||||
/// <param name="array"></param>
|
||||
/// <param name="arrayIndex"></param>
|
||||
public void CopyTo(IConversationState[] array, int arrayIndex)
|
||||
{
|
||||
this.innerList.CopyTo(array, arrayIndex);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:ICollection`1"/>
|
||||
/// </summary>
|
||||
public int Count
|
||||
{
|
||||
get { return this.innerList.Count; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:ICollection`1"/>
|
||||
/// </summary>
|
||||
public bool IsReadOnly
|
||||
{
|
||||
get { return this.innerList.IsReadOnly; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:ICollection`1"/>
|
||||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
/// <returns></returns>
|
||||
public bool Remove(IConversationState item)
|
||||
{
|
||||
return this.innerList.Remove(item);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IEnumerable<IConversationState> Members
|
||||
/// <summary>
|
||||
/// <see cref="T:IEnumerable`1"/>
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public IEnumerator<IConversationState> GetEnumerator()
|
||||
{
|
||||
return this.innerList.GetEnumerator();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IEnumerable Members
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="IEnumerable"/>
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
|
||||
{
|
||||
return this.innerList.GetEnumerator();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IList Members
|
||||
/// <summary>
|
||||
/// <see cref="T:IList`1"/>
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public int Add(object value)
|
||||
{
|
||||
((IList<IConversationState>)this).Add((IConversationState)value);
|
||||
return this.innerList.Count - 1;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:IList`1"/>
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public bool Contains(object value)
|
||||
{
|
||||
return ((IList<IConversationState>)this).Contains((IConversationState)value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:IList`1"/>
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public int IndexOf(object value)
|
||||
{
|
||||
return ((IList<IConversationState>)this).IndexOf((IConversationState)value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:IList`1"/>
|
||||
/// </summary>
|
||||
/// <param name="index"></param>
|
||||
/// <param name="value"></param>
|
||||
public void Insert(int index, object value)
|
||||
{
|
||||
((IList<IConversationState>)this).Insert(index, (IConversationState)value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:IList`1"/>
|
||||
/// </summary>
|
||||
public bool IsFixedSize
|
||||
{
|
||||
get { return false; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:IList`1"/>
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
public void Remove(object value)
|
||||
{
|
||||
((IList<IConversationState>)this).Add((IConversationState)value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:IList`1"/>
|
||||
/// </summary>
|
||||
/// <param name="index"></param>
|
||||
/// <returns></returns>
|
||||
object IList.this[int index]
|
||||
{
|
||||
get
|
||||
{
|
||||
return ((IList<IConversationState>)this)[index];
|
||||
}
|
||||
set
|
||||
{
|
||||
((IList<IConversationState>)this)[index] = (IConversationState)value;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region ICollection Members
|
||||
/// <summary>
|
||||
/// <see cref="ICollection"/>
|
||||
/// </summary>
|
||||
/// <param name="array"></param>
|
||||
/// <param name="index"></param>
|
||||
public void CopyTo(Array array, int index)
|
||||
{
|
||||
IConversationState[] convArr = new IConversationState[array.Length];
|
||||
((IList<IConversationState>)this).CopyTo(convArr, index);
|
||||
convArr.CopyTo(array, index);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="ICollection"/>
|
||||
/// </summary>
|
||||
public bool IsSynchronized
|
||||
{
|
||||
get { return false; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="ICollection"/>
|
||||
/// </summary>
|
||||
public object SyncRoot
|
||||
{
|
||||
get { return this; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,374 @@
|
||||
#region License
|
||||
|
||||
/*
|
||||
* Copyright <20> 2002-2011 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Web;
|
||||
using Common.Logging;
|
||||
using NHibernate;
|
||||
using Spring.Context;
|
||||
using Spring.Context.Support;
|
||||
using Spring.Data.NHibernate.Support;
|
||||
|
||||
namespace Spring.Web.Conversation
|
||||
{
|
||||
/// <summary>
|
||||
/// This was made to stay under session scope.
|
||||
/// </summary>
|
||||
/// <author>Hailton de Castro</author>
|
||||
[Serializable]
|
||||
public class WebConversationManager : SessionPerConversationScope, IConversationManager, IApplicationContextAware
|
||||
{
|
||||
private static readonly ILog LOG = LogManager.GetLogger(typeof(WebConversationManager));
|
||||
|
||||
private static readonly String CONVERSATION_COOKIE_ID = "WebConversationManager.activeConversationId";
|
||||
|
||||
/// <summary>
|
||||
/// Semaphore to synchronize writes to the dictionary.
|
||||
/// </summary>
|
||||
[NonSerialized]
|
||||
private Mutex mutexEditDic = new Mutex();
|
||||
private Mutex MutexEditDic
|
||||
{
|
||||
get
|
||||
{
|
||||
if (this.mutexEditDic == null)
|
||||
this.mutexEditDic = new Mutex();
|
||||
return this.mutexEditDic;
|
||||
}
|
||||
}
|
||||
|
||||
private readonly IDictionary<String, IConversationState> conversations = new Dictionary<String, IConversationState>();
|
||||
private IConversationState activeConversation = null;
|
||||
|
||||
#region IConversationManager Members
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="IConversationManager"/>
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public IConversationState GetConversationById(string id)
|
||||
{
|
||||
if (this.conversations.ContainsKey(id))
|
||||
{
|
||||
return this.conversations[id];
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="IConversationManager"/>
|
||||
/// </summary>
|
||||
public void EndOnTimeOut()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug("EndOnTimeOut");
|
||||
this.MutexEditDic.WaitOne(5000);
|
||||
foreach (String keyItem in this.conversations.Keys)
|
||||
{
|
||||
IConversationState conversationItem = this.conversations[keyItem];
|
||||
if (conversationItem.TimeOut > 0)
|
||||
{
|
||||
if (DateTime.Now.Subtract(conversationItem.LastAccess).TotalMilliseconds > conversationItem.TimeOut)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("Timeout for conversation '{0}'", conversationItem.Id));
|
||||
conversationItem.EndConversation();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
this.MutexEditDic.ReleaseMutex();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="IConversationManager"/>
|
||||
/// </summary>
|
||||
public void PauseConversations()
|
||||
{
|
||||
foreach (IConversationState convItem in this.conversations.Values)
|
||||
{
|
||||
convItem.PauseConversation();
|
||||
}
|
||||
this.Close(this.SessionFactory, this.conversations.Values);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="IConversationManager"/>
|
||||
/// </summary>
|
||||
public void FreeEnded()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug("EndOnTimeOut");
|
||||
this.MutexEditDic.WaitOne(5000);
|
||||
List<IConversationState> removeList = new List<IConversationState>();
|
||||
foreach (String keyItem in this.conversations.Keys)
|
||||
{
|
||||
IConversationState conversationItem = this.conversations[keyItem];
|
||||
if (conversationItem.Ended)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("FreeEnded: Release conversation '{0}'", conversationItem.Id));
|
||||
removeList.Add(conversationItem);
|
||||
}
|
||||
}
|
||||
|
||||
if (removeList.Count > 0)
|
||||
{
|
||||
this.Close(this.SessionFactory, removeList);
|
||||
}
|
||||
|
||||
foreach (IConversationState conversationItem in removeList)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("FreeEnded: Remove conversation '{0}'", conversationItem.Id));
|
||||
conversationItem.EndConversation();
|
||||
this.RemoveConversation(conversationItem);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
this.MutexEditDic.ReleaseMutex();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="IConversationManager"/>
|
||||
/// </summary>
|
||||
/// <param name="conversation"></param>
|
||||
public void AddConversation(IConversationState conversation)
|
||||
{
|
||||
try
|
||||
{
|
||||
this.MutexEditDic.WaitOne(5000);
|
||||
this.conversations.Add(conversation.Id, conversation);
|
||||
}
|
||||
finally
|
||||
{
|
||||
this.MutexEditDic.ReleaseMutex();
|
||||
}
|
||||
|
||||
if (conversation.ConversationManager != null && conversation.ConversationManager != this)
|
||||
{
|
||||
throw new InvalidOperationException(String.Format("Conversation already has another manager. conversation='{0}'", conversation.Id));
|
||||
}
|
||||
|
||||
if (conversation.ConversationManager == null)
|
||||
{
|
||||
conversation.ConversationManager = this;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="IConversationManager"/>
|
||||
/// </summary>
|
||||
/// <param name="conversation"></param>
|
||||
public void SetActiveConversation(IConversationState conversation)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("SetActiveConversation('{0}')", conversation.Id));
|
||||
|
||||
//Close connection for the last conversation, if it is open.
|
||||
if (this.activeConversation != null && this.activeConversation != conversation)
|
||||
{
|
||||
this.Close(this.SessionFactory, this.conversations.Values);
|
||||
}
|
||||
this.Open(conversation, this.conversations.Values);
|
||||
|
||||
this.activeConversation = conversation;
|
||||
|
||||
//Ending the paused conversations.
|
||||
if (this.EndPaused)
|
||||
{
|
||||
foreach (IConversationState convItem in this.conversations.Values)
|
||||
{
|
||||
if (convItem.IsPaused)
|
||||
{
|
||||
convItem.EndConversation();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="IConversationManager"/>
|
||||
/// </summary>
|
||||
[Obsolete("Not used, the active conversation is defined by call 'IConversationManager.SetActiveConversation' on 'IConversationState.StartResumeConversation'")]
|
||||
public void LoadActiveConversation()
|
||||
{
|
||||
//reset this.activeConversation
|
||||
this.activeConversation = null;
|
||||
|
||||
if (LOG.IsDebugEnabled) LOG.Debug("LoadActiveConversation");
|
||||
|
||||
HttpCookie activeConveCookie = HttpContext.Current.Request.Cookies[CONVERSATION_COOKIE_ID];
|
||||
if (activeConveCookie != null && !String.IsNullOrEmpty(activeConveCookie.Value))
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("LoadActiveConversation: cooking found for current active conversation: [{0}]", activeConveCookie.ToString()));
|
||||
if (this.conversations.ContainsKey(activeConveCookie.Value))
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("LoadActiveConversation: active conversation found for id: '{0}'", activeConveCookie.Value));
|
||||
IConversationState conversation = this.conversations[activeConveCookie.Value];
|
||||
if (conversation != null)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("LoadActiveConversation: conversation found: '{0}'", conversation.Id));
|
||||
//find root conversation.
|
||||
IConversationState rootConversation = conversation;
|
||||
while (rootConversation.ParentConversation != null)
|
||||
{
|
||||
rootConversation = rootConversation.ParentConversation;
|
||||
}
|
||||
rootConversation.StartResumeConversation();
|
||||
this.SetActiveConversation(rootConversation);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("LoadActiveConversation: conversation NOT found for id on the cookie: '{0}'", activeConveCookie.Value));
|
||||
HttpContext.Current.Response.Cookies.Remove(CONVERSATION_COOKIE_ID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="IConversationManager"/>
|
||||
/// </summary>
|
||||
public IConversationState ActiveConversation
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.activeConversation;
|
||||
}
|
||||
}
|
||||
|
||||
private String sessionFactoryName;
|
||||
/// <summary>
|
||||
/// "SessionFactory" name in the current context.
|
||||
/// This approach is required to support serialization.
|
||||
/// </summary>
|
||||
public String SessionFactoryName
|
||||
{
|
||||
get { return sessionFactoryName; }
|
||||
set { sessionFactoryName = value; }
|
||||
}
|
||||
|
||||
[NonSerialized]
|
||||
private ISessionFactory sessionFactory;
|
||||
/// <summary>
|
||||
/// <see cref="IConversationManager"/>
|
||||
/// </summary>
|
||||
public ISessionFactory SessionFactory
|
||||
{
|
||||
get
|
||||
{
|
||||
if (this.sessionFactory == null && this.sessionFactoryName != null)
|
||||
{
|
||||
this.sessionFactory = this.ApplicationContext.GetObject<ISessionFactory>(this.sessionFactoryName);
|
||||
}
|
||||
return sessionFactory;
|
||||
}
|
||||
}
|
||||
|
||||
private bool endPaused = false;
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="IConversationManager"/>
|
||||
/// </summary>
|
||||
public bool EndPaused
|
||||
{
|
||||
get { return endPaused; }
|
||||
set { endPaused = value; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region SessionPerConversationScope Members
|
||||
/// <summary>
|
||||
/// Ends all conversations and Closes all their Session.
|
||||
/// </summary>
|
||||
public override void Dispose()
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug("Dispose. End all Conversations");
|
||||
foreach (String conversationId in this.conversations.Keys)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(string.Format("Ending Conversation for Conversation Id: {0}", conversationId));
|
||||
this.conversations[conversationId].EndConversation();
|
||||
}
|
||||
|
||||
this.Close(this.SessionFactory, this.conversations.Values);
|
||||
|
||||
this.conversations.Clear();
|
||||
this.sessionFactory = null;
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Remove conversation.
|
||||
/// </summary>
|
||||
/// <param name="conversation"></param>
|
||||
private void RemoveConversation(IConversationState conversation)
|
||||
{
|
||||
try
|
||||
{
|
||||
this.MutexEditDic.WaitOne(5000);
|
||||
if (!this.conversations.Remove(conversation.Id))
|
||||
{
|
||||
throw new InvalidOperationException(String.Format("Conversation '{0}' does not exist on this manager.", conversation.Id));
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
this.MutexEditDic.ReleaseMutex();
|
||||
}
|
||||
}
|
||||
|
||||
#region IApplicationContextAware Members
|
||||
private String applicationContextName;
|
||||
[NonSerialized]
|
||||
private IApplicationContext applicationContext = null;
|
||||
/// <summary>
|
||||
/// Returns the current context. Supports serialization and deserialization.
|
||||
/// </summary>
|
||||
public IApplicationContext ApplicationContext
|
||||
{
|
||||
set
|
||||
{
|
||||
this.applicationContext = value;
|
||||
this.applicationContextName = this.applicationContext.Name;
|
||||
}
|
||||
get
|
||||
{
|
||||
if (this.applicationContext == null)
|
||||
{
|
||||
this.applicationContext = ContextRegistry.GetContext(this.applicationContextName);
|
||||
}
|
||||
return this.applicationContext;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,669 @@
|
||||
#region License
|
||||
|
||||
/*
|
||||
* Copyright <20> 2002-2011 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Web;
|
||||
using Common.Logging;
|
||||
using NHibernate;
|
||||
using Spring.Context;
|
||||
using Spring.Context.Support;
|
||||
using Spring.Data.Common;
|
||||
using Spring.Objects.Factory;
|
||||
|
||||
namespace Spring.Web.Conversation
|
||||
{
|
||||
/// <summary>
|
||||
/// Implementation of conversation in the infrastructure of Spring.
|
||||
/// It avoid Circular Dependencies.
|
||||
/// </summary>
|
||||
/// <author>Hailton de Castro</author>
|
||||
[Serializable]
|
||||
public class WebConversationSpringState : IConversationState, IObjectNameAware, IApplicationContextAware
|
||||
{
|
||||
private const string SPRING_SESSSION_SCOPE_KEY = "spring.objects";
|
||||
private static readonly ILog LOG = LogManager.GetLogger(typeof(WebConversationSpringState));
|
||||
|
||||
/// <summary>
|
||||
/// Default message for "CONVERSATION ALREADY HAS A PARENT" error.
|
||||
/// </summary>
|
||||
public static readonly String MSG_CONVERSATION_ALREADY_HAS_PARENT =
|
||||
"This conversation already has a different parent." +
|
||||
" Current: '{0}'. Tried: '{1}'";
|
||||
|
||||
private IDictionary<string, object> state = new Dictionary<string, object>();
|
||||
|
||||
#region IConversationState Members
|
||||
|
||||
private String id;
|
||||
/// <summary>
|
||||
/// <see cref="IConversationState"/>
|
||||
/// </summary>
|
||||
public string Id
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.id;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.id = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="IConversationState"/>
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public void EndConversation()
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("End of Conversation '{0}'", this.id));
|
||||
|
||||
IDictionary springSessionScope = (IDictionary)HttpContext.Current.Session[SPRING_SESSSION_SCOPE_KEY];
|
||||
if (springSessionScope == null)
|
||||
{
|
||||
throw new InvalidOperationException(string.Format("The 'spring session scope' is not located in the key {0} of HttpSessionState.", SPRING_SESSSION_SCOPE_KEY));
|
||||
}
|
||||
|
||||
if (springSessionScope.Contains(this.Id))
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("EndConversation: Id='{0}' Was Found on 'spring session scope'!", this.id));
|
||||
springSessionScope.Remove(this.id);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("EndConversation: Id='{0}' Was NOT Found on 'spring session scope!", this.id));
|
||||
}
|
||||
|
||||
List<IConversationState> innerConversationsListTemp = new List<IConversationState>(this.InnerConversations);
|
||||
foreach (IConversationState innerConversationItem in innerConversationsListTemp)
|
||||
{
|
||||
innerConversationItem.EndConversation();
|
||||
}
|
||||
|
||||
if (this.parentConversation != null)
|
||||
{
|
||||
this.parentConversation.InnerConversations.Remove(this);
|
||||
}
|
||||
|
||||
this.ended = true;
|
||||
}
|
||||
|
||||
private bool ended = false;
|
||||
/// <summary>
|
||||
/// <see cref="IConversationState"/>
|
||||
/// </summary>
|
||||
public bool Ended
|
||||
{
|
||||
get { return ended; }
|
||||
}
|
||||
|
||||
private int timeOut = 180000;
|
||||
/// <summary>
|
||||
/// Default 180000.
|
||||
/// </summary>
|
||||
public int TimeOut
|
||||
{
|
||||
get { return timeOut; }
|
||||
set { timeOut = value; }
|
||||
}
|
||||
|
||||
private IList<IConversationState> innerConversations;
|
||||
/// <summary>
|
||||
/// <see cref="IConversationState"/>
|
||||
/// </summary>
|
||||
public IList<IConversationState> InnerConversations
|
||||
{
|
||||
get
|
||||
{
|
||||
if (this.innerConversations == null)
|
||||
{
|
||||
this.innerConversations = new InnerConversationList(this);
|
||||
}
|
||||
return this.innerConversations;
|
||||
}
|
||||
}
|
||||
|
||||
private IConversationState parentConversation;
|
||||
/// <summary>
|
||||
/// <see cref="IConversationState"/>
|
||||
/// </summary>
|
||||
public IConversationState ParentConversation
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.parentConversation;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (this.parentConversation != null && this.parentConversation != value)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
String.Format(MSG_CONVERSATION_ALREADY_HAS_PARENT, this.parentConversation.Id, value.Id));
|
||||
}
|
||||
if (!this.IsNew)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
String.Format("This Conversation is not new." +
|
||||
" Conversation.Id: '{0}'. Parent Tried: '{1}'", this.Id, value.Id));
|
||||
}
|
||||
//Perhaps the father need not be new, only the child needs to be.
|
||||
//if (!value.IsNew)
|
||||
//{
|
||||
// throw new InvalidOperationException(
|
||||
// String.Format("The Parent conversation is not new." +
|
||||
// " Conversation.Id: '{0}'. Parent Tried: '{1}'", this.Id, value.Id));
|
||||
//}
|
||||
|
||||
this.parentConversation = value;
|
||||
if (!this.parentConversation.InnerConversations.Contains(this))
|
||||
{
|
||||
this.parentConversation.InnerConversations.Add(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private DateTime lastAccess = DateTime.Now;
|
||||
/// <summary>
|
||||
/// <see cref="LastAccess"/>.
|
||||
/// </summary>
|
||||
public DateTime LastAccess
|
||||
{
|
||||
get { return lastAccess; }
|
||||
set { lastAccess = value; }
|
||||
}
|
||||
|
||||
private IConversationManager conversationManager;
|
||||
/// <summary>
|
||||
/// <see cref="IConversationState"/>
|
||||
/// </summary>
|
||||
public IConversationManager ConversationManager
|
||||
{
|
||||
get
|
||||
{
|
||||
return conversationManager;
|
||||
}
|
||||
set
|
||||
{
|
||||
conversationManager = value;
|
||||
if (this.conversationManager.GetConversationById(this.Id) == null)
|
||||
{
|
||||
this.conversationManager.AddConversation(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="IConversationState"/>
|
||||
/// </summary>
|
||||
public void StartResumeConversation()
|
||||
{
|
||||
this.isNew = false;
|
||||
this.isPaused = false;
|
||||
this.lastAccess = DateTime.Now;
|
||||
|
||||
if (this.Ended)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
String.Format(
|
||||
"StartResumeConversation: this conversation is ended." +
|
||||
" Conversation.Id '{0}'", this.Id));
|
||||
}
|
||||
if (this.ConversationManager != null)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("StartResumeConversation('{0}'): ConversationManager is not null.", this.Id));
|
||||
//if this is the root conversation.
|
||||
if (this.ParentConversation == null)
|
||||
{
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("SetActiveConversation('{0}'): ConversationManager is not null.", this.Id));
|
||||
//if this is the root conversation.
|
||||
this.ConversationManager.SetActiveConversation(this);
|
||||
|
||||
//makes SessionHolder to reopen this session
|
||||
if (this.RootSessionPerConversation != null)
|
||||
{
|
||||
ISession session = this.SessionFactory.GetCurrentSession();
|
||||
if (this.RootSessionPerConversation != session)
|
||||
{
|
||||
//How it is implemented it will never happen, because of the sequence of previous calls:
|
||||
// ConversationManager.SetActiveConversation -> SessionPerConversationScope.Open
|
||||
// 'new InvalidOperationException("Participating in existing Hibernate SessionFactory IS NOT ALOWED.")' happen first.
|
||||
throw new InvalidOperationException(
|
||||
String.Format(
|
||||
"StartResumeConversation: this.SessionFactory.GetCurrentSession()" +
|
||||
" have a different instance than 'RootSessionPerConversation'" +
|
||||
" from conversation '{0}'", this.Id));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
this.ParentConversation.StartResumeConversation();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private ISession rootSessionPerConversation;
|
||||
/// <summary>
|
||||
/// <see cref="IConversationState"/>
|
||||
/// </summary>
|
||||
public ISession RootSessionPerConversation
|
||||
{
|
||||
get
|
||||
{
|
||||
if (this.ParentConversation != null)
|
||||
{
|
||||
return this.ParentConversation.RootSessionPerConversation;
|
||||
}
|
||||
else
|
||||
{
|
||||
return rootSessionPerConversation;
|
||||
}
|
||||
}
|
||||
set
|
||||
{
|
||||
if (this.ParentConversation != null)
|
||||
{
|
||||
this.ParentConversation.RootSessionPerConversation = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
rootSessionPerConversation = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private String sessionFactoryName;
|
||||
/// <summary>
|
||||
/// "SessionFactory" name in the current context.
|
||||
/// This approach is required to support serialization.
|
||||
/// </summary>
|
||||
public String SessionFactoryName
|
||||
{
|
||||
get { return sessionFactoryName; }
|
||||
set { sessionFactoryName = value; }
|
||||
}
|
||||
|
||||
[NonSerialized]
|
||||
private ISessionFactory sessionFactory;
|
||||
/// <summary>
|
||||
/// <see cref="IConversationState"/>
|
||||
/// </summary>
|
||||
public ISessionFactory SessionFactory
|
||||
{
|
||||
get
|
||||
{
|
||||
if (this.sessionFactory == null && this.sessionFactoryName != null)
|
||||
{
|
||||
this.sessionFactory = this.ApplicationContext.GetObject<ISessionFactory>(this.sessionFactoryName);
|
||||
}
|
||||
return sessionFactory;
|
||||
}
|
||||
}
|
||||
|
||||
private String dbProviderName;
|
||||
/// <summary>
|
||||
/// "DbProvider" name in the current context.
|
||||
/// This approach is required to support serialization.
|
||||
/// </summary>
|
||||
public String DbProviderName
|
||||
{
|
||||
get { return dbProviderName; }
|
||||
set { dbProviderName = value; }
|
||||
}
|
||||
|
||||
[NonSerialized]
|
||||
private IDbProvider dbProvider;
|
||||
/// <summary>
|
||||
/// <see cref="IConversationState"/>
|
||||
/// </summary>
|
||||
public IDbProvider DbProvider
|
||||
{
|
||||
get
|
||||
{
|
||||
if (this.dbProvider == null && this.dbProviderName != null)
|
||||
{
|
||||
this.dbProvider = this.ApplicationContext.GetObject<IDbProvider>(this.dbProviderName);
|
||||
}
|
||||
return dbProvider;
|
||||
}
|
||||
}
|
||||
|
||||
private bool isNew = true;
|
||||
/// <summary>
|
||||
/// <see cref="IConversationState"/>
|
||||
/// </summary>
|
||||
public bool IsNew
|
||||
{
|
||||
get { return this.isNew; }
|
||||
}
|
||||
|
||||
private bool isPaused = true;
|
||||
/// <summary>
|
||||
/// <see cref="IConversationState"/>
|
||||
/// </summary>
|
||||
public bool IsPaused
|
||||
{
|
||||
get { return isPaused; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="IConversationState"/>
|
||||
/// </summary>
|
||||
public void PauseConversation()
|
||||
{
|
||||
this.isPaused = true;
|
||||
foreach (IConversationState conversation in this.InnerConversations)
|
||||
{
|
||||
conversation.PauseConversation();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region IObjectNameAware Members
|
||||
/// <summary>
|
||||
/// <see cref="IObjectNameAware"/>. It is used to valddate <see cref="Id"/>
|
||||
/// </summary>
|
||||
public string ObjectName
|
||||
{
|
||||
set
|
||||
{
|
||||
if (this.id != value)
|
||||
{
|
||||
throw new InvalidOperationException(String.Format("Id is different from spring name for this instance.. Currents='{0}', springName='{1}'", this.id, value));
|
||||
}
|
||||
if (LOG.IsDebugEnabled) LOG.Debug(String.Format("Begin of Conversation '{0}'", this.id));
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IDictionary<string,object> Members
|
||||
/// <summary>
|
||||
/// <see cref="T:IDictionary`2"/>
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
public void Add(string key, object value)
|
||||
{
|
||||
this.state.Add(key, value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:IDictionary`2"/>
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <returns></returns>
|
||||
public bool ContainsKey(string key)
|
||||
{
|
||||
if (this.state.ContainsKey(key))
|
||||
{
|
||||
return this.state.ContainsKey(key);
|
||||
}
|
||||
else if (this.parentConversation != null)
|
||||
{
|
||||
return this.parentConversation.ContainsKey(key);
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:IDictionary`2"/>
|
||||
/// </summary>
|
||||
public ICollection<string> Keys
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.state.Keys;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:IDictionary`2"/>
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <returns></returns>
|
||||
public bool Remove(string key)
|
||||
{
|
||||
return this.state.Remove(key);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:IDictionary`2"/>
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="value"></param>
|
||||
/// <returns></returns>
|
||||
public bool TryGetValue(string key, out object value)
|
||||
{
|
||||
if (this.state.TryGetValue(key, out value))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (this.parentConversation != null && this.parentConversation.TryGetValue(key, out value))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:IDictionary`2"/>
|
||||
/// </summary>
|
||||
public ICollection<object> Values
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.state.Values;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:IDictionary`2"/>
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <returns></returns>
|
||||
public object this[string key]
|
||||
{
|
||||
get
|
||||
{
|
||||
if (this.state.ContainsKey(key))
|
||||
{
|
||||
return this.state[key];
|
||||
}
|
||||
else if (this.parentConversation != null)
|
||||
{
|
||||
return this.parentConversation[key];
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
set
|
||||
{
|
||||
this.state[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region ICollection<KeyValuePair<string,object>> Members
|
||||
/// <summary>
|
||||
/// <see cref="T:ICollection`1"/>
|
||||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
public void Add(KeyValuePair<string, object> item)
|
||||
{
|
||||
this.state.Add(item);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:ICollection`1"/>
|
||||
/// </summary>
|
||||
public void Clear()
|
||||
{
|
||||
this.state.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:ICollection`1"/>
|
||||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
/// <returns></returns>
|
||||
public bool Contains(KeyValuePair<string, object> item)
|
||||
{
|
||||
if (this.state.Contains(item))
|
||||
{
|
||||
return this.state.Contains(item);
|
||||
}
|
||||
else if (this.parentConversation != null)
|
||||
{
|
||||
return this.parentConversation.Contains(item);
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:ICollection`1"/>
|
||||
/// </summary>
|
||||
/// <param name="array"></param>
|
||||
/// <param name="arrayIndex"></param>
|
||||
public void CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)
|
||||
{
|
||||
this.state.CopyTo(array, arrayIndex);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:ICollection`1"/>
|
||||
/// </summary>
|
||||
public int Count
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.state.Count;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:ICollection`1"/>
|
||||
/// </summary>
|
||||
public bool IsReadOnly
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.state.IsReadOnly;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="T:ICollection`1"/>
|
||||
/// </summary>
|
||||
/// <param name="item"></param>
|
||||
/// <returns></returns>
|
||||
public bool Remove(KeyValuePair<string, object> item)
|
||||
{
|
||||
return this.state.Remove(item);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IEnumerable<KeyValuePair<string,object>> Members
|
||||
/// <summary>
|
||||
/// <see cref="T:IEnumerable`1"/>
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
|
||||
{
|
||||
return this.state.GetEnumerator();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IEnumerable Members
|
||||
/// <summary>
|
||||
/// <see cref="IEnumerable"/>
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
IEnumerator IEnumerable.GetEnumerator()
|
||||
{
|
||||
return this.state.GetEnumerator();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// A String representation from conversation.
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public override string ToString()
|
||||
{
|
||||
String innerConsversationsStr = "";
|
||||
|
||||
String conector = "";
|
||||
foreach (IConversationState convItem in this.InnerConversations)
|
||||
{
|
||||
innerConsversationsStr += conector + convItem;
|
||||
}
|
||||
|
||||
return String.Format("{{Id='{0}'; this.ParentConversation.Id={1}; InnerConversations=[{2}]}}",
|
||||
this.id,
|
||||
this.ParentConversation != null ? this.ParentConversation.Id : "<no_parent>",
|
||||
innerConsversationsStr
|
||||
);
|
||||
}
|
||||
|
||||
#region IApplicationContextAware Members
|
||||
private String applicationContextName;
|
||||
[NonSerialized]
|
||||
private IApplicationContext applicationContext = null;
|
||||
/// <summary>
|
||||
/// Returns the current context. Supports serialization and deserialization.
|
||||
/// </summary>
|
||||
public IApplicationContext ApplicationContext
|
||||
{
|
||||
set
|
||||
{
|
||||
this.applicationContext = value;
|
||||
this.applicationContextName = this.applicationContext.Name;
|
||||
}
|
||||
get
|
||||
{
|
||||
if (this.applicationContext == null)
|
||||
{
|
||||
this.applicationContext = ContextRegistry.GetContext(this.applicationContextName);
|
||||
}
|
||||
return this.applicationContext;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0"?>
|
||||
<configuration>
|
||||
<startup/></configuration>
|
||||
@@ -0,0 +1,5 @@
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: AssemblyTitle("Spring.Web.Conversation.NHibernate33. NHibernate 3.3 support.")]
|
||||
[assembly: AssemblyDescription("Interfaces and classes that provide 'Long-Running Conversation' support in Spring.Net")]
|
||||
@@ -0,0 +1 @@
|
||||
sources are linked here from Spring.ConversationWA.NH32
|
||||
@@ -0,0 +1,112 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Spring</RootNamespace>
|
||||
<AssemblyName>Spring.Web.Conversation.NHibernate33</AssemblyName>
|
||||
<TargetFrameworkVersion>v3.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<TargetFrameworkSubset>
|
||||
</TargetFrameworkSubset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>..\..\..\build\VS.Net.2008\Spring.Web.Conversation.NHibernate33\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<DocumentationFile>bin\Debug\Spring.Web.Conversation.NHibernate33.XML</DocumentationFile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Common.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=af08829b84f0328e, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\lib\Net\2.0\Common.Logging.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\lib\NHibernate33\net\3.5\Iesi.Collections.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NHibernate, Version=3.3.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\lib\NHibernate33\net\3.5\NHibernate.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Web" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="..\CommonAssemblyInfo.cs">
|
||||
<Link>CommonAssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Spring.Web.Conversation.NHibernate32\Data\NHibernate\Support\SessionPerConversationScope.cs">
|
||||
<Link>Data\NHibernate\Support\SessionPerConversationScope.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Spring.Web.Conversation.NHibernate32\Data\NHibernate\Support\SessionPerConversationSettings.cs">
|
||||
<Link>Data\NHibernate\Support\SessionPerConversationSettings.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Spring.Web.Conversation.NHibernate32\Web\Conversation\HttpModule\ConversationModule.cs">
|
||||
<Link>Web\Conversation\HttpModule\ConversationModule.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Spring.Web.Conversation.NHibernate32\Web\Conversation\IConversationManager.cs">
|
||||
<Link>Web\Conversation\IConversationManager.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Spring.Web.Conversation.NHibernate32\Web\Conversation\IConversationState.cs">
|
||||
<Link>Web\Conversation\IConversationState.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Spring.Web.Conversation.NHibernate32\Web\Conversation\InnerConversationList.cs">
|
||||
<Link>Web\Conversation\InnerConversationList.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Spring.Web.Conversation.NHibernate32\Web\Conversation\WebConversationManager.cs">
|
||||
<Link>Web\Conversation\WebConversationManager.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Spring.Web.Conversation.NHibernate32\Web\Conversation\WebConversationSpringState.cs">
|
||||
<Link>Web\Conversation\WebConversationSpringState.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Spring.Core\Spring.Core.2008.csproj">
|
||||
<Project>{710961A3-0DF4-49E4-A26E-F5B9C044AC84}</Project>
|
||||
<Name>Spring.Core.2008</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Data.NHibernate33\Spring.Data.NHibernate33.2008.csproj">
|
||||
<Project>{67EA5988-C54E-4348-BFFB-E4A61F26143C}</Project>
|
||||
<Name>Spring.Data.NHibernate33.2008</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Data\Spring.Data.2008.csproj">
|
||||
<Project>{AE00E5AB-C39A-436F-86D2-33BFE33E2E40}</Project>
|
||||
<Name>Spring.Data.2008</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Properties\" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
@@ -0,0 +1,114 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{CF375928-B6D5-485C-B04D-2BC41D9DBF1E}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Spring</RootNamespace>
|
||||
<AssemblyName>Spring.Web.Conversation.NHibernate33</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
<OldToolsVersion>3.5</OldToolsVersion>
|
||||
<UpgradeBackupLocation />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>..\..\..\build\VS.Net.2010\Spring.Web.Conversation.NHibernate33\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<DocumentationFile>Spring.Web.Conversation.NHibernate33.XML</DocumentationFile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Common.Logging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=af08829b84f0328e, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\lib\Net\2.0\Common.Logging.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\lib\NHibernate33\net\3.5\Iesi.Collections.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="NHibernate, Version=3.3.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\lib\NHibernate33\net\3.5\NHibernate.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Web" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="..\CommonAssemblyInfo.cs">
|
||||
<Link>CommonAssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Spring.Web.Conversation.NHibernate32\Data\NHibernate\Support\SessionPerConversationScope.cs">
|
||||
<Link>Data\NHibernate\Support\SessionPerConversationScope.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Spring.Web.Conversation.NHibernate32\Data\NHibernate\Support\SessionPerConversationSettings.cs">
|
||||
<Link>Data\NHibernate\Support\SessionPerConversationSettings.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Spring.Web.Conversation.NHibernate32\Web\Conversation\HttpModule\ConversationModule.cs">
|
||||
<Link>Web\Conversation\HttpModule\ConversationModule.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Spring.Web.Conversation.NHibernate32\Web\Conversation\IConversationManager.cs">
|
||||
<Link>Web\Conversation\IConversationManager.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Spring.Web.Conversation.NHibernate32\Web\Conversation\IConversationState.cs">
|
||||
<Link>Web\Conversation\IConversationState.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Spring.Web.Conversation.NHibernate32\Web\Conversation\InnerConversationList.cs">
|
||||
<Link>Web\Conversation\InnerConversationList.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Spring.Web.Conversation.NHibernate32\Web\Conversation\WebConversationManager.cs">
|
||||
<Link>Web\Conversation\WebConversationManager.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Spring.Web.Conversation.NHibernate32\Web\Conversation\WebConversationSpringState.cs">
|
||||
<Link>Web\Conversation\WebConversationSpringState.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Spring.Core\Spring.Core.2010.csproj">
|
||||
<Project>{710961A3-0DF4-49E4-A26E-F5B9C044AC84}</Project>
|
||||
<Name>Spring.Core.2010</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Data.NHibernate33\Spring.Data.NHibernate33.2010.csproj">
|
||||
<Project>{67EA5988-C54E-4348-BFFB-E4A61F26143C}</Project>
|
||||
<Name>Spring.Data.NHibernate33.2010</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Spring.Data\Spring.Data.2010.csproj">
|
||||
<Project>{AE00E5AB-C39A-436F-86D2-33BFE33E2E40}</Project>
|
||||
<Name>Spring.Data.2010</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Properties\" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
@@ -0,0 +1,958 @@
|
||||
<?xml version="1.0"?>
|
||||
<doc>
|
||||
<assembly>
|
||||
<name>Spring.Web.Conversation.NHibernate33</name>
|
||||
</assembly>
|
||||
<members>
|
||||
<member name="T:Spring.Data.NHibernate.Support.SessionPerConversationScope">
|
||||
<summary>
|
||||
Based on <see cref="T:Spring.Data.NHibernate.Support.SessionScope"/>
|
||||
for support of 'session-per-conversation' pattern.
|
||||
</summary>
|
||||
<author>Hailton de Castro</author>
|
||||
</member>
|
||||
<member name="F:Spring.Data.NHibernate.Support.SessionPerConversationScope.log">
|
||||
<summary>
|
||||
The logging instance.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.#ctor">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings"/> class.
|
||||
Uses default values for <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.#ctor(NHibernate.IInterceptor,NHibernate.FlushMode)">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings"/> class.
|
||||
</summary>
|
||||
<param name="entityInterceptor">Specify the <see cref="T:NHibernate.IInterceptor"/> to be set on each session provided by this <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScope"/> instance.</param>
|
||||
<param name="defaultFlushMode">Specify the flushmode to be applied on each session provided by this <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScope"/> instance.
|
||||
</param>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.#ctor(Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings)">
|
||||
<summary>
|
||||
Initializes a new instance of the <see cref="T:Spring.Data.NHibernate.Support.SessionScope"/> class.
|
||||
</summary>
|
||||
<param name="settings">An <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings"/> instance holding the scope configuration</param>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.SetOpen(System.Boolean)">
|
||||
<summary>
|
||||
Sets a flag, whether this scope is in "open" state on the current logical thread.
|
||||
</summary>
|
||||
<param name="isOpen"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.Dispose">
|
||||
<summary>
|
||||
NOOP.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.Open(Spring.Web.Conversation.IConversationState,System.Collections.Generic.ICollection{Spring.Web.Conversation.IConversationState})">
|
||||
<summary>
|
||||
Open a new session or reconect the
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.RootSessionPerConversation"/> in <paramref name="activeConversation"/>.
|
||||
Participating in an existing session registed with <see cref="T:Spring.Transaction.Support.TransactionSynchronizationManager"/>
|
||||
is not alowed.
|
||||
</summary>
|
||||
<param name="activeConversation"></param>
|
||||
<param name="allManagedConversation"></param>
|
||||
<exception cref="T:System.InvalidOperationException">
|
||||
<list type="bullet">
|
||||
<item>If there is another conversation with a <see cref="T:NHibernate.ISession"/> with opened
|
||||
<see cref="T:System.Data.IDbConnection"/>.</item>
|
||||
<item>If attempting to participate in an existing NHibernate <see cref="T:NHibernate.ISessionFactory"/>
|
||||
managed by <see cref="T:Spring.Transaction.Support.TransactionSynchronizationManager"/>.
|
||||
</item>
|
||||
</list>
|
||||
</exception>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.Close(NHibernate.ISessionFactory,System.Collections.Generic.ICollection{Spring.Web.Conversation.IConversationState})">
|
||||
<summary>
|
||||
Close the current view's session and unregisters
|
||||
from <see cref="T:Spring.Transaction.Support.TransactionSynchronizationManager"/>.
|
||||
</summary>
|
||||
<param name="sessionFactory">The session factory that <see cref="T:Spring.Web.Conversation.IConversationState"/> on <paramref name="allManagedConversation"/> use</param>
|
||||
<param name="allManagedConversation">A list of conversations which the session can be closed or disconnected</param>
|
||||
<exception cref="T:System.InvalidOperationException">
|
||||
<list type="bullet">
|
||||
<item>If start/resume a conversation from a
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/> when exists a different <see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
with open <see cref="T:NHibernate.ISession"/> registered on <see cref="T:Spring.Transaction.Support.TransactionSynchronizationManager"/>
|
||||
</item>
|
||||
<item>If the holder on <see cref="T:Spring.Transaction.Support.TransactionSynchronizationManager"/>, is not a <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScope.LazySessionPerConversationHolder"/>.</item>
|
||||
</list>
|
||||
</exception>
|
||||
</member>
|
||||
<member name="P:Spring.Data.NHibernate.Support.SessionPerConversationScope.DefaultFlushMode">
|
||||
<summary>
|
||||
Gets the flushmode to be applied on each newly created session.
|
||||
</summary>
|
||||
<remarks>
|
||||
This property defaults to <see cref="F:NHibernate.FlushMode.Never"/> to ensure that modifying objects outside the boundaries
|
||||
of a transaction will not be persisted. It is recommended to not change this value but wrap any modifying operation
|
||||
within a transaction.
|
||||
</remarks>
|
||||
</member>
|
||||
<member name="P:Spring.Data.NHibernate.Support.SessionPerConversationScope.EntityInterceptor">
|
||||
<summary>
|
||||
Get the configured EntityInterceptor
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Data.NHibernate.Support.SessionPerConversationScope.OpenerConversationId">
|
||||
<summary>
|
||||
Id for conversation that open the Session.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Data.NHibernate.Support.SessionPerConversationScope.IsOpen">
|
||||
<summary>
|
||||
Gets a flag, whether this scope is in "open" state on the current logical thread.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:Spring.Data.NHibernate.Support.SessionPerConversationScope.LazySessionPerConversationHolder">
|
||||
<summary>
|
||||
This sessionHolder creates a session for the active conversation only if it is
|
||||
needed (<see cref="M:Spring.Web.Conversation.IConversationState.StartResumeConversation"/>).
|
||||
</summary>
|
||||
<remarks>
|
||||
Although a NHibernateSession defers creation of db-connections until they are really
|
||||
needed, instantiation a session is still more expensive than using LazySessionHolder.
|
||||
</remarks>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.LazySessionPerConversationHolder.#ctor(Spring.Data.NHibernate.Support.SessionPerConversationScope,Spring.Web.Conversation.IConversationState,System.Collections.Generic.ICollection{Spring.Web.Conversation.IConversationState})">
|
||||
<summary>
|
||||
Initialize a new instance.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScope.LazySessionPerConversationHolder.EnsureInitialized">
|
||||
<summary>
|
||||
Create a new session on demand
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings">
|
||||
<summary>
|
||||
Setting for <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScope"/>
|
||||
</summary>
|
||||
<author>Hailton de Castro</author>
|
||||
</member>
|
||||
<member name="F:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.FLUSHMODE_DEFAULT">
|
||||
<summary>
|
||||
Default value for <see cref="P:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.DefaultFlushMode"/> property.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.#ctor">
|
||||
<summary>
|
||||
Initialize a new instance of <see cref="T:Spring.Data.NHibernate.Support.SessionScopeSettings"/> with default values.
|
||||
</summary>
|
||||
<remarks>
|
||||
Calling this constructor from your derived class leaves <see cref="P:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.EntityInterceptor"/>
|
||||
uninitialized. See <see cref="M:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.ResolveEntityInterceptor"/> for more.
|
||||
</remarks>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.#ctor(NHibernate.IInterceptor,NHibernate.FlushMode)">
|
||||
<summary>
|
||||
Initialize a new instance of <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings"/> with the given values and references.
|
||||
</summary>
|
||||
<param name="entityInterceptor">
|
||||
Specify the <see cref="T:NHibernate.IInterceptor"/> to be set on each session provided by the <see cref="T:Spring.Data.NHibernate.Support.SessionPerConversationScope"/> instance.
|
||||
</param>
|
||||
<param name="defaultFlushMode">
|
||||
Specify the flushmode to be applied on each session provided by the <see cref="T:Spring.Data.NHibernate.Support.SessionScope"/> instance.
|
||||
</param>
|
||||
<remarks>
|
||||
Calling this constructor marks all properties initialized.
|
||||
</remarks>
|
||||
</member>
|
||||
<member name="M:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.ResolveEntityInterceptor">
|
||||
<summary>
|
||||
Override this method to resolve an <see cref="T:NHibernate.IInterceptor"/> instance according to your chosen strategy.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.EntityInterceptor">
|
||||
<summary>
|
||||
Gets the configured <see cref="T:NHibernate.IInterceptor"/> instance to be used.
|
||||
</summary>
|
||||
<remarks>
|
||||
</remarks>
|
||||
</member>
|
||||
<member name="P:Spring.Data.NHibernate.Support.SessionPerConversationScopeSettings.DefaultFlushMode">
|
||||
<summary>
|
||||
Gets or Sets the flushmode to be applied on each newly created session.
|
||||
</summary>
|
||||
<remarks>
|
||||
This property defaults to <see cref="F:NHibernate.FlushMode.Never"/> to ensure that modifying objects outside the boundaries
|
||||
of a transaction will not be persisted. It is recommended to not change this value but wrap any modifying operation
|
||||
within a transaction.
|
||||
</remarks>
|
||||
</member>
|
||||
<member name="T:Spring.Web.Conversation.IConversationManager">
|
||||
<summary>
|
||||
manager for Conversations.
|
||||
</summary>
|
||||
<author>Hailton de Castro</author>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationManager.GetConversationById(System.String)">
|
||||
<summary>
|
||||
Returns the conversation if it is still alive, otherwise it returns null.
|
||||
</summary>
|
||||
<param name="id"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationManager.EndOnTimeOut">
|
||||
<summary>
|
||||
Ends all conversations with the timeout exceeded.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationManager.PauseConversations">
|
||||
<summary>
|
||||
Close IDbConnections for <see cref="T:Spring.Web.Conversation.IConversationState"/> that
|
||||
use 'session-per-conversation'. It calls
|
||||
<see cref="M:Spring.Web.Conversation.IConversationState.PauseConversation"/> in all conversations.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationManager.FreeEnded">
|
||||
<summary>
|
||||
Release the ended conversations And removes them.
|
||||
If the conversation supports 'session-per-conversation', also close the session.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationManager.AddConversation(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
Add conversation. If <see cref="T:Spring.Web.Conversation.IConversationManager"/> is null
|
||||
it resolves to 'this'.
|
||||
</summary>
|
||||
<param name="conversation"></param>
|
||||
<exception cref="T:System.InvalidOperationException">
|
||||
If <paramref name="conversation"/> already has another manager.
|
||||
</exception>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationManager.SetActiveConversation(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
Makes the 'root conversation' of <paramref name="conversation"/>
|
||||
the current active conversation and open/reopen the
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.RootSessionPerConversation"/> if
|
||||
the conversation supports 'session-per-conversation'. Close all
|
||||
the connection for all session before.
|
||||
If <see cref="P:Spring.Web.Conversation.IConversationManager.EndPaused"/> is <c>true</c> will end all
|
||||
paused conversations.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationManager.ActiveConversation">
|
||||
<summary>
|
||||
Returns the active conversation if exists, otherwise returns null.
|
||||
It depends on <see cref="M:Spring.Web.Conversation.IConversationManager.SetActiveConversation(Spring.Web.Conversation.IConversationState)"/>
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationManager.SessionFactory">
|
||||
<summary>
|
||||
<para>If this is non-null run pattern 'session-per-conversation'.
|
||||
Must be the same SessionFactory of the managed conversations.
|
||||
</para>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationManager.EndPaused">
|
||||
<summary>
|
||||
Ends the "paused conversations" in call to <see cref="P:Spring.Web.Conversation.IConversationManager.ActiveConversation"/>.
|
||||
Important: Unexpected behavior may occur if there are nested conversations,
|
||||
as in <see cref="M:Spring.Web.Conversation.IConversationState.StartResumeConversation"/> only the current conversation and its parents
|
||||
are started, the 'conversations children' remain paused, so these will be ended.
|
||||
Defaul value: <c>false</c>.
|
||||
</summary>
|
||||
<remarks>
|
||||
<para>When it is true, "start/resume a conversation" will cause the other to be
|
||||
ended and cleaned up.
|
||||
</para>
|
||||
<para>This is useful to avoid memory leak where there are many conversations.
|
||||
This leak can be very considerable, as the conversation may keep a "NHibernate session"
|
||||
that can contain many objects in its cache from the database queries.
|
||||
</para>
|
||||
</remarks>
|
||||
</member>
|
||||
<member name="T:Spring.Web.Conversation.IConversationState">
|
||||
<summary>
|
||||
Port to conversation. If the object is not found in the current
|
||||
conversation, will be tried on the parent if the parent is
|
||||
not null.
|
||||
</summary>
|
||||
<exception cref="T:System.InvalidOperationException">
|
||||
If <see cref="P:Spring.Web.Conversation.IConversationState.Id"/> is different from spring name for this instance.
|
||||
</exception>
|
||||
<author>Hailton de Castro</author>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationState.StartResumeConversation">
|
||||
<summary>
|
||||
Starts or resumes the conversation and the <see cref="P:Spring.Web.Conversation.IConversationState.ParentConversation"/>.
|
||||
<para>If <see cref="P:Spring.Web.Conversation.IConversationState.RootSessionPerConversation"/> is not null, so
|
||||
<see cref="M:NHibernate.ISessionFactory.GetCurrentSession"/> is called to
|
||||
Raise SessionHolder for make the reconnection.
|
||||
</para>
|
||||
<para>Make <see cref="P:Spring.Web.Conversation.IConversationState.IsNew"/> return false.
|
||||
</para>
|
||||
<para>Update the <see cref="P:Spring.Web.Conversation.IConversationState.LastAccess"/>.
|
||||
</para>
|
||||
</summary>
|
||||
<exception cref="T:System.InvalidOperationException">
|
||||
<list type="bullet">
|
||||
<item>If this conversation is ended.
|
||||
</item>
|
||||
<item>If <see cref="P:Spring.Web.Conversation.IConversationState.RootSessionPerConversation"/> is not null and
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.RootSessionPerConversation"/> different from
|
||||
<see cref="M:NHibernate.ISessionFactory.GetCurrentSession"/>
|
||||
</item>
|
||||
</list>
|
||||
</exception>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationState.EndConversation">
|
||||
<summary>
|
||||
Ends the conversation. End each of the 'inner conversations' in
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.InnerConversations"/>. Returns false if the
|
||||
conversation and all <see cref="T:Spring.Web.Conversation.IConversationState"/> of
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.InnerConversations"/> has already been ended.
|
||||
</summary>
|
||||
<returns></returns>
|
||||
<exception cref="T:System.InvalidOperationException">
|
||||
<list type="bullet">
|
||||
<item>If <see cref="P:System.Web.HttpContext.Current"/>.
|
||||
<see cref="T:System.Web.SessionState.HttpSessionState">Session</see>["spring.objects"]
|
||||
is null.
|
||||
</item>
|
||||
<item>The 'spring session scopes' are not located in the key
|
||||
'spring.objects' of HttpSessionState.
|
||||
</item>
|
||||
</list>
|
||||
</exception>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.IConversationState.PauseConversation">
|
||||
<summary>
|
||||
Starts or resumes the conversation and each 'inner conversation' in
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.InnerConversations"/>.
|
||||
It is not about 'Session-per-conversation' because it is done by
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.Id">
|
||||
<summary>
|
||||
Conversation id.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.IsNew">
|
||||
<summary>
|
||||
Return true until <see cref="M:Spring.Web.Conversation.IConversationState.StartResumeConversation"/> is called.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.Ended">
|
||||
<summary>
|
||||
Return true if this conversation is ended.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.InnerConversations">
|
||||
<summary>
|
||||
Inner conversation. After added if the <see cref="P:Spring.Web.Conversation.IConversationState.ParentConversation"/>
|
||||
is null it will resolve to 'this'.
|
||||
</summary>
|
||||
<exception cref="T:System.InvalidOperationException">at
|
||||
<see cref="T:System.Collections.Generic.ICollection`1.Add(T)"/>,
|
||||
<see cref="T:System.Collections.Generic.IList`1.this[int]"/>,
|
||||
<see cref="T:System.Collections.Generic.IList`1.Insert(int, T)"/>
|
||||
if Circular Dependency is detected.</exception>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.ParentConversation">
|
||||
<summary>
|
||||
Conversation parent.
|
||||
</summary>
|
||||
<exception cref="T:System.InvalidOperationException">
|
||||
<list type="bullet">
|
||||
<item>If this conversation already has a different parent.
|
||||
</item>
|
||||
<item>If this Conversation is not new.
|
||||
</item>
|
||||
<item>If Circular Dependency is detected.
|
||||
</item>
|
||||
<item>The Parent conversation is not new.
|
||||
</item>
|
||||
</list>
|
||||
</exception>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.TimeOut">
|
||||
<summary>
|
||||
TimeOut for the conversation in milliseconds.
|
||||
If <c>0</c> TimeOut will be ignored.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.LastAccess">
|
||||
<summary>
|
||||
Last acces for a value into this Conversation or Inner Conversation.
|
||||
Reset to DateTime.Now each time <see cref="M:Spring.Web.Conversation.IConversationState.StartResumeConversation"/>
|
||||
is called.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.ConversationManager">
|
||||
<summary>
|
||||
Conversation Manager. When this is setted if
|
||||
<see cref="M:Spring.Web.Conversation.IConversationManager.GetConversationById(System.String)"/>
|
||||
returns null so AddConversation is called.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.RootSessionPerConversation">
|
||||
<summary>
|
||||
<para><see cref="T:NHibernate.ISession"/> that is stored in the root conversation.
|
||||
</para>
|
||||
<para>
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.ConversationManager"/> must support 'session-per-conversation'.
|
||||
</para>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.SessionFactory">
|
||||
<summary>
|
||||
<para>If this is non-null run pattern 'session-per-conversation'.
|
||||
It also depends on <see cref="P:Spring.Web.Conversation.IConversationState.DbProvider"/> and <see cref="P:Spring.Web.Conversation.IConversationState.ConversationManager"/>.
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.ConversationManager"/> must support ConversationManager.
|
||||
</para>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.DbProvider">
|
||||
<summary>
|
||||
<para>If this is non-null run pattern 'session-per-conversation'.
|
||||
It also depends on <see cref="P:Spring.Web.Conversation.IConversationState.SessionFactory"/> and <see cref="P:Spring.Web.Conversation.IConversationState.ConversationManager"/>.
|
||||
<see cref="P:Spring.Web.Conversation.IConversationState.ConversationManager"/> must support ConversationManager.
|
||||
</para>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.IConversationState.IsPaused">
|
||||
<summary>
|
||||
Indicates that the conversation is paused.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:Spring.Web.Conversation.InnerConversationList">
|
||||
<summary>
|
||||
List that make validation for Circular Dependency for <see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
<author>Hailton de Castro</author>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.#ctor(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
Contructor.
|
||||
</summary>
|
||||
<param name="conversationOwner">The <see cref="T:Spring.Web.Conversation.IConversationState"/> that owns this <see cref="T:Spring.Web.Conversation.InnerConversationList"/>.</param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.PreAddProcessor(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
Common Helper to be run before insert.
|
||||
</summary>
|
||||
<param name="itemAdded"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.PostAddProcessor(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
Common Helper to be run after insert.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.IndexOf(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="item"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Insert(System.Int32,Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="index"></param>
|
||||
<param name="item"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.RemoveAt(System.Int32)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="index"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Add(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
<param name="item"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Clear">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Contains(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
<param name="item"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.CopyTo(Spring.Web.Conversation.IConversationState[],System.Int32)">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
<param name="array"></param>
|
||||
<param name="arrayIndex"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Remove(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
<param name="item"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.GetEnumerator">
|
||||
<summary>
|
||||
<see cref="T:IEnumerable`1"/>
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.System#Collections#IEnumerable#GetEnumerator">
|
||||
<summary>
|
||||
<see cref="T:System.Collections.IEnumerable"/>
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Add(System.Object)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="value"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Contains(System.Object)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="value"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.IndexOf(System.Object)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="value"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Insert(System.Int32,System.Object)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="index"></param>
|
||||
<param name="value"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.Remove(System.Object)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="value"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.InnerConversationList.CopyTo(System.Array,System.Int32)">
|
||||
<summary>
|
||||
<see cref="T:System.Collections.ICollection"/>
|
||||
</summary>
|
||||
<param name="array"></param>
|
||||
<param name="index"></param>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.InnerConversationList.Item(System.Int32)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="index"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.InnerConversationList.Count">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.InnerConversationList.IsReadOnly">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.InnerConversationList.IsFixedSize">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.InnerConversationList.System#Collections#IList#Item(System.Int32)">
|
||||
<summary>
|
||||
<see cref="T:IList`1"/>
|
||||
</summary>
|
||||
<param name="index"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.InnerConversationList.IsSynchronized">
|
||||
<summary>
|
||||
<see cref="T:System.Collections.ICollection"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.InnerConversationList.SyncRoot">
|
||||
<summary>
|
||||
<see cref="T:System.Collections.ICollection"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:Spring.Web.Conversation.WebConversationManager">
|
||||
<summary>
|
||||
This was made to stay under session scope.
|
||||
</summary>
|
||||
<author>Hailton de Castro</author>
|
||||
</member>
|
||||
<member name="F:Spring.Web.Conversation.WebConversationManager.mutexEditDic">
|
||||
<summary>
|
||||
Semaphore to synchronize writes to the dictionary.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.GetConversationById(System.String)">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
<param name="id"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.EndOnTimeOut">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.PauseConversations">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.FreeEnded">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.AddConversation(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
<param name="conversation"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.SetActiveConversation(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
<param name="conversation"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.LoadActiveConversation">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.Dispose">
|
||||
<summary>
|
||||
Ends all conversations and Closes all their Session.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationManager.RemoveConversation(Spring.Web.Conversation.IConversationState)">
|
||||
<summary>
|
||||
Remove conversation.
|
||||
</summary>
|
||||
<param name="conversation"></param>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationManager.ActiveConversation">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationManager.SessionFactoryName">
|
||||
<summary>
|
||||
"SessionFactory" name in the current context.
|
||||
This approach is required to support serialization.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationManager.SessionFactory">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationManager.EndPaused">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationManager.ApplicationContext">
|
||||
<summary>
|
||||
Returns the current context. Supports serialization and deserialization.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:Spring.Web.Conversation.WebConversationSpringState">
|
||||
<summary>
|
||||
Implementation of conversation in the infrastructure of Spring.
|
||||
It avoid Circular Dependencies.
|
||||
</summary>
|
||||
<author>Hailton de Castro</author>
|
||||
</member>
|
||||
<member name="F:Spring.Web.Conversation.WebConversationSpringState.MSG_CONVERSATION_ALREADY_HAS_PARENT">
|
||||
<summary>
|
||||
Default message for "CONVERSATION ALREADY HAS A PARENT" error.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.EndConversation">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.StartResumeConversation">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.PauseConversation">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.Add(System.String,System.Object)">
|
||||
<summary>
|
||||
<see cref="T:IDictionary`2"/>
|
||||
</summary>
|
||||
<param name="key"></param>
|
||||
<param name="value"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.ContainsKey(System.String)">
|
||||
<summary>
|
||||
<see cref="T:IDictionary`2"/>
|
||||
</summary>
|
||||
<param name="key"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.Remove(System.String)">
|
||||
<summary>
|
||||
<see cref="T:IDictionary`2"/>
|
||||
</summary>
|
||||
<param name="key"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.TryGetValue(System.String,System.Object@)">
|
||||
<summary>
|
||||
<see cref="T:IDictionary`2"/>
|
||||
</summary>
|
||||
<param name="key"></param>
|
||||
<param name="value"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.Add(System.Collections.Generic.KeyValuePair{System.String,System.Object})">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
<param name="item"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.Clear">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.Contains(System.Collections.Generic.KeyValuePair{System.String,System.Object})">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
<param name="item"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.CopyTo(System.Collections.Generic.KeyValuePair{System.String,System.Object}[],System.Int32)">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
<param name="array"></param>
|
||||
<param name="arrayIndex"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.Remove(System.Collections.Generic.KeyValuePair{System.String,System.Object})">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
<param name="item"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.GetEnumerator">
|
||||
<summary>
|
||||
<see cref="T:IEnumerable`1"/>
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.System#Collections#IEnumerable#GetEnumerator">
|
||||
<summary>
|
||||
<see cref="T:System.Collections.IEnumerable"/>
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.WebConversationSpringState.ToString">
|
||||
<summary>
|
||||
A String representation from conversation.
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.Id">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.Ended">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.TimeOut">
|
||||
<summary>
|
||||
Default 180000.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.InnerConversations">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.ParentConversation">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.LastAccess">
|
||||
<summary>
|
||||
<see cref="P:Spring.Web.Conversation.WebConversationSpringState.LastAccess"/>.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.ConversationManager">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.RootSessionPerConversation">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.SessionFactoryName">
|
||||
<summary>
|
||||
"SessionFactory" name in the current context.
|
||||
This approach is required to support serialization.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.SessionFactory">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.DbProviderName">
|
||||
<summary>
|
||||
"DbProvider" name in the current context.
|
||||
This approach is required to support serialization.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.DbProvider">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.IsNew">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.IsPaused">
|
||||
<summary>
|
||||
<see cref="T:Spring.Web.Conversation.IConversationState"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.ObjectName">
|
||||
<summary>
|
||||
<see cref="T:Spring.Objects.Factory.IObjectNameAware"/>. It is used to valddate <see cref="P:Spring.Web.Conversation.WebConversationSpringState.Id"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.Keys">
|
||||
<summary>
|
||||
<see cref="T:IDictionary`2"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.Values">
|
||||
<summary>
|
||||
<see cref="T:IDictionary`2"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.Item(System.String)">
|
||||
<summary>
|
||||
<see cref="T:IDictionary`2"/>
|
||||
</summary>
|
||||
<param name="key"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.Count">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.IsReadOnly">
|
||||
<summary>
|
||||
<see cref="T:ICollection`1"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.WebConversationSpringState.ApplicationContext">
|
||||
<summary>
|
||||
Returns the current context. Supports serialization and deserialization.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:Spring.Web.Conversation.HttpModule.ConversationModule">
|
||||
<summary>
|
||||
HttpModule for ending Conversations with Timeout exceeded.
|
||||
</summary>
|
||||
<author>Hailton de Castro</author>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.HttpModule.ConversationModule.Init(System.Web.HttpApplication)">
|
||||
<summary>
|
||||
Add PostRequestHandlerExecute event to clear conversations with timeout exceeded.
|
||||
</summary>
|
||||
<param name="context"></param>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.HttpModule.ConversationModule.Dispose">
|
||||
<summary>
|
||||
Disposes of the resources (other than memory) used by the module that implements <see cref="T:System.Web.IHttpModule"/>.
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Spring.Web.Conversation.HttpModule.ConversationModule.page_Unload(System.Object,System.EventArgs)">
|
||||
<summary>
|
||||
Handles the Unload event of the page control.
|
||||
</summary>
|
||||
<param name="sender">The source of the event.</param>
|
||||
<param name="e">The <see cref="T:System.EventArgs"/> instance containing the event data.</param>
|
||||
<remarks>
|
||||
Necessary for Redirect or Abort for any reason.
|
||||
</remarks>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.HttpModule.ConversationModule.ConversationManagerNameList">
|
||||
<summary>
|
||||
The Names of the <see cref="T:Spring.Web.Conversation.IConversationManager"/>s in the <see cref="T:Spring.Context.IApplicationContext"/>
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Spring.Web.Conversation.HttpModule.ConversationModule.ApplicationContext">
|
||||
<summary>
|
||||
Sets the <see cref="T:Spring.Context.IApplicationContext"/> that this
|
||||
object runs in.
|
||||
</summary>
|
||||
<value></value>
|
||||
<remarks>
|
||||
<p>
|
||||
Used to obtain the instances of <see cref="T:Spring.Web.Conversation.IConversationManager"/>
|
||||
</p>
|
||||
<p>
|
||||
Invoked after population of normal object properties but before an
|
||||
init callback such as
|
||||
<see cref="T:Spring.Objects.Factory.IInitializingObject"/>'s
|
||||
<see cref="M:Spring.Objects.Factory.IInitializingObject.AfterPropertiesSet"/>
|
||||
or a custom init-method. Invoked after the setting of any
|
||||
<see cref="T:Spring.Context.IResourceLoaderAware"/>'s
|
||||
<see cref="P:Spring.Context.IResourceLoaderAware.ResourceLoader"/>
|
||||
property.
|
||||
</p>
|
||||
</remarks>
|
||||
<exception cref="T:Spring.Context.ApplicationContextException">
|
||||
In the case of application context initialization errors.
|
||||
</exception>
|
||||
<exception cref="T:Spring.Objects.ObjectsException">
|
||||
If thrown by any application context methods.
|
||||
</exception>
|
||||
<exception cref="T:Spring.Objects.Factory.ObjectInitializationException"/>
|
||||
</member>
|
||||
</members>
|
||||
</doc>
|
||||