file system abstraction and folder providers in...

62
1 File System Abstraction and Folder Providers in DotNetNuke Brandon Haynes

Upload: vandan

Post on 18-Mar-2018

221 views

Category:

Documents


0 download

TRANSCRIPT

1

File System Abstraction and

Folder Providers in DotNetNuke Brandon Haynes

2

Agenda

Background • File Services in DotNetNuke 5 and 6

Architecture • File and Folder Managers • Provider Model and Folder Providers • Core Implementations

Extension • Why? • Hello World • Build something cool

3

BACKGROUND File System Abstraction and Folder Providers in DotNetNuke

4

The File Manager

5

The File Manager

6

File Types in DotNetNuke 5.x

• FolderController.StorageLocationTypes

InsecureFileSystem (Standard)

SecureFileSystem (Secure)

DatabaseSecure (Database)

7

File Types in DotNetNuke 5.x

• InsecureFileSystem (Standard)

Exists on the local file system

May be directly accessed via URI

Path obscurity via LinkClick HTTP Handler

8

File Types in DotNetNuke 5.x

• SecureFileSystem (Secure)

Exists on local file system

“.resources” extension appended

Not served by IIS (by default)

Streaming access via LinkClick HTTPHandler

9

File Types in DotNetNuke 5.x

• DatabaseSecure (Secure)

Persisted in database

– In the Files table, Content field

Streaming access via LinkClick HTTPHandler

Performance considerations

10

File Manager, DotNetNuke 6.x

11

File Manager, DotNetNuke 6.x

12

File Manager, DotNetNuke 6.x

13

File Manager, DotNetNuke 6.x

14

File Manager, DotNetNuke 6.x

15

File Manager, DotNetNuke 6.x

16

Core Folder Provider Implementations

Community (DotNetNuke.Services.FileSystem) • StandardFolderProvider

• SecureFolderProvider

• DatabaseFolderProvider

Professional • Amazon S3

• Windows Azure

• SharePoint

Others • Evotiva DNNGlobalStorage (Amazon S3)

• Intelequia DNNFolderProviders (Windows Azure)

• Sharepoint Folder Provider (Alpha)

17

ARCHITECTURE File System Abstraction and Folder Providers in DotNetNuke

18

DotNetNuke File System (5.x)

FileSystemUtilities

DataProvider

FolderController

FileInfo

Filename: string

StorageLocation

FolderInfo

FolderName: string

StorageLocation

GetFolder

AddFolder

DeleteFolder

FileController

GetFile

AddFile

DeleteFile

GetFileStream: Stream

19

DotNetNuke File System (6.x)

<<interface>>

IFolderManager

GetFolder

AddFolder

UpdateFolder

DeleteFolder

<<interface>>

IFileManager

GetFile

AddFile

UpdateFile

DeleteFile

20

DotNetNuke File System (6.x)

<<interface>>

IFolderManager

GetFolder

AddFolder

UpdateFolder

DeleteFolder

FolderManager

<<interface>>

IFileManager

GetFile

AddFile

UpdateFile

DeleteFile

FileManager

21

DotNetNuke File System (6.x)

FolderInfo

<<interface>>

IFolderInfo

FileInfo

<<interface>>

IFileInfo

22

DotNetNuke File System (6.x)

FolderManager

GetFolder

AddFolder

DeleteFolder

<<abstract>>

ComponentBase

TType TContract

<<bind>>

<IFolderManager,

FolderManager>

Instance: TContract

class FolderManager : ComponentBase<IFolderManager, FolderManager>, IFolderManager { ... }

class ComponentBase<TContract, TType> where TType : TContract { static TContract Instance { get { ... } } }

23

DotNetNuke File System (6.x)

FolderManager

GetFolder

AddFolder

DeleteFolder

FolderController

GetFolder

AddFolder

DeleteFolder

FileSystemUtilities

Awesome new DotNetNuke 6.x stuff

Legacy support

24

DotNetNuke File System (6.x)

FolderManager

GetFolder

AddFolder

DeleteFolder

FolderController

