初始化

vsxingchen
vsxingchen 9 months ago
parent 511839ac99
commit cb5c857001

@ -0,0 +1,33 @@
<?xml version="1.0"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.jwsaas</groupId>
<artifactId>food-parent</artifactId>
<version>2.0.0</version>
</parent>
<artifactId>food-pdm-tools</artifactId>
<name>food-pdm-tools</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<freemarker.version>2.3.23</freemarker.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!-- freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>${freemarker.version}</version>
</dependency>
</dependencies>
</project>

@ -0,0 +1,201 @@
package com.jwsaas.powerdesign;
import java.io.File;
import java.io.FileWriter;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.jwsaas.powerdesign.parse.PDMParser;
import com.jwsaas.powerdesign.parse.bean.Category;
import com.jwsaas.powerdesign.parse.bean.Project;
import com.jwsaas.powerdesign.parse.bean.Table;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
public class Generate {
public static void main(String[] args) throws Exception {
String currentPath = PDMParser.class.getResource("/").getPath();
File file = new File(currentPath);
String pdmFile = file.getParentFile().getParentFile().getParentFile() + File.separator + "food-document" + File.separator + "db" + File.separator + "food_v2.0.pdm";
Project project = PDMParser.parse(new File(pdmFile));
for (Category category : project.getCategoryList()) {
List<Table> tables = category.getTableList();
for (Table table : tables) {
String comment = category.getComment();
if (StringUtils.isNotEmpty(comment) && comment.indexOf("#") > 0 && comment.split("#").length == 3) {
String[] str = comment.split("#");
table.setSign(str[0]);
table.setBasePackage(str[1]);
table.setSignPackage(str[2]);
} else {
// System.out.println(category.getName() +
// "-->Comment没有定义或者格式错误");
}
}
}
// 生成Entity、Dao、Service
generate(project.getTableList());
generateSpring(project);
}
protected static void generate(List<Table> tables) {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
try {
String currentPath = PDMParser.class.getResource("/").getPath();
File file = new File(currentPath + File.separator + "template");
cfg.setDirectoryForTemplateLoading(file);
cfg.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_21));
cfg.setOutputEncoding("utf-8");
// TODO 如何做国际化。
cfg.setDefaultEncoding("utf-8");
cfg.setNumberFormat("#");
cfg.setCacheStorage(new freemarker.cache.MruCacheStorage(20, 250));
for (Table table : tables) {
File out = new File(currentPath).getParentFile().getParentFile();
String filePath = out.getPath() + File.separator + "src" + File.separator + "generate" + File.separator + (StringUtils.isNotEmpty(table.getSign()) ? (table.getSign() + File.separator) : "");
System.out.println(table.getName() + "," + table.getBasePackage());
// 判断entity包名是否存在不存在新建
String packageName = table.getBasePackage() + ".entity" + ((StringUtils.isNotEmpty(table.getSign()) && !"shared".equals(table.getSign())) ? ("." + table.getSign()) : "");
File dir = new File(filePath + packageName);
if (!dir.exists()) {
dir.mkdirs();
}
// 生成Entity的类
Template template = cfg.getTemplate("entity.java.ftl");
FileWriter writer = new FileWriter(filePath + packageName + File.separator + table.getScode() + ".java");
template.process(table, writer);
// 生成Dao的接口
template = cfg.getTemplate("dao.java.ftl");
packageName = table.getBasePackage() + ".dao" + ((StringUtils.isNotEmpty(table.getSign()) && !"shared".equals(table.getSign())) ? ("." + table.getSign()) : "");
dir = new File(filePath + packageName);
if (!dir.exists()) {
dir.mkdirs();
}
writer = new FileWriter(filePath + packageName + File.separator + table.getScode() + "Dao.java");
template.process(table, writer);
// 生成Dao的实现
template = cfg.getTemplate("dao.impl.java.ftl");
packageName = table.getBasePackage() + ".dao" + ((StringUtils.isNotEmpty(table.getSign()) && !"shared".equals(table.getSign())) ? ("." + table.getSign()) : "") + ".impl";
dir = new File(filePath + packageName);
if (!dir.exists()) {
dir.mkdirs();
}
writer = new FileWriter(filePath + packageName + File.separator + table.getScode() + "DaoImpl.java");
template.process(table, writer);
// 生成Service的接口
template = cfg.getTemplate("service.java.ftl");
packageName = table.getBasePackage() + ".service" + ((StringUtils.isNotEmpty(table.getSign()) && !"shared".equals(table.getSign())) ? ("." + table.getSign()) : "");
;
dir = new File(filePath + packageName);
if (!dir.exists()) {
dir.mkdirs();
}
writer = new FileWriter(filePath + packageName + File.separator + table.getScode() + "Service.java");
template.process(table, writer);
// 生成Service的实现
template = cfg.getTemplate("service.impl.java.ftl");
packageName = table.getBasePackage() + ".service" + ((StringUtils.isNotEmpty(table.getSign()) && !"shared".equals(table.getSign())) ? ("." + table.getSign()) : "") + ".impl";
dir = new File(filePath + packageName);
if (!dir.exists()) {
dir.mkdirs();
}
writer = new FileWriter(filePath + packageName + File.separator + table.getScode() + "ServiceImpl.java");
template.process(table, writer);
// 生成MyBatis的Mapper文件
template = cfg.getTemplate("mapper.xml.ftl");
dir = new File(filePath + "mybatis");
if (!dir.exists()) {
dir.mkdirs();
}
writer = new FileWriter(filePath + "mybatis" + File.separator + table.getScode() + "Mapper.xml");
template.process(table, writer);
}
} catch (Exception e) {
e.printStackTrace();
}
}
protected static void generateSpring(Project project) {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_21);
try {
String currentPath = PDMParser.class.getResource("/").getPath();
File file = new File(currentPath + File.separator + "template");
cfg.setDirectoryForTemplateLoading(file);
cfg.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_21));
cfg.setOutputEncoding("utf-8");
// TODO 如何做国际化。
cfg.setDefaultEncoding("utf-8");
cfg.setNumberFormat("#");
cfg.setCacheStorage(new freemarker.cache.MruCacheStorage(20, 250));
File out = new File(currentPath).getParentFile().getParentFile();
String filePath = out.getPath() + File.separator + "src" + File.separator + "generate" + File.separator;
// 生成Spring的服务暴露配置文件
Template template = cfg.getTemplate("spring.service.xml.ftl");
File dir = new File(filePath + "spring");
if (!dir.exists()) {
dir.mkdirs();
}
FileWriter writer = new FileWriter(filePath + "spring" + File.separator + "spring-service.xml");
template.process(project, writer);
// 生成Spring的服务引用配置文件
template = cfg.getTemplate("spring.reference.xml.ftl");
dir = new File(filePath + "spring");
if (!dir.exists()) {
dir.mkdirs();
}
writer = new FileWriter(filePath + "spring" + File.separator + "spring-reference.xml");
template.process(project, writer);
// 生成Spring的单元测试直连配置文件
template = cfg.getTemplate("spring.test.xml.ftl");
dir = new File(filePath + "spring");
if (!dir.exists()) {
dir.mkdirs();
}
writer = new FileWriter(filePath + "spring" + File.separator + "spring-test.xml");
template.process(project, writer);
} catch (Exception e) {
e.printStackTrace();
}
}
}

