Rename "Future.Modules.Packaging" to "Orchard.Packaging"

--HG--
branch : dev
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/AdminMenu.cs => src/Orchard.Web/Modules/Orchard.Packaging/AdminMenu.cs
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Commands/PackagingCommands.cs => src/Orchard.Web/Modules/Orchard.Packaging/Commands/GalleryCommands.cs
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Commands/PackagingCommands.cs => src/Orchard.Web/Modules/Orchard.Packaging/Commands/PackagingCommands.cs
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Controllers/DownloadStreamResult.cs => src/Orchard.Web/Modules/Orchard.Packaging/Controllers/DownloadStreamResult.cs
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Controllers/PackagingController.cs => src/Orchard.Web/Modules/Orchard.Packaging/Controllers/PackagingController.cs
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Module.txt => src/Orchard.Web/Modules/Orchard.Packaging/Module.txt
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Futures.Modules.Packaging.csproj => src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Properties/AssemblyInfo.cs => src/Orchard.Web/Modules/Orchard.Packaging/Properties/AssemblyInfo.cs
rename : src/Orchard/Packaging/AtomExtensions.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/AtomExtensions.cs
rename : src/Orchard/Packaging/IPackageBuilder.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageBuilder.cs
rename : src/Orchard/Packaging/IPackageExpander.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageExpander.cs
rename : src/Orchard/Packaging/IPackageManager.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackageManager.cs
rename : src/Orchard/Packaging/IPackagingSourceManager.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/IPackagingSourceManager.cs
rename : src/Orchard/Packaging/PackageBuilder.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageBuilder.cs
rename : src/Orchard/Packaging/PackageData.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageData.cs
rename : src/Orchard/Packaging/PackageExpander.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageExpander.cs
rename : src/Orchard/Packaging/PackageManager.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackageManager.cs
rename : src/Orchard/Packaging/PackagingEntry.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackagingEntry.cs
rename : src/Orchard/Packaging/PackagingSource.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackagingSource.cs
rename : src/Orchard/Packaging/PackagingSourceManager.cs => src/Orchard.Web/Modules/Orchard.Packaging/Services/PackagingSourceManager.cs
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/ViewModels/PackagingHarvestViewModel.cs => src/Orchard.Web/Modules/Orchard.Packaging/ViewModels/PackagingHarvestViewModel.cs
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/ViewModels/PackagingModulesViewModel.cs => src/Orchard.Web/Modules/Orchard.Packaging/ViewModels/PackagingModulesViewModel.cs
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/ViewModels/PackagingSourcesViewModel.cs => src/Orchard.Web/Modules/Orchard.Packaging/ViewModels/PackagingSourcesViewModel.cs
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Views/Packaging/Harvest.ascx => src/Orchard.Web/Modules/Orchard.Packaging/Views/Packaging/Harvest.ascx
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Views/Packaging/Modules.ascx => src/Orchard.Web/Modules/Orchard.Packaging/Views/Packaging/Modules.ascx
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Views/Packaging/Sources.ascx => src/Orchard.Web/Modules/Orchard.Packaging/Views/Packaging/Sources.ascx
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Views/Packaging/_Subnav.ascx => src/Orchard.Web/Modules/Orchard.Packaging/Views/Packaging/_Subnav.ascx
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Views/Web.config => src/Orchard.Web/Modules/Orchard.Packaging/Views/Web.config
rename : src/Orchard.Web/Modules/Futures.Modules.Packaging/Web.config => src/Orchard.Web/Modules/Orchard.Packaging/Web.config
This commit is contained in:
Renaud Paquay
2010-07-22 22:09:34 -07:00
parent d83f3d1520
commit b46a2944ae
36 changed files with 260 additions and 203 deletions

View File

@@ -1,11 +0,0 @@
name: Futures.Modules.Packaging
antiforgery: enabled
author: The Orchard Team
website: http://orchardproject.net
version: 0.5.0
orchardversion: 0.5.0
description: The packaging module enables packaging modules using the OPC format.
features:
Futures.Modules.Packaging:
Description: Standard module and feature management.
Category: Developer

View File

@@ -6,6 +6,7 @@ using Orchard.Localization;
using Orchard.Modules.ViewModels;
using Orchard.Mvc.Results;
using Orchard.Packaging;
using Orchard.Packaging.Services;
using Orchard.Reports.Services;
using Orchard.UI.Notify;

View File

@@ -8,4 +8,5 @@ description: The Modules module enables the administrator of the site to manage
features:
Orchard.Modules:
Description: Standard module and feature management.
Dependencies: PackagingServices
Category: Core

View File

@@ -66,7 +66,6 @@
</ItemGroup>
<ItemGroup>
<Compile Include="AdminMenu.cs" />
<Compile Include="Commands\PackagingCommands.cs" />
<Compile Include="Commands\FeatureCommands.cs" />
<Compile Include="Controllers\AdminController.cs" />
<Compile Include="Extensions\StringExtensions.cs" />
@@ -90,6 +89,10 @@
<Project>{2D1D92BB-4555-4CBE-8D0E-63563D6CE4C6}</Project>
<Name>Orchard.Framework</Name>
</ProjectReference>
<ProjectReference Include="..\Orchard.Packaging\Orchard.Packaging.csproj">
<Project>{DFD137A2-DDB5-4D22-BE0D-FA9AD4C8B059}</Project>
<Name>Orchard.Packaging</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="Content\Admin\images\disabled.gif" />

