From 7d075f6142e7dba1072b5b4cc4bdeca3211c168a Mon Sep 17 00:00:00 2001 From: vfedosevich Date: Mon, 30 Mar 2015 03:34:22 -0700 Subject: [PATCH] webdav portal root folder speed fix --- .../EnterpriseStorageProxy.cs | 81 +++++++++++++++++++ .../EnterpriseStorageController.cs | 56 +++++++++++++ .../esEnterpriseStorage.asmx.cs | 6 ++ .../Managers/WebDavManager.cs | 26 +----- 4 files changed, 147 insertions(+), 22 deletions(-) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs index ef29192f..761f7449 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs @@ -47,6 +47,8 @@ namespace WebsitePanel.EnterpriseServer { private System.Threading.SendOrPostCallback GetEnterpriseFoldersOperationCompleted; + private System.Threading.SendOrPostCallback GetUserRootFoldersOperationCompleted; + private System.Threading.SendOrPostCallback GetEnterpriseFolderOperationCompleted; private System.Threading.SendOrPostCallback CreateEnterpriseFolderOperationCompleted; @@ -128,6 +130,9 @@ namespace WebsitePanel.EnterpriseServer { /// public event GetEnterpriseFoldersCompletedEventHandler GetEnterpriseFoldersCompleted; + /// + public event GetUserRootFoldersCompletedEventHandler GetUserRootFoldersCompleted; + /// public event GetEnterpriseFolderCompletedEventHandler GetEnterpriseFolderCompleted; @@ -456,6 +461,56 @@ namespace WebsitePanel.EnterpriseServer { } } + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetUserRootFolders", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public SystemFile[] GetUserRootFolders(int itemId, int accountId, string userName, string displayName) { + object[] results = this.Invoke("GetUserRootFolders", new object[] { + itemId, + accountId, + userName, + displayName}); + return ((SystemFile[])(results[0])); + } + + /// + public System.IAsyncResult BeginGetUserRootFolders(int itemId, int accountId, string userName, string displayName, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("GetUserRootFolders", new object[] { + itemId, + accountId, + userName, + displayName}, callback, asyncState); + } + + /// + public SystemFile[] EndGetUserRootFolders(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((SystemFile[])(results[0])); + } + + /// + public void GetUserRootFoldersAsync(int itemId, int accountId, string userName, string displayName) { + this.GetUserRootFoldersAsync(itemId, accountId, userName, displayName, null); + } + + /// + public void GetUserRootFoldersAsync(int itemId, int accountId, string userName, string displayName, object userState) { + if ((this.GetUserRootFoldersOperationCompleted == null)) { + this.GetUserRootFoldersOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetUserRootFoldersOperationCompleted); + } + this.InvokeAsync("GetUserRootFolders", new object[] { + itemId, + accountId, + userName, + displayName}, this.GetUserRootFoldersOperationCompleted, userState); + } + + private void OnGetUserRootFoldersOperationCompleted(object arg) { + if ((this.GetUserRootFoldersCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.GetUserRootFoldersCompleted(this, new GetUserRootFoldersCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetEnterpriseFolder", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] public SystemFile GetEnterpriseFolder(int itemId, string folderName) { @@ -1933,6 +1988,32 @@ namespace WebsitePanel.EnterpriseServer { } } + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void GetUserRootFoldersCompletedEventHandler(object sender, GetUserRootFoldersCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class GetUserRootFoldersCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal GetUserRootFoldersCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public SystemFile[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((SystemFile[])(this.results[0])); + } + } + } + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void GetEnterpriseFolderCompletedEventHandler(object sender, GetEnterpriseFolderCompletedEventArgs e); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs index 6402a7b0..7398203b 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs @@ -76,6 +76,11 @@ namespace WebsitePanel.EnterpriseServer return GetFoldersInternal(itemId); } + public static SystemFile[] GetUserRootFolders(int itemId, int accountId, string userName, string displayName) + { + return GetUserRootFoldersInternal(itemId, accountId, userName, displayName); + } + public static SystemFile GetFolder(int itemId, string folderName) { return GetFolderInternal(itemId, folderName); @@ -554,6 +559,57 @@ namespace WebsitePanel.EnterpriseServer } } + protected static SystemFile[] GetUserRootFoldersInternal(int itemId, int accountId, string userName, string displayName) + { + try + { + var rootFolders = new List(); + + // load organization + Organization org = OrganizationController.GetOrganization(itemId); + if (org == null) + { + return new SystemFile[0]; + } + + int serviceId = GetEnterpriseStorageServiceID(org.PackageId); + + if (serviceId == 0) + { + return new SystemFile[0]; + } + + EnterpriseStorage es = GetEnterpriseStorage(serviceId); + + var webDavSettings = ObjectUtils.CreateListFromDataReader( + DataProvider.GetEnterpriseFolders(itemId)).ToArray(); + + var userGroups = OrganizationController.GetSecurityGroupsByMember(itemId, accountId); + + foreach (var folder in es.GetFolders(org.OrganizationId, webDavSettings)) + { + var permissions = ConvertToESPermission(itemId,folder.Rules); + + foreach (var permission in permissions) + { + if ((!permission.IsGroup + && (permission.DisplayName == userName || permission.DisplayName == displayName)) + || (permission.IsGroup && userGroups.Any(x => x.DisplayName == permission.DisplayName))) + { + rootFolders.Add(folder); + break; + } + } + } + + return rootFolders.ToArray(); + } + catch (Exception ex) + { + throw ex; + } + } + protected static SystemFile GetFolderInternal(int itemId, string folderName) { try diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs index f5ba338b..eab4e26b 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs @@ -92,6 +92,12 @@ namespace WebsitePanel.EnterpriseServer return EnterpriseStorageController.GetFolders(itemId); } + [WebMethod] + public SystemFile[] GetUserRootFolders(int itemId, int accountId, string userName, string displayName) + { + return EnterpriseStorageController.GetUserRootFolders(itemId, accountId, userName, displayName); + } + [WebMethod] public SystemFile GetEnterpriseFolder(int itemId, string folderName) { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/WebDavManager.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/WebDavManager.cs index de3626fd..ceb0beb8 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/WebDavManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/WebDavManager.cs @@ -47,7 +47,7 @@ namespace WebsitePanel.WebDav.Core.Managers if (string.IsNullOrWhiteSpace(pathPart)) { - children = ConnectToWebDavServer().Select(x => new WebDavResource + children = GetWebDavRootItems().Select(x => new WebDavResource { Href = new Uri(x.Url), ItemType = ItemType.Folder, @@ -82,10 +82,9 @@ namespace WebsitePanel.WebDav.Core.Managers SystemFile[] items; - if (string.IsNullOrWhiteSpace(pathPart)) { - var rootItems = ConnectToWebDavServer().Select(x => x.Name).ToList(); + var rootItems = GetWebDavRootItems().Select(x => x.Name).ToList(); rootItems.Insert(0, string.Empty); items = WspContext.Services.EnterpriseStorage.SearchFiles(itemId, rootItems.ToArray(), searchValue, uesrPrincipalName, recursive); @@ -285,28 +284,11 @@ namespace WebsitePanel.WebDav.Core.Managers } } - private IList ConnectToWebDavServer() + private IList GetWebDavRootItems() { - var rootFolders = new List(); var user = WspContext.User; - var userGroups = WSP.Services.Organizations.GetSecurityGroupsByMember(user.ItemId, user.AccountId); - - foreach (var folder in WSP.Services.EnterpriseStorage.GetEnterpriseFolders(WspContext.User.ItemId)) - { - var permissions = WSP.Services.EnterpriseStorage.GetEnterpriseFolderPermissions(WspContext.User.ItemId, folder.Name); - - foreach (var permission in permissions) - { - if ((!permission.IsGroup - && (permission.DisplayName == user.UserName || permission.DisplayName == user.DisplayName)) - || (permission.IsGroup && userGroups.Any(x => x.DisplayName == permission.DisplayName))) - { - rootFolders.Add(folder); - break; - } - } - } + var rootFolders = WspContext.Services.EnterpriseStorage.GetUserRootFolders(user.ItemId, user.AccountId,user.UserName, user.DisplayName); return rootFolders; }