Export and import works

This commit is contained in:
mahsaro
2015-07-28 13:52:55 +01:00
parent 586ad9be84
commit 6718f1902b
16 changed files with 100 additions and 62 deletions

View File

@@ -140,7 +140,7 @@ namespace Orchard.Alias.Controllers {
} }
try { try {
_aliasService.Set(aliasPath, routePath, "Custom"); _aliasService.Set(aliasPath, routePath, "Custom",false);
} }
catch(Exception ex) { catch(Exception ex) {
Services.TransactionManager.Cancel(); Services.TransactionManager.Cancel();
@@ -204,7 +204,7 @@ namespace Orchard.Alias.Controllers {
} }
try { try {
_aliasService.Set(aliasPath, routePath, "Custom"); _aliasService.Set(aliasPath, routePath, "Custom",false);
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@@ -5,8 +5,8 @@ using System.Web.Routing;
namespace Orchard.Alias { namespace Orchard.Alias {
public interface IAliasService : IDependency { public interface IAliasService : IDependency {
RouteValueDictionary Get(string aliasPath); RouteValueDictionary Get(string aliasPath);
void Set(string aliasPath, RouteValueDictionary routeValues, string aliasSource); void Set(string aliasPath, RouteValueDictionary routeValues, string aliasSource, bool isManaged);
void Set(string aliasPath, string routePath, string aliasSource); void Set(string aliasPath, string routePath, string aliasSource, bool isManaged);
void Delete(string aliasPath); void Delete(string aliasPath);
void Delete(string aliasPath, string aliasSource); void Delete(string aliasPath, string aliasSource);
/// <summary> /// <summary>
@@ -18,8 +18,8 @@ namespace Orchard.Alias {
IEnumerable<string> Lookup(RouteValueDictionary routeValues); IEnumerable<string> Lookup(RouteValueDictionary routeValues);
IEnumerable<string> Lookup(string routePath); IEnumerable<string> Lookup(string routePath);
void Replace(string aliasPath, RouteValueDictionary routeValues, string aliasSource); void Replace(string aliasPath, RouteValueDictionary routeValues, string aliasSource, bool isManaged);
void Replace(string aliasPath, string routePath, string aliasSource); void Replace(string aliasPath, string routePath, string aliasSource, bool isManaged);
IEnumerable<Tuple<string, RouteValueDictionary>> List(); IEnumerable<Tuple<string, RouteValueDictionary>> List();
IEnumerable<Tuple<string, RouteValueDictionary, string>> List(string sourceStartsWith); IEnumerable<Tuple<string, RouteValueDictionary, string>> List(string sourceStartsWith);

View File

@@ -29,12 +29,14 @@ namespace Orchard.Alias.Implementation {
var virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo; var virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;
// Attempt to lookup RouteValues in the alias map // Attempt to lookup RouteValues in the alias map
IDictionary<string, string> routeValues; //IDictionary<string, string> routeValues;
AliasInfo aliasInfo;
// TODO: Might as well have the lookup in AliasHolder... // TODO: Might as well have the lookup in AliasHolder...
if (_aliasMap.TryGetAlias(virtualPath, out routeValues)) { if (_aliasMap.TryGetAlias(virtualPath, out aliasInfo))
{
// Construct RouteData from the route values // Construct RouteData from the route values
var data = new RouteData(this, _routeHandler); var data = new RouteData(this, _routeHandler);
foreach (var routeValue in routeValues) { foreach (var routeValue in aliasInfo.RouteValues) {
var key = routeValue.Key; var key = routeValue.Key;
if (key.EndsWith("-")) if (key.EndsWith("-"))
data.Values.Add(key.Substring(0, key.Length - 1), routeValue.Value); data.Values.Add(key.Substring(0, key.Length - 1), routeValue.Value);

View File

@@ -31,18 +31,20 @@ namespace Orchard.Alias.Implementation {
return _aliasStorage.Get(aliasPath).ToRouteValueDictionary(); return _aliasStorage.Get(aliasPath).ToRouteValueDictionary();
} }
public void Set(string aliasPath, RouteValueDictionary routeValues, string aliasSource) { public void Set(string aliasPath, RouteValueDictionary routeValues, string aliasSource, bool isManaged) {
_aliasStorage.Set( _aliasStorage.Set(
aliasPath, aliasPath,
ToDictionary(routeValues), ToDictionary(routeValues),
aliasSource); aliasSource,
isManaged);
} }
public void Set(string aliasPath, string routePath, string aliasSource) { public void Set(string aliasPath, string routePath, string aliasSource, bool isManaged) {
_aliasStorage.Set( _aliasStorage.Set(
aliasPath.TrimStart('/'), aliasPath.TrimStart('/'),
ToDictionary(routePath), ToDictionary(routePath),
aliasSource); aliasSource,
isManaged);
} }
public void Delete(string aliasPath) { public void Delete(string aliasPath) {
@@ -71,15 +73,16 @@ namespace Orchard.Alias.Implementation {
return Lookup(ToDictionary(routePath).ToRouteValueDictionary()); return Lookup(ToDictionary(routePath).ToRouteValueDictionary());
} }
public void Replace(string aliasPath, RouteValueDictionary routeValues, string aliasSource) { public void Replace(string aliasPath, RouteValueDictionary routeValues, string aliasSource, bool isManaged) {
foreach (var lookup in Lookup(routeValues).Where(path => path != aliasPath)) { foreach (var lookup in Lookup(routeValues).Where(path => path != aliasPath)) {
Delete(lookup, aliasSource); Delete(lookup, aliasSource);
} }
Set(aliasPath, routeValues, aliasSource); Set(aliasPath, routeValues, aliasSource, isManaged);
} }
public void Replace(string aliasPath, string routePath, string aliasSource) { public void Replace(string aliasPath, string routePath, string aliasSource, bool isManaged)
Replace(aliasPath, ToDictionary(routePath).ToRouteValueDictionary(), aliasSource); {
Replace(aliasPath, ToDictionary(routePath).ToRouteValueDictionary(), aliasSource, isManaged);
} }
public IEnumerable<string> Lookup(RouteValueDictionary routeValues) { public IEnumerable<string> Lookup(RouteValueDictionary routeValues) {

View File

@@ -5,5 +5,6 @@ namespace Orchard.Alias.Implementation.Holder {
public string Area { get; set; } public string Area { get; set; }
public string Path { get; set; } public string Path { get; set; }
public IDictionary<string, string> RouteValues { get; set; } public IDictionary<string, string> RouteValues { get; set; }
public bool IsManaged { get; set; }
} }
} }

View File

@@ -9,21 +9,29 @@ using System.Collections.Concurrent;
namespace Orchard.Alias.Implementation.Map { namespace Orchard.Alias.Implementation.Map {
public class AliasMap { public class AliasMap {
private readonly string _area; private readonly string _area;
private readonly ConcurrentDictionary<string, IDictionary<string, string>> _aliases; //private readonly ConcurrentDictionary<string, IDictionary<string, string>> _aliases;
private readonly Node _root; private readonly ConcurrentDictionary<string, AliasInfo> _aliases;
private readonly Node _root;
public AliasMap(string area) { public AliasMap(string area) {
_area = area; _area = area;
_aliases = new ConcurrentDictionary<string, IDictionary<string, string>>(StringComparer.OrdinalIgnoreCase); //_aliases = new ConcurrentDictionary<string, IDictionary<string, string>>(StringComparer.OrdinalIgnoreCase);
_aliases = new ConcurrentDictionary<string, AliasInfo>(StringComparer.OrdinalIgnoreCase);
_root = new Node(); _root = new Node();
//_isManaged = isManaged;
} }
public IEnumerable<AliasInfo> GetAliases() { public IEnumerable<AliasInfo> GetAliases() {
return _aliases.Select(x => new AliasInfo {Area = _area, Path = x.Key, RouteValues = x.Value}); return _aliases.Select(x => new AliasInfo { Area = _area, Path = x.Key, RouteValues = x.Value.RouteValues, IsManaged = x.Value.IsManaged });
} }
public bool TryGetAlias(string virtualPath, out IDictionary<string, string> routeValues) { //public bool TryGetAlias(string virtualPath, out IDictionary<string, string> routeValues) {
return _aliases.TryGetValue(virtualPath, out routeValues); // return _aliases.TryGetValue(virtualPath, out routeValues);
//}
public bool TryGetAlias(string virtualPath, out AliasInfo aliasInfo)
{
return _aliases.TryGetValue(virtualPath, out aliasInfo);
} }
public Tuple<IDictionary<string, object>, string> Locate(RouteValueDictionary routeValues) { public Tuple<IDictionary<string, object>, string> Locate(RouteValueDictionary routeValues) {
@@ -39,7 +47,8 @@ namespace Orchard.Alias.Implementation.Map {
throw new ArgumentNullException(); throw new ArgumentNullException();
} }
_aliases[info.Path] = info.RouteValues; //_aliases[info.Path] = info.RouteValues;
_aliases[info.Path] = info;
ExpandTree(_root, info.Path, info.RouteValues); ExpandTree(_root, info.Path, info.RouteValues);
} }
@@ -48,8 +57,10 @@ namespace Orchard.Alias.Implementation.Map {
/// </summary> /// </summary>
/// <param name="info"></param> /// <param name="info"></param>
public void Remove(AliasInfo info) { public void Remove(AliasInfo info) {
IDictionary<string,string> values; //IDictionary<string, string> values;
_aliases.TryRemove(info.Path, out values); AliasInfo aliasInfo;
_aliases.TryRemove(info.Path, out aliasInfo);
//_aliases.TryRemove(info.Path, out info);
CollapseTree(_root, info.Path, info.RouteValues); CollapseTree(_root, info.Path, info.RouteValues);
} }

View File

@@ -10,15 +10,15 @@ using Orchard.Validation;
namespace Orchard.Alias.Implementation.Storage { namespace Orchard.Alias.Implementation.Storage {
public interface IAliasStorage : IDependency { public interface IAliasStorage : IDependency {
void Set(string path, IDictionary<string, string> routeValues, string source); void Set(string path, IDictionary<string, string> routeValues, string source, bool isManaged);
IDictionary<string, string> Get(string aliasPath); IDictionary<string, string> Get(string aliasPath);
void Remove(Expression<Func<AliasRecord, bool>> filter); void Remove(Expression<Func<AliasRecord, bool>> filter);
void Remove(string path); void Remove(string path);
void Remove(string path, string aliasSource); void Remove(string path, string aliasSource);
void RemoveBySource(string aliasSource); void RemoveBySource(string aliasSource);
IEnumerable<Tuple<string, string, IDictionary<string, string>, string, int>> List(Expression<Func<AliasRecord, bool>> predicate); IEnumerable<Tuple<string, string, IDictionary<string, string>, string, int, bool>> List(Expression<Func<AliasRecord, bool>> predicate);
IEnumerable<Tuple<string, string, IDictionary<string, string>, string, int>> List(); IEnumerable<Tuple<string, string, IDictionary<string, string>, string, int, bool>> List();
IEnumerable<Tuple<string, string, IDictionary<string, string>, string, int>> List(string sourceStartsWith); IEnumerable<Tuple<string, string, IDictionary<string, string>, string, int, bool>> List(string sourceStartsWith);
} }
public class AliasStorage : IAliasStorage { public class AliasStorage : IAliasStorage {
@@ -31,7 +31,7 @@ namespace Orchard.Alias.Implementation.Storage {
_aliasHolder = aliasHolder; _aliasHolder = aliasHolder;
} }
public void Set(string path, IDictionary<string, string> routeValues, string source) { public void Set(string path, IDictionary<string, string> routeValues, string source, bool isManaged) {
if (path == null) { if (path == null) {
throw new ArgumentNullException("path"); throw new ArgumentNullException("path");
} }
@@ -66,6 +66,7 @@ namespace Orchard.Alias.Implementation.Storage {
aliasRecord.RouteValues = values.ToString(); aliasRecord.RouteValues = values.ToString();
aliasRecord.Source = source; aliasRecord.Source = source;
aliasRecord.IsManaged = isManaged;
if (aliasRecord.Action.Id == 0 || aliasRecord.Id == 0) { if (aliasRecord.Action.Id == 0 || aliasRecord.Id == 0) {
if (aliasRecord.Action.Id == 0) { if (aliasRecord.Action.Id == 0) {
_actionRepository.Create(aliasRecord.Action); _actionRepository.Create(aliasRecord.Action);
@@ -78,7 +79,7 @@ namespace Orchard.Alias.Implementation.Storage {
} }
// Transform and push into AliasHolder // Transform and push into AliasHolder
var dict = ToDictionary(aliasRecord); var dict = ToDictionary(aliasRecord);
_aliasHolder.SetAlias(new AliasInfo { Path = dict.Item1, Area = dict.Item2, RouteValues = dict.Item3 }); _aliasHolder.SetAlias(new AliasInfo { Path = dict.Item1, Area = dict.Item2, RouteValues = dict.Item3, IsManaged = dict.Item6 });
} }
public IDictionary<string, string> Get(string path) { public IDictionary<string, string> Get(string path) {
@@ -109,15 +110,17 @@ namespace Orchard.Alias.Implementation.Storage {
// Bulk updates might go wrong if we don't flush. // Bulk updates might go wrong if we don't flush.
_aliasRepository.Flush(); _aliasRepository.Flush();
var dict = ToDictionary(aliasRecord); var dict = ToDictionary(aliasRecord);
_aliasHolder.RemoveAlias(new AliasInfo() { Path = dict.Item1, Area = dict.Item2, RouteValues = dict.Item3 }); //TODO:
_aliasHolder.RemoveAlias(new AliasInfo() { Path = dict.Item1, Area = dict.Item2, RouteValues = dict.Item3, IsManaged = dict.Item6});
} }
} }
public IEnumerable<Tuple<string, string, IDictionary<string, string>, string, int>> List() { public IEnumerable<Tuple<string, string, IDictionary<string, string>, string, int, bool>> List()
{
return List((Expression<Func<AliasRecord, bool>>)null); return List((Expression<Func<AliasRecord, bool>>)null);
} }
public IEnumerable<Tuple<string, string, IDictionary<string, string>, string, int>> List(Expression<Func<AliasRecord, bool>> predicate) { public IEnumerable<Tuple<string, string, IDictionary<string, string>, string, int, bool>> List(Expression<Func<AliasRecord, bool>> predicate) {
var table = _aliasRepository.Table; var table = _aliasRepository.Table;
if (predicate != null) { if (predicate != null) {
@@ -127,11 +130,13 @@ namespace Orchard.Alias.Implementation.Storage {
return table.OrderBy(a => a.Id).Select(ToDictionary).ToList(); return table.OrderBy(a => a.Id).Select(ToDictionary).ToList();
} }
public IEnumerable<Tuple<string, string, IDictionary<string, string>, string, int>> List(string sourceStartsWith) { public IEnumerable<Tuple<string, string, IDictionary<string, string>, string, int, bool>> List(string sourceStartsWith)
{
return List(a => a.Source.StartsWith(sourceStartsWith)); return List(a => a.Source.StartsWith(sourceStartsWith));
} }
private static Tuple<string, string, IDictionary<string, string>, string, int> ToDictionary(AliasRecord aliasRecord) { private static Tuple<string, string, IDictionary<string, string>, string, int, bool> ToDictionary(AliasRecord aliasRecord)
{
IDictionary<string, string> routeValues = new Dictionary<string, string>(); IDictionary<string, string> routeValues = new Dictionary<string, string>();
if (aliasRecord.Action.Area != null) { if (aliasRecord.Action.Area != null) {
routeValues.Add("area", aliasRecord.Action.Area); routeValues.Add("area", aliasRecord.Action.Area);
@@ -147,7 +152,7 @@ namespace Orchard.Alias.Implementation.Storage {
routeValues.Add(attr.Name.LocalName, attr.Value); routeValues.Add(attr.Name.LocalName, attr.Value);
} }
} }
return Tuple.Create(aliasRecord.Path, aliasRecord.Action.Area, routeValues, aliasRecord.Source, aliasRecord.Id); return Tuple.Create(aliasRecord.Path, aliasRecord.Action.Area, routeValues, aliasRecord.Source, aliasRecord.Id, aliasRecord.IsManaged);
} }
} }
} }

View File

@@ -34,7 +34,7 @@ namespace Orchard.Alias.Implementation.Updater {
// update the last processed id // update the last processed id
if (aliases.Any()) { if (aliases.Any()) {
_cursor.Cursor = aliases.Last().Item5; _cursor.Cursor = aliases.Last().Item5;
_aliasHolder.SetAliases(aliases.Select(alias => new AliasInfo { Path = alias.Item1, Area = alias.Item2, RouteValues = alias.Item3 })); _aliasHolder.SetAliases(aliases.Select(alias => new AliasInfo { Path = alias.Item1, Area = alias.Item2, RouteValues = alias.Item3, IsManaged = alias.Item6 }));
} }
} }
catch (Exception ex) { catch (Exception ex) {

View File

@@ -20,5 +20,14 @@ namespace Orchard.Alias {
return 1; return 1;
} }
public int UpdateFrom1()
{
SchemaBuilder.AlterTable("AliasRecord",
table => table
.AddColumn<bool>("IsManaged", column => column.WithDefault(false))
);
return 2;
}
} }
} }

View File

@@ -32,7 +32,7 @@ namespace Orchard.Roles.Recipes.Builders {
public override void Build(BuildContext context) { public override void Build(BuildContext context) {
//var aliases = _aliasRecordepository.Table.ToList(); //var aliases = _aliasRecordepository.Table.ToList();
var aliases = _aliasHolder.GetMaps().SelectMany(m => m.GetAliases()).ToList(); var aliases = _aliasHolder.GetMaps().SelectMany(m => m.GetAliases()).Where(m => m.IsManaged== false).ToList();
if (!aliases.Any()) if (!aliases.Any())
return; return;
@@ -57,13 +57,13 @@ namespace Orchard.Roles.Recipes.Builders {
} }
//add a collection of all the alias paths in this site so that the importing site can remove aliases that don't exist remotely //add a collection of all the alias paths in this site so that the importing site can remove aliases that don't exist remotely
var pathsElement = new XElement("Paths"); //var pathsElement = new XElement("Paths");
foreach (var aliasInfo in aliases) //foreach (var aliasInfo in aliases)
{ //{
pathsElement.Add(new XElement("Add", new XAttribute("Path", aliasInfo.Path))); // pathsElement.Add(new XElement("Add", new XAttribute("Path", aliasInfo.Path)));
} //}
root.Add(pathsElement); //root.Add(pathsElement);
//var rootElement = context.Document.Descendants("Orchard").FirstOrDefault(); //var rootElement = context.Document.Descendants("Orchard").FirstOrDefault();

View File

@@ -18,7 +18,7 @@ namespace Orchard.Alias.Recipes.Executors {
} }
public override string Name { public override string Name {
get { return "Alias"; } get { return "Aliases"; }
} }
public override void Execute(RecipeExecutionContext context) { public override void Execute(RecipeExecutionContext context) {
@@ -42,10 +42,10 @@ namespace Orchard.Alias.Recipes.Executors {
} }
} }
_aliasService.Set(aliasPath, rvd, "Custom"); //_aliasService.Set(aliasPath, rvd, "Custom",false);
try { try {
_aliasService.Set(aliasPath, rvd, "Custom"); _aliasService.Set(aliasPath, rvd, "Custom", false);
//var role = _roleService.GetRoleByName(roleName); //var role = _roleService.GetRoleByName(roleName);
//if (role == null) { //if (role == null) {
// _roleService.CreateRole(roleName); // _roleService.CreateRole(roleName);

View File

@@ -5,5 +5,6 @@
public virtual ActionRecord Action { get; set; } public virtual ActionRecord Action { get; set; }
public virtual string RouteValues { get; set; } public virtual string RouteValues { get; set; }
public virtual string Source { get; set; } public virtual string Source { get; set; }
public virtual bool IsManaged { get; set; }
} }
} }

View File

@@ -12,6 +12,7 @@ namespace Orchard.Alias.ViewModels {
public class AliasEntry { public class AliasEntry {
public AliasInfo Alias { get; set; } public AliasInfo Alias { get; set; }
public bool IsChecked { get; set; } public bool IsChecked { get; set; }
public bool IsManaged { get; set; }
} }
public class AdminIndexOptions { public class AdminIndexOptions {
public string Search { get; set; } public string Search { get; set; }

View File

@@ -96,7 +96,7 @@ namespace Orchard.Autoroute.Services {
public void PublishAlias(AutoroutePart part) { public void PublishAlias(AutoroutePart part) {
var displayRouteValues = _contentManager.GetItemMetadata(part).DisplayRouteValues; var displayRouteValues = _contentManager.GetItemMetadata(part).DisplayRouteValues;
_aliasService.Replace(part.DisplayAlias, displayRouteValues, AliasSource); _aliasService.Replace(part.DisplayAlias, displayRouteValues, AliasSource, true);
_routeEvents.Routed(part, part.DisplayAlias); _routeEvents.Routed(part, part.DisplayAlias);
} }

View File

@@ -37,18 +37,20 @@ namespace Orchard.Blogs.Routing {
return false; return false;
} }
IDictionary<string, string> routeValues; //IDictionary<string, string> routeValues;
if (!_aliasHolder.GetMap("Orchard.Blogs").TryGetAlias(path, out routeValues)) { AliasInfo aliasInfo;
if (!_aliasHolder.GetMap("Orchard.Blogs").TryGetAlias(path, out aliasInfo))
{
return false; return false;
} }
var isBlog = var isBlog =
//routeValues.ContainsKey("area") && //routeValues.ContainsKey("area") &&
//routeValues["area"] == "Orchard.Blogs" && //routeValues["area"] == "Orchard.Blogs" &&
routeValues.ContainsKey("controller") && aliasInfo.RouteValues.ContainsKey("controller") &&
routeValues["controller"] == "Blog" && aliasInfo.RouteValues["controller"] == "Blog" &&
routeValues.ContainsKey("action") && aliasInfo.RouteValues.ContainsKey("action") &&
routeValues["action"] == "Item" aliasInfo.RouteValues["action"] == "Item"
; ;
return isBlog; return isBlog;

View File

@@ -25,18 +25,21 @@ namespace Orchard.Blogs.Routing {
return false; return false;
} }
IDictionary<string, string> routeValues; //IDictionary<string, string> routeValues;
if (!_aliasHolder.GetMap("Orchard.Blogs").TryGetAlias(path, out routeValues)) { AliasInfo aliasInfo;
//if (!_aliasHolder.GetMap("Orchard.Blogs").TryGetAlias(path, out routeValues)) {
if (!_aliasHolder.GetMap("Orchard.Blogs").TryGetAlias(path, out aliasInfo))
{
return false; return false;
} }
var isBlog = var isBlog =
//routeValues.ContainsKey("area") && //routeValues.ContainsKey("area") &&
//routeValues["area"] == "Orchard.Blogs" && //routeValues["area"] == "Orchard.Blogs" &&
routeValues.ContainsKey("controller") && aliasInfo.RouteValues.ContainsKey("controller") &&
routeValues["controller"] == "Blog" && aliasInfo.RouteValues["controller"] == "Blog" &&
routeValues.ContainsKey("action") && aliasInfo.RouteValues.ContainsKey("action") &&
routeValues["action"] == "Item" aliasInfo.RouteValues["action"] == "Item"
; ;
return isBlog; return isBlog;