using System; | |
using System.Text; | |
using Agility.Core; | |
using IBatisNet.DataMapper; | |
using Nexus.Core; | |
using Spring.Objects.Factory; | |
namespace PhoneBook.Core.Commands | |
{ | |
/// <summary> | |
/// Provide an abtract extension of BaseNexusCommand | |
/// with shared members for WNE Commands, | |
/// including a SqlMapper factory method. | |
/// </summary> | |
/// <remarks><p> | |
/// Superclasses must implement a NexusExecute method (inherited from BaseNexusCommand. | |
/// </p><p> | |
/// Concrete subclasses are expected to be created by a IOC Container, like Spring.NET. | |
/// Most concrete subclasses will be "decorator" classes designed to behave | |
/// differently based on what properties are set when the class is created. | |
/// Others may be custom classes with predefined behaviors. | |
/// </p><p> | |
/// The Spring catalog provides the versatility we need to mix-and-match | |
/// base commands with custom commands, as needed, | |
/// and call either from the client in exactly the same way. | |
/// </p><p> | |
/// NOTE that subclasses should NOT use the Outcome property of | |
/// the Nexus context since they may be subcommands in a Chain. | |
/// All BaseCommands should use the idiom | |
/// <code>context[ID] = object</code> | |
/// to store output. | |
/// </p><p> | |
/// NOTE after using the ReShaper code reformatter, | |
/// the Mapper method needs to be edited. | |
/// ReSharper removes an absolute reference that we actually need. | |
/// (Our Mapper method calls the IBatisNet Mapper method.) | |
/// The correct line of code is maintained as a comment, | |
/// so that it can <b>copied</b> over the reformatted version. | |
/// </p></remarks> | |
public abstract class BaseCommand : RequestCommand, IObjectNameAware | |
{ | |
/// <summary> | |
/// If an ID is not provided, default to the ObjectName. | |
/// </summary> | |
public override string ID | |
{ | |
get | |
{ | |
string _ID = base.ID; | |
if (null == _ID) return ObjectName; | |
else return _ID; | |
} | |
set { base.ID = value; } | |
} | |
private string _ObjectName; | |
/// <summary> | |
/// Provide a field for the Spring object name (set by Spring). | |
/// </summary> | |
public string ObjectName | |
{ | |
get { return _ObjectName; } | |
set { _ObjectName = value; } | |
} | |
/// <summary> | |
/// Provide a field for the Remark property. | |
/// </summary> | |
private string _Remark; | |
/// <summary> | |
/// Accept an arbitrary comment about a command | |
/// -- more for use in the XML document. | |
/// </summary> | |
/// | |
public string Remark | |
{ | |
get { return _Remark; } | |
set { _Remark = value; } | |
} | |
/// <summary> | |
/// Provide a field for the Mapper property. | |
/// </summary> | |
/// | |
private SqlMapper _Mapper; | |
/// <summary> | |
/// Expose a preconfigured SqlMapper instance that Commands can use to run statements. | |
/// </summary> | |
/// <remarks><p> | |
/// Commands use Mapper to invoke SqlMap statements, such as | |
/// <code> | |
/// object row = Mapper ().QueryForObject (QueryID, context); | |
/// </code>. | |
/// </p><p> | |
/// Any SqlMapper API method may be called. | |
/// </p><p> | |
/// The default behavior of BAseNexusCommand is to use the | |
/// command ID if the QueryID is null. | |
/// </p></remarks> | |
/// <returns>Preconfigured Mapper</returns> | |
/// | |
public SqlMapper Mapper | |
{ | |
get { return _Mapper; } | |
set { _Mapper = value; } | |
} | |
/// <summary> | |
/// Indicate whether string is null or zero length. | |
/// </summary> | |
/// <param name="input">Input to validate</param> | |
/// <returns>True if string is nyull or zero length</returns> | |
/// | |
protected bool IsEmpty(string input) | |
{ | |
return ((input == null) || (input.Equals(String.Empty))); | |
} | |
/// <summary> | |
/// Create new Global Universal Identifer as a formatted string. | |
/// </summary> | |
/// <returns>String representing a new GUID</returns> | |
/// <remarks><p> | |
/// No two calls to this method will ever return duplicate strings. | |
/// </p></remarks> | |
/// | |
protected string GuidString() | |
{ | |
Guid guid = Guid.NewGuid(); | |
string gs = guid.ToString(); | |
return gs; | |
} | |
/// <summary> | |
/// Document the wildcard character used by SQL queries. | |
/// </summary> | |
public const string WILDCARD = "%"; | |
/// <summary> | |
/// Prepare an attribute for use with a SQL wildcard ("LIKE") operation. | |
/// </summary> | |
/// <remarks><p> | |
/// A wildcard is prepended and appended for a full, scan-across match, | |
/// so that the string will found in any part of the field. | |
/// </p></remarks> | |
/// <param name="context">Context with attribute to escape</param> | |
/// <param name="id">Name of attribute to escape</param> | |
protected void LikeMe(IContext context, string id) | |
{ | |
string param = context[id] as string; | |
if (null != param) | |
{ | |
StringBuilder sb = new StringBuilder(WILDCARD); | |
sb.Append(param); | |
sb.Append(WILDCARD); | |
context[id] = sb.ToString(); | |
} | |
} | |
} | |
} |