用于扫描com.major.openplatform.support.storage.file包中所有继承自AbstractFileStorage的类,并将它们存储在一个Set集合中。其中,ClassScaner是一个自定义的类扫描器,可以通过它来扫描指定包中的所有类。scanPackageBySuper方法用于扫描指定包及其子包中所有继承自指定超类的类。在这个例子中,超类为AbstractFileStorage。返回值为一个Set集合,其中存储了所有扫描到的类。
// 自动注册 Set<Class<AbstractFileStorage>> clses = ClassScaner.scanPackageBySuper("com.storage.file", AbstractFileStorage) clses.each { Class<AbstractFileStorage> cls-> AbstractFileStorage instance = cls.newInstance() HOLDER.put(instance.alias, instance ) }
扫描类然后装入 map中,getStorage 通过扫描到的被装入HOLDER里面的类的别名Alias返回类的实例对象
package com.storage.file
import cn.hutool.core.lang.ClassScaner
import com.major.openplatform.utils.SysConfig
import com.domain.security.SysFile
import javax.servlet.http.HttpServletResponse
import javax.xml.ws.Holder
/**
* Created by Grain on 2017/4/15.
*/
class FileStorageFactory {
static Map<String, AbstractFileStorage> HOLDER = [:]
static {
// 自动注册
Set<Class<AbstractFileStorage>> clses = ClassScaner.scanPackageBySuper("com.support.storage.file", AbstractFileStorage)
clses.each { Class<AbstractFileStorage> cls->
AbstractFileStorage instance = cls.newInstance()
HOLDER.put(instance.alias, instance )
}
}
static AbstractFileStorage getStorage(String name = SysConfig.fileDataBase) {
try {
println(HOLDER)
return HOLDER[name] as AbstractFileStorage
} catch (NullPointerException e) {
System.out.println("Failed to get storage: " + e.getMessage()); return null;
}
}
static InputStream getInputStream(Long sysFileId) {
SysFile sysFile = SysFile.get(sysFileId)
return getInputStream(sysFile)
}
static InputStream getInputStream(SysFile sysFile) {
AbstractFileStorage storage = getStorage(sysFile.storage)
return storage.getInputStream(sysFile)
}
static void download(HttpServletResponse res, Long sysFileId) {
SysFile sysFile = SysFile.get(sysFileId)
download(res, sysFile)
}
static void download(HttpServletResponse res, String uuid) {
SysFile sysFile = new SysFile(storage: 'idoc', saveFileName: uuid)
download(res, sysFile)
}
static void download(HttpServletResponse res, SysFile sysFile) {
AbstractFileStorage storage = getStorage(sysFile.storage)
storage.download(res, sysFile)
}
}
被扫描的类 ,里面有别名Alias
import javax.servlet.http.HttpServletResponse
/**
* Created by Grain on 2017/4/15.
*/
class RfFileStorage extends AbstractFileStorage implements FileStorage {
static Logger logger = LoggerFactory.getLogger( RfFileStorage.class )
@Override
InputStream getInputStream(Long sysFileId ) {
getInputStream(SysFile.get( sysFileId ) )
}
@Override
InputStream getInputStream(SysFile sysFile) {
File file = new File( sysFile.localPath + File.separator + sysFile.saveFileName )
return file.newInputStream()
}
// 通过一个sysFile获取其访问路径
@Override
String retrieveDownloadURL(SysFile sysFile) {
return "/file/url/" + sysFile.id
}
@Override
String getName() {
return "TDM主站"
}
@Override
String getAlias() {
return "rf"
}
// 生成文件名
static String genFileName() {
return UUIDGenerator.generate()
}
}