@ -0,0 +1,86 @@
package com.jwsaas.powerdesign.parse;
public class CamelCaseUtils {
private static final char SEPARATOR = '_';
public static String toUnderlineName(String s) {
if (s == null) {
return null;
}
StringBuilder sb = new StringBuilder();
boolean upperCase = false;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
boolean nextUpperCase = true;
if (i < (s.length() - 1)) {
nextUpperCase = Character.isUpperCase(s.charAt(i + 1));
}
if ((i >= 0) && Character.isUpperCase(c)) {
if (!upperCase || !nextUpperCase) {
if (i > 0)
sb.append(SEPARATOR);
}
upperCase = true;
} else {
upperCase = false;
}
sb.append(Character.toLowerCase(c));
}
return sb.toString();
}
public static String toCamelCase(String s) {
if (s == null) {
return null;
}
s = s.toLowerCase();
StringBuilder sb = new StringBuilder(s.length());
boolean upperCase = false;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == SEPARATOR) {
upperCase = true;
} else if (upperCase) {
sb.append(Character.toUpperCase(c));
upperCase = false;
} else {
sb.append(c);
}
}
return sb.toString();
}
/**
*
*
* @param s
* @return
*/
public static String toCapitalizeCamelCase(String s) {
if (s == null) {
return null;
}
s = toCamelCase(s);
return s.substring(0, 1).toUpperCase() + s.substring(1);
}
public static void main(String[] args) {
System.out.println(CamelCaseUtils.toUnderlineName("ISOCertifiedStaff"));
System.out.println(CamelCaseUtils.toUnderlineName("CertifiedStaff"));
System.out.println(CamelCaseUtils.toUnderlineName("UserID"));
System.out.println(CamelCaseUtils.toCamelCase("iso_certified_staff"));
System.out.println(CamelCaseUtils.toCamelCase("certified_staff"));
System.out.println(CamelCaseUtils.toCamelCase("user_id"));
}
}

