基于Freemarker的eclipse plugin代码生成器插件开发

固定类型的软件写多了,里面总是有一些复制粘贴改变类名改变量的基础文件,相似程度非常高。作为一名程序员,坚持不多写一行重复代码的精神,写了一个Eclipse的代码生成器插件。插件通过在xml文件中配置的变量信息及模版位置、目标文件位置信息,直接生成目标文件,减少了大量的重复工作。

1.建立一个plug-in with a popup menu工程,引入freemarker.jar,配置popup menu的对应文件扩展名为.coding.xml

2.先写核心的文档生成代码,保证使用main函数可调用。核心的内容是按照freemarker的要求写好 模版路径、模板文件名、目标文件路径、目标文件名、文件所使用的字符集、以及包含所有数据的map

 1 public class CodegenUtil
 2 {
 3   public static void genFile(String templatePath, String templateFileName, String targetPath, String targetFileName, String charset, Map paramMap)
 4     throws IOException, TemplateException
 5   {
 6
 7     File localFile = new File(targetPath, targetFileName);
 8     if (!localFile.exists()) {
 9       if (!localFile.getParentFile().exists())
10         localFile.getParentFile().mkdirs();
11       localFile.createNewFile();
12     }
13     OutputStreamWriter localOutputStreamWriter = new OutputStreamWriter(new FileOutputStream(localFile), charset);
14
15     Configuration freemarkerConfigration = new Configuration();
16     freemarkerConfigration.setDirectoryForTemplateLoading(new File(templatePath));
17
18     Template localTemplate = freemarkerConfigration.getTemplate(templateFileName, charset);
19     localTemplate.process(paramMap, localOutputStreamWriter);
20     localOutputStreamWriter.close();
21
22   }
23 }

3.写Action调用

