org.tinygroup.vfs.VFS Maven / Gradle / Ivy
The newest version!
/**
* Copyright (c) 1997-2013, www.tinygroup.org ([email protected]).
*
* Licensed under the GPL, Version 3.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.gnu.org/licenses/gpl.html
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.tinygroup.vfs;
import org.tinygroup.vfs.impl.*;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 虚拟文件系统
*
* @author luoguo
*/
public final class VFS {
private static Map fileObjectCacheMap = new ConcurrentHashMap();
private static Map fileModifyTimeMap = new ConcurrentHashMap();
private static Map schemaProviderMap = new HashMap();
private static String defaultSchema = "file:";
static {
addSchemaProvider(new JarSchemaProvider());//注册本地jar模式提供者
addSchemaProvider(new WsJarSchemaProvider());//注册wsjar协议的模式提供者
addSchemaProvider(new ZipSchemaProvider());//注册本地zip模式提供者
addSchemaProvider(new FileSchemaProvider());//注册file协议的模式提供者
addSchemaProvider(new HttpSchemaProvider());//注册http协议的模式提供者
addSchemaProvider(new HttpsSchemaProvider());//注册https协议的模式提供者
addSchemaProvider(new JBossVfsSchemaProvider());//注册vfs虚拟协议的模式提供者
addSchemaProvider(new FtpSchemaProvider());//注册ftp协议的模式提供者
}
/**
* 构建函数私有化
*/
private VFS() {
}
/**
* 清空Cache
*/
public static void clearCache() {
fileObjectCacheMap.clear();
}
/**
* 添加新的模式提供者
*
* @param schemaProvider
*/
public static void addSchemaProvider(SchemaProvider schemaProvider) {
schemaProviderMap.put(schemaProvider.getSchema(), schemaProvider);
}
/**
* 设置默认模式提供者
*
* @param schema
*/
public static void setDefaultSchemaProvider(String schema) {
defaultSchema = schema;
}
/**
* 返回指定的模式提供者
*
* @param schema
* @return
*/
public static SchemaProvider getSchemaProvider(String schema) {
return schemaProviderMap.get(schema);
}
/**
* 解析文件,
* 如果是在压缩包类型的文件内,则判断是否存在,如果存在,判断修改时间
* 如果不是包内文件,则直接读取
* @param resourceResolve
* @return
*/
public static FileObject resolveFile(String resourceResolve) {
String resource=resourceResolve;
//根据协议地址从缓存中查询FileObject
FileObject fileObject = fileObjectCacheMap.get(resource);
if (fileObject != null && fileObject.isInPackage()) {
//检查FileObject的最近修改时间戳和缓存中的是否一致,如果一致的话就直接返回结果
long oldTime = fileModifyTimeMap.get(resource);
long newTime = fileObject.getLastModifiedTime();
if (oldTime == newTime) {
return fileObject;
}
}
try {
//采用utf-8编码对协议地址进行解码
resource = URLDecoder.decode(resource, "UTF-8");
} catch (UnsupportedEncodingException e) {
// 如果出错也不用管,忽略之
}
//取得默认的模式提供者FileSchemaProvider
SchemaProvider schemaProvider = schemaProviderMap.get(defaultSchema);
for (SchemaProvider provider : schemaProviderMap.values()) {
//遍历模式提供者,判断协议地址是否匹配当前模式提供者
if (provider.isMatch(resource)) {
schemaProvider = provider;
break;
}
}
//返回解析结果
fileObject = schemaProvider.resolver(resource);
//如果fileObject是包资源,则更新fileObject缓存和时间戳信息
if (fileObject != null && fileObject.isInPackage()) {
fileObjectCacheMap.put(resource, fileObject);
fileModifyTimeMap.put(resource, fileObject.getLastModifiedTime());
}
return fileObject;
}
/**
* 解析URL
*
* @param url
* @return
*/
public static FileObject resolveURL(URL url) {
return resolveFile(url.getPath());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy