com.frameworkset.orm.doclet.HandlerORMapping Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of bboss-persistent Show documentation
Show all versions of bboss-persistent Show documentation
bboss is a j2ee framework include aop/ioc,mvc,persistent,taglib,rpc,event ,bean-xml serializable and so on.http://www.bbossgroups.com
The newest version!
/*
* Copyright 2008 biaoping.yin
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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 com.frameworkset.orm.doclet;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.frameworkset.orm.ORMappingException;
import com.frameworkset.orm.ORMappingManager;
import com.frameworkset.orm.engine.model.Column;
import com.frameworkset.orm.engine.model.Database;
import com.frameworkset.orm.engine.model.Table;
import xjavadoc.XClass;
import xjavadoc.XDoc;
import xjavadoc.XField;
import xjavadoc.XJavaDoc;
import xjavadoc.XTag;
import xjavadoc.filesystem.FileSourceSet;
/**
* Title: HandlerORMapping
*
* Description: 初始化解析系统中所有的javabean中与数据库关系表之间存在的对象属性和表字段的映射关系.
* 分析o/r mapping元模型,并且对元模型进行持久化
* 根据以下规则进行解析:
* 在javabean的类注释中定义数据库名称和表名称,这种定义是可选的
* 在javabean的属性定义的注释中定义字段对应的表的字段,这种定义是必须的
*
*
* Copyright: Copyright (c) 2005
*
* Company:
*
* @author biaoping.yin
* @version 1.0
*/
public class HandlerORMapping {
private static Logger log = LoggerFactory.getLogger(HandlerORMapping.class);
private final XJavaDoc _xJavaDoc = new XJavaDoc();
private File srcDir;
private Collection allClasses = null;
public static void main(String[] args) {
HandlerORMapping handlerormapping = new HandlerORMapping();
// handlerormapping.init("src");
// handlerormapping.execute();
String str = null;
try {
str = handlerormapping.restoreFromXml("d:/schemas").getAnonymityDatabase().
toString();
} catch (ORMappingException ex) {
}
log.debug(str);
}
/**
* 根据传入的源文件的相对根目录(绝对目录通过保存在系统属性中basedir+relativeSrcdir而得),
* 初始化xjavadoc,将所有的java文件转换成XClass对象,为解析java对象中属性与数据库表之间得关系做准备
* @param relativeSrcdir String
*/
public void init(String relativeSrcdir)
{
long start = System.currentTimeMillis();
srcDir = new File(System.getProperty("basedir"),relativeSrcdir);
log.debug("Load java source in " + srcDir.getAbsolutePath());
_xJavaDoc.reset(true);
_xJavaDoc.addSourceSet(new FileSourceSet(srcDir));
allClasses = _xJavaDoc.getSourceClasses();
long end = System.currentTimeMillis();
log.debug("Load java source complete! Total cost:" + (end - start)/1000 + " seconds");
}
/**
* 根据传入的源文件的根目录,
* 初始化xjavadoc,将所有的java文件转换成XClass对象,为解析java对象中属性与数据库表之间得关系做准备
* @param srcdir String
*/
public void initByCompletePath(String srcdir)
{
long start = System.currentTimeMillis();
log.debug("Load java source in " + srcdir);
srcDir = new File(srcdir);
_xJavaDoc.reset(true);
_xJavaDoc.addSourceSet(new FileSourceSet(srcDir));
allClasses = _xJavaDoc.getSourceClasses();
long end = System.currentTimeMillis();
log.debug("Load java source complete! Total cost:" + (end - start)/1000 + " seconds");
}
/**
* 解析开始
*/
public void execute()
{
ORMappingManager.getInstance().lock();
log.debug("Handler ORMapping start...");
long start = System.currentTimeMillis();
if(allClasses == null)
{
log.debug("No java source in dir:" + srcDir.getAbsoluteFile());
return;
}
Iterator it = allClasses.iterator();
XClass xclass = null;
for(;it.hasNext();)
{
Table table = null;
xclass = (XClass)it.next();
//如果xclass对应的类没有指定表的字段信息,继续进行下一次循环
if(!needHandler(xclass))
{
//log.debug("ignore parseing " + xclass.getQualifiedName() + ".");
continue;
}
log.debug("Start parseing " + xclass.getQualifiedName() + ".....");
Database dataBase = null;
String dbName = null;
String dbType = null;
String tableName = null;
String tableSchema = null;
XDoc doc = xclass.getDoc();
XTag databaseTag = doc.getTag(TagConst.TAG_DATABASE);
XTag tableTag = doc.getTag(TagConst.TAG_TABLE);
if(databaseTag == null && tableTag == null)
dataBase = ORMappingManager.getInstance().creatAnonymityDataBase();
else
{
if (databaseTag != null) {
dbName = databaseTag.getAttributeValue(TagConst.
TAG_DATABASE_NAME);
dbType = databaseTag.getAttributeValue(TagConst.
TAG_DATABASE_TYPE);
tableName = databaseTag.getAttributeValue(TagConst.
TAG_DATABASE_TABLE);
}
if(tableTag != null)
{
tableName = tableTag.getAttributeValue(TagConst.
TAG_TABLE_NAME);
//保留属性
tableSchema = tableTag.getAttributeValue(TagConst.
TAG_TABLE_SCHEMA);
}
//创建数据库实例
//如果没有指定数据库标签,但是表标签指定了,则根据表标签的属性创建数据库实例
//否则
if (databaseTag == null && tableTag != null) {
if (tableSchema != null)
dataBase = ORMappingManager.getInstance().creatDataBase(tableSchema);
else
dataBase = ORMappingManager.getInstance().creatDefaultDataBase();
} else
dataBase = ORMappingManager.getInstance().creatDataBase(dbName, dbType);
}
try { //创建表实例
log.debug("Parseing table ....." + tableName);
table = ORMappingManager.getInstance().creatTable(tableName);
table.setDatabase(dataBase);
table.setBaseClass(xclass.getSuperclass().getQualifiedName());
table.setJavaName(xclass.getQualifiedName());
table.setPackage(xclass.getContainingPackage().getName());
Iterator xFields = xclass.getFields().iterator();
for(;xFields.hasNext();)
{
XField field = (XField)xFields.next();
XDoc fdoc = field.getDoc();
if(fdoc != null)
{
XTag columnTag = fdoc.getTag(TagConst.TAG_COLUMN);
if(columnTag == null)
continue;
String columnName = columnTag.getAttributeValue(TagConst.TAG_COLUMN_NAME);
String columnDescription = columnTag.getAttributeValue(TagConst.TAG_COLUMN_DESCRIPTION);
String columnPrimarykey = columnTag.getAttributeValue(TagConst.TAG_COLUMN_PRIMARYKEY);
String columnRequired = columnTag.getAttributeValue(TagConst.TAG_COLUMN_REQUIRED);
String columnType = columnTag.getAttributeValue(TagConst.TAG_COLUMN_TYPE);
Column column = ORMappingManager.getInstance().creatColumn(columnName);
column.setTable(table);
column.setDescription(columnDescription);
if(columnPrimarykey != null)
column.setPrimaryKey(new Boolean(columnPrimarykey).booleanValue());
if(columnRequired != null)
column.setNotNull(new Boolean(columnRequired).booleanValue());
column.setType(columnType);
column.setJavaName(field.getName());
log.debug("Parseing table column '" + columnName + "' with field '" + field.getName() + "'");
column.setJavaType(field.getType().getQualifiedName());
table.addColumn(column);
}
}
//table.setDatabase(dataBase);
//将表实例添加到数据库中
dataBase.addTable(table);
//System.out.println(dataBase);
log.debug("Complete parseing " + xclass.getQualifiedName() + ".");
} catch (ORMappingException ex) {
ex.printStackTrace();
}
}
ORMappingManager.getInstance().unlock();
long end = System.currentTimeMillis();
log.debug("Complete parseing all java sources! Total cost:" + (end - start) + " ms");
}
/**
* 判断是否需要解析xclass中的数据库相关信息
* @param xclass XClass
* @return boolean
*/
private boolean needHandler(XClass xclass)
{
boolean need = false;
if(xclass == null || xclass.getFields() == null || xclass.getFields().size() == 0)
need = false;
else
{
Iterator fields = xclass.getFields().iterator();
for(;fields.hasNext();)
{
XField field = (XField)fields.next();
if(field.getDoc().getTag(TagConst.TAG_COLUMN) != null)
{
need = true;
break;
}
}
}
return need;
}
private String getPackage(XClass xclass)
{
String name = xclass.getModifiers();
return null;
}
/**
* cache
*/
public boolean cache() {
try {
ORMappingManager.getInstance().cache();
return true;
} catch (IOException ex) {
return false;
}
}
/**
* cache
*/
public boolean cache(String cachePath) {
try {
ORMappingManager.getInstance().cache(cachePath);
return true;
} catch (IOException ex) {
return false;
}
}
/**
* restore
*/
public ORMappingManager restore() {
try {
return ORMappingManager.restore();
} catch (ClassNotFoundException ex) {
return null;
} catch (IOException ex) {
return null;
}
}
/**
* restore from path
*/
public ORMappingManager restore(String path) {
try {
return ORMappingManager.restore(path);
} catch (ClassNotFoundException ex) {
return null;
} catch (IOException ex) {
return null;
}
}
/**
* 将数据库存放在目录xmlDir中的schema文件转换成
* @param xmlDir String
* @return ORMappingManager
*/
public boolean cachetoXml(String xmlDir)
{
try {
ORMappingManager.getInstance().cacheToXml(xmlDir);
return true;
} catch (ORMappingException ex) {
return false;
}
}
/**
* 从存放在目录xmlDir中的schema文件转换成数据库
* @param xmlDir String
* @return ORMappingManager
*/
public ORMappingManager restoreFromXml(String xmlDir)
{
return ORMappingManager.getInstance().restoreFromXml(xmlDir);
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy