Arrow 一个自动化生成代码的工具

版本变更

1.0

2002-10-29

Fish

1.0.0.1 2002-10-30 Fish

 

          Java带给我们前所未有的开发体验,我们的开发更加灵活和清晰,代码的重用性和可扩展性更加的优秀。但是同时也增加了我们开发的复杂性和开发的周期。数据库的应用在现在仍然是项目开发中最常见的,如何使数据库的应用更加的迅速完成,如何将数据模型映射成java的类,这就是Arrow所要解决的。

 

相关文档 :

        API 文档

     安装

              下载Arrow包,是一个rar文件,解压缩后包括这么几个目录

              build.xml               编译和运行exampleant脚本

l         ant genjar       编译arrow

l         ant testmenu   运行example 生成的文件在./Examples/out目录下

              /doc                      Arrow 的文档和Api doc

              /lib                        Arrow将要用到的lib

l         commons-beanutils.jar

l         commons-collections.jar

l         commons-logging.jar

l         jakarta-oro-2.0.6.jar

l         jalopy-1.0b8.jar                                  格式化代码API

l         jdom.jar

l         junit.jar

l         log4j-1.2.7.jar

l         velocity-1.3-rc1.jar                             Arrow的模版引擎

l         w3cdom2.jar

l         xalan.jar

l         xerces.jar

 

              /resource                      Arrow将要用到的配置文件和模版文件

l         design.xml             Arrow的定义文件,定义数据库表的信息

l         datatype.xml          Arrow的数据类型和java,数据库字段的类型对应

l         /template               模版目录

ü         DbObjectIteratorSourceTemplate.vm

ü         DbObjectSourceFactoryTemplate.vm

ü         DbObjectSourceTemplate.vm

ü         ObjectSourceFactoryTemplate.vm

ü         ObjectSourceTemplate.vm

              /other                           为了方面模版开发,我定义了utralEdit的高亮显示文件,如果需要,可以覆盖utralEdit中的这个文件即可

                     WORDFILE.TXT

              /src                              Arrow源代码

              /examples

                     /out                       例子文件的输出目录

                     /menu                   例子文件的运行环境和Junit测试脚本

      

     Arrow项目

      Arrow 简介

       本质上说Arrow就是根据配置文件来自动生成java的代码,这个配置文件中需要描述的仅仅是数据库中表的一些信息。例1 描述了一个简单的配置文件

      

<?xml version="1.0" encoding="gb2312"?>

<entitygroup>

         <entity package="com.huahang.tj.app" name="menu" desc="菜单" allowadd="true" allowdel="true" allowupdate="true" factory="true">

                   <field name="menu_id" type="long" length="10" isnull="no" desc="菜单编号"/>

                   <field name="menu_name" type="string" length="20" isnull="no" desc="菜单名称"/>

                   <field name="menu_desc" type="string" length="200" isnull="no" desc="菜单描述"/>

                   <field name="menu_link" type="string" length="1000" isnull="yes" desc="菜单的连接"/>

                   <field name="seq" type="long" length="5" isnull="yes" desc="菜单显示的顺序"/>

                   <key name="menu_id" sequence="true"/>

         </entity>

</entitygroup>

1是一个菜单表的信息

      

       Arrow 执行后会生成5个文件他们是,遵循jivebean的模式,他们是Menu.java , MenuFactory.java , DbMenu.java , DbMenuFactory.java

       这几个bean可以完成对Menu表的增加,删除,修改,查询等工作。例如我们想要创建一个新的Menu我们可以这么写:

String menu_name = "testmenuname";

String menu_desc = "testmenudesc";

String menu_link = "testmenulink";

long seqid = 1;

 

MenuFactory mf = MenuFactory.getInstance();

Menu menu = null;

try {

         menu = mf.createMenu(menu_name, menu_desc, menu_link, seqid);

} catch (Exception e) {

}

2 创建menu

      

     在Arrow的配置文件中还可以定义表间的关系,执行后会生成对应的对象的关系

       

<relations>
         <relation type="onetomany" parent="menu" child="menuopt">
                  <relationkey parentfield="menu_id" childfield="menu_id"/>
         </relation>

</relations>

例3 定义关系

      

     生成的代码后除了在例2中的5个文件外还会多出Menuopt.java , DbMenuopt.java , DbMenuoptIterator.java . 当我们要为一个menu 增加子menu时,

     我们可以使用下面的代码

       

MenuFactory mf = MenuFactory.getInstance();
try {
         Menu menu = mf.getMenu(this.menuid);
         Menuopt menuopt =menu.createMenuopt("ARROW","自动化生成代码的工具","http://arrow.gro.clinux.org/",1);

} catch (Exception e) {
         fail(e.toString());
}

例4 创建子菜单

   

    Arrow的模版

        为了实现例2 的代码,我们需要什么呢?

        MenuFactory.java , 这个类有一个getInstance的方法,返回是一个MenuFactory 对象,这个主要实现了Factory的模式,实际返回的是DbMenuFactory的一个实例,下面的创建菜单等操作,是在DbMenuFactory中实现的。

        首先看一下MenuFactory的getInstance方法

       

private static MenuFactory factory = null;
private static Object initLock = new Object();
private static String className = "com.huahang.tj.app.database.DbMenuFactory";

 

public static MenuFactory getInstance() {
         if (factory == null) {
                  synchronized (initLock) {
                           if (factory == null) {
                                    if (className != null) {
                                             try {
                                                      //Load the class and create an instance.
                                                      Class c = Class.forName(className);
                                                      factory = (MenuFactory) c.newInstance();
                                                      return factory;
                                             } catch (Exception e) {
                                                      System.err.println("Failed to load Menu class " + className + ". Rotor cannot function normally.");e.printStackTrace();
                                                      return null;
                                             }
                                    } else {
                                             System.err.println("Error: could not create Menu " + "because the Menu classname has not been set. ");
                                             return null;
                                    }
                           }
                  }
         }
         return factory;
}
 

例5 MenuFactory.java

        这是由Arrow生成的代码,功能是创建了一个DbMenuFactory的实例,那么Arrow是如何生成这段代码的呢?下面来看一下模版

##-----------------------------------------------------------
#**
         GetInstance方法
*#
#macro( getinstance)

         public static ${managername}Factory getInstance(){
                  if (factory == null) {
                           synchronized(initLock) {
                                    if (factory == null) {
                                             if (className != null) {
                                                      try {
                                                               //Load the class and create an instance.
                                                               Class c = Class.forName(className);
                                                               factory = (${managername}Factory)c.newInstance();
                                                               return factory;
                                                      }catch (Exception e) {
                                                               System.err.println("Failed to load $managername class "+ className + ". Rotor cannot function normally.");
                                                               e.printStackTrace();
                                                               return null;
                                                      }
                                             }else {
                                                      System.err.println("Error: could not create $managername " +"because the $managername classname has not been set. ");
                                                      return null;
                                             }
                                    }
                           }
                  }
                  return factory;
         }
#end

 

例5 MenuFactory模版