@ -0,0 +1,159 @@
package com.jwsaas.powerdesign.parse;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.jwsaas.powerdesign.parse.bean.Category;
import com.jwsaas.powerdesign.parse.bean.Column;
import com.jwsaas.powerdesign.parse.bean.Domain;
import com.jwsaas.powerdesign.parse.bean.Project;
import com.jwsaas.powerdesign.parse.bean.Table;
/**
* PDM
*/
public class PDMParser {
private PDMParser() {
}
/**
* pdm
*
* @param pdmFile
* @return
* @throws IOException
*/
public static Project parse(File pdmFile) throws IOException {
return parse(new FileInputStream(pdmFile));
}
public static Project parse(InputStream is) throws IOException {
String pdmContent = readFile(is, "UTF-8");
return parse(pdmContent);
}
public static Project parse(String pdmContent) {
Project ret = new Project();
ret.setAuthor(getString(pdmContent, "<a:Author>(.*?)</a:Author>", 1, null));
ret.setVersion(getString(pdmContent, "<a:Version>(.*?)</a:Version>", 1, null));
ret.setName(getString(pdmContent, "<a:Name>(.*?)</a:Name>", 1, null));
ret.setCode(getString(pdmContent, "<a:Code>(.*?)</a:Code>", 1, null));
Pattern lPattern = Pattern.compile("<o:PhysicalDomain Id=\\\"([a-zA-Z0-9_]+)\\\">\\s+<a:ObjectID>(.*?)</a:ObjectID>\\s+<a:Name>(.*?)</a:Name>\\s+<a:Code>([a-zA-Z0-9_]+)</a:Code>(?s)(.*?)</o:PhysicalDomain>", Pattern.CASE_INSENSITIVE);
Matcher lMatcher = lPattern.matcher(pdmContent);
while (lMatcher.find()) {
Domain domain = new Domain(lMatcher.group(1), lMatcher.group(3), lMatcher.group(4));
domain.setType(getString(lMatcher.group(5), "<a:DataType>(.*?)</a:DataType>", 1, null));
domain.setComment(getString(lMatcher.group(5), "<a:Comment>(?s)(.*?)</a:Comment>", 1, null));
ret.getDomains().put(domain.getId(), domain);
}
lPattern = Pattern.compile("<(o:Table) Id=\"(.*?)\">(?s)(.*?)<(a:Name)>(.*?)</(\\4)>(?s)(.*?)<(a:Code)>(.*?)</(\\8)>(?s)(.*?)<(c:Columns)>(?s)(.*?)</(\\12)>(?s)(.*?)</(\\1)>", Pattern.CASE_INSENSITIVE);
lMatcher.reset();
lMatcher = lPattern.matcher(getString(pdmContent, "<(c:Tables)>(?s)(.*?)</(\\1)>", 2, ""));
while (lMatcher.find()) {
Table table = new Table(ret.getCode(), lMatcher.group(2), lMatcher.group(9), lMatcher.group(5));
Pattern pattern = Pattern.compile("<(o:Column) Id=\"(.*?)\">(?s)(.*?)<(a:Name)>(.*?)</(\\4)>(?s)(.*?)<(a:Code)>(.*?)</(\\8)>(?s)(.*?)<(a:DataType)>(.*?)</(\\12)>(?s)(.*?)</(\\1)>", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(lMatcher.group(13));
while (matcher.find()) {
int length = Integer.valueOf(getString(matcher.group(15), "<a:Length>([\\d]+)</a:Length>", 1, "0"));
int precision = Integer.valueOf(getString(matcher.group(15), "<a:Precision>([\\d]+)</a:Precision>", 1, "0"));
Column column = new Column(matcher.group(2), matcher.group(9), matcher.group(5), matcher.group(13), length, precision);
String nul = getString(matcher.group(15), "<(a:Mandatory)>(.*?)</(\\1)>(.*?)", 2, "0");
if (nul != null && (nul.equalsIgnoreCase("1") || nul.trim().equalsIgnoreCase("yes")))
column.setNullFlag(true);
column.setDomainId(getString(matcher.group(15), "<(c:Domain)>\\s*<o:PhysicalDomain[ ]+Ref=\\\"([a-zA-Z0-9_]+)\\\"/>\\s*</(\\1)>", 2, null));
column.setComment(getString(matcher.group(11), "<a:Comment>(?s)(.*?)</a:Comment>", 1, null));
if (column.getDomainId() != null)
column.setDomain(ret.getDomains().get(column.getDomainId()));
table.getColumns().add(column);
}
// FIXME 这里实际上是有问题的应该先查c:PrimaryKey的值然后再向上找才准确。
pattern = Pattern.compile("<(c:Keys)>(?s)(.*?)<o:Key Id=\"(.*?)\">(?s)(.*?)<o:Column Ref=\"(.*?)\"/>(.*?)</(\\1)>(?s)(.*?)<c:PrimaryKey>(?s)(.*?)<o:Key Ref=\"(.*?)\"/>(?s)(.*?)</c:PrimaryKey>", Pattern.CASE_INSENSITIVE);
matcher = pattern.matcher(lMatcher.group(15));
if (matcher.find())
table.setPK(matcher.group(5));
ret.getTableList().add(table);
}
lPattern = Pattern.compile("<(o:Reference)(.*?)>(?s)(.*?)<a:Cardinality>[0,1]\\.\\.\\*</a:Cardinality>(?s)(.*?)<o:Table Ref=\"(.*?)\"/>(?s)(.*?)<o:Table Ref=\"(.*?)\"/>(?s)(.*?)<o:Column Ref=\"(.*?)\"/>(?s)(.*?)<o:Column Ref=\"(.*?)\"/>(?s)(.*?)(\\1)", Pattern.CASE_INSENSITIVE);
lMatcher.reset();
lMatcher = lPattern.matcher(pdmContent);
while (lMatcher.find())
ret.setFK(lMatcher.group(7), lMatcher.group(5), lMatcher.group(11), lMatcher.group(9));
lPattern = Pattern.compile("<o:PhysicalDiagram Id=\\\"([a-zA-Z0-9_]+)\\\">(?s)(.*?)</o:PhysicalDiagram>", Pattern.CASE_INSENSITIVE);
lMatcher.reset();
lMatcher = lPattern.matcher(pdmContent);
while (lMatcher.find()) {
String name = getString(lMatcher.group(2), "<a:Name>(.*?)</a:Name>", 1, null);
String code = getString(lMatcher.group(2), "<a:Code>(.*?)</a:Code>", 1, null);
String author = getString(lMatcher.group(2), "<a:Creator>(.*?)</a:Creator>", 1, null);
String comment = getString(lMatcher.group(2), "<a:Comment>(.*?)</a:Comment>", 1, null);
Category category = new Category(name, code, author, comment);
category.setId(lMatcher.group(1));
Pattern p1 = Pattern.compile("<o:Table Ref=\\\"([a-zA-Z0-9_]+)\\\"/>", Pattern.CASE_INSENSITIVE);
Matcher m1 = p1.matcher(lMatcher.group(2));
while (m1.find()) {
category.getTableList().add(ret.getTable(m1.group(1)));
}
ret.getCategoryList().add(category);
}
scode(ret);
return ret;
}
private static void scode(Project proj) {
for (Category cate : proj.getCategoryList()) {
for (Table table : cate.getTableList()) {
String prefix = (table.getCode().indexOf('_') > 0 ? table.getCode().substring(0, table.getCode().indexOf('_')) : table.getCode());
if (table.getCode().startsWith(prefix)) {
table.setScode(CamelCaseUtils.toCapitalizeCamelCase(table.getCode().substring(prefix.length() + 1)));
} else {
table.setScode(CamelCaseUtils.toCapitalizeCamelCase(table.getCode()));
}
for (Column col : table.getColumns()) {
if (col.getCode().indexOf('_') > 0) {
col.setScode(CamelCaseUtils.toCamelCase(col.getCode()));
} else {
col.setScode(col.getCode());
}
}
}
}
}
private static String getString(String str, String reg, int group, String def) {
Pattern p = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(str);
if (m.find() && m.groupCount() >= group)
return m.group(group);
return def;
}
private static String readFile(InputStream fis, String charset) throws IOException {
StringBuffer ret = new StringBuffer();
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(fis, charset));
char[] buf = new char[512];
int size = bufferedreader.read(buf);
while (size != -1) {
ret.append(buf, 0, size);
size = bufferedreader.read(buf);
}
bufferedreader.close();
return ret.toString();
}
}

