From a8b6e5feff26237dd254b402164ead9b1289286a Mon Sep 17 00:00:00 2001 From: markpollack Date: Thu, 18 Jun 2009 06:48:10 +0000 Subject: [PATCH] TIBCO EMS QuickStart --- .../Spring.EmsQuickStart.2005.sln | 104 +++++++++++++ .../Spring.EmsQuickStart.Client/App.config | 44 ++++++ .../Config/Application.xml | 15 ++ .../Config/Messaging.xml | 55 +++++++ .../Gateways/EmsStockServiceGateway.cs | 31 ++++ .../Gateways/EmsSyncStockServiceGateway.cs | 35 +++++ .../Gateways/IStockService.cs | 31 ++++ .../Gateways/ISyncStockService.cs | 38 +++++ .../Gateways/RequestReplyEmsTemplate.cs | 58 +++++++ .../Handlers/StockAppHandler.cs | 66 ++++++++ .../Spring.EmsQuickStart.Client/Program.cs | 66 ++++++++ .../Properties/AssemblyInfo.cs | 33 ++++ .../Properties/Resources.Designer.cs | 63 ++++++++ .../Properties/Resources.resx | 117 ++++++++++++++ .../Properties/Settings.Designer.cs | 26 ++++ .../Properties/Settings.settings | 7 + .../Spring.EmsQuickStart.Client.csproj | 127 +++++++++++++++ .../Spring.EmsQuickStart.Client.csproj.user | 5 + .../UI/StockController.cs | 75 +++++++++ .../UI/StockForm.cs | 86 +++++++++++ .../UI/StockForm.designer.cs | 127 +++++++++++++++ .../UI/StockForm.resx | 120 +++++++++++++++ .../Spring.EmsQuickStart.Common/Bo/Trade.cs | 40 +++++ .../Bo/TradeRequest.cs | 97 ++++++++++++ .../AbstractNamedMessageConverter.cs | 30 ++++ .../Converters/INamedMessageConverter.cs | 34 +++++ .../Converters/ITypeMapper.cs | 42 +++++ .../Converters/MultiMessageConverter.cs | 110 +++++++++++++ .../Converters/TradeConverter.cs | 61 ++++++++ .../Converters/TradeRequestConverter.cs | 69 +++++++++ .../Converters/TypeMapper.cs | 144 ++++++++++++++++++ .../Converters/XmlMessageConverter.cs | 137 +++++++++++++++++ .../Data/TradeRequest.cs | 123 +++++++++++++++ .../Data/TradeRequest.xsd | 18 +++ .../Data/TradeRequest.xsx | 3 + .../Data/TradeResponse.cs | 111 ++++++++++++++ .../Data/TradeResponse.xsd | 17 +++ .../Data/TradeResponse.xsx | 3 + .../Data/generate-classes.bat | 2 + .../Properties/AssemblyInfo.cs | 35 +++++ .../Spring.EmsQuickStart.Common.csproj | 91 +++++++++++ .../Spring.EmsQuickStart.Server/App.config | 45 ++++++ .../Config/Handlers.xml | 11 ++ .../Config/Messaging.xml | 45 ++++++ .../Config/ServiceStubs.xml | 10 ++ .../Gateways/IMarketDataService.cs | 7 + .../Gateways/MarketDataServiceGateway.cs | 65 ++++++++ .../Handlers/LoggingExceptionListener.cs | 23 +++ .../Handlers/StockAppHandler.cs | 44 ++++++ .../Spring.EmsQuickStart.Server/Program.cs | 33 ++++ .../Properties/AssemblyInfo.cs | 33 ++++ .../Services/ICreditCheckService.cs | 33 ++++ .../Services/IExecutionVenueService.cs | 31 ++++ .../Services/ITradingService.cs | 31 ++++ .../Services/Stubs/CreditCheckServiceStub.cs | 16 ++ .../Stubs/ExecutionVenueServiceStub.cs | 36 +++++ .../Services/Stubs/TradingServiceStub.cs | 15 ++ .../Spring.EmsQuickStart.Server.csproj | 101 ++++++++++++ .../AssemblyInfo.cs | 6 + ...msQuickStart.Integration.Tests.2005.csproj | 44 ++++++ .../AssemblyInfo.cs | 6 + .../Spring.EmsQuickStart.Tests.2005.csproj | 44 ++++++ 62 files changed, 3175 insertions(+) create mode 100644 examples/Spring/Spring.EmsQuickStart/Spring.EmsQuickStart.2005.sln create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/App.config create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Config/Application.xml create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Config/Messaging.xml create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/EmsStockServiceGateway.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/EmsSyncStockServiceGateway.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/IStockService.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/ISyncStockService.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/RequestReplyEmsTemplate.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Handlers/StockAppHandler.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Program.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/AssemblyInfo.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/Resources.Designer.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/Resources.resx create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/Settings.Designer.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/Settings.settings create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Spring.EmsQuickStart.Client.csproj create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Spring.EmsQuickStart.Client.csproj.user create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/UI/StockController.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/UI/StockForm.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/UI/StockForm.designer.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/UI/StockForm.resx create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Bo/Trade.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Bo/TradeRequest.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/AbstractNamedMessageConverter.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/INamedMessageConverter.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/ITypeMapper.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/MultiMessageConverter.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/TradeConverter.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/TradeRequestConverter.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/TypeMapper.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/XmlMessageConverter.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeRequest.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeRequest.xsd create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeRequest.xsx create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeResponse.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeResponse.xsd create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeResponse.xsx create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/generate-classes.bat create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Properties/AssemblyInfo.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Spring.EmsQuickStart.Common.csproj create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/App.config create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Config/Handlers.xml create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Config/Messaging.xml create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Config/ServiceStubs.xml create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Gateways/IMarketDataService.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Gateways/MarketDataServiceGateway.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Handlers/LoggingExceptionListener.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Handlers/StockAppHandler.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Program.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Properties/AssemblyInfo.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/ICreditCheckService.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/IExecutionVenueService.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/ITradingService.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/Stubs/CreditCheckServiceStub.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/Stubs/ExecutionVenueServiceStub.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/Stubs/TradingServiceStub.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Spring.EmsQuickStart.Server.csproj create mode 100644 examples/Spring/Spring.EmsQuickStart/test/Spring/Spring.EmsQuickStart.Integration.Tests/AssemblyInfo.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/test/Spring/Spring.EmsQuickStart.Integration.Tests/Spring.EmsQuickStart.Integration.Tests.2005.csproj create mode 100644 examples/Spring/Spring.EmsQuickStart/test/Spring/Spring.EmsQuickStart.Tests/AssemblyInfo.cs create mode 100644 examples/Spring/Spring.EmsQuickStart/test/Spring/Spring.EmsQuickStart.Tests/Spring.EmsQuickStart.Tests.2005.csproj diff --git a/examples/Spring/Spring.EmsQuickStart/Spring.EmsQuickStart.2005.sln b/examples/Spring/Spring.EmsQuickStart/Spring.EmsQuickStart.2005.sln new file mode 100644 index 00000000..f0a7fbc4 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/Spring.EmsQuickStart.2005.sln @@ -0,0 +1,104 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.EmsQuickStart.Integration.Tests.2005", "test\Spring\Spring.EmsQuickStart.Integration.Tests\Spring.EmsQuickStart.Integration.Tests.2005.csproj", "{E641F51F-1B51-4B94-B419-F902EABCE4D4}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.EmsQuickStart.Tests.2005", "test\Spring\Spring.EmsQuickStart.Tests\Spring.EmsQuickStart.Tests.2005.csproj", "{94E4E1B4-D424-4EB9-BF34-2EE8CC3D7048}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.EmsQuickStart.Common", "src\Spring\Spring.EmsQuickStart.Common\Spring.EmsQuickStart.Common.csproj", "{AC5A3035-75DD-48E5-ABCA-38FBC8193F22}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.EmsQuickStart.Server", "src\Spring\Spring.EmsQuickStart.Server\Spring.EmsQuickStart.Server.csproj", "{85E7B947-8153-45E4-B572-BEDB191F1FB2}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.EmsQuickStart.Client", "src\Spring\Spring.EmsQuickStart.Client\Spring.EmsQuickStart.Client.csproj", "{87D0B725-A652-4A6B-A95F-197F7155769F}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Core.2005", "..\..\..\src\Spring\Spring.Core\Spring.Core.2005.csproj", "{710961A3-0DF4-49E4-A26E-F5B9C044AC84}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Aop.2005", "..\..\..\src\Spring\Spring.Aop\Spring.Aop.2005.csproj", "{3A3A4E65-45A6-4B20-B460-0BEDC302C02C}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Data.2005", "..\..\..\src\Spring\Spring.Data\Spring.Data.2005.csproj", "{AE00E5AB-C39A-436F-86D2-33BFE33E2E40}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Spring.Messaging.Ems.2005", "..\..\..\src\Spring\Spring.Messaging.Ems\Spring.Messaging.Ems.2005.csproj", "{900E3839-301E-48B1-BAEB-B6645620ACFF}" + ProjectSection(WebsiteProperties) = preProject + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.Debug = "False" + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E641F51F-1B51-4B94-B419-F902EABCE4D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E641F51F-1B51-4B94-B419-F902EABCE4D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E641F51F-1B51-4B94-B419-F902EABCE4D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E641F51F-1B51-4B94-B419-F902EABCE4D4}.Release|Any CPU.Build.0 = Release|Any CPU + {94E4E1B4-D424-4EB9-BF34-2EE8CC3D7048}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {94E4E1B4-D424-4EB9-BF34-2EE8CC3D7048}.Debug|Any CPU.Build.0 = Debug|Any CPU + {94E4E1B4-D424-4EB9-BF34-2EE8CC3D7048}.Release|Any CPU.ActiveCfg = Release|Any CPU + {94E4E1B4-D424-4EB9-BF34-2EE8CC3D7048}.Release|Any CPU.Build.0 = Release|Any CPU + {AC5A3035-75DD-48E5-ABCA-38FBC8193F22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AC5A3035-75DD-48E5-ABCA-38FBC8193F22}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AC5A3035-75DD-48E5-ABCA-38FBC8193F22}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AC5A3035-75DD-48E5-ABCA-38FBC8193F22}.Release|Any CPU.Build.0 = Release|Any CPU + {85E7B947-8153-45E4-B572-BEDB191F1FB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {85E7B947-8153-45E4-B572-BEDB191F1FB2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {85E7B947-8153-45E4-B572-BEDB191F1FB2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {85E7B947-8153-45E4-B572-BEDB191F1FB2}.Release|Any CPU.Build.0 = Release|Any CPU + {87D0B725-A652-4A6B-A95F-197F7155769F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87D0B725-A652-4A6B-A95F-197F7155769F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87D0B725-A652-4A6B-A95F-197F7155769F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87D0B725-A652-4A6B-A95F-197F7155769F}.Release|Any CPU.Build.0 = Release|Any CPU + {710961A3-0DF4-49E4-A26E-F5B9C044AC84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {710961A3-0DF4-49E4-A26E-F5B9C044AC84}.Debug|Any CPU.Build.0 = Debug|Any CPU + {710961A3-0DF4-49E4-A26E-F5B9C044AC84}.Release|Any CPU.ActiveCfg = Release|Any CPU + {710961A3-0DF4-49E4-A26E-F5B9C044AC84}.Release|Any CPU.Build.0 = Release|Any CPU + {3A3A4E65-45A6-4B20-B460-0BEDC302C02C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3A3A4E65-45A6-4B20-B460-0BEDC302C02C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3A3A4E65-45A6-4B20-B460-0BEDC302C02C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3A3A4E65-45A6-4B20-B460-0BEDC302C02C}.Release|Any CPU.Build.0 = Release|Any CPU + {AE00E5AB-C39A-436F-86D2-33BFE33E2E40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AE00E5AB-C39A-436F-86D2-33BFE33E2E40}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE00E5AB-C39A-436F-86D2-33BFE33E2E40}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AE00E5AB-C39A-436F-86D2-33BFE33E2E40}.Release|Any CPU.Build.0 = Release|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}.Release|Any CPU.ActiveCfg = Release|Any CPU + {900E3839-301E-48B1-BAEB-B6645620ACFF}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/App.config b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/App.config new file mode 100644 index 00000000..5041d42e --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/App.config @@ -0,0 +1,44 @@ + + + + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Config/Application.xml b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Config/Application.xml new file mode 100644 index 00000000..af0859cf --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Config/Application.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Config/Messaging.xml b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Config/Messaging.xml new file mode 100644 index 00000000..b0281c09 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Config/Messaging.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/EmsStockServiceGateway.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/EmsStockServiceGateway.cs new file mode 100644 index 00000000..7c1eb9e9 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/EmsStockServiceGateway.cs @@ -0,0 +1,31 @@ + + + +using System; +using Spring.Messaging.Ems.Core; +using Spring.EmsQuickStart.Common.Data; +using Spring.Objects.Factory; +using TIBCO.EMS; + +namespace Spring.EmsQuickStart.Client.Gateways +{ + public class EmsStockServiceGateway : EmsGatewaySupport, IStockService + { + private Destination defaultReplyToQueue; + + public Destination DefaultReplyToQueue + { + set { defaultReplyToQueue = value; } + } + + public void Send(TradeRequest tradeRequest) + { + EmsTemplate.ConvertAndSendWithDelegate(tradeRequest, delegate(Message message) + { + message.ReplyTo = defaultReplyToQueue; + message.CorrelationID = new Guid().ToString(); + return message; + }); + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/EmsSyncStockServiceGateway.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/EmsSyncStockServiceGateway.cs new file mode 100644 index 00000000..a34cf419 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/EmsSyncStockServiceGateway.cs @@ -0,0 +1,35 @@ +#region License + +/* + * Copyright 2002-2009 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 Spring.Messaging.Ems.Core; +using Spring.EmsQuickStart.Common.Data; + +namespace Spring.EmsQuickStart.Client.Gateways +{ + public class EmsSyncStockServiceGateway : EmsGatewaySupport, ISyncStockService + { + public TradeResponse Send(TradeRequest tradeRequest) + { + RequestReplyEmsTemplate requestReplyNmsTemplate = (RequestReplyEmsTemplate) EmsTemplate; + return (TradeResponse)requestReplyNmsTemplate.ConvertAndSendRequestReply(tradeRequest); + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/IStockService.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/IStockService.cs new file mode 100644 index 00000000..b225e13c --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/IStockService.cs @@ -0,0 +1,31 @@ + + +#region License + +/* + * Copyright 2002-2008 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 Spring.EmsQuickStart.Common.Data; + +namespace Spring.EmsQuickStart.Client.Gateways +{ + public interface IStockService + { + void Send(TradeRequest tradeRequest); + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/ISyncStockService.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/ISyncStockService.cs new file mode 100644 index 00000000..c77afcbf --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/ISyncStockService.cs @@ -0,0 +1,38 @@ + + +#region License + +/* + * Copyright 2002-2008 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 Spring.EmsQuickStart.Common.Data; + +namespace Spring.EmsQuickStart.Client.Gateways +{ + /// + /// + /// + /// + /// + /// + /// Mark Pollack + public interface ISyncStockService + { + TradeResponse Send(TradeRequest tradeRequest); + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/RequestReplyEmsTemplate.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/RequestReplyEmsTemplate.cs new file mode 100644 index 00000000..1b2acc58 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Gateways/RequestReplyEmsTemplate.cs @@ -0,0 +1,58 @@ +#region License + +/* + * Copyright 2002-2009 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 Spring.Messaging.Ems.Common; +using Spring.Messaging.Ems.Core; +using TIBCO.EMS; + +namespace Spring.EmsQuickStart.Client.Gateways +{ + /// + /// Not used in the example application but included to show how one could layer on top of + /// EMS a synchronous request reply interaction. This implementation uses temporary queues but + /// another approach would be to use a permanent queue with a message selector unique to the request. + /// + public class RequestReplyEmsTemplate : EmsTemplate + { + public object ConvertAndSendRequestReply(object objectToSend) + { + + return Execute(delegate(ISession session, IMessageProducer producer) + { + TemporaryQueue tempQueue = null; + try + { + tempQueue = session.CreateTemporaryQueue(); + this.ConvertAndSendWithDelegate(objectToSend, delegate(Message message) + { + message.ReplyTo = tempQueue; + return message; + }); + return ReceiveAndConvert(tempQueue); + } + finally + { + //TODO use Admin API + //if (tempQueue != null) session.DeleteDestination(tempQueue); + } + }); + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Handlers/StockAppHandler.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Handlers/StockAppHandler.cs new file mode 100644 index 00000000..9bac1e27 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Handlers/StockAppHandler.cs @@ -0,0 +1,66 @@ +#region License + +/* + * Copyright 2002-2009 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.Collections; +using Common.Logging; +using Spring.EmsQuickStart.Client.UI; +using Spring.EmsQuickStart.Common.Data; + +namespace Spring.EmsQuickStart.Client.Handlers +{ + public class StockAppHandler + { + #region Logging Definition + + private readonly ILog log = LogManager.GetLogger(typeof(StockAppHandler)); + + #endregion + + private StockController stockController; + + + public StockController StockController + { + get { return stockController; } + set { stockController = value; } + } + + public void Handle(Hashtable data) + { + log.Info(string.Format("Received market data. Ticker = {0}, Price = {1}", data["TICKER"], data["PRICE"])); + + // forward to controller to update view + stockController.UpdateMarketData(data); + + } + + + public void Handle(TradeResponse tradeResponse) + { + log.Info(string.Format("Received trade resonse. Ticker = {0}, Price = {1}", tradeResponse.Ticker, tradeResponse.Price)); + stockController.UpdateTrade(tradeResponse); + } + + public void Handle(object catchAllObject) + { + log.Error("could not handle object of type = " + catchAllObject.GetType()); + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Program.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Program.cs new file mode 100644 index 00000000..9ac74978 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Program.cs @@ -0,0 +1,66 @@ +#region License + +/* + * Copyright 2002-2009 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.Threading; +using System.Windows.Forms; +using Common.Logging; +using Spring.Context; +using Spring.Context.Support; +using Spring.EmsQuickStart.Client.UI; + +namespace Spring.EmsQuickStart.Client +{ + static class Program + { + + private static readonly ILog log = LogManager.GetLogger(typeof(Program)); + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + try + { + log.Info("Running...."); + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + using (IApplicationContext ctx = ContextRegistry.GetContext()) + { + StockForm stockForm = new StockForm(); + Application.ThreadException += ThreadException; + Application.Run(stockForm); + } + } + catch (Exception e) + { + log.Error("Spring.EmsQuickStart.Client is broken.", e); + } + } + + private static void ThreadException(object sender, ThreadExceptionEventArgs e) + { + log.Error("Uncaught application exception.", e.Exception); + Application.Exit(); + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/AssemblyInfo.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..55c3e8dc --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Spring.EmsQuickStart.Client")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Spring.EmsQuickStart.Client")] +[assembly: AssemblyCopyright("Copyright © 2008")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("aff1d9ab-7818-4748-8234-8a78e5631899")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/Resources.Designer.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/Resources.Designer.cs new file mode 100644 index 00000000..f21fff1e --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.3053 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Spring.EmsQuickStart.Client.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Spring.EmsQuickStart.Client.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/Resources.resx b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/Resources.resx new file mode 100644 index 00000000..ffecec85 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/Settings.Designer.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/Settings.Designer.cs new file mode 100644 index 00000000..68851bef --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.3053 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Spring.EmsQuickStart.Client.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/Settings.settings b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/Settings.settings new file mode 100644 index 00000000..abf36c5d --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Spring.EmsQuickStart.Client.csproj b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Spring.EmsQuickStart.Client.csproj new file mode 100644 index 00000000..e99bb927 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Spring.EmsQuickStart.Client.csproj @@ -0,0 +1,127 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {87D0B725-A652-4A6B-A95F-197F7155769F} + WinExe + Properties + Spring.EmsQuickStart.Client + Spring.EmsQuickStart.Client + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + ..\..\..\..\..\..\lib\Net\2.0\Common.Logging.dll + + + + + + + + + False + ..\..\..\..\..\..\lib\Net\2.0\TIBCO.EMS.dll + + + + + Code + + + + Code + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + StockForm.cs + Designer + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + Form + + + StockForm.cs + + + + + {3A3A4E65-45A6-4B20-B460-0BEDC302C02C} + Spring.Aop.2005 + + + {710961A3-0DF4-49E4-A26E-F5B9C044AC84} + Spring.Core.2005 + + + {AE00E5AB-C39A-436F-86D2-33BFE33E2E40} + Spring.Data.2005 + + + {900E3839-301E-48B1-BAEB-B6645620ACFF} + Spring.Messaging.Ems.2005 + + + {AC5A3035-75DD-48E5-ABCA-38FBC8193F22} + Spring.EmsQuickStart.Common + + + + + Always + + + Always + + + + + \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Spring.EmsQuickStart.Client.csproj.user b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Spring.EmsQuickStart.Client.csproj.user new file mode 100644 index 00000000..5c2d6e6a --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/Spring.EmsQuickStart.Client.csproj.user @@ -0,0 +1,5 @@ + + + ShowAllFiles + + \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/UI/StockController.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/UI/StockController.cs new file mode 100644 index 00000000..d35a15bb --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/UI/StockController.cs @@ -0,0 +1,75 @@ +#region License + +/* + * Copyright 2002-2009 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.Collections; +using Spring.EmsQuickStart.Client.Gateways; +using Spring.EmsQuickStart.Common.Data; + +namespace Spring.EmsQuickStart.Client.UI +{ + /// + /// Handles requests from the UI and forwards them to the remote service. Messages recieved from + /// the service routed through this controller to update the UI. + /// + public class StockController + { + private StockForm stockForm; + + private IStockService stockService; + + public StockForm StockForm + { + get { return stockForm; } + set { stockForm = value; } + } + + public IStockService StockService + { + get { return stockService; } + set { stockService = value; } + } + + public void SendTradeRequest() + { + TradeRequest tradeRequest = new TradeRequest(); + tradeRequest.AccountName = "ACCT-123"; + tradeRequest.BuyRequest = true; + tradeRequest.OrderType = "MARKET"; + tradeRequest.Quantity = 314000000; + tradeRequest.RequestID = "REQ-1"; + tradeRequest.Ticker = "CSCO"; + tradeRequest.UserName = "Joe Trader"; + + stockService.Send(tradeRequest); + } + + public void UpdateMarketData(IDictionary marketDataDict) + { + stockForm.UpdateMarketData(marketDataDict); + } + + public void UpdateTrade(TradeResponse tradeResponse) + { + stockForm.UpdateTrade(tradeResponse); + } + + } +} diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/UI/StockForm.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/UI/StockForm.cs new file mode 100644 index 00000000..736e022d --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/UI/StockForm.cs @@ -0,0 +1,86 @@ +#region License + +/* + * Copyright 2002-2009 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.Windows.Forms; +using Common.Logging; +using Spring.Context.Support; +using Spring.EmsQuickStart.Common.Data; + +namespace Spring.EmsQuickStart.Client.UI +{ + public partial class StockForm : Form + { + #region Logging Definition + + private static readonly ILog log = LogManager.GetLogger(typeof (StockForm)); + + #endregion + + private StockController stockController; + + public StockForm() + { + InitializeComponent(); + stockController = ContextRegistry.GetContext()["StockController"] as StockController; + stockController.StockForm = this; + } + + public StockController Controller + { + set { stockController = value; } + } + + private void OnSendTradeRequest(object sender, EventArgs e) + { + //In this simple example no data is collected from the view. + //Instead a hardcoded trade request is created in the controller. + tradeRequestStatusTextBox.Text = "Request Pending..."; + stockController.SendTradeRequest(); + log.Info("Sent trade request."); + } + + public void UpdateTrade(TradeResponse trade) + { + Invoke(new MethodInvoker( + delegate + { + tradeRequestStatusTextBox.Text = "Confirmed. " + trade.Ticker + " " + trade.Price; + })); + } + + public void UpdateMarketData(IDictionary marketDataDict) + { + Invoke(new MethodInvoker( + delegate + { + marketDataListBox.Items.Add(marketDataDict["TICKER"] + " " + marketDataDict["PRICE"]); + })); + } + + private void OnPortfolioRequest(object sender, EventArgs e) + { + MessageBox.Show("Get Portfolio operation not yet implemented.", "EmsQuickStart"); + } + + + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/UI/StockForm.designer.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/UI/StockForm.designer.cs new file mode 100644 index 00000000..c6340084 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/UI/StockForm.designer.cs @@ -0,0 +1,127 @@ +namespace Spring.EmsQuickStart.Client.UI +{ + partial class StockForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tradeRequestButton = new System.Windows.Forms.Button(); + this.tradeRequestStatusTextBox = new System.Windows.Forms.TextBox(); + this.button1 = new System.Windows.Forms.Button(); + this.portfolioListBox = new System.Windows.Forms.ListBox(); + this.marketDataListBox = new System.Windows.Forms.ListBox(); + this.label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // tradeRequestButton + // + this.tradeRequestButton.Location = new System.Drawing.Point(12, 12); + this.tradeRequestButton.Name = "tradeRequestButton"; + this.tradeRequestButton.Size = new System.Drawing.Size(135, 23); + this.tradeRequestButton.TabIndex = 0; + this.tradeRequestButton.Text = "Send Trade Request"; + this.tradeRequestButton.UseVisualStyleBackColor = true; + this.tradeRequestButton.Click += new System.EventHandler(this.OnSendTradeRequest); + // + // tradeRequestStatusTextBox + // + this.tradeRequestStatusTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tradeRequestStatusTextBox.Location = new System.Drawing.Point(154, 13); + this.tradeRequestStatusTextBox.Name = "tradeRequestStatusTextBox"; + this.tradeRequestStatusTextBox.Size = new System.Drawing.Size(340, 20); + this.tradeRequestStatusTextBox.TabIndex = 1; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(12, 41); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(135, 23); + this.button1.TabIndex = 2; + this.button1.Text = "Get Portfolio"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.OnPortfolioRequest); + // + // portfolioListBox + // + this.portfolioListBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.portfolioListBox.FormattingEnabled = true; + this.portfolioListBox.Location = new System.Drawing.Point(154, 41); + this.portfolioListBox.Name = "portfolioListBox"; + this.portfolioListBox.Size = new System.Drawing.Size(340, 108); + this.portfolioListBox.TabIndex = 3; + // + // marketDataListBox + // + this.marketDataListBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.marketDataListBox.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(177))); + this.marketDataListBox.FormattingEnabled = true; + this.marketDataListBox.ItemHeight = 14; + this.marketDataListBox.Location = new System.Drawing.Point(90, 155); + this.marketDataListBox.Name = "marketDataListBox"; + this.marketDataListBox.Size = new System.Drawing.Size(404, 102); + this.marketDataListBox.TabIndex = 4; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 155); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(72, 13); + this.label1.TabIndex = 5; + this.label1.Text = "Market Data :"; + // + // StockForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(506, 269); + this.Controls.Add(this.label1); + this.Controls.Add(this.marketDataListBox); + this.Controls.Add(this.portfolioListBox); + this.Controls.Add(this.button1); + this.Controls.Add(this.tradeRequestStatusTextBox); + this.Controls.Add(this.tradeRequestButton); + this.Name = "StockForm"; + this.Text = "TradeForm"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button tradeRequestButton; + private System.Windows.Forms.TextBox tradeRequestStatusTextBox; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.ListBox portfolioListBox; + private System.Windows.Forms.ListBox marketDataListBox; + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/UI/StockForm.resx b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/UI/StockForm.resx new file mode 100644 index 00000000..ff31a6db --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Client/UI/StockForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Bo/Trade.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Bo/Trade.cs new file mode 100644 index 00000000..7bb740c0 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Bo/Trade.cs @@ -0,0 +1,40 @@ + + +namespace Spring.NmsQuickStart.Common.Bo +{ + public class Trade + { + private string ticker; + + private long quantity; + + private double price; + + private string orderType; + + + public string Ticker + { + get { return ticker; } + set { ticker = value; } + } + + public long Quantity + { + get { return quantity; } + set { quantity = value; } + } + + public double Price + { + get { return price; } + set { price = value; } + } + + public string OrderType + { + get { return orderType; } + set { orderType = value; } + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Bo/TradeRequest.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Bo/TradeRequest.cs new file mode 100644 index 00000000..d0011ac4 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Bo/TradeRequest.cs @@ -0,0 +1,97 @@ + + +using System.Collections; + +namespace Spring.NmsQuickStart.Common.Bo +{ + public class TradeRequest + { + private string ticker; + + private long quantity; + + private double price; + + private string orderType; + + private string accountName; + + private bool buyRequest; + + private string userName; + + private string requestId; + + + public string Ticker + { + get { return ticker; } + set { ticker = value; } + } + + public long Quantity + { + get { return quantity; } + set { quantity = value; } + } + + public double Price + { + get { return price; } + set { price = value; } + } + + public string OrderType + { + get { return orderType; } + set { orderType = value; } + } + + public string AccountName + { + get { return accountName; } + set { accountName = value; } + } + + public bool BuyRequest + { + get { return buyRequest; } + set { buyRequest = value; } + } + + public string UserName + { + get { return userName; } + set { userName = value; } + } + + public string RequestId + { + get { return requestId; } + set { requestId = value; } + } + + public bool Validate(IList validationErrors) + { + // Not intended to be an example best practices for validation + // The intention is to include some simple behavior in the class + + if (userName == null) + { + validationErrors.Add("User name not specified"); + } + if (requestId == null || requestId.Length == 0) + { + validationErrors.Add("Request Id not specified"); + } + if (!orderType.Equals("MARKET")) + { + if (price <= 0) + { + validationErrors.Add("Market order must have a price"); + } + } + return validationErrors.Count > 0; + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/AbstractNamedMessageConverter.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/AbstractNamedMessageConverter.cs new file mode 100644 index 00000000..b827cbf4 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/AbstractNamedMessageConverter.cs @@ -0,0 +1,30 @@ + + +using System; +using Apache.NMS; +using Spring.Objects.Factory; + +namespace Spring.NmsQuickStart.Common.Converters +{ + public abstract class AbstractNamedMessageConverter : INamedMessageConverter, IObjectNameAware + { + private string objectName; + + + public string Name + { + get { return objectName; } + set { objectName = value; } + } + + public abstract Type TargetType { get; } + + public string ObjectName + { + set { objectName = value; } + } + + public abstract IMessage ToMessage(object objectToConvert, ISession session); + public abstract object FromMessage(IMessage messageToConvert); + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/INamedMessageConverter.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/INamedMessageConverter.cs new file mode 100644 index 00000000..554acc01 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/INamedMessageConverter.cs @@ -0,0 +1,34 @@ + + +#region License + +/* + * Copyright 2002-2008 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 Spring.Messaging.Nms.Support.Converter; + +namespace Spring.NmsQuickStart.Common.Converters +{ + public interface INamedMessageConverter : IMessageConverter + { + string Name { get; set; } + + Type TargetType { get; } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/ITypeMapper.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/ITypeMapper.cs new file mode 100644 index 00000000..8a273bba --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/ITypeMapper.cs @@ -0,0 +1,42 @@ + + +#region License + +/* + * Copyright 2002-2008 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; + +namespace Spring.EmsQuickStart.Common.Converters +{ + /// + /// Provides a layer of indirection when adding the 'type' of the object as a message property. + /// + /// Mark Pollack + public interface ITypeMapper + { + string TypeIdFieldName + { + get; + } + + string FromType(Type typeOfObjectToConvert); + + Type ToType(string typeId); + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/MultiMessageConverter.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/MultiMessageConverter.cs new file mode 100644 index 00000000..c9fd8685 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/MultiMessageConverter.cs @@ -0,0 +1,110 @@ + + +using System; +using System.Collections; +using Apache.NMS; +using Spring.Messaging.Nms.Support.Converter; +using Spring.Objects.Factory; + +namespace Spring.NmsQuickStart.Common.Converters +{ + public class MultiMessageConverter : IMessageConverter, IInitializingObject + { + private IMessageConverter defaultMessageConverter = new SimpleMessageConverter(); + + private IDictionary typeConverterMapping = new Hashtable(); + + private IDictionary nameConverterMapping = new Hashtable(); + + private IList namedMessageConverters = new ArrayList(); + + + public MultiMessageConverter() + { + + } + + + public IList NamedMessageConverters + { + set { namedMessageConverters = value; } + } + + private string converterIdFieldName = "__ConverterId__"; + + public IMessage ToMessage(object objectToConvert, ISession session) + { + if (objectToConvert == null) + { + throw new MessageConversionException("Can't convert null object"); + } + if (objectToConvert.GetType().Equals(typeof(string)) || + typeof(IDictionary).IsAssignableFrom(objectToConvert.GetType()) || + objectToConvert.GetType().Equals(typeof(Byte[]))) + { + return defaultMessageConverter.ToMessage(objectToConvert, session); + } + else + { + INamedMessageConverter converter = GetConverterForType(objectToConvert.GetType()); + if (converter != null) + { + IMessage msg = converter.ToMessage(objectToConvert, session); + msg.Properties.SetString(converterIdFieldName, converter.Name); + return msg; + } + throw new MessageConversionException("Can't convert object of type " + objectToConvert.GetType()); + } + } + + private INamedMessageConverter GetConverterForType(Type typeOfObjectToConvert) + { + if (typeConverterMapping.Contains(typeOfObjectToConvert)) + { + return typeConverterMapping[typeOfObjectToConvert] as INamedMessageConverter; + } + return null; + } + + public object FromMessage(IMessage messageToConvert) + { + if (messageToConvert == null) + { + throw new MessageConversionException("Can't convert null message"); + } + string converterId = messageToConvert.Properties.GetString(converterIdFieldName); + if (converterId == null) + { + return defaultMessageConverter.FromMessage(messageToConvert); + } + else + { + IMessageConverter converter = GetConverterForId(converterId); + if (converter != null) + { + return converter.FromMessage(messageToConvert); + } + throw new MessageConversionException("Can't convert message with ConverterId = " + converterId + ". Message = " + messageToConvert); + + } + } + + private IMessageConverter GetConverterForId(string converterName) + { + if (nameConverterMapping.Contains(converterName)) + { + return nameConverterMapping[converterName] as IMessageConverter; + } + return null; + } + + public void AfterPropertiesSet() + { + foreach (INamedMessageConverter namedMessageConverter in namedMessageConverters) + { + nameConverterMapping.Add(namedMessageConverter.Name, namedMessageConverter); + typeConverterMapping.Add(namedMessageConverter.TargetType, namedMessageConverter); + } + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/TradeConverter.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/TradeConverter.cs new file mode 100644 index 00000000..b3021110 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/TradeConverter.cs @@ -0,0 +1,61 @@ + + +using System; +using Apache.NMS; +using Spring.Messaging.Nms.Support.Converter; +using Spring.NmsQuickStart.Common.Bo; + +namespace Spring.NmsQuickStart.Common.Converters +{ + public class TradeConverter : AbstractNamedMessageConverter + { + public override Type TargetType + { + get { return typeof (Trade); } + } + + public override IMessage ToMessage(object objectToConvert, ISession session) + { + Trade trade = objectToConvert as Trade; + if (trade == null) + { + throw new MessageConversionException("TradeConverter can not convert object of type " + + objectToConvert.GetType()); + } + try + { + IMapMessage mm = session.CreateMapMessage(); + + mm.Body.SetString("orderType", trade.OrderType); + mm.Body.SetDouble("price", trade.Price); + mm.Body.SetLong("quantity", trade.Quantity); + mm.Body.SetString("ticker", trade.Ticker); + + return mm; + + } + catch (Exception e) + { + throw new MessageConversionException("Could not convert TradeRequest to message", e); + } + } + + public override object FromMessage(IMessage messageToConvert) + { + IMapMessage mm = messageToConvert as IMapMessage; + if (mm != null) + { + Trade trade = new Trade(); + trade.OrderType = mm.Body.GetString("orderType"); + trade.Price = mm.Body.GetDouble("price"); + trade.Quantity = mm.Body.GetLong("quantity"); + trade.Ticker = mm.Body.GetString("ticker"); + return trade; + } + else + { + throw new MessageConversionException("Not of expected type MapMessage. Message = " + messageToConvert); + } + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/TradeRequestConverter.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/TradeRequestConverter.cs new file mode 100644 index 00000000..0f1e14f5 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/TradeRequestConverter.cs @@ -0,0 +1,69 @@ +using System; +using Apache.NMS; +using Spring.Messaging.Nms.Support.Converter; +using Spring.NmsQuickStart.Common.Bo; + +namespace Spring.NmsQuickStart.Common.Converters +{ + public class TradeRequestConverter : AbstractNamedMessageConverter + { + public override IMessage ToMessage(object objectToConvert, ISession session) + { + TradeRequest tradeRequest = objectToConvert as TradeRequest; + if (tradeRequest == null) + { + throw new MessageConversionException("TradeRequestConverter can not convert object of type " + + objectToConvert.GetType()); + } + + try + { + IMapMessage mm = session.CreateMapMessage(); + + + mm.Body.SetString("accountName", tradeRequest.AccountName); + mm.Body.SetBool("buyRequest", tradeRequest.BuyRequest); + mm.Body.SetString("orderType", tradeRequest.OrderType); + mm.Body.SetDouble("price", tradeRequest.Price); + mm.Body.SetLong("quantity", tradeRequest.Quantity); + mm.Body.SetString("requestId", tradeRequest.RequestId); + mm.Body.SetString("ticker", tradeRequest.Ticker); + mm.Body.SetString("username", tradeRequest.UserName); + + return mm; + + } catch (Exception e) + { + throw new MessageConversionException("Could not convert TradeRequest to message", e); + } + } + + public override object FromMessage(IMessage messageToConvert) + { + IMapMessage mm = messageToConvert as IMapMessage; + if (mm != null) + { + TradeRequest tradeRequest = new TradeRequest(); + tradeRequest.AccountName = mm.Body.GetString("accountName"); + tradeRequest.BuyRequest = mm.Body.GetBool("buyRequest"); + tradeRequest.OrderType = mm.Body.GetString("orderType"); + tradeRequest.Price = mm.Body.GetDouble("price"); + tradeRequest.Quantity = mm.Body.GetLong("quantity"); + tradeRequest.RequestId = mm.Body.GetString("requestId"); + tradeRequest.Ticker = mm.Body.GetString("ticker"); + tradeRequest.UserName = mm.Body.GetString("username"); + + return tradeRequest; + } + else + { + throw new MessageConversionException("Not of expected type MapMessage. Message = " + messageToConvert); + } + } + + public override Type TargetType + { + get { return typeof (TradeRequest); } + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/TypeMapper.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/TypeMapper.cs new file mode 100644 index 00000000..98faa98e --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/TypeMapper.cs @@ -0,0 +1,144 @@ + + +using System; +using System.Collections; +using Spring.Core.TypeResolution; + +namespace Spring.EmsQuickStart.Common.Converters +{ + public class TypeMapper : ITypeMapper + { + private string defaultNamespace; + private string defaultAssemblyName; + + //Generics not used to support both 1.1 and 2.0 + private IDictionary idTypeMapping; + private IDictionary typeIdMapping; + + + //TODO generalize? + private string defaultHashtableTypeId = "Hashtable"; + + private Type defaultHashtableClass = typeof(Hashtable); + + public TypeMapper() + { + idTypeMapping = new Hashtable(); + typeIdMapping = new Hashtable(); + } + + + public IDictionary IdTypeMapping + { + get { return idTypeMapping; } + set { idTypeMapping = value; } + } + + public string TypeIdFieldName + { + get { return "__TypeId__"; } + } + + + public Type DefaultHashtableClass + { + set { defaultHashtableClass = value; } + } + + public string FromType(Type typeOfObjectToConvert) + { + + if (typeIdMapping.Contains(typeOfObjectToConvert)) + { + return typeIdMapping[typeOfObjectToConvert] as string; + } + else + { + if ( typeof (IDictionary).IsAssignableFrom(typeOfObjectToConvert)) + { + return defaultHashtableTypeId; + } + return typeOfObjectToConvert.Name; + } + } + + public Type ToType(string typeId) + { + if (idTypeMapping.Contains(typeId)) + { + return idTypeMapping[typeId] as Type; + } + else + { + if (typeId.Equals(defaultHashtableTypeId)) + { + return defaultHashtableClass; + } + string fullyQualifiedTypeName = defaultNamespace + "." + + typeId + ", " + + DefaultAssemblyName; + return TypeResolutionUtils.ResolveType(fullyQualifiedTypeName); + } + + } + + public string DefaultNamespace + { + get + { + return defaultNamespace; + } + set + { + defaultNamespace = value; + } + + } + + public string DefaultAssemblyName + { + get + { + return defaultAssemblyName; + } + set + { + defaultAssemblyName = value; + } + } + + public void AfterPropertiesSet() + { + ValidateIdTypeMapping(); + if (DefaultAssemblyName != null && DefaultNamespace == null) + { + throw new ArgumentException("Default Namespace required when DefaultAssemblyName is set."); + } + if (DefaultNamespace != null && DefaultAssemblyName == null) + { + throw new ArgumentException("Default Assembly Name required when DefaultNamespace is set."); + } + } + + + private void ValidateIdTypeMapping() + { + IDictionary finalIdTypeMapping = new Hashtable(); + foreach (DictionaryEntry entry in idTypeMapping) + { + string id = entry.Key.ToString(); + Type t = entry.Value as Type; + if (t == null) + { + //convert from string value. + string typeName = entry.Value.ToString(); + t = TypeResolutionUtils.ResolveType(typeName); + } + finalIdTypeMapping.Add(id,t); + typeIdMapping.Add(t,id); + + } + idTypeMapping = finalIdTypeMapping; + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/XmlMessageConverter.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/XmlMessageConverter.cs new file mode 100644 index 00000000..3055eaee --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Converters/XmlMessageConverter.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections; +using System.IO; +using System.Text; +using System.Xml; +using System.Xml.Serialization; +using Spring.Messaging.Ems.Common; +using TIBCO.EMS; +using Spring.Messaging.Ems.Support.Converter; + +namespace Spring.EmsQuickStart.Common.Converters +{ + public class XmlMessageConverter : IMessageConverter + { + private IMessageConverter defaultMessageConverter = new SimpleMessageConverter(); + + + private ITypeMapper typeMapper; + + + public ITypeMapper TypeMapper + { + set { typeMapper = value; } + } + + public Message ToMessage(object objectToConvert, ISession session) + { + if (objectToConvert == null) + { + throw new MessageConversionException("Can't convert null object"); + } + try + { + if (objectToConvert.GetType().Equals(typeof (string)) || + typeof (IDictionary).IsAssignableFrom(objectToConvert.GetType()) || + objectToConvert.GetType().Equals(typeof (Byte[]))) + { + return defaultMessageConverter.ToMessage(objectToConvert, session); + } + else + { + string xmlString = GetXmlString(objectToConvert); + Message msg = session.CreateTextMessage(xmlString); + msg.SetStringProperty(typeMapper.TypeIdFieldName, typeMapper.FromType(objectToConvert.GetType())); + return msg; + } + } catch (Exception e) + { + throw new MessageConversionException("Can't convert object of type " + objectToConvert.GetType(), e); + } + } + + private string GetXmlString(object objectToConvert) + { + string xmlString; + XmlTextWriter xmlTextWriter = null; + MemoryStream memoryStream = null; + try + { + memoryStream = new MemoryStream(); + xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); + XmlSerializer xs = new XmlSerializer(objectToConvert.GetType()); + xs.Serialize(xmlTextWriter, objectToConvert); + xmlString = UTF8ByteArrayToString(((MemoryStream) xmlTextWriter.BaseStream).ToArray()); + } catch (Exception e) + { + throw new MessageConversionException("Can't convert object of type " + objectToConvert.GetType(), e); + } finally + { + if (memoryStream != null) memoryStream.Close(); + if (xmlTextWriter != null) xmlTextWriter.Close(); + } + return xmlString; + } + + public object FromMessage(Message messageToConvert) + { + if (messageToConvert == null) + { + throw new MessageConversionException("Can't convert null message"); + } + try + { + string converterId = messageToConvert.GetStringProperty(typeMapper.TypeIdFieldName); + if (converterId == null) + { + return defaultMessageConverter.FromMessage(messageToConvert); + } + else + { + TextMessage textMessage = messageToConvert as TextMessage; + if (textMessage == null) + { + throw new MessageConversionException("Can't convert message of type " + + messageToConvert.GetType()); + } + + using (MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(textMessage.Text))) + { + + XmlSerializer xs = new XmlSerializer(GetTargetType(textMessage)); + XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); + return xs.Deserialize(memoryStream); + } + } + } catch (Exception e) + { + throw new MessageConversionException("Can't convert message of type " + messageToConvert.GetType(), e); + } + } + + private Type GetTargetType(TextMessage message) + { + return typeMapper.ToType(message.GetStringProperty(typeMapper.TypeIdFieldName)); + } + + + private String UTF8ByteArrayToString(Byte[] characters) + { + UTF8Encoding encoding = new UTF8Encoding(); + + String constructedString = encoding.GetString(characters); + + return (constructedString); + } + + + private Byte[] StringToUTF8ByteArray(String pXmlString) + { + UTF8Encoding encoding = new UTF8Encoding(); + + Byte[] byteArray = encoding.GetBytes(pXmlString); + + return byteArray; + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeRequest.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeRequest.cs new file mode 100644 index 00000000..0d7a9309 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeRequest.cs @@ -0,0 +1,123 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.1433 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +// +// This source code was auto-generated by xsd, Version=2.0.50727.42. +// +namespace Spring.EmsQuickStart.Common.Data { + using System.Xml.Serialization; + + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.springframework.net/nms/common/2008-08-05")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.springframework.net/nms/common/2008-08-05", IsNullable=false)] + public partial class TradeRequest { + + private string tickerField; + + private long quantityField; + + private decimal priceField; + + private string orderTypeField; + + private string accountNameField; + + private bool buyRequestField; + + private string userNameField; + + private string requestIDField; + + /// + public string Ticker { + get { + return this.tickerField; + } + set { + this.tickerField = value; + } + } + + /// + public long Quantity { + get { + return this.quantityField; + } + set { + this.quantityField = value; + } + } + + /// + public decimal Price { + get { + return this.priceField; + } + set { + this.priceField = value; + } + } + + /// + public string OrderType { + get { + return this.orderTypeField; + } + set { + this.orderTypeField = value; + } + } + + /// + public string AccountName { + get { + return this.accountNameField; + } + set { + this.accountNameField = value; + } + } + + /// + public bool BuyRequest { + get { + return this.buyRequestField; + } + set { + this.buyRequestField = value; + } + } + + /// + public string UserName { + get { + return this.userNameField; + } + set { + this.userNameField = value; + } + } + + /// + public string RequestID { + get { + return this.requestIDField; + } + set { + this.requestIDField = value; + } + } + } +} diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeRequest.xsd b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeRequest.xsd new file mode 100644 index 00000000..c5e5573a --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeRequest.xsd @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeRequest.xsx b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeRequest.xsx new file mode 100644 index 00000000..ff71343b --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeRequest.xsx @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeResponse.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeResponse.cs new file mode 100644 index 00000000..1f3c4f77 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeResponse.cs @@ -0,0 +1,111 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.1433 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +// +// This source code was auto-generated by xsd, Version=2.0.50727.42. +// +namespace Spring.EmsQuickStart.Common.Data { + using System.Xml.Serialization; + + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.springframework.net/nms/common/2008-08-05")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="http://www.springframework.net/nms/common/2008-08-05", IsNullable=false)] + public partial class TradeResponse { + + private string tickerField; + + private long quantityField; + + private decimal priceField; + + private string orderTypeField; + + private string confirmationNumberField; + + private bool errorField; + + private string errorMessageField; + + /// + public string Ticker { + get { + return this.tickerField; + } + set { + this.tickerField = value; + } + } + + /// + public long Quantity { + get { + return this.quantityField; + } + set { + this.quantityField = value; + } + } + + /// + public decimal Price { + get { + return this.priceField; + } + set { + this.priceField = value; + } + } + + /// + public string OrderType { + get { + return this.orderTypeField; + } + set { + this.orderTypeField = value; + } + } + + /// + public string ConfirmationNumber { + get { + return this.confirmationNumberField; + } + set { + this.confirmationNumberField = value; + } + } + + /// + public bool Error { + get { + return this.errorField; + } + set { + this.errorField = value; + } + } + + /// + public string ErrorMessage { + get { + return this.errorMessageField; + } + set { + this.errorMessageField = value; + } + } + } +} diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeResponse.xsd b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeResponse.xsd new file mode 100644 index 00000000..d930e79d --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeResponse.xsd @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeResponse.xsx b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeResponse.xsx new file mode 100644 index 00000000..ff71343b --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/TradeResponse.xsx @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/generate-classes.bat b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/generate-classes.bat new file mode 100644 index 00000000..2a9c297b --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Data/generate-classes.bat @@ -0,0 +1,2 @@ +xsd.exe -c -l:c# -n:Spring.NmsQuickStart.Common.Data TradeResponse.xsd +xsd.exe -c -l:c# -n:Spring.NmsQuickStart.Common.Data TradeRequest.xsd \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Properties/AssemblyInfo.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..bb0a9527 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Spring.EmsQuickStart.Common")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Spring.EmsQuickStart.Common")] +[assembly: AssemblyCopyright("Copyright © 2008")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("0d2c3d0f-af2f-47aa-9441-c3bd966f94f7")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Spring.EmsQuickStart.Common.csproj b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Spring.EmsQuickStart.Common.csproj new file mode 100644 index 00000000..e49f970d --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Common/Spring.EmsQuickStart.Common.csproj @@ -0,0 +1,91 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {AC5A3035-75DD-48E5-ABCA-38FBC8193F22} + Library + Properties + Spring.EmsQuickStart.Common + Spring.EmsQuickStart.Common + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + False + ..\..\..\..\..\..\lib\Net\2.0\TIBCO.EMS.dll + + + + + + + + TradeResponse.xsd + + + TradeRequest.xsd + + + + + + {3A3A4E65-45A6-4B20-B460-0BEDC302C02C} + Spring.Aop.2005 + + + {710961A3-0DF4-49E4-A26E-F5B9C044AC84} + Spring.Core.2005 + + + {AE00E5AB-C39A-436F-86D2-33BFE33E2E40} + Spring.Data.2005 + + + {900E3839-301E-48B1-BAEB-B6645620ACFF} + Spring.Messaging.Ems.2005 + + + + + Designer + + + TradeResponse.xsd + + + Designer + + + TradeRequest.xsd + + + + + \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/App.config b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/App.config new file mode 100644 index 00000000..27772f82 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/App.config @@ -0,0 +1,45 @@ + + + + + + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Config/Handlers.xml b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Config/Handlers.xml new file mode 100644 index 00000000..3b37436c --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Config/Handlers.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Config/Messaging.xml b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Config/Messaging.xml new file mode 100644 index 00000000..6b1945d5 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Config/Messaging.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Config/ServiceStubs.xml b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Config/ServiceStubs.xml new file mode 100644 index 00000000..c133ffad --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Config/ServiceStubs.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Gateways/IMarketDataService.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Gateways/IMarketDataService.cs new file mode 100644 index 00000000..81dc6465 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Gateways/IMarketDataService.cs @@ -0,0 +1,7 @@ +namespace Spring.EmsQuickStart.Server.Gateways +{ + public interface IMarketDataService + { + void SendMarketData(); + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Gateways/MarketDataServiceGateway.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Gateways/MarketDataServiceGateway.cs new file mode 100644 index 00000000..e9db6ec1 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Gateways/MarketDataServiceGateway.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections; +using System.Threading; +using Common.Logging; +using Spring.Messaging.Ems.Core; + +namespace Spring.EmsQuickStart.Server.Gateways +{ + public class MarketDataServiceGateway : EmsGatewaySupport, IMarketDataService + { + private static readonly ILog log = LogManager.GetLogger(typeof (MarketDataServiceGateway)); + + private readonly Random random; + private TimeSpan sleepTimeInSeconds = new TimeSpan(0,0,0,10,0); + + + public MarketDataServiceGateway() + { + random = new Random(); + } + + public TimeSpan SleepTimeInSeconds + { + set { sleepTimeInSeconds = value; } + } + + public void SendMarketData() + { + while (true) + { + IDictionary data = GenerateFakeMarketData(); + log.Info("Sending market data."); + EmsTemplate.ConvertAndSend(data); + log.Info("Sleeping " + sleepTimeInSeconds + " seconds before sending more market data."); + Thread.Sleep(sleepTimeInSeconds); + } + } + + private IDictionary GenerateFakeMarketData() + { + IDictionary md = new Hashtable(); + md.Add("TICKER", "CSCO"); + md.Add("PRICE", string.Format("{0:##.##}", 22+Math.Abs(Gaussian()))); + return md; + } + + private double Gaussian() + { + double x1, x2, w; + + do + { + x1 = 2.0*random.NextDouble() - 1.0; + x2 = 2.0*random.NextDouble() - 1.0; + w = x1*x1 + x2*x2; + } while (w >= 1.0); + + w = Math.Sqrt(-2.0*Math.Log(w)/w); + + // two Gaussian random numbers are generated + return x1*w; + //y2 = x2 * w; + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Handlers/LoggingExceptionListener.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Handlers/LoggingExceptionListener.cs new file mode 100644 index 00000000..72afe929 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Handlers/LoggingExceptionListener.cs @@ -0,0 +1,23 @@ + + +using System; +using Common.Logging; +using Spring.Messaging.Ems.Core; +using TIBCO.EMS; + +namespace Spring.EmsQuickStart.Server.Handlers +{ + public class LoggingExceptionListener : IExceptionListener + { + #region Logging + + private readonly ILog logger = LogManager.GetLogger(typeof(LoggingExceptionListener)); + + #endregion + + public void OnException(EMSException exception) + { + logger.Info("********* Caught exception *************", exception); + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Handlers/StockAppHandler.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Handlers/StockAppHandler.cs new file mode 100644 index 00000000..16f65dd5 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Handlers/StockAppHandler.cs @@ -0,0 +1,44 @@ + + +using System.Collections; +using Spring.EmsQuickStart.Common.Data; +using Spring.EmsQuickStart.Server.Services; +using Spring.Util; + +namespace Spring.EmsQuickStart.Server.Handlers +{ + public class StockAppHandler + { + private IExecutionVenueService executionVenueService; + + private ICreditCheckService creditCheckService; + + private ITradingService tradingService; + + public StockAppHandler(IExecutionVenueService executionVenueService, ICreditCheckService creditCheckService, ITradingService tradingService) + { + this.executionVenueService = executionVenueService; + this.creditCheckService = creditCheckService; + this.tradingService = tradingService; + } + + public TradeResponse Handle(TradeRequest tradeRequest) + { + TradeResponse tradeResponse; + ArrayList errors = new ArrayList(); + if (creditCheckService.CanExecute(tradeRequest, errors)) + { + tradeResponse = executionVenueService.ExecuteTradeRequest(tradeRequest); + } + else + { + tradeResponse = new TradeResponse(); + tradeResponse.Error = true; + tradeResponse.ErrorMessage = StringUtils.ArrayToCommaDelimitedString(errors.ToArray()); + + } + tradingService.ProcessTrade(tradeRequest, tradeResponse); + return tradeResponse; + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Program.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Program.cs new file mode 100644 index 00000000..4a682468 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Program.cs @@ -0,0 +1,33 @@ +using System; +using System.Threading; +using Spring.Context.Support; +using Spring.EmsQuickStart.Server.Gateways; + +namespace Spring.EmsQuickStart.Server +{ + public class Program + { + static void Main(string[] args) + { + try + { + // Using Spring's IoC container + ContextRegistry.GetContext(); // Force Spring to load configuration + Console.Out.WriteLine("Server listening..."); + IMarketDataService marketDataService = + ContextRegistry.GetContext().GetObject("MarketDataGateway") as MarketDataServiceGateway; + ThreadStart job = new ThreadStart(marketDataService.SendMarketData); + Thread thread = new Thread(job); + thread.Start(); + Console.Out.WriteLine("--- Press to quit ---"); + Console.ReadLine(); + } + catch (Exception e) + { + Console.Out.WriteLine(e); + Console.Out.WriteLine("--- Press to quit ---"); + Console.ReadLine(); + } + } + } +} diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Properties/AssemblyInfo.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..c441eee5 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Spring.EmsQuickStart.Server")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Spring.EmsQuickStart.Server")] +[assembly: AssemblyCopyright("Copyright © 2008")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3e4b803d-86c9-4634-9b38-e29d70a083e0")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/ICreditCheckService.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/ICreditCheckService.cs new file mode 100644 index 00000000..e0101f02 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/ICreditCheckService.cs @@ -0,0 +1,33 @@ + + +#region License + +/* + * Copyright 2002-2008 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.Collections; +using Spring.EmsQuickStart.Common.Data; + +namespace Spring.EmsQuickStart.Server.Services +{ + + public interface ICreditCheckService + { + bool CanExecute(TradeRequest tradeRequest, IList errors); + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/IExecutionVenueService.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/IExecutionVenueService.cs new file mode 100644 index 00000000..fff4efd6 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/IExecutionVenueService.cs @@ -0,0 +1,31 @@ + + +#region License + +/* + * Copyright 2002-2008 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 Spring.EmsQuickStart.Common.Data; + +namespace Spring.EmsQuickStart.Server.Services +{ + public interface IExecutionVenueService + { + TradeResponse ExecuteTradeRequest(TradeRequest request); + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/ITradingService.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/ITradingService.cs new file mode 100644 index 00000000..3b7d1f85 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/ITradingService.cs @@ -0,0 +1,31 @@ + + +#region License + +/* + * Copyright 2002-2008 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 Spring.EmsQuickStart.Common.Data; + +namespace Spring.EmsQuickStart.Server.Services +{ + public interface ITradingService + { + void ProcessTrade(TradeRequest request, TradeResponse response); + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/Stubs/CreditCheckServiceStub.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/Stubs/CreditCheckServiceStub.cs new file mode 100644 index 00000000..d51df97c --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/Stubs/CreditCheckServiceStub.cs @@ -0,0 +1,16 @@ + + +using System.Collections; +using Spring.EmsQuickStart.Common.Data; +using Spring.EmsQuickStart.Server.Services; + +namespace Spring.EmsQuickStart.Server.Services.Stubs +{ + public class CreditCheckServiceStub : ICreditCheckService + { + public bool CanExecute(TradeRequest tradeRequest, IList errors) + { + return true; + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/Stubs/ExecutionVenueServiceStub.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/Stubs/ExecutionVenueServiceStub.cs new file mode 100644 index 00000000..428b1e92 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/Stubs/ExecutionVenueServiceStub.cs @@ -0,0 +1,36 @@ + + +using System; +using Spring.EmsQuickStart.Common.Data; +using Spring.EmsQuickStart.Server.Services; + +namespace Spring.EmsQuickStart.Server.Services.Stubs +{ + public class ExecutionVenueServiceStub : IExecutionVenueService + { + public TradeResponse ExecuteTradeRequest(TradeRequest request) + { + TradeResponse response = new TradeResponse(); + response.OrderType = request.OrderType; + response.Price = CalculatePrice(request.Ticker, request.Quantity, request.OrderType, request.Price, request.UserName); + response.Quantity = request.Quantity; + response.Ticker = request.Ticker; + response.ConfirmationNumber = new Guid().ToString(); + return response; + } + + private decimal CalculatePrice(string ticker, long quantity, string ordertype, decimal limitPrice, string userName) + { + // provide as sophisticed an impl as testing requires...for now all the same price. + if (ordertype.CompareTo("LIMIT") == 0) + { + return limitPrice; + } + else + { + return 27.6m; + } + + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/Stubs/TradingServiceStub.cs b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/Stubs/TradingServiceStub.cs new file mode 100644 index 00000000..ee5aafe6 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Services/Stubs/TradingServiceStub.cs @@ -0,0 +1,15 @@ + + +using Spring.EmsQuickStart.Common.Data; +using Spring.EmsQuickStart.Server.Services; + +namespace Spring.EmsQuickStart.Server.Services.Stubs +{ + public class TradingServiceStub : ITradingService + { + public void ProcessTrade(TradeRequest request, TradeResponse response) + { + //do nothing implementation, typical implementations would persist state to the database. + } + } +} \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Spring.EmsQuickStart.Server.csproj b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Spring.EmsQuickStart.Server.csproj new file mode 100644 index 00000000..69a1299b --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/src/Spring/Spring.EmsQuickStart.Server/Spring.EmsQuickStart.Server.csproj @@ -0,0 +1,101 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {85E7B947-8153-45E4-B572-BEDB191F1FB2} + Exe + Properties + Spring.EmsQuickStart.Server + Spring.EmsQuickStart.Server + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + ..\..\..\..\..\..\lib\Net\2.0\Common.Logging.dll + + + + + + False + ..\..\..\..\..\..\lib\Net\2.0\TIBCO.EMS.dll + + + + + + + + + + + + + + + + + + + + + + {3A3A4E65-45A6-4B20-B460-0BEDC302C02C} + Spring.Aop.2005 + + + {710961A3-0DF4-49E4-A26E-F5B9C044AC84} + Spring.Core.2005 + + + {AE00E5AB-C39A-436F-86D2-33BFE33E2E40} + Spring.Data.2005 + + + {900E3839-301E-48B1-BAEB-B6645620ACFF} + Spring.Messaging.Ems.2005 + + + {AC5A3035-75DD-48E5-ABCA-38FBC8193F22} + Spring.EmsQuickStart.Common + + + + + Always + + + Always + + + Always + + + + + \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/test/Spring/Spring.EmsQuickStart.Integration.Tests/AssemblyInfo.cs b/examples/Spring/Spring.EmsQuickStart/test/Spring/Spring.EmsQuickStart.Integration.Tests/AssemblyInfo.cs new file mode 100644 index 00000000..17c5b2f4 --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/test/Spring/Spring.EmsQuickStart.Integration.Tests/AssemblyInfo.cs @@ -0,0 +1,6 @@ +using System.Reflection; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Integration Tests")] diff --git a/examples/Spring/Spring.EmsQuickStart/test/Spring/Spring.EmsQuickStart.Integration.Tests/Spring.EmsQuickStart.Integration.Tests.2005.csproj b/examples/Spring/Spring.EmsQuickStart/test/Spring/Spring.EmsQuickStart.Integration.Tests/Spring.EmsQuickStart.Integration.Tests.2005.csproj new file mode 100644 index 00000000..56b6f41f --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/test/Spring/Spring.EmsQuickStart.Integration.Tests/Spring.EmsQuickStart.Integration.Tests.2005.csproj @@ -0,0 +1,44 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {E641F51F-1B51-4B94-B419-F902EABCE4D4} + Library + Properties + Spring + Spring.EmsQuickStart.Integration.Tests + + + true + full + false + ..\..\..\build\VS.NET.2005\Spring.NmsQuickStart.Integration.Tests\Debug\ + TRACE;DEBUG;NET_2_0 + prompt + 4 + + + pdbonly + true + ..\..\..\build\VS.NET.2005\Spring.NmsQuickStart.Integration.Tests\Release\ + TRACE;NET_2_0 + prompt + 4 + + + + + + + + + + \ No newline at end of file diff --git a/examples/Spring/Spring.EmsQuickStart/test/Spring/Spring.EmsQuickStart.Tests/AssemblyInfo.cs b/examples/Spring/Spring.EmsQuickStart/test/Spring/Spring.EmsQuickStart.Tests/AssemblyInfo.cs new file mode 100644 index 00000000..f8f7b7fa --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/test/Spring/Spring.EmsQuickStart.Tests/AssemblyInfo.cs @@ -0,0 +1,6 @@ +using System.Reflection; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Unit Tests")] diff --git a/examples/Spring/Spring.EmsQuickStart/test/Spring/Spring.EmsQuickStart.Tests/Spring.EmsQuickStart.Tests.2005.csproj b/examples/Spring/Spring.EmsQuickStart/test/Spring/Spring.EmsQuickStart.Tests/Spring.EmsQuickStart.Tests.2005.csproj new file mode 100644 index 00000000..36859b8d --- /dev/null +++ b/examples/Spring/Spring.EmsQuickStart/test/Spring/Spring.EmsQuickStart.Tests/Spring.EmsQuickStart.Tests.2005.csproj @@ -0,0 +1,44 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {94E4E1B4-D424-4EB9-BF34-2EE8CC3D7048} + Library + Properties + Spring + Spring.EmsQuickStart.Tests + + + true + full + false + ..\..\..\build\VS.NET.2005\Spring.NmsQuickStart.Tests\Debug\ + TRACE;DEBUG;NET_2_0 + prompt + 4 + + + pdbonly + true + ..\..\..\build\VS.NET.2005\Spring.NmsQuickStart.Tests\Release\ + TRACE;NET_2_0 + prompt + 4 + + + + + + + + + + \ No newline at end of file