/*
* Created on 2007-1-9 19:53:40 by mlrain
*/
package cn.com.agree.web.tapestry.presentation.spring;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.mlstudio.util.StringUtil;
//mlrain的实用工具集
import org.mlstudio.util.file.FileListUtil;
import org.mlstudio.util.file.filter.WildcardFileFilter;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.orm.hibernate.LocalSessionFactoryBean;
import org.springframework.util.ResourceUtils;
/**
* 加载指定目录下的Hibernate配置文件的工具类。 <BR>
* 支持多目录。<BR>
* <ul>
* version 1.1.0
* <li>支持直接注册hbm配置文件</li>
* <li>支持jar包中hbm配置文件的注册,但仅限于注册具体的hbm配置文件,不支持目录注册</li>
* </ul>
* <ul>
* version 1.1.1
* <li>增加Websphere中wsjar协议的支持</li>
* </ul>
*
* @author mlrain
* @version 1.1.1, 2007-7-17 13:24:40
*/
//这里LocalSessionFactoryBean是一个Factory用来生成Bean
public class LocalDirectorySessionFactoryBean extends LocalSessionFactoryBean
{
/**
* Logger
*/
private Logger logger = Logger.getLogger(getClass());
/**
* URL协议:jar。
*
* @since version 1.1.0
*/
public static final String URL_PROTOCOL_JAR = "jar";
/**
* URL协议:wsjar
*
* @since version 1.1.1
*/
public static final String URL_PROTOCOL_WSJAR = "wsjar";
/**
* 加载指定目录下的Hibernate配置文件。
*
* @param mappingResourcesDirectory
*/
//在spring配置文件中会配置mappingResourcesDirectory属性,就是指明一个目录
//是一个数组
public void setMappingResourcesDirectories(
String[] mappingResourcesDirectories)
{
try
{
if (mappingResourcesDirectories == null
|| mappingResourcesDirectories.length == 0)
{
logger.error("Hibernate配置文件目录为空!");
return;
}
// 获取各目录下的配置文件
List mappingFiles = new ArrayList();
// 1 row(s) below added by mlrain @2007-6-7 下午09:36:24
// for: 增加对jar包中的配置文件的支持,@since version 1.1.0
List jarMappingFiles = new ArrayList(); // 存放在jar包中的配置文件列表
//只选择*.hbm.xml
FileListUtil.filter = new WildcardFileFilter("*.hbm.xml");
for (int i = 0; i < mappingResourcesDirectories.length; ++i)
{
String thisDir = mappingResourcesDirectories[i];
if (StringUtil.empty(thisDir))
continue;
thisDir = thisDir.trim();
// 获取配置文件目录
ClassLoader cl = Thread.currentThread().getContextClassLoader();
URL url = cl.getResource(thisDir);
// 5 row(s) below added by mlrain @2007-6-7 上午10:39:07
// for: 增加未找到URL的判断,修正抛异常的BUG
if (url == null)
{
logger.warn("指定路径[" + thisDir + "]不存在!");
continue;
}
// 3 row(s) below added by mlrain @2007-6-7 下午09:46:13
// for: 增加对jar包中配置文件的支持,@since version 1.1.0
if (isJarResource(url))
jarMappingFiles.add(url);
else
{
File fDir = ResourceUtils.getFile(url);
// 3 row(s) below added by mlrain @2007-6-7 下午09:48:06
// for: 增加对hbm配置文件的直接注册,@since version 1.1.0
if (fDir.isFile())
mappingFiles.add(fDir);
else
{
// 获取配置文件列表
List list = FileListUtil.getChildrenFile(fDir);
mappingFiles.addAll(list);
}
}
}
// 1 row(s) below edited by mlrain @2007-6-11 下午07:37:00
// for: 只有两种情况都没有找到配置文件时才打印警告信息
if (mappingFiles.size() == 0 && jarMappingFiles.size() == 0)
// if (mappingFiles.size() == 0)
logger.warn("在指定的Hibernate配置文件目录下未找到任何配置文件!");
// 建立配置文件资源数组
// 1 row(s) below edited by mlrain @2007-6-7 下午09:49:43
// for: 增加对jar包中配置文件的支持,@since version 1.1.0
List resourceList = new ArrayList(); // 资源列表
// Resource[] mappingResources = new Resource[mappingFiles.size()];
for (int i = 0; i < mappingFiles.size(); ++i)
{
File file = (File) mappingFiles.get(i);
// 1 row(s) below edited by mlrain @2007-6-7 下午09:49:43
// for: 增加对jar包中配置文件的支持,@since version 1.1.0
resourceList.add(new FileSystemResource(file));
// mappingResources[i] = new FileSystemResource(file);
}
// 5 row(s) below added by mlrain @2007-6-7 下午09:52:47
// for: 增加对jar包中配置文件的支持,@since version 1.1.0
for (int i = 0; i < jarMappingFiles.size(); ++i)
{
URL url = (URL) jarMappingFiles.get(i);
resourceList.add(new UrlResource(url));
}
// 设置给资源变量
// 1 row(s) below added by mlrain @2007-6-7 下午09:51:24
// for: 增加对jar包中配置文件的支持,@since version 1.1.0
Resource[] mappingResources = (Resource[]) resourceList
.toArray(new Resource[0]);
//调用了内部的setMappingLocations方法
setMappingLocations(mappingResources);
} catch (Exception e)
{
logger.error("注册Hibernate配置文件出错!", e);
}
}
private boolean isJarResource(URL url)
{
if (url == null)
return false;
// 1 row(s) below edited by mlrain @2007-7-17 下午01:25:20
// for: 增加对Websphere中wsjar协议的支持
// return URL_PROTOCOL_JAR.equals(url.getProtocol());
//通过url.getProtocol()来判断文件是否来自jar
return URL_PROTOCOL_JAR.equals(url.getProtocol())
|| URL_PROTOCOL_WSJAR.equals(url.getProtocol());
}
}
* Created on 2007-1-9 19:53:40 by mlrain
*/
package cn.com.agree.web.tapestry.presentation.spring;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.mlstudio.util.StringUtil;
//mlrain的实用工具集
import org.mlstudio.util.file.FileListUtil;
import org.mlstudio.util.file.filter.WildcardFileFilter;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.orm.hibernate.LocalSessionFactoryBean;
import org.springframework.util.ResourceUtils;
/**
* 加载指定目录下的Hibernate配置文件的工具类。 <BR>
* 支持多目录。<BR>
* <ul>
* version 1.1.0
* <li>支持直接注册hbm配置文件</li>
* <li>支持jar包中hbm配置文件的注册,但仅限于注册具体的hbm配置文件,不支持目录注册</li>
* </ul>
* <ul>
* version 1.1.1
* <li>增加Websphere中wsjar协议的支持</li>
* </ul>
*
* @author mlrain
* @version 1.1.1, 2007-7-17 13:24:40
*/
//这里LocalSessionFactoryBean是一个Factory用来生成Bean
public class LocalDirectorySessionFactoryBean extends LocalSessionFactoryBean
{
/**
* Logger
*/
private Logger logger = Logger.getLogger(getClass());
/**
* URL协议:jar。
*
* @since version 1.1.0
*/
public static final String URL_PROTOCOL_JAR = "jar";
/**
* URL协议:wsjar
*
* @since version 1.1.1
*/
public static final String URL_PROTOCOL_WSJAR = "wsjar";
/**
* 加载指定目录下的Hibernate配置文件。
*
* @param mappingResourcesDirectory
*/
//在spring配置文件中会配置mappingResourcesDirectory属性,就是指明一个目录
//是一个数组
public void setMappingResourcesDirectories(
String[] mappingResourcesDirectories)
{
try
{
if (mappingResourcesDirectories == null
|| mappingResourcesDirectories.length == 0)
{
logger.error("Hibernate配置文件目录为空!");
return;
}
// 获取各目录下的配置文件
List mappingFiles = new ArrayList();
// 1 row(s) below added by mlrain @2007-6-7 下午09:36:24
// for: 增加对jar包中的配置文件的支持,@since version 1.1.0
List jarMappingFiles = new ArrayList(); // 存放在jar包中的配置文件列表
//只选择*.hbm.xml
FileListUtil.filter = new WildcardFileFilter("*.hbm.xml");
for (int i = 0; i < mappingResourcesDirectories.length; ++i)
{
String thisDir = mappingResourcesDirectories[i];
if (StringUtil.empty(thisDir))
continue;
thisDir = thisDir.trim();
// 获取配置文件目录
ClassLoader cl = Thread.currentThread().getContextClassLoader();
URL url = cl.getResource(thisDir);
// 5 row(s) below added by mlrain @2007-6-7 上午10:39:07
// for: 增加未找到URL的判断,修正抛异常的BUG
if (url == null)
{
logger.warn("指定路径[" + thisDir + "]不存在!");
continue;
}
// 3 row(s) below added by mlrain @2007-6-7 下午09:46:13
// for: 增加对jar包中配置文件的支持,@since version 1.1.0
if (isJarResource(url))
jarMappingFiles.add(url);
else
{
File fDir = ResourceUtils.getFile(url);
// 3 row(s) below added by mlrain @2007-6-7 下午09:48:06
// for: 增加对hbm配置文件的直接注册,@since version 1.1.0
if (fDir.isFile())
mappingFiles.add(fDir);
else
{
// 获取配置文件列表
List list = FileListUtil.getChildrenFile(fDir);
mappingFiles.addAll(list);
}
}
}
// 1 row(s) below edited by mlrain @2007-6-11 下午07:37:00
// for: 只有两种情况都没有找到配置文件时才打印警告信息
if (mappingFiles.size() == 0 && jarMappingFiles.size() == 0)
// if (mappingFiles.size() == 0)
logger.warn("在指定的Hibernate配置文件目录下未找到任何配置文件!");
// 建立配置文件资源数组
// 1 row(s) below edited by mlrain @2007-6-7 下午09:49:43
// for: 增加对jar包中配置文件的支持,@since version 1.1.0
List resourceList = new ArrayList(); // 资源列表
// Resource[] mappingResources = new Resource[mappingFiles.size()];
for (int i = 0; i < mappingFiles.size(); ++i)
{
File file = (File) mappingFiles.get(i);
// 1 row(s) below edited by mlrain @2007-6-7 下午09:49:43
// for: 增加对jar包中配置文件的支持,@since version 1.1.0
resourceList.add(new FileSystemResource(file));
// mappingResources[i] = new FileSystemResource(file);
}
// 5 row(s) below added by mlrain @2007-6-7 下午09:52:47
// for: 增加对jar包中配置文件的支持,@since version 1.1.0
for (int i = 0; i < jarMappingFiles.size(); ++i)
{
URL url = (URL) jarMappingFiles.get(i);
resourceList.add(new UrlResource(url));
}
// 设置给资源变量
// 1 row(s) below added by mlrain @2007-6-7 下午09:51:24
// for: 增加对jar包中配置文件的支持,@since version 1.1.0
Resource[] mappingResources = (Resource[]) resourceList
.toArray(new Resource[0]);
//调用了内部的setMappingLocations方法
setMappingLocations(mappingResources);
} catch (Exception e)
{
logger.error("注册Hibernate配置文件出错!", e);
}
}
private boolean isJarResource(URL url)
{
if (url == null)
return false;
// 1 row(s) below edited by mlrain @2007-7-17 下午01:25:20
// for: 增加对Websphere中wsjar协议的支持
// return URL_PROTOCOL_JAR.equals(url.getProtocol());
//通过url.getProtocol()来判断文件是否来自jar
return URL_PROTOCOL_JAR.equals(url.getProtocol())
|| URL_PROTOCOL_WSJAR.equals(url.getProtocol());
}
}