@ -0,0 +1,75 @@
package com.jwsaas.powerdesign.parse.bean;
import java.util.ArrayList;
import java.util.List;
/**
*
*
* @author
*/
public class Category {
private String id;
private String name; // PDM名称
private String code; // PDM代码
private String author; // 作者
private String comment; // 注释
private List<Table> tableList = new ArrayList<Table>();
public Category(String name, String code, String author, String comment) {
super();
this.name = name;
this.code = code;
this.author = author;
this.comment = comment;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public List<Table> getTableList() {
return tableList;
}
public void setTableList(List<Table> tableList) {
this.tableList = tableList;
}
}

@ -0,0 +1,227 @@
package com.jwsaas.powerdesign.parse.bean;
/**
*
*
* @author
*/
public class Column {
private String id;
private String code; // 字段代码
private String scode; // 简化后的表代码, 主要是去调前缀,比如BASE_USER-->USER
private String name; // 字段含义
private String type; // 原始类型及长度
private int length;
private int precision;
private String domainId; // 定义的数据域ID
private boolean pkFlag; // 是否为主键
private boolean nullFlag; // 是否可以为空
private boolean uniqueFlag; // 是否唯一
private Table ref;// 关联表
private String refId; // 关联表字段ID
private String comment; // 注释
private Domain domain;
private static final String[] STRING = { "varchar", "text", "tinytext", "longtext", "bigint" };
private static final String[] DATE = { "date", "datetime", "time", "timestamp" };
private static final String[] INT = { "int" };
private static final String[] LONG = { "decimal" };
private static final String[] DOUBLE = { "decimal" };
public Column() {
}
public Column(String id, String code, String name, String type, int length, int precision) {
this.id = id;
this.code = code;
this.name = name;
this.type = type;
this.length = length;
this.precision = precision;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer().append(id);
sb.append("\t").append(name).append("(").append(code).append("--").append(scode).append(")");
sb.append("\t").append(type);
if (nullFlag)
sb.append("\tNot Null");
if (pkFlag)
sb.append("\tPrimary Key");
if (uniqueFlag)
sb.append("\tUnique");
if (ref != null) {
sb.append("\t-->").append(ref.getId()).append("(").append(ref.getCode()).append(").").append(refId).append("(").append(ref.getColumnInfo(refId).getCode()).append(")");
}
if (domain != null)
sb.append("\tdomainId:").append(domainId);
if (comment != null)
sb.append("\t//").append(comment);
return sb.append("\r\n").toString();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getDomainId() {
return domainId;
}
public void setDomainId(String domainId) {
this.domainId = domainId;
}
public boolean isPkFlag() {
return pkFlag;
}
public void setPkFlag(boolean pkFlag) {
this.pkFlag = pkFlag;
}
public boolean isNullFlag() {
return nullFlag;
}
public void setNullFlag(boolean nullFlag) {
this.nullFlag = nullFlag;
}
public boolean isUniqueFlag() {
return uniqueFlag;
}
public void setUniqueFlag(boolean uniqueFlag) {
this.uniqueFlag = uniqueFlag;
}
public String getRefId() {
return refId;
}
public void setRefId(String refId) {
this.refId = refId;
}
public Table getRef() {
return ref;
}
public void setRef(Table ref) {
this.ref = ref;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public Domain getDomain() {
return domain;
}
public void setDomain(Domain domain) {
this.domain = domain;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int getPrecision() {
return precision;
}
public void setPrecision(int precision) {
this.precision = precision;
}
public String getScode() {
return scode;
}
public void setScode(String scode) {
this.scode = scode;
}
public String getJavaType() {
String dataType = this.type;
int pos = this.type.indexOf("(");
if (pos != -1) {
dataType = this.type.substring(0, pos);
}
if ("char".equalsIgnoreCase(dataType) && length == 1)
return "Boolean";
for (String type : STRING) {
if (type.equalsIgnoreCase(dataType))
return "String";
}
for (String type : DATE) {
if (type.equalsIgnoreCase(dataType))
return "Date";
}
for (String type : INT) {
if (type.equalsIgnoreCase(dataType))
return "Integer";
}
for (String type : LONG) {
if (type.equalsIgnoreCase(dataType)) {
if (precision != 0) {
return "Double";
} else
return "Long";
}
}
for (String type : DOUBLE) {
dataType = dataType.toLowerCase();
if (dataType.startsWith(type)) {
return "Double";
}
}
System.out.println("未知的数据类型:" + dataType);
return "Serializable";
}
}

@ -0,0 +1,70 @@
package com.jwsaas.powerdesign.parse.bean;
/**
*
*
* @author
*/
public class Domain {
private String id;
private String name; // 名称
private String code; // 代码
private String type; // 数据类型
private String comment; // 注释
public Domain(String id, String name, String code) {
this.id = id;
this.name = name;
this.code = code;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer().append(id);
sb.append("\t").append(name).append("(").append(code).append(")");
sb.append("\t").append(type);
if (comment != null)
sb.append("\t//").append(comment);
return sb.append("\r\n").toString();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
}

@ -0,0 +1,51 @@
package com.jwsaas.powerdesign.parse.bean;
import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
public class Messages {
private static final String BUNDLE_NAME = "com.baoyuan.bean.messages"; //$NON-NLS-1$
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
.getBundle(BUNDLE_NAME);
private Messages() {
}
public static String getString(String key) {
try {
return RESOURCE_BUNDLE.getString(key);
} catch (MissingResourceException e) {
return '!' + key + '!';
}
}
public static String getString(String key, String parm1) {
try {
return MessageFormat.format(RESOURCE_BUNDLE.getString(key),
new Object[] { parm1 });
} catch (MissingResourceException e) {
return '!' + key + '!';
}
}
public static String getString(String key, String parm1, String parm2) {
try {
return MessageFormat.format(RESOURCE_BUNDLE.getString(key),
new Object[] { parm1, parm2 });
} catch (MissingResourceException e) {
return '!' + key + '!';
}
}
public static String getString(String key, String parm1, String parm2,
String parm3) {
try {
return MessageFormat.format(RESOURCE_BUNDLE.getString(key),
new Object[] { parm1, parm2, parm3 });
} catch (MissingResourceException e) {
return '!' + key + '!';
}
}
}

@ -0,0 +1,164 @@
package com.jwsaas.powerdesign.parse.bean;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* PDM
*/
public class Project {
private String code; // 项目代码
private String name; // 项目名称
private String author; // 作者
private String version; // 版本
private Date cdate; // 创建日期
private Map<String, Domain> domains = new HashMap<String, Domain>();
private List<Category> categoryList = new ArrayList<Category>();
private List<Table> tableList = new ArrayList<Table>(); // 表列表
/**
* ID
*
* @param oid
* @return
*/
public Table getTable(String oid) {
for (int i = 0; i < tableList.size(); i++)
if (((Table) tableList.get(i)).getId().equals(oid))
return ((Table) tableList.get(i));
return null;
}
/**
*
*
* @param soid
* @param toid
* @param sfoid
* @param tfoid
*/
public void setFK(String soid, String toid, String sfoid, String tfoid) {
Table t1 = getTable(soid);
Table t2 = getTable(toid);
if (t1 == null || t2 == null)
return;
Column col1 = t1.getColumnInfo(sfoid);
Column col2 = t2.getColumnInfo(tfoid);
if (col1 == null || col2 == null)
return;
col1.setRef(t2);
col1.setRefId(tfoid);
}
/**
* PDM
*
* @param cateId
* @return
*/
public Category getCategory(String cateId) {
for (Category cate : categoryList) {
if (cateId.equals(cate.getId()))
return cate;
}
return null;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer().append(name);
sb.append("(").append(code).append(")\tAuthor:").append(author);
sb.append(" Version:").append(version);
sb.append(" Create time:").append(cdate);
sb.append(" ").append(domains.size()).append(" domains");
sb.append(" ").append(categoryList.size()).append(" pdms");
sb.append(" ").append(tableList.size()).append(" tables");
sb.append("\r\n");
if (domains.size() > 0) {
sb.append("Domain List:\r\n");
for (Entry<String, Domain> entry : domains.entrySet()) {
sb.append("\t").append(entry.getValue());
}
}
if (tableList.size() > 0) {
sb.append("Table List:\r\n");
for (Table table : tableList) {
sb.append("\t").append(table);
}
}
return sb.append("\r\n").toString();
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public Date getCdate() {
return cdate;
}
public void setCdate(Date cdate) {
this.cdate = cdate;
}
public List<Category> getCategoryList() {
return categoryList;
}
public void setCategoryList(List<Category> categoryList) {
this.categoryList = categoryList;
}
public List<Table> getTableList() {
return tableList;
}
public void setTableList(List<Table> tableList) {
this.tableList = tableList;
}
public Map<String, Domain> getDomains() {
return domains;
}
public void setDomains(Map<String, Domain> domains) {
this.domains = domains;
}
}

@ -0,0 +1,151 @@
package com.jwsaas.powerdesign.parse.bean;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.RandomStringUtils;
/**
*
*
* @author
*/
public class Table {
private String id;
private String prjId; // 项目ID
private String code; // 表代码
private String name; // 表含义
private String scode; // 简化后的表代码, 主要是去调前缀,比如BASE_USER-->USER
private String basePackage;// 包名
private String sign;// 项目标识,影响包的命名规范(dao层规范basePackage.sign.dao.impl,service层basePackage.sign.service.impl)
private String signPackage;// 区别服务标识类似Shared.SIGN
private List<Column> columns = new ArrayList<Column>(); // 列信息
public Table() {
}
public Table(String prjId, String id, String code, String name) {
this.prjId = prjId;
this.id = id;
this.code = code;
this.name = name;
}
/**
* id
*
* @param oid
* @return
*/
public Column getColumnInfo(String oid) {
Column col = null;
for (int i = 0; i < columns.size(); i++) {
col = (Column) columns.get(i);
if (col.getId().equalsIgnoreCase(oid))
break;
}
return col;
}
/**
*
*
* @param oid
*/
public void setPK(String oid) {
Column col = getColumnInfo(oid);
if (col != null)
col.setPkFlag(true);
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer().append(id);
sb.append("\t").append(name).append("(").append(code).append("--").append(scode).append(")\r\n");
if (columns.size() > 0) {
for (Column column : columns) {
sb.append("\t\t").append(column);
}
}
return sb.append("\r\n").toString();
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPrjId() {
return prjId;
}
public void setPrjId(String prjId) {
this.prjId = prjId;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Column> getColumns() {
return columns;
}
public void setColumns(List<Column> columns) {
this.columns = columns;
}
public String getScode() {
return scode;
}
public void setScode(String scode) {
this.scode = scode;
}
public String getBasePackage() {
return basePackage;
}
public void setBasePackage(String basePackage) {
this.basePackage = basePackage;
}
public String getSignPackage() {
return signPackage;
}
public void setSignPackage(String signPackage) {
this.signPackage = signPackage;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getSerialVersionUID() {
return "1" + RandomStringUtils.randomNumeric(18);
}
}

@ -0,0 +1,49 @@
package com.jwsaas.powerdesign.parse.bean;
import java.io.Serializable;
public class TableSchema implements Serializable {
private static final long serialVersionUID = -1258282486852764827L;
private String columnName;
private String isNullable;
private String dataType;
private String columnComment;
public String getColumnName() {
return columnName;
}
public void setColumnName(String columnName) {
this.columnName = columnName;
}
public String getIsNullable() {
return isNullable;
}
public void setIsNullable(String isNullable) {
this.isNullable = isNullable;
}
public String getDataType() {
return dataType;
}
public void setDataType(String dataType) {
this.dataType = dataType;
}
public String getColumnComment() {
return columnComment;
}
public void setColumnComment(String columnComment) {
this.columnComment = columnComment;
}
}

@ -0,0 +1,22 @@
package com.jwsaas.powerdesign.parse.exceptions;
public class DataSourceDescriptorException extends RuntimeException{
private static final long serialVersionUID = 5082299003855826096L;
public DataSourceDescriptorException() {
super();
}
public DataSourceDescriptorException(Throwable e) {
super(e);
}
public DataSourceDescriptorException(String message) {
super(message);
}
public DataSourceDescriptorException(String message,Throwable e) {
super(message, e);
}
}

@ -0,0 +1,60 @@
package com.jwsaas.powerdesign.parse.exceptions;
public class ErrorContext {
private static final String LINE_SEPARATOR = System.getProperty("line.separator", "\n");
private static final ThreadLocal<ErrorContext> LOCAL = new ThreadLocal<ErrorContext>();
private String message;
private Throwable cause;
private ErrorContext() {
}
public static ErrorContext instance() {
ErrorContext context = LOCAL.get();
if (context == null) {
context = new ErrorContext();
LOCAL.set(context);
}
return context;
}
public ErrorContext message(String message) {
this.message = message;
return this;
}
public ErrorContext cause(Throwable cause) {
this.cause = cause;
return this;
}
public ErrorContext reset() {
message = null;
cause = null;
LOCAL.remove();
return this;
}
public String toString() {
StringBuffer description = new StringBuffer();
// message
if (this.message != null) {
description.append(LINE_SEPARATOR);
description.append("### ");
description.append(this.message);
}
// cause
if (cause != null) {
description.append(LINE_SEPARATOR);
description.append("### Cause: ");
description.append(cause.toString());
}
return description.toString();
}
}

@ -0,0 +1,60 @@
package com.jwsaas.powerdesign.parse.exceptions;
import java.util.Map;
/**
*
* @author Administrator
*
*/
public class ExceptionFactory {
/**
* ServiceException
*
* @param message
* @param e
* @return
*/
public static RuntimeException wrapServiceException(String message, Exception e) {
return new ServiceException(ErrorContext.instance().message(message).cause(e).toString(), e);
}
/**
* ValidationException
*
* @param message
* @param e
* @return
*/
public static RuntimeException wrapValidationException(String message, Throwable e, Map<String, String> result) {
return new ValidationException(ErrorContext.instance().message(message).cause(e).toString(), e, result);
}
/**
* DataSourceDescriptorException
*
* @param message
* @param e
* @return
*/
public static RuntimeException wrapDataSourceDescriptorException(String message, Exception e) {
return new DataSourceDescriptorException(ErrorContext.instance().message(message).cause(e).toString(), e);
}
/**
* DataSourceDescriptorException
*
* @param message
* @param e
* @return
*/
public static RuntimeException wrapDataSourceDescriptorException(String message) {
return new DataSourceDescriptorException(ErrorContext.instance().message(message).toString());
}
public static RuntimeException wrapForeignKeyException(String message, Exception e) {
return new ForeignKeyException(ErrorContext.instance().message(message).cause(e).toString(), e);
}
}

@ -0,0 +1,22 @@
package com.jwsaas.powerdesign.parse.exceptions;
public class ForeignKeyException extends RuntimeException{
private static final long serialVersionUID = 3053852074986193714L;
public ForeignKeyException() {
super();
}
public ForeignKeyException(Throwable e) {
super(e);
}
public ForeignKeyException(String message) {
super(message);
}
public ForeignKeyException(String message,Throwable e) {
super(message, e);
}
}

@ -0,0 +1,23 @@
package com.jwsaas.powerdesign.parse.exceptions;
public class ServiceException extends RuntimeException {
private static final long serialVersionUID = -1095971671427544722L;
public ServiceException() {
super();
}
public ServiceException(Throwable e) {
super(e);
}
public ServiceException(String message) {
super(message);
}
public ServiceException(String message,Throwable e) {
super(message, e);
}
}

@ -0,0 +1,23 @@
package com.jwsaas.powerdesign.parse.exceptions;
import java.util.Map;
public class ValidationException extends RuntimeException{
private static final long serialVersionUID = -4820402020206751860L;
private Map<String,String> result;
public ValidationException() {
super();
}
public ValidationException(String message,Throwable e,Map<String,String> result) {
super(message, e);
this.result = result;
}
public Map<String, String> getResult() {
return result;
}
}

@ -0,0 +1,14 @@
package ${basePackage}.dao<#if sign != "shared">.${sign}</#if>.impl;
import ${basePackage}.dao<#if sign != "shared">.${sign}</#if>.${scode}Dao;
import ${basePackage}.entity<#if sign != "shared">.${sign}</#if>.${scode};
<#if sign != "shared">import com.jwsaas.dao.impl.BaseDaoImpl;</#if>
import org.springframework.stereotype.Repository;
/**
* ${name}数据接口实现
*/
@Repository(${signPackage} + "${scode}DaoImpl")
public class ${scode}DaoImpl extends BaseDaoImpl<${scode}, String> implements ${scode}Dao {
}

@ -0,0 +1,8 @@
package ${basePackage}.dao<#if sign != "shared">.${sign}</#if>;
import ${basePackage}.entity<#if sign != "shared">.${sign}</#if>.${scode};
<#if sign != "shared">import com.jwsaas.dao.BaseDao;</#if>
public interface ${scode}Dao extends BaseDao<${scode}, String> {
}

@ -0,0 +1,51 @@
package ${basePackage}.entity<#if sign != "shared">.${sign}</#if>;
import java.util.Date;
import org.apache.ibatis.type.Alias;
<#if sign != "shared">import com.jwsaas.entity.BaseEntity;</#if>
//Generated from PowerDesigner file ,Written by 张莹.
/**
* 表名称:${name}
* 表代码:${code}
*/
@Alias(${signPackage}+"${scode}")
public class ${scode} extends BaseEntity {
private static final long serialVersionUID = ${serialVersionUID}L;
<#assign ignore = ["id", "tenantId", "createUser", "createDate", "modifyUser", "modifyDate"]>
<#list columns as column>
<#if ignore?seq_contains(column.scode)==false>
/**
*${column.name}
*/
private ${column.javaType} ${column.scode};
</#if>
</#list>
<#list columns as column>
<#if ignore?seq_contains(column.scode)==false>
/**
* 字段名称 :${column.name}
* 数据类型 :${column.type}
* 是否必填 :${column.nullFlag?string('true','false')}
*/
public ${column.javaType} get${column.scode?cap_first}() {
return this.${column.scode};
}
/**
* 字段名称 :${column.name}
* 数据类型 :${column.type}
* 是否必填 :${column.nullFlag?string('true','false')}
*/
public void set${column.scode?cap_first}(${column.javaType} ${column.scode}) {
this.${column.scode} = ${column.scode};
}
</#if>
</#list>
}

@ -0,0 +1,118 @@
<#macro mapperEl value>${r"#{"}${value}}</#macro>
<#macro jspEl value>${r"${"}${value}}</#macro>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${basePackage}.entity<#if sign != "shared">.${sign}</#if>.${scode}Mapper">
<sql id="columnList">
<#list columns as column>`${column.scode}`<#if column_has_next>,</#if></#list>
</sql>
<select id="get" resultType="${sign}${scode}">
select
<include refid="columnList" />
from ${code}
where id = <@mapperEl 'id'/>
</select>
<select id="find" resultType="${sign}${scode}">
select
<include refid="columnList" />
from ${code}
where tenantId = <@mapperEl 'tenantId'/> and <@jspEl 'property'/>=<@mapperEl 'value'/>
</select>
<select id="findList" resultType="${sign}${scode}">
select
<include refid="columnList" />
from ${code}
where tenantId = <@mapperEl 'tenantId'/> and <@jspEl 'property'/>=<@mapperEl 'value'/>
</select>
<select id="findListByIds" parameterType="java.lang.String"
resultType="${sign}${scode}">
select
<include refid="columnList" />
from ${code}
where `id` in
<foreach collection="list" item="id" index="index" open="(" close=")" separator=","><@mapperEl 'id'/></foreach>
</select>
<select id="getPager" resultType="${sign}${scode}">
select
<include refid="columnList" />
from ${code}
<if test="(@com.jwsaas.utils.OgnlUtils@isEmpty(condition))!=null"><@jspEl 'condition'/></if>
</select>
<select id="getList" resultType="${sign}${scode}">
select
<include refid="columnList" />
from ${code}
<if test="(@com.jwsaas.utils.OgnlUtils@isEmpty(condition))!=null"><@jspEl 'condition'/></if>
</select>
<select id="getTotalCount" resultType="java.lang.Long">
select count(id) as result
from ${code} where `tenantId` = <@mapperEl 'tenantId'/>
</select>
<select id="isExist" resultType="java.lang.Boolean">
select count(id) as result from ${code}
where `tenantId` = <@mapperEl 'tenantId'/> and <@jspEl 'property'/>=<@mapperEl 'value'/>
</select>
<insert id="save" parameterType="${sign}${scode}"
useGeneratedKeys="true" keyProperty="id">
insert into ${code}
<trim prefix="(" suffix=")" suffixOverrides=",">
`id`,`tenantId`
<#assign ignore = ["id", "tenantId", "modifyUser", "modifyDate"]>
<#list columns as column>
<#if ignore?seq_contains(column.scode)==false>
<if test="${column.scode} != null">,`${column.scode}`</if>
</#if>
</#list>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<@mapperEl 'id'/>,<@mapperEl 'tenantId'/>
<#assign ignore = ["id", "tenantId", "modifyUser", "modifyDate"]>
<#list columns as column>
<#if ignore?seq_contains(column.scode)==false>
<if test="${column.scode} != null">,<@mapperEl '${column.scode}'/></if>
</#if>
</#list>
</trim>
</insert>
<update id="update" parameterType="${sign}${scode}">
update ${code}
<set>
`tenantId` = <@mapperEl 'tenantId'/>
<#assign ignore = ["id", "tenantId", "createUser", "createDate"]>
<#list columns as column>
<#if ignore?seq_contains(column.scode)==false>
<if test="${column.scode} != null">,`${column.scode}` = <@mapperEl '${column.scode}'/></if>
</#if>
</#list>
</set>
where `id` = <@mapperEl 'id'/>
</update>
<delete id="delete">
delete from ${code}
where `id` = <@mapperEl 'id'/>
</delete>
<delete id="deleteByCriteria">
delete from ${code}
<if test="(@com.jwsaas.utils.OgnlUtils@isEmpty(condition))!=null"><@jspEl 'condition'/></if>
</delete>
<delete id="deleteByProperty">
delete from ${code}
where `tenantId` = <@mapperEl 'tenantId'/> and <@jspEl 'property'/>=<@mapperEl 'value'/>
</delete>
</mapper>

@ -0,0 +1,26 @@
package ${basePackage}.service<#if sign != "shared">.${sign}</#if>.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import ${basePackage}.dao.BaseDao;
import ${basePackage}.dao<#if sign != "shared">.${sign}</#if>.${scode}Dao;
import ${basePackage}.entity<#if sign != "shared">.${sign}</#if>.${scode};
import ${basePackage}.service<#if sign != "shared">.${sign}</#if>.${scode}Service;
<#if sign != "shared">import com.jwsaas.service.impl.BaseServiceImpl;</#if>
@Service(${signPackage}+"${scode}ServiceImpl")
public class ${scode}ServiceImpl extends BaseServiceImpl<${scode}, String> implements ${scode}Service{
@Resource(name=${signPackage}+"${scode}DaoImpl")
private ${scode}Dao ${scode?uncap_first}Dao;
@Override
public BaseDao<${scode}, String> getBaseDao() {
return this.${scode?uncap_first}Dao;
}
}

@ -0,0 +1,11 @@
package ${basePackage}.service<#if sign != "shared">.${sign}</#if>;
import ${basePackage}.entity<#if sign != "shared">.${sign}</#if>.${scode};
<#if sign != "shared">import com.jwsaas.service.BaseService;</#if>
/**
* ${name}数据接口
*/
public interface ${scode}Service extends BaseService<${scode}, String> {
}

@ -0,0 +1,13 @@
<#macro mapperEl value>${r"#{"}${value}}</#macro>
<#macro jspEl value>${r"${"}${value}}</#macro>
<!--服务引用部分开始-->
<#list tableList as table>
<!-- ${table.name}服务 -->
<dubbo:reference id="${table.sign}${table.scode}Service" interface="com.jwsaas.service<#if table.sign != "shared">.${table.sign}</#if>.${table.scode}Service"
version="<@jspEl 'reference.version'/>"
group="<@jspEl 'reference.group'/>" timeout="<@jspEl 'reference.timeout'/>"
retries="<@jspEl 'reference.retries'/>" />
</#list>
<!--服务引用部分结束-->

@ -0,0 +1,13 @@
<#macro mapperEl value>${r"#{"}${value}}</#macro>
<#macro jspEl value>${r"${"}${value}}</#macro>
<!--服务暴露部分开始-->
<#list tableList as table>
<!-- ${table.name}服务 -->
<dubbo:service interface="com.jwsaas.service<#if table.sign != "shared">.${table.sign}</#if>.${table.scode}Service"
ref="${table.sign}${table.scode}ServiceImpl" version="<@jspEl 'service.version'/>"
group="<@jspEl 'service.group'/>" timeout="<@jspEl 'service.timeout'/>"
retries="<@jspEl 'service.retries'/>" />
</#list>
<!--服务暴露部分结束-->

@ -0,0 +1,13 @@
<#macro mapperEl value>${r"#{"}${value}}</#macro>
<#macro jspEl value>${r"${"}${value}}</#macro>
<!--服务引用部分开始-->
<#list tableList as table>
<!-- ${table.name}服务 -->
<dubbo:reference id="${table.sign}${table.scode}Service" interface="com.jwsaas.service<#if table.sign != "shared">.${table.sign}</#if>.${table.scode}Service"
version="<@jspEl 'reference.version'/>"
group="<@jspEl 'reference.group'/>" timeout="<@jspEl 'reference.timeout'/>"
retries="<@jspEl 'reference.retries'/>" url="<@jspEl 'reference.url'/>" />
</#list>
<!--服务引用部分结束-->
Loading…
Cancel
Save