GetFolder

AddFolder

DeleteFolder

class FolderController { FolderInfo GetFolder(…) { return FolderManager .Instance .GetFolder(…); } }

FileSystemUtilities

25

DotNetNuke File System (6.x)

FolderManager

GetFolder

AddFolder

UpdateFoler

DeleteFolder

FolderProvider FolderProvider FolderProvider FolderProvider

26

DotNetNuke File System (6.x)

FolderManager

FolderProvider FolderProvider FolderProvider FolderProvider

FileManager

27

DotNetNuke File System (6.x)

FolderProvider

IFolderInfo

Data

DotNetNuke

Periodic Synchronization

28

web.config Provider Configuration

<[providerType] defaultProvider=“[name]"> <providers> <clear/> <add name=“[name]" type=“[type]" otherAttributes=“…”/> </providers> </[providerType]>

29

web.config Folder Provider Configuration

<folder defaultProvider=“StandardFolderProvider"> <providers> <clear/> <add name=“StandardFolderProvider" …/> <add name=“SecureFolderProvider" …/> <add name=“DatabaseFolderProvider" …/> </providers> </roles>

30

web.config Folder Provider Configuration

<folder defaultProvider=“StandardFolderProvider"> <providers> <clear/> <add name=“StandardFolderProvider" …/> <add name=“SecureFolderProvider" …/> <add name=“DatabaseFolderProvider" …/> <add name=“MyAwesomeFolderProvider" …/> </providers> </roles>

31

FolderProvider Abstract Class

<<abstract>>

FolderProvider

IsStorageSecure

RequiresNetworkConnectivity

GetFiles

GetFileStream

GetFileSize

GetFileUrl

GetSubFolders

AddFolder

AddFile

UpdateFile

DeleteFolder

DeleteFile

RenameFile

RenameFolder

FileExists

FolderExists

GetFileAttributes

SetFileAttributes

SupportsFileAttributes

GetLastModificationTime

GetSettingsVirtualControlPath

IsInSync

32

FolderProvider Abstract Class

<<abstract>>

FolderProvider

GetFiles(IFolderInfo): string[]

GetFileStream(IFileInfo): Stream

GetFileSize(IFileInfo): long

GetFileUrl(IFileInfo): string

AddFile(folder: IFolderInfo, filename: string)

UpdateFile(file: IFileInfo, stream: Stream)

DeleteFile(IFileInfo)

RenameFile(file: IFileInfo, newName: string)

FileExists(file: IFolderInfo, name: string): Boolean

33

FolderProvider Abstract Class

<<abstract>>

FolderProvider

GetSubFolders(path: string, mapping: FolderMappingInfo)

AddFolder(path: string, mapping: FolderMappingInfo)

DeleteFolder(folder: IFolderInfo)

RenameFolder(folder: IFolderInfo, newName: string)

FolderExists(path: string, mapping: FolderMappingInfo)

34

FolderProvider Abstract Class

<<abstract>>

FolderProvider

GetFileAttributes(IFileInfo): System.IO.FileAttributes?

SetFileAttributes(IFileInfo, FileAttributes)

SupportsFileAttributes: Boolean

GetLastModificationTime(IFileInfo): DateTime

35

FolderProvider Abstract Class

<<abstract>>

FolderProvider

IsStorageSecure

RequiresNetworkConnectivity

GetSettingsVirtualControlPath: string

IsInSync(IFileInfo): Boolean

36

EXTENSION File System Abstraction and Folder Providers in DotNetNuke

37

Custom File Providers

Why would we need a custom file provider? • Probably going to use existing file system and

cloud providers E.g., existing Amazon S3 folder providers are “good enough”

New niches are likely to be quickly filled by third parties

They’re more powerful than you think. • Not just for storing data on the cloud or in SharePoint

• Essentially able to be a lightweight directory and stream service for arbitrary data

Lots of possibilities: • Expose data via WCF, simple transformations, extend

existing providers via decoration

38

Hello World

Simplest provider possible

Create a directory using the Hello-World provider

