/* | |
* Copyright 2005 The Apache Software Foundation. | |
* | |
* 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. | |
*/ | |
using System; | |
using System.Collections; | |
using Agility.Core; | |
using Nexus.Core; | |
using Nexus.Core.Helpers; | |
using Nexus.Core.Tables; | |
using Spring.Context; | |
namespace Nexus.Extras.Spring | |
{ | |
/// <summary> | |
/// Implement IRequestCatalog | |
/// using Spring as an IOC container [OVR-8]. | |
/// </summary> | |
/// | |
public class Catalog : IRequestCatalog, IApplicationContextAware | |
{ | |
#region Messages | |
private const string msg_ADD_COMMAND = "This catalog instance is created through dependency injection."; | |
private const string msg_MISSING = "Object is not found in Factory."; | |
private const string msg_NULL = "Object ID cannot be null."; | |
private const string msg_TYPE = "Command is not a IRequestCommand or IRequestChain."; | |
private const string msg_CATALOG_CONTEXT_NULL = "Catalog: Context cannot be null!"; | |
private const string msg_CATALOG_COMMAND_NULL = "Catalog: Command within Context cannot be null! -- Was Context retrieved from Catalog?"; | |
#endregion | |
#region IApplicationContextAware | |
private IApplicationContext _Factory = null; | |
public IApplicationContext ApplicationContext | |
{ | |
get { return _Factory; } | |
set { _Factory = value; } | |
} | |
#endregion | |
#region IRequestCatalog | |
public object GetObject(string name) | |
{ | |
if (null == name) | |
{ | |
Exception e = new Exception(msg_NULL); | |
throw(e); | |
} | |
object o = Factory().GetObject(name); | |
if (o == null) | |
{ | |
Exception e = new Exception(msg_MISSING); | |
throw(e); | |
} | |
return o; | |
} | |
public IViewHelper GetHelperFor(string command) | |
{ | |
IViewHelper helper = ViewHelper; | |
helper.Catalog = this; | |
helper.Command = GetRequestCommand(command); | |
return helper; | |
} | |
/// <summary> | |
/// Not implemented as Catalog is expected to be created by an IOC framework. | |
/// </summary> | |
/// <param name="name">ID for command</param> | |
/// <param name="command">Command instance</param> | |
public void AddCommand(string name, ICommand command) | |
{ | |
throw new NotImplementedException(msg_ADD_COMMAND); // OK | |
} | |
public ICommand GetCommand(string name) | |
{ | |
object o = GetObject(name); | |
return o as ICommand; | |
} | |
public IRequestCommand GetRequestCommand(string name) | |
{ | |
ICommand c = GetCommand(name); | |
IRequestCommand command = c as IRequestCommand; | |
if (command == null) | |
{ | |
Exception e = new Exception(msg_TYPE); | |
throw(e); | |
} | |
return command; | |
} | |
public IEnumerator GetNames() | |
{ | |
string[] names = _Factory.GetObjectDefinitionNames(); | |
IEnumerator enu = names.GetEnumerator(); | |
return enu; | |
} | |
#endregion | |
#region IRequestCatalog | |
/// <summary> | |
/// Default constructor. | |
/// </summary> | |
public Catalog() | |
{ | |
} | |
/// <summary> | |
/// Construct object and set ApplicationContext. | |
/// </summary> | |
/// <param name="value">Our ApplicationContext</param> | |
public Catalog(IApplicationContext value) | |
{ | |
ApplicationContext = value; | |
} | |
/// <summary> | |
/// Provide the IApplicationContext instance. | |
/// </summary> | |
/// <returns>IApplicationContext instance</returns> | |
public IApplicationContext Factory() | |
{ | |
return _Factory; | |
} | |
private IFieldTable _FieldTable; | |
public IFieldTable FieldTable | |
{ | |
get { return _FieldTable; } | |
set { _FieldTable = value; } | |
} | |
private IRequestCommand _PreOp; | |
public IRequestCommand PreOp | |
{ | |
get { return _PreOp; } | |
set { _PreOp = value; } | |
} | |
private IRequestCommand _PostOp; | |
public IRequestCommand PostOp | |
{ | |
get { return _PostOp; } | |
set { _PostOp = value; } | |
} | |
private IViewHelper _ViewHelper; | |
public IViewHelper ViewHelper | |
{ | |
get { return _ViewHelper; } | |
set { _ViewHelper = value; } | |
} | |
public IRequestContext GetRequestContext(string name) | |
{ | |
ICommand _command = GetCommand(name); | |
IRequestCommand _rc = _command as IRequestCommand; | |
return GetRequestContext(_rc); | |
} | |
public IRequestContext GetRequestContext(IRequestCommand command) | |
{ | |
IRequestContext context; | |
try | |
{ | |
context = command.NewContext(); | |
context[Tokens.CommandBin] = command; | |
context[Tokens.FieldTable] = FieldTable; | |
// TODO: MessageTable | |
} | |
catch (Exception e) | |
{ | |
context = new RequestContext(); | |
context.Fault = e; | |
// ISSUE: Log exception(faults) (Log all errors in verbose mode?) | |
// ISSUE: Provide an alternate location on fault? -- Declarative exception handing | |
} | |
return context; | |
} | |
public IRequestContext GetRequestContext(string name, IDictionary input) | |
{ | |
IRequestContext context = GetRequestContext(name); | |
context.Criteria = input; | |
return context; | |
} | |
/// <summary> | |
/// Confirm that the Context is not null, and the Context's Command is not null. | |
/// </summary> | |
/// <param name="context">IRequestContext to verify</param> | |
/// <returns>The non-null Command for this Context</returns> | |
private IRequestCommand VerifyRequest(IRequestContext context) | |
{ | |
if (null == context) | |
{ | |
context = new RequestContext(); | |
context.AddAlert(msg_CATALOG_CONTEXT_NULL); | |
} | |
IRequestCommand command = context[Tokens.CommandBin] as IRequestCommand; | |
if (null == command) | |
context.AddAlert(msg_CATALOG_COMMAND_NULL); | |
return command; | |
} | |
public IRequestContext ExecuteRequest(string name) | |
{ | |
IRequestContext context = GetRequestContext(name); | |
ExecuteRequest(context); | |
return context; | |
} | |
public void ExecuteRequest(IRequestContext context) | |
{ | |
IRequestCommand command = VerifyRequest(context); | |
if (context.IsNominal) | |
{ | |
try | |
{ | |
command.Execute(context); | |
} | |
catch (Exception e) | |
{ | |
context.Fault = e; | |
} | |
} | |
// ISSUE: Log exception(faults) (Log all errors in verbose mode?) | |
// ISSUE: Provide an alternate location on fault? -- Declarative exception handing? | |
} | |
public void ExecuteView(IRequestContext context) | |
{ | |
IRequestCommand command = VerifyRequest(context); | |
if (context.IsNominal) | |
{ | |
IChain chain = new Chain(); | |
if (_PreOp != null) chain.AddCommand(_PreOp); | |
chain.AddCommand(command); | |
if (_PostOp != null) chain.AddCommand(_PostOp); | |
try | |
{ | |
chain.Execute(context); | |
} | |
catch (Exception e) | |
{ | |
context.Fault = e; | |
} | |
} | |
} | |
#endregion | |
} | |
} |