View File

@@ -1,7 +1,9 @@
using Orchard.Localization;
using Orchard.Environment.Extensions;
using Orchard.Localization;
using Orchard.UI.Navigation;
namespace Futures.Modules.Packaging {
namespace Orchard.Packaging {
[OrchardFeature("Gallery")]
public class AdminMenu : INavigationProvider {
public Localizer T { get; set; }
@@ -9,8 +11,8 @@ namespace Futures.Modules.Packaging {
public void GetNavigation(NavigationBuilder builder) {
builder.Add(T("Site Configuration"), "11", menu => menu
.Add(T("Module Packaging"), "5.0", item => item
.Action("Index", "Packaging", new { area = "Futures.Modules.Packaging" })));
.Add(T("Gallery"), "5.0", item => item
.Action("Index", "Packaging", new { area = "Orchard.Packaging" })));
}
}
}

View File

@@ -2,13 +2,13 @@ using System;
using System.IO;
using System.Net;
using Orchard.Commands;
using Orchard.Packaging;
using Orchard.Packaging.Services;
namespace Futures.Modules.Packaging.Commands {
public class PackagingCommands : DefaultOrchardCommandHandler {
namespace Orchard.Packaging.Commands {
public class GalleryCommands : DefaultOrchardCommandHandler {
private readonly IPackageManager _packageManager;
public PackagingCommands(IPackageManager packageManager) {
public GalleryCommands(IPackageManager packageManager) {
_packageManager = packageManager;
}

View File

@@ -1,17 +1,14 @@
using System.IO;
using Orchard.Commands;
using Orchard.Packaging;
using Orchard.UI.Notify;
using Orchard.Environment.Extensions;
using Orchard.Packaging.Services;
namespace Orchard.Modules.Commands {
namespace Orchard.Packaging.Commands {
[OrchardFeature("Packaging")]
public class PackagingCommands : DefaultOrchardCommandHandler {
private readonly IModuleService _moduleService;
private readonly INotifier _notifier;
private readonly IPackageManager _packageManager;
public PackagingCommands(IModuleService moduleService, INotifier notifier, IPackageManager packageManager) {
_moduleService = moduleService;
_notifier = notifier;
public PackagingCommands(IPackageManager packageManager) {
_packageManager = packageManager;
}

View File

@@ -1,7 +1,7 @@
using System.IO;
using System.Web.Mvc;
namespace Futures.Modules.Packaging.Controllers {
namespace Orchard.Packaging.Controllers {
public class DownloadStreamResult : ActionResult {
public string FileName { get; set; }
public string ContentType { get; set; }

View File

@@ -1,15 +1,16 @@
using System;
using System.Linq;
using System.Web.Mvc;
using Futures.Modules.Packaging.ViewModels;
using Orchard.Environment.Extensions;
using Orchard.Localization;
using Orchard.Packaging;
using Orchard.Packaging.Services;
using Orchard.Packaging.ViewModels;
using Orchard.Themes;
using Orchard.UI.Admin;
using Orchard.UI.Notify;
namespace Futures.Modules.Packaging.Controllers {
namespace Orchard.Packaging.Controllers {
[OrchardFeature("Gallery")]
[Themed, Admin]
public class PackagingController : Controller {
private readonly IPackageManager _packageManager;

View File

@@ -0,0 +1,19 @@
name: Packaging
antiforgery: enabled
author: The Orchard Team
website: http://orchardproject.net
version: 0.5.0
orchardversion: 0.5.0
description: The packaging module enables packaging modules using the OPC format.
features:
PackagingServices:
Description: Core services for packaging using the OPC format.
Category: Core
Orchard.Packaging:
Description: Commands for creating/installing local modules.
Dependencies: PackagingServices
Category: Packaging
Gallery:
Description: Module gallery management.
Dependencies: PackagingServices
Category: Packaging

View File

@@ -10,8 +10,8 @@
<ProjectTypeGuids>{F85E285D-A4E0-4152-9332-AB1D724D3325};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Futures.Modules.Packaging</RootNamespace>
<AssemblyName>Futures.Modules.Packaging</AssemblyName>
<RootNamespace>Orchard.Packaging</RootNamespace>
<AssemblyName>Orchard.Packaging</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<MvcBuildViews>false</MvcBuildViews>
</PropertyGroup>
@@ -37,6 +37,7 @@
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.Web.DynamicData" />
<Reference Include="System.Web.Entity" />
<Reference Include="System.Web.ApplicationServices" />
@@ -63,12 +64,26 @@
<Reference Include="System.Configuration" />
<Reference Include="System.Web.Services" />
<Reference Include="System.EnterpriseServices" />
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="AdminMenu.cs" />
<Compile Include="Commands\GalleryCommands.cs" />
<Compile Include="Commands\PackagingCommands.cs" />
<Compile Include="Controllers\DownloadStreamResult.cs" />
<Compile Include="Controllers\PackagingController.cs" />
<Compile Include="Services\AtomExtensions.cs" />
<Compile Include="Services\IPackageBuilder.cs" />
<Compile Include="Services\IPackageExpander.cs" />
<Compile Include="Services\IPackageManager.cs" />
<Compile Include="Services\IPackagingSourceManager.cs" />
<Compile Include="Services\PackageBuilder.cs" />
<Compile Include="Services\PackageData.cs" />
<Compile Include="Services\PackageExpander.cs" />
<Compile Include="Services\PackageManager.cs" />
<Compile Include="Services\PackagingEntry.cs" />
<Compile Include="Services\PackagingSource.cs" />
<Compile Include="Services\PackagingSourceManager.cs" />
<Compile Include="ViewModels\PackagingHarvestViewModel.cs" />
<Compile Include="ViewModels\PackagingModulesViewModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />

View File

@@ -5,11 +5,11 @@ using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Futures.Modules.Packaging")]
[assembly: AssemblyTitle("Orchard.Packaging")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Futures.Modules.Packaging")]
[assembly: AssemblyProduct("Orchard")]
[assembly: AssemblyCopyright("Copyright © CodePlex Foundation 2009")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

View File

@@ -1,9 +1,11 @@
using System.Xml.Linq;
using Orchard.Environment.Extensions;
namespace Orchard.Packaging {
static class AtomExtensions {
namespace Orchard.Packaging.Services {
[OrchardFeature("PackagingServices")]
internal static class AtomExtensions {
public static string Atom(this XElement entry, string localName) {
var element = entry.Element(AtomXName(localName));
XElement element = entry.Element(AtomXName(localName));
return element != null ? element.Value : null;
}

View File

@@ -1,7 +1,8 @@
using System.IO;
using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Models;
namespace Orchard.Packaging {
namespace Orchard.Packaging.Services {
public interface IPackageBuilder : IDependency {
Stream BuildPackage(ExtensionDescriptor extensionDescriptor);
}

View File

@@ -1,7 +1,7 @@
using System;
using System.IO;
using Orchard.Environment.Extensions;
namespace Orchard.Packaging {
namespace Orchard.Packaging.Services {
public class PackageInfo {
public string ExtensionName { get; set; }
public string ExtensionVersion { get; set; }

View File

@@ -1,6 +1,6 @@
using System.IO;
namespace Orchard.Packaging {
namespace Orchard.Packaging.Services {
public interface IPackageManager : IDependency {
PackageData Harvest(string extensionName);
PackageData Download(string feedItemId);

View File

@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
namespace Orchard.Packaging {
namespace Orchard.Packaging.Services {
public interface IPackagingSourceManager : IDependency {
IEnumerable<PackagingSource> GetSources();
void AddSource(PackagingSource source);

View File

@@ -1,4 +1,5 @@
using System;
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Packaging;
using System.Linq;
@@ -9,7 +10,8 @@ using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Models;
using Orchard.FileSystems.WebSite;
namespace Orchard.Packaging {
namespace Orchard.Packaging.Services {
[OrchardFeature("PackagingServices")]
public class PackageBuilder : IPackageBuilder {
private readonly IExtensionManager _extensionManager;
private readonly IWebSiteFolder _webSiteFolder;
@@ -19,16 +21,7 @@ namespace Orchard.Packaging {
_webSiteFolder = webSiteFolder;
}
class CreateContext {
public Stream Stream { get; set; }
public Package Package { get; set; }
public IWebSiteFolder SourceFolder { get; set; }
public string SourcePath { get; set; }
public string TargetPath { get; set; }
public XDocument Project { get; set; }
}
#region IPackageBuilder Members
public Stream BuildPackage(ExtensionDescriptor extensionDescriptor) {
var context = new CreateContext();
@@ -37,7 +30,7 @@ namespace Orchard.Packaging {
EstablishPaths(context, _webSiteFolder, extensionDescriptor.Location, extensionDescriptor.Name);
SetCoreProperties(context, extensionDescriptor);
var projectFile = extensionDescriptor.Name + ".csproj";
string projectFile = extensionDescriptor.Name + ".csproj";
if (LoadProject(context, projectFile)) {
EmbedVirtualFile(context, projectFile, MediaTypeNames.Text.Xml);
EmbedProjectFiles(context, "Compile", "Content", "None", "EmbeddedResource");
@@ -48,14 +41,17 @@ namespace Orchard.Packaging {
EndPackage(context);
}
if (context.Stream.CanSeek)
if (context.Stream.CanSeek) {
context.Stream.Seek(0, SeekOrigin.Begin);
}
return context.Stream;
}
#endregion
private void SetCoreProperties(CreateContext context, ExtensionDescriptor extensionDescriptor) {
var properties = context.Package.PackageProperties;
PackageProperties properties = context.Package.PackageProperties;
properties.Title = extensionDescriptor.DisplayName ?? extensionDescriptor.Name;
//properties.Subject = "";
properties.Creator = extensionDescriptor.Author;
@@ -76,16 +72,16 @@ namespace Orchard.Packaging {
private void EmbedProjectFiles(CreateContext context, params string[] itemGroupTypes) {
var itemGroups = context.Project
IEnumerable<XElement> itemGroups = context.Project
.Elements(Ns("Project"))
.Elements(Ns("ItemGroup"));
foreach (var itemGroupType in itemGroupTypes) {
var includePaths = itemGroups
foreach (string itemGroupType in itemGroupTypes) {
IEnumerable<string> includePaths = itemGroups
.Elements(Ns(itemGroupType))
.Attributes("Include")
.Select(x => x.Value);
foreach (var includePath in includePaths) {
foreach (string includePath in includePaths) {
EmbedVirtualFile(context, includePath, MediaTypeNames.Application.Octet);
}
}
@@ -104,14 +100,13 @@ namespace Orchard.Packaging {
foreach (var entry in entries) {
var assemblyName = new AssemblyName(entry.Include.Value);
var hintPath = entry.HintPath != null ? entry.HintPath.Value : null;
string hintPath = entry.HintPath != null ? entry.HintPath.Value : null;
var virtualPath = "bin/" + assemblyName.Name + ".dll";
string virtualPath = "bin/" + assemblyName.Name + ".dll";
if (context.SourceFolder.FileExists(context.SourcePath + virtualPath)) {
EmbedVirtualFile(context, virtualPath, MediaTypeNames.Application.Octet);
}
else if (hintPath != null) {
}
else if (hintPath != null) {}
}
}
@@ -120,19 +115,19 @@ namespace Orchard.Packaging {
}
static void BeginPackage(CreateContext context) {
private static void BeginPackage(CreateContext context) {
context.Stream = new MemoryStream();
context.Package = Package.Open(context.Stream, FileMode.Create, FileAccess.ReadWrite);
}
static void EstablishPaths(CreateContext context, IWebSiteFolder webSiteFolder, string locationPath, string moduleName) {
private static void EstablishPaths(CreateContext context, IWebSiteFolder webSiteFolder, string locationPath, string moduleName) {
context.SourceFolder = webSiteFolder;
context.SourcePath = "~/Modules/" + moduleName + "/";
context.TargetPath = "\\" + moduleName + "\\";
}
static bool LoadProject(CreateContext context, string relativePath) {
var virtualPath = context.SourcePath + relativePath;
private static bool LoadProject(CreateContext context, string relativePath) {
string virtualPath = context.SourcePath + relativePath;
if (context.SourceFolder.FileExists(virtualPath)) {
context.Project = XDocument.Parse(context.SourceFolder.ReadFile(context.SourcePath + relativePath));
return true;
@@ -140,17 +135,32 @@ namespace Orchard.Packaging {
return false;
}
static Uri EmbedVirtualFile(CreateContext context, string relativePath, string contentType) {
var partUri = PackUriHelper.CreatePartUri(new Uri(context.TargetPath + relativePath, UriKind.Relative));
var packagePart = context.Package.CreatePart(partUri, contentType);
using (var stream = packagePart.GetStream(FileMode.Create, FileAccess.Write)) {
context.SourceFolder.CopyFileTo(context.SourcePath + relativePath, stream, true/*actualContent*/);
private static Uri EmbedVirtualFile(CreateContext context, string relativePath, string contentType) {
Uri partUri = PackUriHelper.CreatePartUri(new Uri(context.TargetPath + relativePath, UriKind.Relative));
PackagePart packagePart = context.Package.CreatePart(partUri, contentType);
using (Stream stream = packagePart.GetStream(FileMode.Create, FileAccess.Write)) {
context.SourceFolder.CopyFileTo(context.SourcePath + relativePath, stream, true /*actualContent*/);
}
return partUri;
}
static void EndPackage(CreateContext context) {
private static void EndPackage(CreateContext context) {
context.Package.Close();
}
#region Nested type: CreateContext
private class CreateContext {
public Stream Stream { get; set; }
public Package Package { get; set; }
public IWebSiteFolder SourceFolder { get; set; }
public string SourcePath { get; set; }
public string TargetPath { get; set; }
public XDocument Project { get; set; }
}
#endregion
}
}
}

View File

@@ -1,6 +1,6 @@
using System.IO;
namespace Orchard.Packaging {
namespace Orchard.Packaging.Services {
public class PackageData {
public string ExtensionName { get; set; }
public string ExtensionVersion { get; set; }

View File

@@ -1,13 +1,16 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Packaging;
using System.Linq;
using System.Reflection;
using System.Xml.Linq;
using Orchard.Environment.Extensions;
using Orchard.FileSystems.VirtualPath;
using Orchard.Localization;
namespace Orchard.Packaging {
namespace Orchard.Packaging.Services {
[OrchardFeature("PackagingServices")]
public class PackageExpander : IPackageExpander {
private const string ContentTypePrefix = "Orchard ";
private readonly IVirtualPathProvider _virtualPathProvider;
@@ -20,20 +23,7 @@ namespace Orchard.Packaging {
public Localizer T { get; set; }
class ExpandContext {
public Stream Stream { get; set; }
public Package Package { get; set; }
public string ExtensionName { get; set; }
public string ExtensionVersion { get; set; }
public string ExtensionType { get; set; }
public string TargetPath { get; set; }
public string SourcePath { get; set; }
public XDocument Project { get; set; }
}
#region IPackageExpander Members
public PackageInfo ExpandPackage(Stream packageStream) {
var context = new ExpandContext();
@@ -42,7 +32,7 @@ namespace Orchard.Packaging {
GetCoreProperties(context);
EstablishPaths(context, _virtualPathProvider);
var projectFile = context.ExtensionName + ".csproj";
string projectFile = context.ExtensionName + ".csproj";
if (LoadProject(context, projectFile)) {
ExtractFile(context, projectFile);
ExtractProjectFiles(context, "Compile", "Content", "None", "EmbeddedResource");
@@ -61,32 +51,35 @@ namespace Orchard.Packaging {
};
}
private void ExtractFile(ExpandContext context, string relativePath) {
var partUri = PackUriHelper.CreatePartUri(new Uri(context.SourcePath + relativePath, UriKind.Relative));
var packagePart = context.Package.GetPart(partUri);
using (var packageStream = packagePart.GetStream(FileMode.Open, FileAccess.Read)) {
var filePath = _virtualPathProvider.Combine(context.TargetPath, relativePath);
var folderPath = _virtualPathProvider.GetDirectoryName(filePath);
if (!_virtualPathProvider.DirectoryExists(folderPath))
_virtualPathProvider.CreateDirectory(folderPath);
#endregion
using (var fileStream = _virtualPathProvider.CreateFile(filePath)) {
private void ExtractFile(ExpandContext context, string relativePath) {
Uri partUri = PackUriHelper.CreatePartUri(new Uri(context.SourcePath + relativePath, UriKind.Relative));
PackagePart packagePart = context.Package.GetPart(partUri);
using (Stream packageStream = packagePart.GetStream(FileMode.Open, FileAccess.Read)) {
string filePath = _virtualPathProvider.Combine(context.TargetPath, relativePath);
string folderPath = _virtualPathProvider.GetDirectoryName(filePath);
if (!_virtualPathProvider.DirectoryExists(folderPath)) {
_virtualPathProvider.CreateDirectory(folderPath);
}
using (Stream fileStream = _virtualPathProvider.CreateFile(filePath)) {
packageStream.CopyTo(fileStream);
}
}
}
private void ExtractProjectFiles(ExpandContext context, params string[] itemGroupTypes) {
var itemGroups = context.Project
IEnumerable<XElement> itemGroups = context.Project
.Elements(Ns("Project"))
.Elements(Ns("ItemGroup"));
foreach (var itemGroupType in itemGroupTypes) {
var includePaths = itemGroups
foreach (string itemGroupType in itemGroupTypes) {
IEnumerable<string> includePaths = itemGroups
.Elements(Ns(itemGroupType))
.Attributes("Include")
.Select(x => x.Value);
foreach (var includePath in includePaths) {
foreach (string includePath in includePaths) {
ExtractFile(context, includePath);
}
}
@@ -105,19 +98,18 @@ namespace Orchard.Packaging {
foreach (var entry in entries) {
var assemblyName = new AssemblyName(entry.Include.Value);
var hintPath = entry.HintPath != null ? entry.HintPath.Value : null;
string hintPath = entry.HintPath != null ? entry.HintPath.Value : null;
var virtualPath = "bin/" + assemblyName.Name + ".dll";
string virtualPath = "bin/" + assemblyName.Name + ".dll";
if (PartExists(context, virtualPath)) {
ExtractFile(context, virtualPath);
}
else if (hintPath != null) {
}
else if (hintPath != null) {}
}
}
private bool PartExists(ExpandContext context, string relativePath) {
var projectUri = PackUriHelper.CreatePartUri(new Uri(context.SourcePath + relativePath, UriKind.Relative));
Uri projectUri = PackUriHelper.CreatePartUri(new Uri(context.SourcePath + relativePath, UriKind.Relative));
return context.Package.PartExists(projectUri);
}
@@ -125,12 +117,14 @@ namespace Orchard.Packaging {
private XName Ns(string localName) {
return XName.Get(localName, "http://schemas.microsoft.com/developer/msbuild/2003");
}
private static bool LoadProject(ExpandContext context, string relativePath) {
var projectUri = PackUriHelper.CreatePartUri(new Uri(context.SourcePath + relativePath, UriKind.Relative));
if (!context.Package.PartExists(projectUri))
Uri projectUri = PackUriHelper.CreatePartUri(new Uri(context.SourcePath + relativePath, UriKind.Relative));
if (!context.Package.PartExists(projectUri)) {
return false;
var part = context.Package.GetPart(projectUri);
using (var stream = part.GetStream(FileMode.Open, FileAccess.Read)) {
}
PackagePart part = context.Package.GetPart(projectUri);
using (Stream stream = part.GetStream(FileMode.Open, FileAccess.Read)) {
context.Project = XDocument.Load(stream);
}
return true;
@@ -155,9 +149,10 @@ namespace Orchard.Packaging {
context.ExtensionName = context.Package.PackageProperties.Identifier;
context.ExtensionVersion = context.Package.PackageProperties.Version;
var contentType = context.Package.PackageProperties.ContentType;
if (contentType.StartsWith(ContentTypePrefix))
string contentType = context.Package.PackageProperties.ContentType;
if (contentType.StartsWith(ContentTypePrefix)) {
context.ExtensionType = contentType.Substring(ContentTypePrefix.Length);
}
}
private void EstablishPaths(ExpandContext context, IVirtualPathProvider virtualPathProvider) {
@@ -173,5 +168,24 @@ namespace Orchard.Packaging {
throw new OrchardCoreException(T("Unknown extension type \"{0}\"", context.ExtensionType));
}
}
#region Nested type: ExpandContext
private class ExpandContext {
public Stream Stream { get; set; }
public Package Package { get; set; }
public string ExtensionName { get; set; }
public string ExtensionVersion { get; set; }
public string ExtensionType { get; set; }
public string TargetPath { get; set; }
public string SourcePath { get; set; }
public XDocument Project { get; set; }
}
#endregion
}
}

View File

@@ -3,13 +3,15 @@ using System.IO.Packaging;
using System.Linq;
using System.Net;
using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Models;
namespace Orchard.Packaging {
namespace Orchard.Packaging.Services {
[OrchardFeature("PackagingServices")]
public class PackageManager : IPackageManager {
private readonly IExtensionManager _extensionManager;
private readonly IPackagingSourceManager _packagingSourceManager;
private readonly IPackageBuilder _packageBuilder;
private readonly IPackageExpander _packageExpander;
private readonly IPackagingSourceManager _packagingSourceManager;
public PackageManager(
IExtensionManager extensionManager,
@@ -22,10 +24,13 @@ namespace Orchard.Packaging {
_packageExpander = packageExpander;
}
#region IPackageManager Members
public PackageData Harvest(string extensionName) {
var extensionDescriptor = _extensionManager.AvailableExtensions().FirstOrDefault(x => x.Name == extensionName);
if (extensionDescriptor == null)
ExtensionDescriptor extensionDescriptor = _extensionManager.AvailableExtensions().FirstOrDefault(x => x.Name == extensionName);
if (extensionDescriptor == null) {
return null;
}
return new PackageData {
ExtensionName = extensionDescriptor.Name,
ExtensionVersion = extensionDescriptor.Version,
@@ -34,11 +39,10 @@ namespace Orchard.Packaging {
}
public void Push(PackageData packageData, string feedUrl) {
var request = WebRequest.Create(feedUrl);
WebRequest request = WebRequest.Create(feedUrl);
request.Method = "POST";
request.ContentType = "application/x-package";
using (var requestStream = request.GetRequestStream()) {
using (Stream requestStream = request.GetRequestStream()) {
packageData.PackageStream.Seek(0, SeekOrigin.Begin);
packageData.PackageStream.CopyTo(requestStream);
}
@@ -49,13 +53,13 @@ namespace Orchard.Packaging {
}
public PackageData Download(string feedItemId) {
var entry = _packagingSourceManager.GetModuleList().Single(x => x.SyndicationItem.Id == feedItemId);
var request = WebRequest.Create(entry.PackageStreamUri);
using (var response = request.GetResponse()) {
using (var responseStream = response.GetResponseStream()) {
PackagingEntry entry = _packagingSourceManager.GetModuleList().Single(x => x.SyndicationItem.Id == feedItemId);
WebRequest request = WebRequest.Create(entry.PackageStreamUri);
using (WebResponse response = request.GetResponse()) {
using (Stream responseStream = response.GetResponseStream()) {
var stream = new MemoryStream();
responseStream.CopyTo(stream);
var package = Package.Open(stream);
Package package = Package.Open(stream);
try {
return new PackageData {
ExtensionName = package.PackageProperties.Identifier,
@@ -73,5 +77,7 @@ namespace Orchard.Packaging {
public PackageInfo Install(Stream packageStream) {
return _packageExpander.ExpandPackage(packageStream);
}
#endregion
}
}
}

View File

@@ -1,6 +1,6 @@
using System.ServiceModel.Syndication;
namespace Orchard.Packaging {
namespace Orchard.Packaging.Services {
public class PackagingEntry {
public PackagingSource Source { get; set; }
public SyndicationFeed SyndicationFeed { get; set; }

View File

@@ -1,6 +1,6 @@
using System;
namespace Orchard.Packaging {
namespace Orchard.Packaging.Services {
public class PackagingSource {
public Guid Id { get; set; }
public string FeedUrl { get; set; }

View File

@@ -6,43 +6,34 @@ using System.ServiceModel.Syndication;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
using Orchard.Environment.Extensions;
using Orchard.FileSystems.AppData;
namespace Orchard.Packaging {
namespace Orchard.Packaging.Services {
[OrchardFeature("PackagingServices")]
public class PackagingSourceManager : IPackagingSourceManager {
private static readonly XmlSerializer _sourceSerializer = new XmlSerializer(typeof (List<PackagingSource>), new XmlRootAttribute("Sources"));
private readonly IAppDataFolder _appDataFolder;
private static readonly XmlSerializer _sourceSerializer = new XmlSerializer(typeof(List<PackagingSource>), new XmlRootAttribute("Sources"));
public PackagingSourceManager(IAppDataFolder appDataFolder) {
_appDataFolder = appDataFolder;
}
static string GetSourcesPath() {
return ".Packaging/Sources.xml";
}
static string GetFeedCachePath(PackagingSource source) {
return ".Packaging/Feed." + source.Id.ToString("n") + ".xml";
}
#region IPackagingSourceManager Members
public IEnumerable<PackagingSource> GetSources() {
var text = _appDataFolder.ReadFile(GetSourcesPath());
if (string.IsNullOrEmpty(text))
string text = _appDataFolder.ReadFile(GetSourcesPath());
if (string.IsNullOrEmpty(text)) {
return Enumerable.Empty<PackagingSource>();
}
var textReader = new StringReader(_appDataFolder.ReadFile(GetSourcesPath()));
return (IEnumerable<PackagingSource>)_sourceSerializer.Deserialize(textReader);
}
void SaveSources(IEnumerable<PackagingSource> sources) {
var textWriter = new StringWriter();
_sourceSerializer.Serialize(textWriter, sources.ToList());
_appDataFolder.CreateFile(GetSourcesPath(), textWriter.ToString());
return (IEnumerable<PackagingSource>) _sourceSerializer.Deserialize(textReader);
}
public void AddSource(PackagingSource source) {
UpdateSource(source);
SaveSources(GetSources().Concat(new[] { source }));
SaveSources(GetSources().Concat(new[] {source}));
}
public void RemoveSource(Guid id) {
@@ -50,25 +41,62 @@ namespace Orchard.Packaging {
}
public void UpdateLists() {
foreach (var source in GetSources()) {
foreach (PackagingSource source in GetSources()) {
UpdateSource(source);
}
}
public IEnumerable<PackagingEntry> GetModuleList() {
IEnumerable<PackagingEntry> packageInfos = GetSources()
.SelectMany(
source =>
Bind(ParseFeed(_appDataFolder.ReadFile(GetFeedCachePath(source))),
feed =>
feed.Items.SelectMany(
item =>
Unit(new PackagingEntry {
Source = source,
SyndicationFeed = feed,
SyndicationItem = item,
PackageStreamUri = item.Links.Single().GetAbsoluteUri().AbsoluteUri,
}))));
return packageInfos.ToArray();
}
#endregion
private static string GetSourcesPath() {
return ".Packaging/Sources.xml";
}
private static string GetFeedCachePath(PackagingSource source) {
return ".Packaging/Feed." + source.Id.ToString("n") + ".xml";
}
private void SaveSources(IEnumerable<PackagingSource> sources) {
var textWriter = new StringWriter();
_sourceSerializer.Serialize(textWriter, sources.ToList());
_appDataFolder.CreateFile(GetSourcesPath(), textWriter.ToString());
}
private void UpdateSource(PackagingSource source) {
var feed = XDocument.Load(source.FeedUrl, LoadOptions.PreserveWhitespace);
XDocument feed = XDocument.Load(source.FeedUrl, LoadOptions.PreserveWhitespace);
_appDataFolder.CreateFile(GetFeedCachePath(source), feed.ToString(SaveOptions.DisableFormatting));
}
static XName Atom(string localName) {
private static XName Atom(string localName) {
return AtomExtensions.AtomXName(localName);
}
static IEnumerable<T> Unit<T>(T t) where T : class {
return t != null ? new[] { t } : Enumerable.Empty<T>();
private static IEnumerable<T> Unit<T>(T t) where T : class {
return t != null ? new[] {t} : Enumerable.Empty<T>();
}
static IEnumerable<T2> Bind<T, T2>(T t, Func<T, IEnumerable<T2>> f) where T : class {
private static IEnumerable<T2> Bind<T, T2>(T t, Func<T, IEnumerable<T2>> f) where T : class {
return Unit(t).SelectMany(f);
}
@@ -77,24 +105,5 @@ namespace Orchard.Packaging {
formatter.ReadFrom(XmlReader.Create(new StringReader(content)));
return formatter.Feed;
}
public IEnumerable<PackagingEntry> GetModuleList() {
var packageInfos = GetSources()
.SelectMany(
source =>
Bind(ParseFeed(_appDataFolder.ReadFile(GetFeedCachePath(source))),
feed =>
feed.Items.SelectMany(
item =>
Unit(new PackagingEntry {
Source = source,
SyndicationFeed = feed,
SyndicationItem = item,
PackageStreamUri = item.Links.Single().GetAbsoluteUri().AbsoluteUri,
}))));
return packageInfos.ToArray();
}
}
}

View File

@@ -1,9 +1,9 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Orchard.Environment.Extensions.Models;
using Orchard.Packaging;
using Orchard.Packaging.Services;
namespace Futures.Modules.Packaging.ViewModels {
namespace Orchard.Packaging.ViewModels {
public class PackagingHarvestViewModel {
public IEnumerable<PackagingSource> Sources { get; set; }
public IEnumerable<ExtensionDescriptor> Extensions { get; set; }

View File

@@ -1,7 +1,7 @@
using System.Collections.Generic;
using Orchard.Packaging;
using Orchard.Packaging.Services;
namespace Futures.Modules.Packaging.ViewModels {
namespace Orchard.Packaging.ViewModels {
public class PackagingModulesViewModel {
public IEnumerable<PackagingEntry> Modules { get; set; }
}

View File

@@ -1,7 +1,7 @@
using System.Collections.Generic;
using Orchard.Packaging;
using Orchard.Packaging.Services;
namespace Futures.Modules.Packaging.ViewModels {
namespace Orchard.Packaging.ViewModels {
public class PackagingSourcesViewModel {
public IEnumerable<PackagingSource> Sources { get; set; }
}

View File

@@ -1,4 +1,4 @@
<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl<Futures.Modules.Packaging.ViewModels.PackagingHarvestViewModel>" %>
<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl<Orchard.Packaging.ViewModels.PackagingHarvestViewModel>" %>
<h1>
<%: Html.TitleForPage(T("Packaging").ToString(), T("Harvest Packages").ToString())%></h1>
<%: Html.Partial("_Subnav") %>

View File

@@ -1,4 +1,4 @@
<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl<Futures.Modules.Packaging.ViewModels.PackagingModulesViewModel>" %>
<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl<Orchard.Packaging.ViewModels.PackagingModulesViewModel>" %>
<h1>
<%: Html.TitleForPage(T("Packaging").ToString(), T("Browse Packages").ToString())%></h1>
<%: Html.Partial("_Subnav") %>

View File

@@ -1,4 +1,4 @@
<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl<Futures.Modules.Packaging.ViewModels.PackagingSourcesViewModel>" %>
<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl<Orchard.Packaging.ViewModels.PackagingSourcesViewModel>" %>
<h1>
<%: Html.TitleForPage(T("Packaging").ToString(), T("Edit Sources").ToString())%></h1>
<%: Html.Partial("_Subnav") %>

View File

@@ -83,6 +83,7 @@ namespace Orchard.Setup.Services {
"Orchard.Users",
"Orchard.Roles",
"TinyMce",
"PackagingServices",
"Orchard.Modules",
"Orchard.Themes",
"Orchard.Blogs",

View File

@@ -73,7 +73,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PackageIndexReferenceImplem
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lucene", "Orchard.Web\Modules\Lucene\Lucene.csproj", "{D5D447D7-EF8E-43A6-B9A4-3B025DD9F45D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Futures.Modules.Packaging", "Orchard.Web\Modules\Futures.Modules.Packaging\Futures.Modules.Packaging.csproj", "{DFD137A2-DDB5-4D22-BE0D-FA9AD4C8B059}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.Packaging", "Orchard.Web\Modules\Orchard.Packaging\Orchard.Packaging.csproj", "{DFD137A2-DDB5-4D22-BE0D-FA9AD4C8B059}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -236,6 +236,7 @@ Global
{EA2B9121-EF54-40A6-A53E-6593C86EE696} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5}
{0E7646E8-FE8F-43C1-8799-D97860925EC4} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5}
{D5D447D7-EF8E-43A6-B9A4-3B025DD9F45D} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5}
{DFD137A2-DDB5-4D22-BE0D-FA9AD4C8B059} = {E9C9F120-07BA-4DFB-B9C3-3AFB9D44C9D5}
{ABC826D4-2FA1-4F2F-87DE-E6095F653810} = {74E681ED-FECC-4034-B9BD-01B0BB1BDECA}
{F112851D-B023-4746-B6B1-8D2E5AD8F7AA} = {74E681ED-FECC-4034-B9BD-01B0BB1BDECA}
{6CB3EB30-F725-45C0-9742-42599BA8E8D2} = {74E681ED-FECC-4034-B9BD-01B0BB1BDECA}
@@ -247,6 +248,5 @@ Global
{33B1BC8D-E292-4972-A363-22056B207156} = {383DBA32-4A3E-48D1-AAC3-75377A694452}
{8A4E42CE-79F8-4BE2-8B1E-A6B83432123B} = {383DBA32-4A3E-48D1-AAC3-75377A694452}
{E65E5633-C0FF-453C-A906-481C14F969D6} = {E75A4CE4-CAA6-41E4-B951-33ACC60DC77C}
{DFD137A2-DDB5-4D22-BE0D-FA9AD4C8B059} = {E75A4CE4-CAA6-41E4-B951-33ACC60DC77C}
EndGlobalSection
EndGlobal

View File

@@ -105,7 +105,6 @@
<Reference Include="System.Runtime.Serialization">
<RequiredTargetFramework>3.0</RequiredTargetFramework>
</Reference>
<Reference Include="System.ServiceModel" />
<Reference Include="System.Transactions" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Abstractions">
@@ -121,7 +120,6 @@
</Reference>
<Reference Include="System.Xml" />
<Reference Include="System.Xml.Linq" />
<Reference Include="WindowsBase" />
<Reference Include="Yaml, Version=1.0.3370.39839, Culture=neutral, PublicKeyToken=187a3d240e44a135, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\lib\yaml\Yaml.dll</HintPath>
@@ -369,18 +367,6 @@
</Compile>
<Compile Include="ContentManagement\DataMigrations\FrameworkDataMigration.cs" />
<Compile Include="FileSystems\Dependencies\DynamicModuleVirtualPathProvider.cs" />
<Compile Include="Packaging\AtomExtensions.cs" />
<Compile Include="Packaging\IPackageBuilder.cs" />
<Compile Include="Packaging\IPackageExpander.cs" />
<Compile Include="Packaging\IPackageManager.cs" />
<Compile Include="Packaging\IPackagingSourceManager.cs" />
<Compile Include="Packaging\PackageBuilder.cs" />
<Compile Include="Packaging\PackageData.cs" />
<Compile Include="Packaging\PackagingEntry.cs" />
<Compile Include="Packaging\PackageExpander.cs" />
<Compile Include="Packaging\PackageManager.cs" />
<Compile Include="Packaging\PackagingSource.cs" />
<Compile Include="Packaging\PackagingSourceManager.cs" />
<Compile Include="Utility\Hash.cs" />
<Compile Include="Data\ISessionConfigurationCache.cs" />
<Compile Include="Data\Migration\Generator\ISchemaCommandGenerator.cs" />