Hello-World directories contain exactly one file:

• hello-world.txt

Not supported: • Sub-folders,

• Uploads,

• Updates,

• Etc.

39

Symbolic Link File Provider

Goals: • Create a symbolic link between child and parent

portals [PortalRoot]/MyFile.txt

– http://folderprovider.local/Portals/0/MyFile.txt

[Child PortalRoot]/ParentPortal/MyFile.txt

– http://folderprovider.local/Child/LinkClick.aspx

• Parent files should be read-only in a child portal

• Only link files with anonymous authorization

• Synchronization, dialog selection, etc. should be natural and transparent

40

Symbolic Link Provider

Parent and Child Portal Aliases

http://folderprovider.local/Child

http://folderprovider.local

41

Symbolic Link Provider

Mapping from child IFileInfo instances to parent IFileInfo instances • Child instance is of our custom provider type

• Parent instance may be of any provider type!

IFolder IFolder

Child Portal Parent Portal

SymbolicLink

FolderProvider

Standard

FolderProvider

GetParentFolder

42

Symbolic Link Provider

Define an initial folder provider method:

override string[] GetFiles(IFolderInfo folder) { var parentFolder = folder.GetParentFolder(); var provider = parentFolder.GetProvider(); return provider != null ? provider.GetFiles(parentFolder) : new string[0]; }

43

Symbolic Link Provider

Define an initial folder provider method:

override string[] GetFiles(IFolderInfo folder) { var parentFolder = folder.GetParentFolder(); var provider = parentFolder.GetProvider(); return provider != null ? provider.GetFiles(parentFolder) : new string[0]; }

IFolder IFolder

Child Portal Parent Portal

44

Symbolic Link Provider

Define an initial folder provider method:

override string[] GetFiles(IFolderInfo folder) { var parentFolder = folder.GetParentFolder(); var provider = parentFolder.GetProvider(); return provider != null ? provider.GetFiles(parentFolder) : new string[0]; }

45

Symbolic Link Provider

Define an initial folder provider method:

override string[] GetFiles(IFolderInfo folder) { var parentFolder = folder.GetParentFolder(); var provider = parentFolder.GetProvider(); return provider != null ? provider.GetFiles(parentFolder) : new string[0]; }

46

Symbolic Link Provider

Define an initial folder provider method:

Get Parent

override string[] GetFiles(IFolderInfo folder) { var parentFolder = folder.GetParentFolder(); var provider = parentFolder.GetProvider(); return provider != null ? provider.GetFiles(parentFolder) : new string[0]; }

47

Symbolic Link Provider

Define an initial folder provider method:

Get Provider

override string[] GetFiles(IFolderInfo folder) { var parentFolder = folder.GetParentFolder(); var provider = parentFolder.GetProvider(); return provider != null ? provider.GetFiles(parentFolder) : new string[0]; }

48

Symbolic Link Provider

Define an initial folder provider method:

Defer

override string[] GetFiles(IFolderInfo folder) { var parentFolder = folder.GetParentFolder(); var provider = parentFolder.GetProvider(); return provider != null ? provider.GetFiles(parentFolder) : new string[0]; }

49

Symbolic Link Provider

Define an initial folder provider method:

override string GetFileUrl(IFileInfo file) { var parentFile = file.GetParentFile(); var provider = parentFile.GetProvider(); return provider != null ? provider.GetFileUrl(parentFile) : null; }

50

Symbolic Link Provider

Define an initial folder provider method:

override string GetFileUrl(IFileInfo file) { var parentFile = file.GetParentFile(); var provider = parentFile.GetProvider(); return provider != null ? provider.GetFileUrl(parentFile) : null; }

Get Parent

51

Symbolic Link Provider

Define an initial folder provider method:

override string GetFileUrl(IFileInfo file) { var parentFile = file.GetParentFile(); var provider = parentFile.GetProvider(); return provider != null ? provider.GetFileUrl(parentFile) : null; }

Get Provider

52

Symbolic Link Provider

Define an initial folder provider method:

