package org.dddlib.codegen.api; import org.dddlib.codegen.classdef.ClassDefinition; import java.io.*; import java.util.HashSet; import java.util.Set; /** * 领域类生成器接口。从各种文件或输入流中读取领域类定义生成Java类源文件。 * Created by yyang on 2016/12/21. */ public final class DomainClassGenerator { private Set<DefinitionParser> parsers; private ClassGenerator generator; public DomainClassGenerator(Set<DefinitionParser> parsers, ClassGenerator generator) { this.parsers = parsers; this.generator = generator; } public Set<JavaSourceFile> generateFromFile(String file) { String ext = getExtOfFile(file); return generateFrom(parserOf(ext).parseFile(file)); } public Set<JavaSourceFile> generateFromFile(File file) { String ext = getExtOfFile(file.getName()); return generateFrom(parserOf(ext).parseFile(file)); } public Set<JavaSourceFile> generateFromClasspath(String filePath) { String ext = getExtOfFile(filePath); return generateFrom(parserOf(ext).parseClasspath(filePath)); } public Set<JavaSourceFile> generateFromReader(Reader in, String type) { return generateFrom(parserOf(type).parseReader(in)); } private Set<JavaSourceFile> generateFrom(Set<ClassDefinition> definitions) { Set<JavaSourceFile> results = new HashSet<JavaSourceFile>(); for (ClassDefinition definition : definitions) { results.add(generator.generate(definition)); } return results; } private DefinitionParser parserOf(String ext) { for (DefinitionParser parser : parsers) { if (parser.accept(ext)) { return parser; } } throw new UnsupportedFileFormatException("没有解析器支持文件类型." + ext); } private String getExtOfFile(String filename) { int pos = filename.lastIndexOf("."); if (pos < 0) { return ""; } return filename.substring(pos + 1); } }