public void run(IAction action) {        

        //读取选定的配置文件
        IStructuredSelection selection =(IStructuredSelection) this.selection;        

        ConsoleFactory.printToConsole("--------Start Coding--------", true);

        for(Object element:selection.toList()){
            File file = (File)element;
            String fullpath = file.getLocationURI().getPath();

            Map<String, String> params;
            List<Map<String,String>>  templateMapList=new ArrayList<Map<String,String>>(); 

            try {

                String configfilepath=fullpath.substring(1);
                ConsoleFactory.printToConsole("...load coding config "+configfilepath, true);

                params = XmlUtil.getVars(configfilepath);
                templateMapList=XmlUtil.getTemplates(configfilepath);

                for(Map<String ,String > templateMap:templateMapList){
                    String templateFilePath=templateMap.get(XmlUtil.TEMPLATE_PATH);
                    String templateFileName=templateMap.get(XmlUtil.TEMPLATE_NAME);
                    String targetFilePath=templateMap.get(XmlUtil.TARGET_PATH);
                    String targetFileName=templateMap.get(XmlUtil.TARGET_NAME);

                    ConsoleFactory.printToConsole("... ... coding ... "+targetFilePath+"\\"+targetFileName, true);

                    params.put(XmlUtil.TEMPLATE_PATH, templateFilePath);
                    params.put(XmlUtil.TEMPLATE_NAME, templateFileName);
                    params.put(XmlUtil.TARGET_PATH, targetFilePath);
                    params.put(XmlUtil.TARGET_NAME, targetFileName);                    

                    String charset=params.get(XmlUtil.CHARSET);    

                    CodegenUtil.genFile(templateFilePath,templateFileName,targetFilePath,targetFileName,charset,params);        

                }            

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        ConsoleFactory.printToConsole("--------Finish Coding--------", true);

    }

4.使用System.out.print所打印的东西在插件的运行环境下是不显示的,ConsoleFactory是我写的一个控制台输出类,调用了Eclipse的控制台,主要用来在使用时给出相关的代码生成提示。

public class ConsoleFactory implements IConsoleFactory {

    private static MessageConsole console=new MessageConsole("",null);
    static boolean exists=false;

    @Override
    public void openConsole() {
        showConsole();
    }

    private static void showConsole(){
        if(console!=null){
            IConsoleManager manager=ConsolePlugin.getDefault().getConsoleManager();
            IConsole[] existing = manager.getConsoles();

            exists=false;
            for(int i=0;i<existing.length;i++){
                if(console==existing[i]){
                    exists=true;
                }
            }
            if(!exists){
                manager.addConsoles(new IConsole[]{console});
            }

        }
    }

    public static void closeConsole(){
        IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
        if(console!=null){
            manager.removeConsoles(new IConsole[]{console});
        }
    }

    public static MessageConsole getConsole(){
        showConsole();
        return console;
    }

    public static void printToConsole(String message , boolean activate){
        MessageConsoleStream printer = ConsoleFactory.getConsole().newMessageStream();
        printer.setActivateOnWrite(activate);
        printer.println(message);
    }

}

5.主要内容完毕。使用时先配好xml文件,如下示例。在Eclipse中选中.coding.xml文件,右键菜单 [代码生成器]-->[生成代码]

<?xml version="1.0" encoding="utf-8" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <variables>
        <variable name="developer" value="PennPeng" />
        <variable name="charset" value="utf-8" />
        <variable name="class" value="CodeGen" />
        <variable name="name" value="姓名" />
        <variable name="age" value="年龄" />
    </variables>

    <templates>
        <template>
            <variable name="templatepath" value="E:\CodeGenTest\template" />
            <variable name="templatename" value="a.ftl" />
            <variable name="targetpath" value="E:\CodeGenTest" />
            <variable name="targetname" value="CodeGen.java" />
        </template>
        <template>
            <variable name="templatepath" value="E:\CodeGenTest\template" />
            <variable name="templatename" value="b.ftl" />
            <variable name="targetpath" value="E:\CodeGenTest" />
            <variable name="targetname" value="CodeGen2.java" />
        </template>
    </templates>
</config>

还有很多需要扩展完善的地方,比如数据库的自动支持、各类型文档的生成。

项目地址 https://github.com/buaawp/codegen

时间: 2025-01-03 19:46:54

基于Freemarker的eclipse plugin代码生成器插件开发的相关文章

OSGi与Maven、Eclipse PlugIn的区别

osgi 的框架的 apache felix   equinox osgi的bundle 的概念maven 的  module  的   Eclipse 的 PlugIn  的区别.... OSGi与Maven Maven也具有模块化系统的特征:但是它只是一个编译时工具,而不是运行时框架.Maven并不是OSGi的竞争者,而是OSGi的一个补充. 通过在pom.xml中指定所依赖jar包的名称.版本号,Maven就能在编译时自动下载正确的jar文件,并部署到classpath中. 然而Maven

基于 SWTBot 进行 Eclipse GUI 自动化测试

背景简介 在软件开发领域,持续集成和部署对于软件测试自动化提出了越来越高的要求,基于 Eclipse 应用在这一需求中仍然占据重要的组成部分.目前主流的测试自动化工具主要以录制回放的功能为主,辅助以脚本的方式实现.然而,基于此的测试方法往往具有测试用例维护复杂,测试过程容易失败的问题,这直接影响了测试效率.SWTBot 作为 Eclipse 官网推荐的自动化测试工具,提供了专业的类库以及扩展点,在 Eclipse 应用的自动化测试中具有先天的优势. SWTBot 是基于 Eclipse SWT

GNU ARM Eclipse Plug-in

sourceforge的一个开源项目GNU ARM Eclipse Plug-in,适合Eclipse编译ARM,代替原来的命令行界面vim,累死Windows的集成开发环境,下面是主页链接很有用 http://sourceforge.net/projects/gnuarmeclipse/ GNU ARM Eclipse Plug-in,布布扣,bubuko.com

2.1 Hadoop Eclipse Plugin 配置及安装

Hadoop Eclipse 开发工具 主要分为 1.根据Hadoop版本生成插件 2.安装Hadoop Eclipse插件 3.配置Hadoop目录 4.配置Hadoop连接 5.新一个MapReduce工程 WordCount.java MapReduce--WordCount问题总结 参考:http://blog.sina.com.cn/s/blog_7fcb1aef0100zpux.html 正成功输入出后信息: 14/05/21 23:06:47 INFO input.FileInpu

The J-Link hardware debugging Eclipse plug-in

Quicklinks If you already know what are the features of the new plug-in and just want to know how to install/use it, you can directly skip to: J-Link install J-Link plug-in usage Why a new plug-in? Until now, debugging with the J-Link probe in Eclips

Installing the Eclipse Plugin

Installing the Eclipse Plugin Android offers a custom plugin for the Eclipse IDE, called Android Development Tools (ADT). This plugin provides a powerful, integrated environment in which to develop Android apps. It extends the capabilities of Eclipse

基于jquery的邮箱输入联想插件开发

js代码: /*create by code_bunny 20140701 [email protected] https://github.com/OOP-Code-Bunny */ (function ($) { $.fn.autoComplate = function (opts) { this.each(function () { init.call(this, opts); }); return this; }; function init(opts) { var defaultOpt

Eclipse Plugin Installation and Windows User Access Control

I make Eclipse Plugins and I sell them to developers using Eclipse. Most of the visitors to my web site are not Eclipse experts. One of my key challenges is getting them to successfully install and try my software. It sounds simple, but Eclipse plugi

How to setup Eclipse with WinAVR and the Eclipse plugin AVR-eclipse

源:How to setup Eclipse with WinAVR and the Eclipse plugin AVR-eclipse 中文参考: Arduino的Eclispe开发环境的搭建 Windows下使用Eclipse开发Arduino程序