override string GetFileUrl(IFileInfo file) { var parentFile = file.GetParentFile(); var provider = parentFile.GetProvider(); return provider != null ? provider.GetFileUrl(parentFile) : null; }

Defer

53

Symbolic Link Provider

Define an initial folder provider method:

override string GetFileUrl(IFileInfo file) { var parentFile = file.GetParentFile(); var provider = parentFile.GetProvider(); return provider != null ? provider.GetFileUrl(parentFile) : null; }

54

Symbolic Link Provider

Define an initial folder provider method:

override string GetFileUrl(IFileInfo file) { var parentFile = file.GetParentFile(); var provider = parentFile.GetProvider(); return provider != null ? provider.GetFileUrl(parentFile) : null; }

55

Symbolic Link Provider

Even better, consider a helper function of type: IFolderInfo → (FolderProvider → (IFolderInfo → α)) → α → α

T ParentPortalOperation<T>( this IFolderInfo folder, Func<FolderProvider, Func<IFolderInfo, T>> operation, T defaultValue) { var parentFolder = folder.GetParentFolder(); return parentFolder != null ? operation(parentFolder.GetProvider())(parentFolder) : defaultValue; }

56

Symbolic Link Provider

Even better, consider a helper function of type: IFolderInfo → (FolderProvider → (IFolderInfo → α)) → α → α

T ParentPortalOperation<T>( this IFolderInfo folder, Func<FolderProvider, Func<IFolderInfo, T>> operation, T defaultValue) { var parentFolder = folder.GetParentFolder(); return parentFolder != null ? operation(parentFolder.GetProvider())(parentFolder) : defaultValue; }

Get Parent

57

Symbolic Link Provider

Even better, consider a helper function of type: IFolderInfo → (FolderProvider → (IFolderInfo → α)) → α → α

T ParentPortalOperation<T>( this IFolderInfo folder, Func<FolderProvider, Func<IFolderInfo, T>> operation, T defaultValue) { var parentFolder = folder.GetParentFolder(); return parentFolder != null ? operation(parentFolder.GetProvider())(parentFolder) : defaultValue; }

Get Provider

58

Symbolic Link Provider

Even better, consider a helper function of type: IFolderInfo → (FolderProvider → (IFolderInfo → α)) → α → α

T ParentPortalOperation<T>( this IFolderInfo folder, Func<FolderProvider, Func<IFolderInfo, T>> operation, T defaultValue) { var parentFolder = folder.GetParentFolder(); return parentFolder != null ? operation(parentFolder.GetProvider())(parentFolder) : defaultValue; }

Operation

59

Symbolic Link Provider

Initial folder provider method, revisited:

override string[] GetFiles(IFolderInfo folder) { return folder.ParentPortalOperation( provider => provider.GetFiles, new string[0]); }

override Stream GetFileStream(IFileInfo file) { return file.ParentPortalOperation<Stream>( provider => provider.GetFileStream); }

Other FolderProvider methods are similarly trivial:

60

<component type="Config">

<config>

<configFile>web.config</configFile>

<install>

<configuration>

<nodes>

<node path="/configuration/dotnetnuke/folder/providers"

action="update" key="name" collision="overwrite">

<add name=“…"

type=“…" />

</node>

</nodes>

</configuration>

</install>

<uninstall>

<configuration>

<nodes>

<node path=“…" action="remove" />

</nodes>

</configuration>

</uninstall>

</config>

</component>

61

Summary

Folder providers are quite cool. • Think outside the box – not just for cloud file systems!

• Function as a lightweight directory and data streaming service

• Decorate standard providers for custom functionality E.g., send an e-mail whenever a file is uploaded to a specific directory

Modern code should interact with the file system via FileManager.Instance and FolderManager.Instance. • Move away from deprecated classes (e.g. FileSystemUtilities, FileController)

New provider types need to derive from the FolderProvider

abstract class • Only a handful of methods and you’re up and running

• Custom settings control via GetSettingsVirtualControlPath

62 62

File System Abstraction and Folder

Providers in DotNetNuke

Brandon Haynes