Repository navigation
Expand file tree
/
Copy pathResourceVirtualDirectory.cs
More file actions
151 lines (123 loc) · 5.41 KB
/
Copy pathResourceVirtualDirectory.cs
File metadata and controls
151 lines (123 loc) · 5.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using ServiceStack.Common.Extensions;
using ServiceStack.IO;
using ServiceStack.VirtualPath;
using ServiceStack.Text;
namespace ServiceStack.Plugins.Embedded.VirtualPath
{
public class ResourceVirtualDirectory : AbstractVirtualDirectoryBase
{
protected Assembly backingAssembly;
protected List<ResourceVirtualDirectory> SubDirectories;
protected List<ResourceVirtualFile> SubFiles;
public override IEnumerable<IVirtualFile> Files { get { return SubFiles.Cast<IVirtualFile>(); } }
public override IEnumerable<IVirtualDirectory> Directories
{
get
{
return SubDirectories.Cast<IVirtualDirectory>();
}
}
public override string Name { get { return DirectoryName; } }
public string DirectoryName { get; set; }
public override DateTime LastModified
{
get { return GetLastWriteTimeOfBackingAsm(); }
}
internal Assembly BackingAssembly { get { return backingAssembly; } }
public ResourceVirtualDirectory(IVirtualPathProvider owningProvider, IVirtualDirectory parentDir, Assembly backingAsm)
: this(owningProvider, parentDir, backingAsm, backingAsm.GetName().Name, backingAsm.GetManifestResourceNames()) { }
public ResourceVirtualDirectory(IVirtualPathProvider owningProvider, IVirtualDirectory parentDir, Assembly backingAsm, String directoryName, IEnumerable<String> manifestResourceNames)
: base(owningProvider, parentDir)
{
if (backingAsm == null)
throw new ArgumentNullException("backingAsm");
if (string.IsNullOrEmpty(directoryName))
throw new ArgumentException("directoryName");
this.backingAssembly = backingAsm;
this.DirectoryName = directoryName;
InitializeDirectoryStructure(manifestResourceNames);
}
protected void InitializeDirectoryStructure(IEnumerable<String> manifestResourceNames)
{
SubDirectories = new List<ResourceVirtualDirectory>();
SubFiles = new List<ResourceVirtualFile>();
var rootNamespace = backingAssembly.GetName().Name;
var resourceNames = manifestResourceNames
.ConvertAll(n => n.Replace(rootNamespace, "").TrimStart('.'));
SubFiles.AddRange(resourceNames
.Where(n => n.Count(c => c == '.') <= 1)
.Select(CreateVirtualFile)
.OrderBy(f => f.Name));
SubDirectories.AddRange(resourceNames
.Where(n => n.Count(c => c == '.') > 1)
.GroupByFirstToken(pathSeparator: '.')
.Select(CreateVirtualDirectory)
.OrderBy(d => d.Name));
}
private DateTime GetLastWriteTimeOfBackingAsm()
{
var fInfo = new FileInfo(BackingAssembly.Location);
return fInfo.LastWriteTime;
}
protected virtual ResourceVirtualDirectory CreateVirtualDirectory(IGrouping<string, string[]> subResources)
{
var remainingResourceNames = subResources.Select(g => g[1]);
var subDir = new ResourceVirtualDirectory(
VirtualPathProvider, this, backingAssembly, subResources.Key, remainingResourceNames);
return subDir;
}
protected virtual ResourceVirtualFile CreateVirtualFile(String resourceName)
{
#if NET_40
Contract.Requires(!String.IsNullOrEmpty(resourceName));
#endif
try
{
var fullResourceName = String.Concat(RealPath, VirtualPathProvider.RealPathSeparator, resourceName);
var mrInfo = backingAssembly.GetManifestResourceInfo(fullResourceName);
if (mrInfo == null)
throw new FileNotFoundException("Virtual file not found", fullResourceName);
return new ResourceVirtualFile(VirtualPathProvider, this, resourceName);
}
catch (Exception ex)
{
ex.Message.Print();
throw;
}
}
protected virtual ResourceVirtualDirectory ConsumeTokensForVirtualDir(Stack<string> resourceTokens)
{
#if NET_40
Contract.Requires(resourceTokens.Count > 1);
#endif
var subDirName = resourceTokens.Pop();
throw new NotImplementedException();
}
public override IEnumerator<IVirtualNode> GetEnumerator()
{
return Directories.Cast<IVirtualNode>().Union<IVirtualNode>(Files.Cast<IVirtualNode>()).GetEnumerator();
}
protected override IVirtualFile GetFileFromBackingDirectoryOrDefault(string fileName)
{
return Files.FirstOrDefault(f => f.Name == fileName);
}
protected override IEnumerable<IVirtualFile> GetMatchingFilesInDir(String globPattern)
{
return Files.Where(f => f.Name.Glob(globPattern));
}
protected override IVirtualDirectory GetDirectoryFromBackingDirectoryOrDefault(string directoryName)
{
return Directories.FirstOrDefault(d => d.Name == directoryName);
}
protected override string GetRealPathToRoot()
{
var path = base.GetRealPathToRoot();
return path.TrimStart('.');
}
}
}