Slightly refactor orchard.exe

Allows calling command execution in asp.net host, passing right set
of parameters

--HG--
branch : dev
rename : src/Tools/Orchard/OrchardArguments.cs => src/Tools/Orchard/OrchardParameters.cs
rename : src/Tools/Orchard/OrchardArgumentsParser.cs => src/Tools/Orchard/OrchardParametersParser.cs
rename : src/Tools/Orchard/Arguments/Switch.cs => src/Tools/Orchard/Parameters/CommandSwitch.cs
This commit is contained in:
Renaud Paquay
2010-04-09 10:29:25 -07:00
parent 343145933c
commit 6a70e66af2
14 changed files with 90 additions and 84 deletions

View File

@@ -19,13 +19,14 @@ namespace Orchard.Commands {
try {
var hostContainer = OrchardStarter.CreateHostContainer(MvcSingletons);
var host = hostContainer.Resolve<IOrchardHost>();
var tenantManager = hostContainer.Resolve<ITenantManager>();
host.Initialize();
// Find tenant (or default)
tenant = tenant ?? "default";
var tenantManager = hostContainer.Resolve<ITenantManager>();
var tenantSettings = tenantManager.LoadSettings().Single(s => String.Equals(s.Name, tenant, StringComparison.OrdinalIgnoreCase));
// Disptach command execution to ICommandManager
using (var env = host.CreateStandaloneEnvironment(tenantSettings)) {
env.Resolve<ICommandManager>().Execute(new CommandParameters {Arguments = args, Switches = switches});
}

View File

@@ -1,7 +0,0 @@
using System.Collections.Generic;
namespace Orchard.Arguments {
public interface IParser {
ParserResult Parse(IEnumerable<string> args);
}
}

View File

@@ -1,34 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Orchard.Arguments {
public class Parser : IParser {
public ParserResult Parse(IEnumerable<string> args) {
ParserResult result = new ParserResult();
IEnumerator<string> e = args.GetEnumerator();
while (e.MoveNext()) {
if (e.Current[0] == '/') {
var s = ParseSwitch(e);
result.Switches.Add(s);
}
else {
result.Arguments.Add(e.Current);
}
}
return result;
}
private Switch ParseSwitch(IEnumerator<string> enumerator) {
string sw = enumerator.Current.Substring(1);
string[] args = sw.Split(':');
return new Switch {
Name = args[0],
Value = args.Length >= 2 ? args[1] : string.Empty
};
}
}
}

View File

@@ -1,13 +0,0 @@
using System.Collections.Generic;
namespace Orchard.Arguments {
public class ParserResult {
public ParserResult() {
this.Arguments = new List<string>();
this.Switches = new List<Switch>();
}
public IList<string> Arguments { get; set; }
public IList<Switch> Switches { get; set; }
}
}

View File

@@ -19,9 +19,12 @@ namespace Orchard.Host {
//TODO
}
public void RunCommand(string[] args) {
public void RunCommand(OrchardParameters args) {
var agent = Activator.CreateInstance("Orchard.Framework", "Orchard.Commands.CommandHostAgent").Unwrap();
agent.GetType().GetMethod("RunSingleCommand").Invoke(agent, new object[] { args });
agent.GetType().GetMethod("RunSingleCommand").Invoke(agent, new object[] {
args.Tenant,
args.Arguments.ToArray(),
args.Switches});
}
}
}

View File

@@ -0,0 +1,7 @@
using Orchard.Parameters;
namespace Orchard {
public interface IOrchardParametersParser {
OrchardParameters Parse(CommandParameters parameters);
}
}

View File

@@ -48,15 +48,16 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Arguments\IParser.cs" />
<Compile Include="OrchardArguments.cs" />
<Compile Include="Arguments\Parser.cs" />
<Compile Include="Arguments\ParserResult.cs" />
<Compile Include="Parameters\ICommandParametersParser.cs" />
<Compile Include="IOrchardParametersParser.cs" />
<Compile Include="OrchardParameters.cs" />
<Compile Include="Parameters\CommandParametersParser.cs" />
<Compile Include="Parameters\CommandParameters.cs" />
<Compile Include="Host\CommandHost.cs" />
<Compile Include="OrchardArgumentsParser.cs" />
<Compile Include="OrchardParametersParser.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Arguments\Switch.cs" />
<Compile Include="Parameters\CommandSwitch.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@@ -4,10 +4,13 @@ using System.Linq;
using System.Text;
namespace Orchard {
public class OrchardArguments {
public class OrchardParameters : MarshalByRefObject {
public bool Verbose { get; set; }
public string VirtualPath { get; set; }
public string WorkingDirectory { get; set; }
public string Tenant { get; set; }
public IEnumerable<string> Arguments { get; set; }
public IDictionary<string, string> Switches { get; set; }
}
}

View File

@@ -1,21 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Orchard.Arguments;
using System.Collections.Generic;
using Orchard.Parameters;
namespace Orchard {
public interface IOrchardArgumentsParser {
OrchardArguments Parse(ParserResult arguments);
}
public class OrchardParametersParser : IOrchardParametersParser {
public class OrchardArgumentsParser : IOrchardArgumentsParser {
public OrchardParameters Parse(CommandParameters parameters) {
public OrchardArguments Parse(ParserResult arguments) {
var result = new OrchardArguments();
var result = new OrchardParameters {
Arguments = parameters.Arguments,
Switches = new Dictionary<string, string>()
};
foreach (var sw in arguments.Switches) {
switch (sw.Name.ToLowerInvariant()) {
foreach (var sw in parameters.Switches) {
switch (sw.Key.ToLowerInvariant()) {
case "wd":
case "workingdirectory":
result.WorkingDirectory = sw.Value;
@@ -35,6 +32,10 @@ namespace Orchard {
case "tenant":
result.Tenant = sw.Value;
break;
default:
result.Switches.Add(sw.Key, sw.Value);
break;
}
}

View File

@@ -0,0 +1,8 @@
using System.Collections.Generic;
namespace Orchard.Parameters {
public class CommandParameters {
public IList<string> Arguments { get; set; }
public IDictionary<string, string> Switches { get; set; }
}
}

View File

@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Orchard.Parameters {
public class CommandParametersParser : ICommandParametersParser {
public CommandParameters Parse(IEnumerable<string> args) {
var result = new CommandParameters {
Arguments = new List<string>(),
Switches = new Dictionary<string, string>()
};
foreach (var arg in args) {
if (arg[0] == '/') {
var switchKeyValue = arg.Substring(1).Split(':');
result.Switches.Add(switchKeyValue[0], switchKeyValue.Length >= 2 ? switchKeyValue[1] : string.Empty);
}
else {
result.Arguments.Add(arg);
}
}
return result;
}
}
}

View File

@@ -1,5 +1,5 @@
namespace Orchard.Arguments {
public class Switch {
namespace Orchard.Parameters {
public class CommandSwitch {
public string Name { get; set; }
public string Value { get; set; }
}

View File

@@ -0,0 +1,7 @@
using System.Collections.Generic;
namespace Orchard.Parameters {
public interface ICommandParametersParser {
CommandParameters Parse(IEnumerable<string> args);
}
}

View File

@@ -8,6 +8,7 @@ using System.Text;
using System.Web;
using System.Web.Hosting;
using Orchard.Host;
using Orchard.Parameters;
namespace Orchard {
class Program {
@@ -23,7 +24,7 @@ namespace Orchard {
public void Run() {
// Parse command line arguments
var arguments = new OrchardArgumentsParser().Parse(new Orchard.Arguments.Parser().Parse(_args));
var arguments = new OrchardParametersParser().Parse(new CommandParametersParser().Parse(_args));
if (string.IsNullOrEmpty(arguments.VirtualPath))
arguments.VirtualPath = "/";
@@ -50,7 +51,7 @@ namespace Orchard {
if (arguments.Verbose) {
Console.WriteLine("Executing command in ASP.NET AppDomain");
}
host.RunCommand(_args);
host.RunCommand(arguments);
}
private DirectoryInfo GetOrchardDirectory(string directory) {
@@ -74,7 +75,8 @@ namespace Orchard {
return directoryInfo;
}
throw new ApplicationException("Directory \"{0}\" doesn't seem to contain an Orchard installation");
throw new ApplicationException(
string.Format("Directory \"{0}\" doesn't seem to contain an Orchard installation", directory));
}
public object CreateWorkerAppDomainWithHost(string virtualPath, string physicalPath, Type hostType) {