Codegen

Codegen은 코드 생성툴을 제작할 수 있도록 도와주는 플러그인이다. xml파일을 바탕으로 팝업 wizard를 화면에 보여주고 wizard의 입력과 template를 바탕으로 코드를 생성할 수 있게 해준다. 제공되는 xml과 template을 바탕으로 간단하게 Anyframe 코드를 생성할 수도 있고, 직접 xml과 template파일을 작성하여 프로젝트에 맞는 코드 생성툴을 제작할 수도 있다.

Codegen은 3개의 플러그인으로 구성되어 있다.
  • anyframe.plugins.Codegen - Codegen 엔진
  • anyframe.plugins.Codegen.templates - Anyframe코드 생성을 위한 xml과 template파일
  • anyframe.plugins.Codegen.db - SQLExplore와 연동을 위한 플러그인

화면 구성

Codegen을 구성하는 UI로는 코드젠 템플릿을 보여주는 View와 인코딩 및 템플릿 변수 설정을 위한 Preference page가 있다.


Codegen View



Preference page

template을 이용한 코드 생성

Codegen을 이용하여 DB Table 기반 Anyframe 코드를 생성해 보도록 하겠다.


툴바의 Codegen icon을 클릭하여 Codegen View를 연다.




SQLExplorer의 Connection View에서 사용할 DB와 연결한다.


SQLExplorer의 Database Structure View에서 사용할 테이블에서 우클릭하여 Connect Codegen DB 메뉴를 선택한다.


Codegen View가 열리면 CRUD App메뉴 더블클릭하여 Wizard를 오픈한다. 이 Wizard의 설정은 anyframe.plugins.Codegen.templates 플러그인의 \wizards\UserDefinedService\3 - CRUD App폴더에서 확인할 수 있다.


SQLExplorer 에서 선택된 테이블을 선택한다.


Table명을 기반으로 한 값들이 자동으로 셋팅이 되며, 나머지 필드에 적절한 값을 입력해 주면 된다.






위와 같은 파일들이 생성된 것을 확인할 수 있다. 주석에 따라 struts-config파일의 셋팅을 해준다.


생성된 코드를 실행한 화면이다. \wizards\UserDefinedService\3 - CRUD App 폴더의 템플릿을 수정하면 프로젝트에 맞는 적절한 화면으로 손쉽게 바꿀 수 있다.

새 wizard 생성

기존에 제공되는 템플릿 외에 새로운 템플릿을 만들 수도 있다. 코드젠 템플릿은 아래의 파일들로 구성되어 있다.
wizards.xml - Codegen View에 나타날 템플릿 목록을 정의한 파일
wizard.xml - wizard의 컴포넌트들을 정의한 파일
event.gv - wizard의 이벤트를 정의한 파일
template.vm - 생성소스의 기반이 되는 템플릿 파일

wizard 그리기

Codegen 엔진에서 xml파일을 읽어 wizard를 그린다. xml파일의 구조는 아래와 같다.


