【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata


一、接口

  • 资源文件模块中表示资源仓库接口:ResourceRepository,资源仓库,资源仓库代表资源获取的源头,可以认为是一种存储的抽象(如FTP、OSS、HDFS),但是并不限定于实际的存储,只要能够提供资源文件的读写都可以称之为资源仓库。
  • 资源仓库的抽象首先是使用InputStream代替了文件类java.io.File的读取,提供了最基础的read、write、exist、create、createDirectory、list和copy、rename方法;

二、资源仓库模块

  • 资源仓库模块ResourceRepositoryActivator是一个标准的模块,实现了Activator,它依赖于环境和配置模块启动,具体启动时需要构建一个ResourceModuleContext上下文,上下文维护资源仓库的工厂管理、配置、安装、服务:
  • 它的启动依赖配置模块,所有在它之前启动的模块不能使用资源仓库模块提供的方法和内容,具体参见@ju 写的模块化启动框架新模块化启动框架
  • 仅仅靠资源仓库无法完成我们正常对资源的操作,实际生产环境中的资源仓库也不仅仅就是本地文件系统或者其它存储,资源读写也需要考虑竞争的问题。作为一整个资源文件模块,需要提供ResourceModuleContext给客户端来管理资源仓库。ResourceModuleContext的类具体功能:
    0、构建上下文;
    1、管理仓库工厂;
    2、安装卸载仓库;
    3、管理仓库的服务;
    4、获取工厂加载器、仓库安装器、仓库服务管理器、模块配置;
    5、添加删除仓库服务管理器监听;
    6、验证仓库配置;
  • 安装仓库流程:
    1、添加仓库的工厂:RepositoryFactoryProvider<extends UniqueKey>泛型为工厂的配置类,如果没有配置类,工厂的配置管理器RepositoryConfigManagerProvider<extends UniqueKey>为空。添加工厂后表示已经支持该类型的仓库;
    2、安装仓库:安装仓库并不需要主动初始化好仓库,而是提供一个凭据,这个凭据包括了仓库的类型、工作路径、配置对象,然后仓库安装器会根据凭据返回一个安装组件,安装组件的设计是为了可以延迟仓库初始化;

    仓库安装示例
               FTPRepositoryProfile.create(FTP_REPO_NAME, bean.getPath(), config).install().apply();
    或者
                InstalledComponent<FTPConfig> component = FTPRepositoryProfile.create(FTP_REPO_NAME, bean.getPath(), config).install();
                component.apply();
                //component.apply(RepositoryApplyPolicy.SELECTABLE);


    3、加入服务:安装组件的apply方法可以携带服务策略参数加入服务,加入服务意味着可以使用这个仓库了;

三、工具类ResourceIOUtils

 

ResourceIOUtils包含了日常文件读写的静态方法,在资源文件模块未启动时,ResourceIOUtils处于孤立模式,此时ResourceIOUtils的读写和本地文件读写没有区别。当资源文件模块启动后,ResourceIOUtils会根据路径识别是否需要到资源仓库读写:

1、使用时,由于实际存储的不确定性,资源仓库并没有完全覆盖WEB-INF下所有的文件读写,只包含reportlets、resources、asserts、plugins、schedule等文件夹,因此直接使用ResourceRepository可能会造成混乱。因此提供了ResourceIOUtils提供屏蔽资源仓库的手动选择。

2、ResourceIOUtils首先会根据传入的路径,根据路径指向的文件夹,选择是否在资源仓库读写。例如,资源文件存储在FTP服务器,而logs、libs等都放在本地,当向一个非资源文件写入时,会调用本地文件系统的FileSystemRepository,当读取一个报表时则会从FTPResourceRepository读。

3、公有方法描述:

方法名称作用描述返回值/参数说明
renameTo
重命名
close
关闭流等
copy
复制源路径和目标路径应该处于同一个存储下
createFile
创建文件若已经存在返回false
createDirectory
创建文件夹自动连续创建,没有mkdir和mkdis区别
isDirectory
是否是文件夹
getName
获取文件或文件夹名称
exist
文件或文件夹是否存在
list
列出文件夹下的内容名称返回的是文件名列表
listWithFullPath
列出文件夹下内容的路径返回的是文件的绝对路径列表
isDirectoryExist
文件夹是否存在
read
读取文件流
readBytes
读取到byte[]
write
接受InputStream、byte[]、String类型的数据
delete
删除文件或文件夹
getParent
获取文件或文件夹父路径
inputStream2String
InputStream转String
inputStream2Bytes
InputStream转byte[]
readFileFromRepoToLocal
从资源仓库读取文件到本地若不指定本地文件夹,会自动指定一个
readDirFromRepoToLocal
从资源仓库读取文件夹到本地若不指定本地文件夹,会自动指定一个
unzip
解压压缩文件可以在本地也可以在资源仓库



四、规范约束

ResourceRepository作为一个通用的资源仓库,并没有规定路径的名称,不仅仅可以读写资源文件,其它存在仓库中的文件同样可以访问。

1、资源仓库必须规定资源工作目录,比如在FTP中,需要一个工作目录,目录下包含./reportlets/、.//resources/、./plugins/、./asserts、./bireport等目录。

2、读写,建议所有文件操作全部使用相对路径(相对WEB-INF路径)

    a、如果要访问某个资源文件,如read("/reportlets/xxx.cpt"),会自动将路径拼接成workroot + /reportlets/xxx.cpt;

    b、如果要访问某个WEB-INF下的非资源文件,比如finedb/db.properties,会自动转化成workroot+ /finedb/db.properties;

    c、如果使用绝对了路径,如/Users/rinoux/FineProjects/finereport-ft/env/WebReport/WEB-INF/reportlets/xxx.cpt,还是会去读绝对路径;

五、注意事项

ResourceIOUtils的所有操作方法,均是提供给本地环境使用的,如果设计到远程设计环境,希望在远程设计的客户端,可读读取到服务端的某些资源,需要使用

com.fr.workspace.resource.WorkResource rs = com.fr.workspace.WorkContext.getWorkResource();

 在获取到WorkResource对象后,再调用响应的读取文件的方法。


 

  • No labels