From cb5c857001f77027e2a2f774115591c662c020b9 Mon Sep 17 00:00:00 2001
From: vsxingchen <37962879@qq.com>
Date: Tue, 9 Jan 2024 17:50:15 +0800
Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
food-pdm-tools/pom.xml | 33 +++
.../java/com/jwsaas/powerdesign/Generate.java | 201 ++++++++++++++++
.../powerdesign/parse/CamelCaseUtils.java | 86 +++++++
.../jwsaas/powerdesign/parse/PDMParser.java | 159 ++++++++++++
.../powerdesign/parse/bean/Category.java | 75 ++++++
.../jwsaas/powerdesign/parse/bean/Column.java | 227 ++++++++++++++++++
.../jwsaas/powerdesign/parse/bean/Domain.java | 70 ++++++
.../powerdesign/parse/bean/Messages.java | 51 ++++
.../powerdesign/parse/bean/Project.java | 164 +++++++++++++
.../jwsaas/powerdesign/parse/bean/Table.java | 151 ++++++++++++
.../powerdesign/parse/bean/TableSchema.java | 49 ++++
.../DataSourceDescriptorException.java | 22 ++
.../parse/exceptions/ErrorContext.java | 60 +++++
.../parse/exceptions/ExceptionFactory.java | 60 +++++
.../parse/exceptions/ForeignKeyException.java | 22 ++
.../parse/exceptions/ServiceException.java | 23 ++
.../parse/exceptions/ValidationException.java | 23 ++
.../main/resources/template/dao.impl.java.ftl | 14 ++
.../src/main/resources/template/dao.java.ftl | 8 +
.../main/resources/template/entity.java.ftl | 51 ++++
.../main/resources/template/mapper.xml.ftl | 118 +++++++++
.../resources/template/service.impl.java.ftl | 26 ++
.../main/resources/template/service.java.ftl | 11 +
.../template/spring.reference.xml.ftl | 13 +
.../resources/template/spring.service.xml.ftl | 13 +
.../resources/template/spring.test.xml.ftl | 13 +
26 files changed, 1743 insertions(+)
create mode 100644 food-pdm-tools/pom.xml
create mode 100644 food-pdm-tools/src/main/java/com/jwsaas/powerdesign/Generate.java
create mode 100644 food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/CamelCaseUtils.java
create mode 100644 food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/PDMParser.java
create mode 100644 food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Category.java
create mode 100644 food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Column.java
create mode 100644 food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Domain.java
create mode 100644 food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Messages.java
create mode 100644 food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Project.java
create mode 100644 food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Table.java
create mode 100644 food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/TableSchema.java
create mode 100644 food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/DataSourceDescriptorException.java
create mode 100644 food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ErrorContext.java
create mode 100644 food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ExceptionFactory.java
create mode 100644 food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ForeignKeyException.java
create mode 100644 food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ServiceException.java
create mode 100644 food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ValidationException.java
create mode 100644 food-pdm-tools/src/main/resources/template/dao.impl.java.ftl
create mode 100644 food-pdm-tools/src/main/resources/template/dao.java.ftl
create mode 100644 food-pdm-tools/src/main/resources/template/entity.java.ftl
create mode 100644 food-pdm-tools/src/main/resources/template/mapper.xml.ftl
create mode 100644 food-pdm-tools/src/main/resources/template/service.impl.java.ftl
create mode 100644 food-pdm-tools/src/main/resources/template/service.java.ftl
create mode 100644 food-pdm-tools/src/main/resources/template/spring.reference.xml.ftl
create mode 100644 food-pdm-tools/src/main/resources/template/spring.service.xml.ftl
create mode 100644 food-pdm-tools/src/main/resources/template/spring.test.xml.ftl
diff --git a/food-pdm-tools/pom.xml b/food-pdm-tools/pom.xml
new file mode 100644
index 0000000..d702df5
--- /dev/null
+++ b/food-pdm-tools/pom.xml
@@ -0,0 +1,33 @@
+
+
+ 4.0.0
+
+ com.jwsaas
+ food-parent
+ 2.0.0
+
+ food-pdm-tools
+ food-pdm-tools
+ http://maven.apache.org
+
+
+ UTF-8
+ 2.3.23
+
+
+
+
+ org.apache.commons
+ commons-lang3
+
+
+
+ org.freemarker
+ freemarker
+ ${freemarker.version}
+
+
+
+
diff --git a/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/Generate.java b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/Generate.java
new file mode 100644
index 0000000..fca1cf1
--- /dev/null
+++ b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/Generate.java
@@ -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
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 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();
+ }
+ }
+}
diff --git a/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/CamelCaseUtils.java b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/CamelCaseUtils.java
new file mode 100644
index 0000000..0686ab8
--- /dev/null
+++ b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/CamelCaseUtils.java
@@ -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"));
+ }
+}
\ No newline at end of file
diff --git a/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/PDMParser.java b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/PDMParser.java
new file mode 100644
index 0000000..053560a
--- /dev/null
+++ b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/PDMParser.java
@@ -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, "(.*?)", 1, null));
+ ret.setVersion(getString(pdmContent, "(.*?)", 1, null));
+ ret.setName(getString(pdmContent, "(.*?)", 1, null));
+ ret.setCode(getString(pdmContent, "(.*?)", 1, null));
+
+ Pattern lPattern = Pattern.compile("\\s+(.*?)\\s+(.*?)\\s+([a-zA-Z0-9_]+)(?s)(.*?)", 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), "(.*?)", 1, null));
+ domain.setComment(getString(lMatcher.group(5), "(?s)(.*?)", 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), "([\\d]+)", 1, "0"));
+ int precision = Integer.valueOf(getString(matcher.group(15), "([\\d]+)", 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*\\s*(\\1)>", 2, null));
+ column.setComment(getString(matcher.group(11), "(?s)(.*?)", 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)(.*?)(?s)(.*?)(.*?)(\\1)>(?s)(.*?)(?s)(.*?)(?s)(.*?)", 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)(.*?)[0,1]\\.\\.\\*(?s)(.*?)(?s)(.*?)(?s)(.*?)(?s)(.*?)(?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("(?s)(.*?)", Pattern.CASE_INSENSITIVE);
+ lMatcher.reset();
+ lMatcher = lPattern.matcher(pdmContent);
+ while (lMatcher.find()) {
+ String name = getString(lMatcher.group(2), "(.*?)", 1, null);
+ String code = getString(lMatcher.group(2), "(.*?)", 1, null);
+ String author = getString(lMatcher.group(2), "(.*?)", 1, null);
+ String comment = getString(lMatcher.group(2), "(.*?)", 1, null);
+
+ Category category = new Category(name, code, author, comment);
+ category.setId(lMatcher.group(1));
+
+ Pattern p1 = Pattern.compile("", 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();
+ }
+
+}
diff --git a/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Category.java b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Category.java
new file mode 100644
index 0000000..c7e086e
--- /dev/null
+++ b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Category.java
@@ -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 tableList = new ArrayList();
+
+ 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 getTableList() {
+ return tableList;
+ }
+
+ public void setTableList(List tableList) {
+ this.tableList = tableList;
+ }
+}
diff --git a/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Column.java b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Column.java
new file mode 100644
index 0000000..73bfd62
--- /dev/null
+++ b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Column.java
@@ -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";
+ }
+}
diff --git a/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Domain.java b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Domain.java
new file mode 100644
index 0000000..1551528
--- /dev/null
+++ b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Domain.java
@@ -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;
+ }
+}
\ No newline at end of file
diff --git a/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Messages.java b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Messages.java
new file mode 100644
index 0000000..17d7f9c
--- /dev/null
+++ b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Messages.java
@@ -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 + '!';
+ }
+ }
+}
diff --git a/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Project.java b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Project.java
new file mode 100644
index 0000000..91de098
--- /dev/null
+++ b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Project.java
@@ -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 domains = new HashMap();
+ private List categoryList = new ArrayList();
+ private List tableList = new ArrayList(); // 表列表
+
+ /**
+ * 获取指定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 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 getCategoryList() {
+ return categoryList;
+ }
+
+ public void setCategoryList(List categoryList) {
+ this.categoryList = categoryList;
+ }
+
+ public List getTableList() {
+ return tableList;
+ }
+
+ public void setTableList(List tableList) {
+ this.tableList = tableList;
+ }
+
+ public Map getDomains() {
+ return domains;
+ }
+
+ public void setDomains(Map domains) {
+ this.domains = domains;
+ }
+}
diff --git a/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Table.java b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Table.java
new file mode 100644
index 0000000..ef3fd46
--- /dev/null
+++ b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/Table.java
@@ -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 columns = new ArrayList(); // 列信息
+
+ 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 getColumns() {
+ return columns;
+ }
+
+ public void setColumns(List 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);
+ }
+}
\ No newline at end of file
diff --git a/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/TableSchema.java b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/TableSchema.java
new file mode 100644
index 0000000..cc02639
--- /dev/null
+++ b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/bean/TableSchema.java
@@ -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;
+ }
+
+}
diff --git a/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/DataSourceDescriptorException.java b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/DataSourceDescriptorException.java
new file mode 100644
index 0000000..26f27d4
--- /dev/null
+++ b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/DataSourceDescriptorException.java
@@ -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);
+ }
+}
diff --git a/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ErrorContext.java b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ErrorContext.java
new file mode 100644
index 0000000..3fe3456
--- /dev/null
+++ b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ErrorContext.java
@@ -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 LOCAL = new ThreadLocal();
+
+ 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();
+ }
+}
diff --git a/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ExceptionFactory.java b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ExceptionFactory.java
new file mode 100644
index 0000000..0f89597
--- /dev/null
+++ b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ExceptionFactory.java
@@ -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 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);
+ }
+
+}
diff --git a/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ForeignKeyException.java b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ForeignKeyException.java
new file mode 100644
index 0000000..a767d25
--- /dev/null
+++ b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ForeignKeyException.java
@@ -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);
+ }
+}
diff --git a/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ServiceException.java b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ServiceException.java
new file mode 100644
index 0000000..416d810
--- /dev/null
+++ b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ServiceException.java
@@ -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);
+ }
+
+}
\ No newline at end of file
diff --git a/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ValidationException.java b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ValidationException.java
new file mode 100644
index 0000000..98b1414
--- /dev/null
+++ b/food-pdm-tools/src/main/java/com/jwsaas/powerdesign/parse/exceptions/ValidationException.java
@@ -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 result;
+
+ public ValidationException() {
+ super();
+ }
+
+ public ValidationException(String message,Throwable e,Map result) {
+ super(message, e);
+ this.result = result;
+ }
+
+ public Map getResult() {
+ return result;
+ }
+}
diff --git a/food-pdm-tools/src/main/resources/template/dao.impl.java.ftl b/food-pdm-tools/src/main/resources/template/dao.impl.java.ftl
new file mode 100644
index 0000000..3191982
--- /dev/null
+++ b/food-pdm-tools/src/main/resources/template/dao.impl.java.ftl
@@ -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 {
+
+}
diff --git a/food-pdm-tools/src/main/resources/template/dao.java.ftl b/food-pdm-tools/src/main/resources/template/dao.java.ftl
new file mode 100644
index 0000000..22f5dbd
--- /dev/null
+++ b/food-pdm-tools/src/main/resources/template/dao.java.ftl
@@ -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> {
+
+}
diff --git a/food-pdm-tools/src/main/resources/template/entity.java.ftl b/food-pdm-tools/src/main/resources/template/entity.java.ftl
new file mode 100644
index 0000000..494d78d
--- /dev/null
+++ b/food-pdm-tools/src/main/resources/template/entity.java.ftl
@@ -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>
+}
\ No newline at end of file
diff --git a/food-pdm-tools/src/main/resources/template/mapper.xml.ftl b/food-pdm-tools/src/main/resources/template/mapper.xml.ftl
new file mode 100644
index 0000000..d621041
--- /dev/null
+++ b/food-pdm-tools/src/main/resources/template/mapper.xml.ftl
@@ -0,0 +1,118 @@
+<#macro mapperEl value>${r"#{"}${value}}#macro>
+<#macro jspEl value>${r"${"}${value}}#macro>
+
+
+.${sign}#if>.${scode}Mapper">
+
+
+ <#list columns as column>`${column.scode}`<#if column_has_next>,#if>#list>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ insert into ${code}
+
+ `id`,`tenantId`
+ <#assign ignore = ["id", "tenantId", "modifyUser", "modifyDate"]>
+ <#list columns as column>
+ <#if ignore?seq_contains(column.scode)==false>
+ ,`${column.scode}`
+ #if>
+ #list>
+
+
+ <@mapperEl 'id'/>,<@mapperEl 'tenantId'/>
+ <#assign ignore = ["id", "tenantId", "modifyUser", "modifyDate"]>
+ <#list columns as column>
+ <#if ignore?seq_contains(column.scode)==false>
+ ,<@mapperEl '${column.scode}'/>
+ #if>
+ #list>
+
+
+
+
+ update ${code}
+
+ `tenantId` = <@mapperEl 'tenantId'/>
+ <#assign ignore = ["id", "tenantId", "createUser", "createDate"]>
+ <#list columns as column>
+ <#if ignore?seq_contains(column.scode)==false>
+ ,`${column.scode}` = <@mapperEl '${column.scode}'/>
+ #if>
+ #list>
+
+ where `id` = <@mapperEl 'id'/>
+
+
+
+ delete from ${code}
+ where `id` = <@mapperEl 'id'/>
+
+
+
+ delete from ${code}
+ <@jspEl 'condition'/>
+
+
+
+ delete from ${code}
+ where `tenantId` = <@mapperEl 'tenantId'/> and <@jspEl 'property'/>=<@mapperEl 'value'/>
+
+
+
\ No newline at end of file
diff --git a/food-pdm-tools/src/main/resources/template/service.impl.java.ftl b/food-pdm-tools/src/main/resources/template/service.impl.java.ftl
new file mode 100644
index 0000000..6a42b7f
--- /dev/null
+++ b/food-pdm-tools/src/main/resources/template/service.impl.java.ftl
@@ -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;
+ }
+
+}
+
diff --git a/food-pdm-tools/src/main/resources/template/service.java.ftl b/food-pdm-tools/src/main/resources/template/service.java.ftl
new file mode 100644
index 0000000..bf99cb0
--- /dev/null
+++ b/food-pdm-tools/src/main/resources/template/service.java.ftl
@@ -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> {
+
+}
diff --git a/food-pdm-tools/src/main/resources/template/spring.reference.xml.ftl b/food-pdm-tools/src/main/resources/template/spring.reference.xml.ftl
new file mode 100644
index 0000000..f68d5bf
--- /dev/null
+++ b/food-pdm-tools/src/main/resources/template/spring.reference.xml.ftl
@@ -0,0 +1,13 @@
+<#macro mapperEl value>${r"#{"}${value}}#macro>
+<#macro jspEl value>${r"${"}${value}}#macro>
+
+<#list tableList as table>
+
+.${table.sign}#if>.${table.scode}Service"
+ version="<@jspEl 'reference.version'/>"
+ group="<@jspEl 'reference.group'/>" timeout="<@jspEl 'reference.timeout'/>"
+ retries="<@jspEl 'reference.retries'/>" />
+
+#list>
+
+
\ No newline at end of file
diff --git a/food-pdm-tools/src/main/resources/template/spring.service.xml.ftl b/food-pdm-tools/src/main/resources/template/spring.service.xml.ftl
new file mode 100644
index 0000000..34c3893
--- /dev/null
+++ b/food-pdm-tools/src/main/resources/template/spring.service.xml.ftl
@@ -0,0 +1,13 @@
+<#macro mapperEl value>${r"#{"}${value}}#macro>
+<#macro jspEl value>${r"${"}${value}}#macro>
+
+<#list tableList as table>
+
+.${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>
+
+
diff --git a/food-pdm-tools/src/main/resources/template/spring.test.xml.ftl b/food-pdm-tools/src/main/resources/template/spring.test.xml.ftl
new file mode 100644
index 0000000..5a62f6a
--- /dev/null
+++ b/food-pdm-tools/src/main/resources/template/spring.test.xml.ftl
@@ -0,0 +1,13 @@
+<#macro mapperEl value>${r"#{"}${value}}#macro>
+<#macro jspEl value>${r"${"}${value}}#macro>
+
+<#list tableList as table>
+
+.${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>
+
+
\ No newline at end of file