Wizard는 여러장의 페이지로 구성되며 페이지 안에 텍스트필드, 콤보등의 컴포넌트가 위치하게 된다.
Tag
Attributes
|<Codegen>
|----<wizard>
|--------<title>
|--------<component-page>* required="true|false"
condition="${component name}"
|------------<description>
|------------<image>
|------------<include> file="{relative path to include file}"
|------------<textfield>* name="{unique id}"
label=""
required="true|false"
extensions="txt|*"
radio="{listener component name}
check="number|ip"
default-value=""
value="*|#{preference var name}"
onChange="{relative path to groovy script file}"
|------------<checkbox>* name="{unique id}"
label=""
radio="{listener component name}"
value="*|#{preference var name}"
|------------<combo>* name="{unique id}"
label=""
value="*|#{preference var name}
edit="true|false"
radio="{listener component name}"
listener="true|false"
check="number|ip"
onChange="{relative path to groovy script file}"
|----------------<elements>
|--------------------<option>* value=""
|------------<radio>* name="{unique id}"
label=""
radio="{listener component name}
listener="true|false"
|----------------<elements>
|--------------------<option>* value=""
|------------<file>* name="{unique id}"
label=""
required="true|false"
extensions="txt|*"
external="true|false"
radio="{listener component name}"
fullpath="true|false"
|------------<type>* name="{unique id}"
label=""
required="true|false"
radio="{listener component name}"
|------------<container>* name="{unique id}"
label=""
type="folder|package|source|srcpackage"
external="true|false"
required="true|false"
radio="{listener component name}"
|------------<group>* name="{unique id}"
label=""
checkbox={radio or combo component name}"
|--------<model-page> type="jdbc|sql|pojo"
required="true|false"
onCreate="{relative path to groovy script file}"
|------------<description>
|--------<table-page>* required="true|false"
|------------<description>
|------------<columns>
|----------------<column>*
|----------------<lines>
|--------------------<linhas>
|------------------------<var>*
|------------------------<combo>*
|----------------------------<elements>
|--------------------------------<option>* value=""
|--------<output>
|------------<template> component="{unique id}"
expression="{component name}"
velocity="relative path to vm file"
extension="txt|*"
container="{container component name}"
|----------------<condition>* variable="{component name}"
value=""

이벤트 제어하기

wizard에 대한 이벤트 조작을 위해 이벤트 스크립트를 작성할 수 있다.


combo는 onChange이벤트를 발생시킬 수 있으며 값으로 이벤트파일의 위치를 지정해준다. 이벤트 파일에서는 component.get("컴포넌트명")을 통해 컴포넌트에서 값을 읽어오거나 컴포넌트의 값을 변경해 줄 수 있다.

템플릿 작성

Codegen엔진은 wizard의 입력을 기반으로 template의 변수들을 치환하여, 최종 코드를 생성해 낸다.


템플릿 파일은 Velocity 문법을 따른다. xml파일에 정의된 컴포넌트 명은 템플릿파일에서 변수명으로 사용할 수 있다. 최종 생성파일과 템플릿은 xml의 output에 지정해 준다.
Component(variables)
Methods
textfield Object value
String extensions
void setUIValue(String)
checkbox Object value
boolean isChecked()
combo Object value
org.eclipse.swt.widgets.Combo combo
void addUIValue(String)
radio Object value
file Object value
String extensions
boolean isReturnFullPath()
type Object value
container Object value
String _package
String _dirName
group
model-page type="jdbc"
($model)
List fields
model-page type="jdbc"
($model.fields)
String name
String capName
String uncapName
String javaName
String typeName
boolean isPK()
boolean isNullable()
boolean isFK()
String javaClass.name()
String javaClass.simpleName()
String comments
model-page type="pojo"
($model)
List fields
String elementName
String fullyName
String package
String capName
String uncapName
String javaName
String fieldName
model-page type="pojo"
($model.fields)
String type
String capName
String uncapName
String name
table-page
($model)
List items
table-page
($model.items)
String getText(int)
Velocity Utils
Velocity variables
Util Class
stringUtils org.apache.commons.lang.StringUtils
date java.util.Date
dateTool org.apache.velocity.tools.generic.DateTool
mathTool org.apache.velocity.tools.generic.MathTool
numberTool org.apache.velocity.tools.generic.NumberTool
renderTool org.apache.velocity.tools.generic.RenderTool
escapeTool org.apache.velocity.tools.generic.EscapeTool
alternatorTool org.apache.velocity.tools.generic.AlternatorTool
valueParserTool org.apache.velocity.tools.generic.ValueParser
listTool org.apache.velocity.tools.generic.ListTool
sortTool org.apache.velocity.tools.generic.SortTool
iteratorTool org.apache.velocity.tools.generic.IteratorTool

Codegen View에 등록하기

새로운 템플릿이 완성이 되었으면 wizards.xml을 수정하여 Codegen View에 나타나게 할 수 있다.