/* * 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 { /// /// Implement IRequestCatalog /// using Spring as an IOC container [OVR-8]. /// /// 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; } /// /// Not implemented as Catalog is expected to be created by an IOC framework. /// /// ID for command /// Command instance 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 /// /// Default constructor. /// public Catalog() { } /// /// Construct object and set ApplicationContext. /// /// Our ApplicationContext public Catalog(IApplicationContext value) { ApplicationContext = value; } /// /// Provide the IApplicationContext instance. /// /// IApplicationContext instance 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; } /// /// Confirm that the Context is not null, and the Context's Command is not null. /// /// IRequestContext to verify /// The non-null Command for this Context 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 } }