diff --git a/pom.xml b/pom.xml index afdf1017..2375f26b 100644 --- a/pom.xml +++ b/pom.xml @@ -41,7 +41,6 @@ 2.2.36 4.0.3 2.19.2 - 0.0.3 0.16.0 1.37 1.8.0 @@ -188,7 +187,7 @@ - + io.github.ascopes protobuf-maven-plugin @@ -239,7 +238,7 @@ - + org.apache.maven.plugins @@ -322,11 +321,6 @@ maven-plugin-api ${maven.version} - - org.apache.maven.resolver - maven-resolver-api - 1.9.18 - javax.inject javax.inject @@ -338,9 +332,9 @@ 1.8.0 - org.apache.commons - commons-csv - 1.11.0 + org.apache.commons + commons-csv + 1.11.0 org.slf4j @@ -377,13 +371,18 @@ xmlbeans 5.2.1 - + com.google.protobuf protobuf-javalite ${protobuf.version} + + io.github.unknow0.maven + unknow-maven-codegen + 0.02 + io.github.unknow0.model unknow-model-bom diff --git a/unknow-server-maven/pom.xml b/unknow-server-maven/pom.xml index aab6925b..d6056db2 100644 --- a/unknow-server-maven/pom.xml +++ b/unknow-server-maven/pom.xml @@ -95,6 +95,10 @@ unknow-model-simple test + + io.github.unknow0.maven + unknow-maven-codegen + com.github.javaparser @@ -118,10 +122,6 @@ org.apache.maven maven-plugin-api - - org.apache.maven.resolver - maven-resolver-api - jakarta.servlet diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/AbstractGeneratorMojo.java b/unknow-server-maven/src/main/java/unknow/server/maven/AbstractGeneratorMojo.java index 23623b20..6a054f91 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/AbstractGeneratorMojo.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/AbstractGeneratorMojo.java @@ -3,325 +3,26 @@ */ package unknow.server.maven; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.net.URL; -import java.net.URLClassLoader; -import java.nio.file.FileVisitResult; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.SimpleFileVisitor; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.BiConsumer; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -import org.apache.maven.model.Resource; -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.MojoExecution; +import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Parameter; -import org.apache.maven.project.MavenProject; -import org.codehaus.plexus.util.DirectoryWalkListener; -import org.codehaus.plexus.util.DirectoryWalker; import org.eclipse.aether.RepositorySystem; -import org.eclipse.aether.RepositorySystemSession; -import org.eclipse.aether.artifact.DefaultArtifact; -import org.eclipse.aether.resolution.ArtifactRequest; -import org.eclipse.aether.resolution.ArtifactResolutionException; -import org.eclipse.aether.resolution.ArtifactResult; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.github.javaparser.JavaParser; -import com.github.javaparser.ParseResult; -import com.github.javaparser.ParserConfiguration; -import com.github.javaparser.ast.CompilationUnit; -import com.github.javaparser.ast.Node; -import com.github.javaparser.ast.PackageDeclaration; -import com.github.javaparser.ast.body.TypeDeclaration; -import com.github.javaparser.resolution.TypeSolver; -import com.github.javaparser.symbolsolver.JavaSymbolSolver; -import com.github.javaparser.symbolsolver.resolution.typesolvers.ClassLoaderTypeSolver; -import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver; -import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver; -import unknow.model.api.ModelLoader; -import unknow.model.api.TypeModel; -import unknow.model.ast.AstModelLoader; -import unknow.model.jvm.JvmModelLoader; +import unknow.maven.codegen.AbstractCodeGenMojo; +import unknow.maven.codegen.CodeGenConfig; /** * @author unknow */ -public abstract class AbstractGeneratorMojo extends AbstractMojo { - private static final Logger logger = LoggerFactory.getLogger(AbstractGeneratorMojo.class); - - @Parameter(defaultValue = "${project}", required = true, readonly = true) - protected MavenProject project; - - @Parameter(defaultValue = "${repositorySystemSession}", required = true, readonly = true) - private RepositorySystemSession session; - @org.apache.maven.plugins.annotations.Component +public abstract class AbstractGeneratorMojo extends AbstractCodeGenMojo { + @Parameter(defaultValue = "${session}", required = true, readonly = true) + protected MavenSession session; + @Parameter(defaultValue = "${mojo}", required = true, readonly = true) + protected MojoExecution mojo; + @Component protected RepositorySystem repository; - @Parameter(name = "packageName") - protected String packageName; - - @Parameter(name = "output") - private String output; - - @Parameter(name = "resources") - protected String resources; - - @Parameter(name = "graalvm", defaultValue = "true") - protected boolean graalvm; - - @Parameter(name = "artifacts") - protected List artifacts; - - @Parameter(name = "prettyPrint") - protected PrettyPrintConfiguration ppConfig = new PrettyPrintConfiguration(); - - protected Output out; - - /** created with init() */ - protected JavaParser parser; - /** created with init() */ - protected TypeSolver resolver; - /** created with init() */ - protected JavaSymbolSolver javaSymbolSolver; - - /** - * existing public class in output package (simpleName->fqn).
- * populated with processSrc - */ - protected final Map existingClass = new HashMap<>(); - - /** all class in src (fqn to classDef) */ - protected final Map> classes = new HashMap<>(); - protected final Map packages = new HashMap<>(); - - protected ModelLoader loader; - - protected ClassLoader classLoader; - - abstract protected String id(); - - protected void init() throws MojoFailureException { - classLoader = getClassLoader(); - loader = ModelLoader.from(JvmModelLoader.GLOBAL, new AstModelLoader(classes, packages), new JvmModelLoader(classLoader)); - - List compileSourceRoots = project.getCompileSourceRoots(); - - List solver = new ArrayList<>(compileSourceRoots.size() + 1); - solver.add(new ClassLoaderTypeSolver(classLoader)); - for (String s : compileSourceRoots) { - if (Files.isDirectory(Paths.get(s))) - solver.add(new JavaParserTypeSolver(s)); - } - resolver = new CombinedTypeSolver(solver); - javaSymbolSolver = new JavaSymbolSolver(resolver); - parser = new JavaParser(new ParserConfiguration().setStoreTokens(true).setSymbolResolver(javaSymbolSolver)); - - if (output == null) - output = project.getBuild().getDirectory() + "/" + id() + "/src"; - project.addCompileSourceRoot(output); - - if (resources == null) - resources = project.getBuild().getDirectory() + "/" + id() + "/resources"; - addResource(resources); - - try { - out = new Output(output, packageName, ppConfig.toPrinterConfiguration()); - } catch (IOException e) { - throw new MojoFailureException("failed to create output folders", e); - } - } - - /** - * @return a newly created compilationUnit - */ - public CompilationUnit newCu() { - CompilationUnit cu = new CompilationUnit(packageName); - cu.setData(Node.SYMBOL_RESOLVER_KEY, javaSymbolSolver); - return cu; - } - - private ClassLoader getClassLoader() { - try { - List classpathElements = project.getRuntimeClasspathElements(); - URL urls[] = new URL[classpathElements.size()]; - - for (int i = 0; i < urls.length; i++) - urls[i] = new File(classpathElements.get(i)).toURI().toURL(); - return new URLClassLoader(urls, getClass().getClassLoader()); - } catch (Exception e) { - logger.error("Failed to get project classpath", e); - return getClass().getClassLoader(); - } - } - - protected void process(TypeConsumer c) throws MojoExecutionException, MojoFailureException { - - SrcWalker w = new SrcWalker(); - for (String s : project.getCompileSourceRoots()) - w.walk(s); - for (String q : classes.keySet()) - c.accept(loader.get(q)); - - if (artifacts == null || artifacts.isEmpty()) - return; - try { - for (String id : artifacts) - parseArtifact(id, c); - } catch (Exception e) { - throw new MojoExecutionException(e); - } - } - - private void parseArtifact(String id, TypeConsumer c) throws ArtifactResolutionException, MojoExecutionException, MojoFailureException { - ArtifactResult a = repository.resolveArtifact(session, new ArtifactRequest().setArtifact(new DefaultArtifact(id))); - if (a == null) - throw new MojoFailureException("Failed to resolve " + id); - try (FileInputStream is = new FileInputStream(a.getArtifact().getFile()); ZipInputStream zip = new ZipInputStream(is)) { - ZipEntry e; - while ((e = zip.getNextEntry()) != null) { - String name = e.getName(); - if (!name.endsWith(".class")) - continue; - c.accept(loader.get(name.substring(0, name.length() - 6).replaceAll("[/$]", "."))); - } - } catch (MojoExecutionException | MojoFailureException e) { - throw e; - } catch (Exception e) { - throw new MojoFailureException("Failed to resolve " + id, e); - } - } - - protected void processResources(BiConsumer c) { - DirectoryWalker scanner = new DirectoryWalker(); - L l = new L(c); - scanner.addDirectoryWalkListener(l); - for (Resource r : project.getResources()) { - l.root = Paths.get(r.getDirectory()); - if (!Files.exists(l.root)) - continue; - scanner.setBaseDir(l.root.toFile()); - scanner.setIncludes(r.getIncludes()); - scanner.setExcludes(r.getExcludes()); - scanner.scan(); - } - } - - private void addResource(String resources) { - for (Resource e : project.getResources()) { - if (resources.equals(e.getDirectory())) - return; - } - Resource resource = new Resource(); - resource.setDirectory(resources); - project.addResource(resource); - - try { - Files.createDirectories(Paths.get(resources)); - } catch (@SuppressWarnings("unused") IOException e) { // ignore - } - } - - private class SrcWalker extends SimpleFileVisitor { - private final String[] part; - private Path local; - private int count; - private Exception ex; - - public SrcWalker() { - this.part = packageName == null ? new String[0] : packageName.split("\\."); - } - - public void walk(String s) throws MojoFailureException, MojoExecutionException { - Path path = Paths.get(s); - if (!Files.isDirectory(path)) - return; - - local = Paths.get(s, part); - count = local.getNameCount(); - ex = null; - try { - Files.walkFileTree(path, this); - } catch (IOException e) { - throw new MojoExecutionException("Failed to process source " + s, e); - } - if (ex instanceof MojoExecutionException) - throw (MojoExecutionException) ex; - if (ex instanceof MojoFailureException) - throw (MojoFailureException) ex; - if (ex != null) - throw new MojoExecutionException("Failed to process source " + s, ex); - } - - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - String f = file.getFileName().toString(); - if (!f.endsWith(".java")) - return FileVisitResult.CONTINUE; - ParseResult parse = parser.parse(file); - - if (!parse.isSuccessful()) { - logger.warn("Failed to parse {}: {}", f, parse.getProblems()); - return FileVisitResult.CONTINUE; - } - CompilationUnit cu = parse.getResult().orElse(null); - if (cu == null) - return FileVisitResult.CONTINUE; - cu.getPackageDeclaration().filter(v -> v.getAnnotations() != null).ifPresent(v -> packages.put(v.getNameAsString(), v)); - for (TypeDeclaration v : cu.findAll(TypeDeclaration.class)) { - String qualifiedName = v.resolve().getQualifiedName(); - classes.put(qualifiedName, v); - } - if (count == file.getNameCount() && file.startsWith(local)) { - String string = file.getFileName().toString(); - string = string.substring(0, string.length() - 5); - existingClass.put(string, packageName + "." + string); - } - return FileVisitResult.CONTINUE; - } - } - - private static class L implements DirectoryWalkListener { - final BiConsumer c; - Path root; - - L(BiConsumer c) { - this.c = c; - } - - @Override - public void directoryWalkStep(int percentage, File file) { - Path path = file.toPath(); - c.accept(path, root.relativize(path)); - } - - @Override - public void directoryWalkStarting(File basedir) { // ok - } - - @Override - public void directoryWalkFinished() { // ok - } - - @Override - public void debug(String message) { // ok - } - } - - public static interface TypeConsumer { - void accept(TypeModel t) throws MojoExecutionException, MojoFailureException; - } + @Parameter + protected CodeGenConfig codegen; } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/ImportGroupsOrdering.java b/unknow-server-maven/src/main/java/unknow/server/maven/ImportGroupsOrdering.java deleted file mode 100644 index 3659bcff..00000000 --- a/unknow-server-maven/src/main/java/unknow/server/maven/ImportGroupsOrdering.java +++ /dev/null @@ -1,77 +0,0 @@ -package unknow.server.maven; - -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; - -import com.github.javaparser.ast.ImportDeclaration; -import com.github.javaparser.ast.NodeList; -import com.github.javaparser.ast.nodeTypes.NodeWithName; -import com.github.javaparser.printer.configuration.ImportOrderingStrategy; - -/** - * Defines strategies used when ordering import statements. - */ -public class ImportGroupsOrdering implements ImportOrderingStrategy { - private static final Comparator SORT = Comparator.comparing(NodeWithName::getNameAsString); - - private boolean sortImportsAlphabetically = false; - - private final String[][] groups; - - public ImportGroupsOrdering(List groups) { - this.groups = new String[groups.size()][]; - int i = 0; - for (String s : groups) - this.groups[i++] = s.split("[, ]+"); - } - - @Override - public List> sortImports(NodeList nodes) { - @SuppressWarnings("unchecked") - NodeList[] imports = new NodeList[groups.length + 2]; - for (int i = 0; i < imports.length; i++) - imports[i] = new NodeList<>(); - int other = imports.length - 1; - - loop: for (ImportDeclaration importDeclaration : nodes) { - // Check if is a static import - if (importDeclaration.isStatic()) { - imports[0].add(importDeclaration); - continue; - } - String importName = importDeclaration.getNameAsString(); - - for (int i = 0; i < groups.length; i++) { - if (match(importName, groups[i])) { - imports[i + 1].add(importDeclaration); - continue loop; - } - } - imports[other].add(importDeclaration); - } - if (sortImportsAlphabetically) { - for (int i = 0; i < imports.length; i++) - imports[i].sort(SORT); - } - return Arrays.asList(imports); - } - - private boolean match(String importName, String[] group) { - for (int i = 0; i < group.length; i++) { - if (importName.startsWith(group[i])) - return true; - } - return false; - } - - @Override - public void setSortImportsAlphabetically(boolean sortAlphabetically) { - sortImportsAlphabetically = sortAlphabetically; - } - - @Override - public boolean isSortImportsAlphabetically() { - return sortImportsAlphabetically; - } -} \ No newline at end of file diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/Indentation.java b/unknow-server-maven/src/main/java/unknow/server/maven/Indentation.java deleted file mode 100644 index ae2f7d3e..00000000 --- a/unknow-server-maven/src/main/java/unknow/server/maven/Indentation.java +++ /dev/null @@ -1,52 +0,0 @@ -package unknow.server.maven; - -import org.apache.maven.plugins.annotations.Parameter; - -import com.github.javaparser.printer.configuration.Indentation.IndentType; - -/** -* Represents indentation configuration. -*/ -public class Indentation { - - /** Type of indentation (e.g., SPACES or TABS). */ - @Parameter - private IndentType type = IndentType.TABS; - - /** Number of spaces or tabs used per indentation level. */ - @Parameter - private int value = 1; - - public Indentation() { - } - - public Indentation(IndentType type, int value) { - this.type = type; - this.value = value; - } - - public IndentType getType() { - return type; - } - - public void setType(IndentType type) { - this.type = type; - } - - public int getValue() { - return value; - } - - public void setValue(int value) { - this.value = value; - } - - @Override - public String toString() { - return type + "(" + value + ")"; - } - - public com.github.javaparser.printer.configuration.Indentation toIndentation() { - return new com.github.javaparser.printer.configuration.Indentation(type, value); - } -} \ No newline at end of file diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/Output.java b/unknow-server-maven/src/main/java/unknow/server/maven/Output.java deleted file mode 100644 index 2137f0ad..00000000 --- a/unknow-server-maven/src/main/java/unknow/server/maven/Output.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * - */ -package unknow.server.maven; - -import java.io.BufferedWriter; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -import org.apache.maven.plugin.MojoExecutionException; - -import com.github.javaparser.ast.CompilationUnit; -import com.github.javaparser.ast.body.TypeDeclaration; -import com.github.javaparser.printer.configuration.PrinterConfiguration; - -/** - * @author unknow - */ -public class Output { - private final Path out; - private final PrinterConfiguration pp; - - public Output(String output, String packageName, PrinterConfiguration pp) throws IOException { - this.pp = pp; - Path file = Paths.get(output); - if (packageName != null) - file = file.resolve(packageName.replace('.', '/')); - out = file; - Files.createDirectories(out); - } - - public void save(CompilationUnit cu) throws MojoExecutionException { - String name = cu.findFirst(TypeDeclaration.class, c -> c.isPublic()).map(c -> c.getNameAsString()).orElse(null); - if (name == null) - name = cu.findFirst(TypeDeclaration.class).map(c -> c.getNameAsString()).orElse(null); - if (name == null) - throw new MojoExecutionException("not type in unit" + cu); - try (BufferedWriter w = Files.newBufferedWriter(out.resolve(name + ".java"), StandardCharsets.UTF_8)) { - w.write(cu.toString(pp)); - } catch (IOException e) { - throw new MojoExecutionException(e); - } - } -} diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/PrettyPrintConfiguration.java b/unknow-server-maven/src/main/java/unknow/server/maven/PrettyPrintConfiguration.java deleted file mode 100644 index 3ddd8d19..00000000 --- a/unknow-server-maven/src/main/java/unknow/server/maven/PrettyPrintConfiguration.java +++ /dev/null @@ -1,226 +0,0 @@ -package unknow.server.maven; - -import java.util.Arrays; -import java.util.List; - -import org.apache.maven.plugins.annotations.Parameter; - -import com.github.javaparser.printer.configuration.DefaultConfigurationOption; -import com.github.javaparser.printer.configuration.DefaultPrinterConfiguration; -import com.github.javaparser.printer.configuration.DefaultPrinterConfiguration.ConfigOption; -import com.github.javaparser.printer.configuration.Indentation.IndentType; -import com.github.javaparser.printer.configuration.PrinterConfiguration; - -/** - * Configuration du formateur de code (Pretty Printer). - * - *

Chaque option correspond à une valeur de l'enum {@code ConfigOption}. - * Les paramètres définis ici peuvent être configurés directement dans le pom.xml sous le tag - * {@code }.

- */ -public class PrettyPrintConfiguration { - - /** - * Order imports alphabetically. - */ - @Parameter(defaultValue = "true") - private boolean orderImports; - - /** - * The list of package prefix to group together to use (default ["java.", "javax.", "org.", "com."]) - */ - @Parameter - private List orderImportGroups = Arrays.asList("java.", "javax.", "org.", "com."); - - /** - * Print comments only. It can be combined with {@code PRINT_JAVADOC} to print regular comments and javadoc. - */ - @Parameter(defaultValue = "true") - private boolean printComments; - - /** - * Print javadoc comments only. It can be combined with {@code PRINT_COMMENTS} to print regular javadoc and comments. - */ - @Parameter(defaultValue = "true") - private boolean printJavadoc; - - /** - * Insert spaces around operators. - */ - @Parameter(defaultValue = "true") - private boolean spaceAroundOperators; - - /** - * Align method parameters in columns. - */ - @Parameter(defaultValue = "false") - private boolean columnAlignParameters; - - /** - * Align the first element of a method chain. - */ - @Parameter(defaultValue = "true") - private boolean columnAlignFirstMethodChain; - - /** - * Indent the case when it is true, don't if false - *
{@code
-	 * switch(x) {            switch(x) {
-	 *    case 1:             case 1:
-	 *        return y;           return y;
-	 *    case 2:             case 2:
-	 *        return z;           return x;
-	 * }                       }
-	 * }
-	 */
-	@Parameter(defaultValue = "true")
-	private boolean indentCaseInSwitch;
-
-	/**
-	* By default enum constants get aligned like this:
-	* 
{@code
-	*     enum X {
-	*        A, B, C, D
-	*     }
-	* }
-	* until the amount of constants passes this currentValue (5 by default).
-	* Then they get aligned like this:
-	* 
{@code
-	*     enum X {
-	*        A,
-	*        B,
-	*        C,
-	*        D,
-	*        E,
-	*        F,
-	*        G
-	*     }
-	* }
- * Set it to a very large number (e.g. {@code Integer.MAX_VALUE} to always align horizontally. - * Set it to 1 or less to always align vertically. - */ - @Parameter(defaultValue = "5") - private int maxEnumConstantsToAlignHorizontally; - - /** - * The end-of-line character used when printing code. Default is system-dependent. - */ - @Parameter - private String endOfLineCharacter = System.getProperty("line.separator"); - - /** - * Indentation property. - */ - @Parameter - private Indentation indentation = new Indentation(IndentType.SPACES, 4); - - public boolean isOrderImports() { - return orderImports; - } - - public void setOrderImports(boolean orderImports) { - this.orderImports = orderImports; - } - - public List getOrderImportGroups() { - return orderImportGroups; - } - - public void setOrderImportGroups(List orderImportGroups) { - this.orderImportGroups = orderImportGroups; - } - - public boolean isPrintComments() { - return printComments; - } - - public void setPrintComments(boolean printComments) { - this.printComments = printComments; - } - - public boolean isPrintJavadoc() { - return printJavadoc; - } - - public void setPrintJavadoc(boolean printJavadoc) { - this.printJavadoc = printJavadoc; - } - - public boolean isSpaceAroundOperators() { - return spaceAroundOperators; - } - - public void setSpaceAroundOperators(boolean spaceAroundOperators) { - this.spaceAroundOperators = spaceAroundOperators; - } - - public boolean isColumnAlignParameters() { - return columnAlignParameters; - } - - public void setColumnAlignParameters(boolean columnAlignParameters) { - this.columnAlignParameters = columnAlignParameters; - } - - public boolean isColumnAlignFirstMethodChain() { - return columnAlignFirstMethodChain; - } - - public void setColumnAlignFirstMethodChain(boolean columnAlignFirstMethodChain) { - this.columnAlignFirstMethodChain = columnAlignFirstMethodChain; - } - - public boolean isIndentCaseInSwitch() { - return indentCaseInSwitch; - } - - public void setIndentCaseInSwitch(boolean indentCaseInSwitch) { - this.indentCaseInSwitch = indentCaseInSwitch; - } - - public int getMaxEnumConstantsToAlignHorizontally() { - return maxEnumConstantsToAlignHorizontally; - } - - public void setMaxEnumConstantsToAlignHorizontally(int maxEnumConstantsToAlignHorizontally) { - this.maxEnumConstantsToAlignHorizontally = maxEnumConstantsToAlignHorizontally; - } - - public String getEndOfLineCharacter() { - return endOfLineCharacter; - } - - public void setEndOfLineCharacter(String endOfLineCharacter) { - this.endOfLineCharacter = endOfLineCharacter; - } - - public Indentation getIndentation() { - return indentation; - } - - public void setIndentation(Indentation indentation) { - this.indentation = indentation; - } - - public PrinterConfiguration toPrinterConfiguration() { - PrinterConfiguration config = new DefaultPrinterConfiguration().addOption(new DefaultConfigurationOption(ConfigOption.ORDER_IMPORTS, orderImports)) - .addOption(new DefaultConfigurationOption(ConfigOption.SORT_IMPORTS_STRATEGY, new ImportGroupsOrdering(orderImportGroups))) - .addOption(new DefaultConfigurationOption(ConfigOption.MAX_ENUM_CONSTANTS_TO_ALIGN_HORIZONTALLY, maxEnumConstantsToAlignHorizontally)) - .addOption(new DefaultConfigurationOption(ConfigOption.END_OF_LINE_CHARACTER, endOfLineCharacter)) - .addOption(new DefaultConfigurationOption(ConfigOption.INDENTATION, indentation.toIndentation())); - if (indentCaseInSwitch) - config.addOption(new DefaultConfigurationOption(ConfigOption.INDENT_CASE_IN_SWITCH)); - if (spaceAroundOperators) - config.addOption(new DefaultConfigurationOption(ConfigOption.SPACE_AROUND_OPERATORS)); - if (columnAlignFirstMethodChain) - config.addOption(new DefaultConfigurationOption(ConfigOption.COLUMN_ALIGN_FIRST_METHOD_CHAIN)); - if (printComments) - config.addOption(new DefaultConfigurationOption(ConfigOption.PRINT_COMMENTS)); - if (printJavadoc) - config.addOption(new DefaultConfigurationOption(ConfigOption.PRINT_JAVADOC)); - if (columnAlignParameters) - config.addOption(new DefaultConfigurationOption(ConfigOption.COLUMN_ALIGN_PARAMETERS)); - return config; - - } -} diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/SourceBuilder.java b/unknow-server-maven/src/main/java/unknow/server/maven/SourceBuilder.java index acca8e1e..1b4d2f2d 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/SourceBuilder.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/SourceBuilder.java @@ -2,17 +2,19 @@ import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; +import unknow.maven.codegen.TypeFactory; + public interface SourceBuilder { - void process(ClassOrInterfaceDeclaration cl, TypeCache types, T ctx); + void process(ClassOrInterfaceDeclaration cl, TypeFactory types, T ctx); public abstract class AbstractSourceBuilder implements SourceBuilder { protected ClassOrInterfaceDeclaration cl; - protected TypeCache types; + protected TypeFactory types; protected T ctx; @Override - public final void process(ClassOrInterfaceDeclaration cl, TypeCache types, T ctx) { + public final void process(ClassOrInterfaceDeclaration cl, TypeFactory types, T ctx) { this.cl = cl; this.types = types; this.ctx = ctx; diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/TypeCache.java b/unknow-server-maven/src/main/java/unknow/server/maven/TypeCache.java deleted file mode 100644 index 538a1b4b..00000000 --- a/unknow-server-maven/src/main/java/unknow/server/maven/TypeCache.java +++ /dev/null @@ -1,148 +0,0 @@ -/** - * - */ -package unknow.server.maven; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.github.javaparser.ast.CompilationUnit; -import com.github.javaparser.ast.NodeList; -import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; -import com.github.javaparser.ast.expr.SimpleName; -import com.github.javaparser.ast.type.ArrayType; -import com.github.javaparser.ast.type.ClassOrInterfaceType; -import com.github.javaparser.ast.type.PrimitiveType; -import com.github.javaparser.ast.type.PrimitiveType.Primitive; -import com.github.javaparser.ast.type.Type; -import com.github.javaparser.ast.type.UnknownType; -import com.github.javaparser.ast.type.WildcardType; - -import unknow.model.api.ModelLoader; -import unknow.model.api.PrimitiveModel; -import unknow.model.api.TypeModel; - -/** - * @author unknow - */ -public class TypeCache { - public static final Type EMPTY = new UnknownType(); - public static final Type ANY = new WildcardType(); - - private final Map types; - - private final CompilationUnit cu; - private final Map existingClass; - - public TypeCache(CompilationUnit cu, Map existingClass) { - this.cu = cu; - this.existingClass = new HashMap<>(existingClass); - - this.types = new HashMap<>(); - types.put("", EMPTY); - types.put("?", ANY); - - for (PrimitiveModel p : PrimitiveModel.PRIMITIVES) { - PrimitiveType type = Primitive.byTypeName(p.simpleName()).map(t -> new PrimitiveType(t)).orElse(null); - if (type != null) { - types.put(p.name(), type); - types.put(p.simpleName(), type); - } - } - } - - public ClassOrInterfaceType getClass(String cl) { - Type type = get(cl); - if (type.isPrimitiveType()) - return type.asPrimitiveType().toBoxedType(); - return type.asClassOrInterfaceType(); - } - - public ClassOrInterfaceType getClass(TypeModel c) { - Type type = get(c.name()); - if (type.isPrimitiveType()) - return type.asPrimitiveType().toBoxedType(); - return type.asClassOrInterfaceType(); - } - - public ClassOrInterfaceType getClass(Class c, Type... param) { - String cl = c.getCanonicalName(); - if (param.length > 0) { - StringBuilder sb = new StringBuilder(cl).append('<'); - for (int i = 0; i < param.length; i++) - sb.append(param[i]).append(','); - sb.setCharAt(sb.length() - 1, '>'); - cl = sb.toString(); - } - Type type = get(cl); - if (type.isPrimitiveType()) - return type.asPrimitiveType().toBoxedType(); - return type.asClassOrInterfaceType(); - } - - public ArrayType array(Class cl) { - return get(cl.getCanonicalName() + "[]").asArrayType(); - } - - public Type get(TypeModel c) { - return get(c.toString()); - } - - public Type get(Class c) { - return get(c.getCanonicalName()); - } - - public ClassOrInterfaceType getClass(ClassOrInterfaceDeclaration decl) { - return get(decl.resolve().getQualifiedName()).asClassOrInterfaceType(); - } - - public Type get(String cl) { - Type t = types.get(cl); - if (t == null) - types.put(cl, t = create(cl)); - return t; - } - - private Type create(String cl) { - if (cl.endsWith("[]")) - return new ArrayType(get(cl.substring(0, cl.length() - 2))); - if (cl.startsWith("[")) - return new ArrayType(get(cl.substring(1))); - if (cl.equals("?")) - return new WildcardType(); - if (cl.startsWith("? extends ")) - return new WildcardType(getClass(cl.substring(10))); - if (cl.startsWith("? super ")) - return new WildcardType().setSuperType(getClass(cl.substring(8))); - - List parse = ModelLoader.parse(cl); - - NodeList params = null; - if (parse.size() > 1) { - params = new NodeList<>(); - for (int i = 1; i < parse.size(); i++) - params.add(get(parse.get(i))); - } - - cl = parse.get(0); - String[] split = cl.split("[.$]"); - String last = split[split.length - 1]; - String string = existingClass.get(last); - if (string != null && !cl.equals(string)) { - ClassOrInterfaceType t = new ClassOrInterfaceType(null, split[0]); - for (int i = 1; i < split.length; i++) - t = new ClassOrInterfaceType(t, split[i]); - return t.setTypeArguments(params); - } - String p = cu.getPackageDeclaration().map(v -> v.getNameAsString()).orElse(""); - int i = cl.lastIndexOf('.'); - if (i > 0 && p.equals(cl.substring(0, i))) - existingClass.put(last, cl); - else if (split.length > 1 && string == null) { - cu.addImport(cl.replace('$', '.')); - existingClass.put(last, cl); - } - return new ClassOrInterfaceType(null, new SimpleName(last), params); - } -} \ No newline at end of file diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/Utils.java b/unknow-server-maven/src/main/java/unknow/server/maven/Utils.java index 8bba9b6a..5e8e2b2d 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/Utils.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/Utils.java @@ -9,24 +9,13 @@ import java.util.List; import java.util.Map; -import com.github.javaparser.ast.ArrayCreationLevel; -import com.github.javaparser.ast.Modifier; -import com.github.javaparser.ast.Node; import com.github.javaparser.ast.NodeList; -import com.github.javaparser.ast.expr.ArrayCreationExpr; -import com.github.javaparser.ast.expr.ArrayInitializerExpr; -import com.github.javaparser.ast.expr.AssignExpr; -import com.github.javaparser.ast.expr.AssignExpr.Operator; -import com.github.javaparser.ast.expr.BinaryExpr; import com.github.javaparser.ast.expr.Expression; import com.github.javaparser.ast.expr.IntegerLiteralExpr; import com.github.javaparser.ast.expr.ObjectCreationExpr; -import com.github.javaparser.ast.expr.StringLiteralExpr; -import com.github.javaparser.ast.expr.VariableDeclarationExpr; -import com.github.javaparser.ast.type.ClassOrInterfaceType; -import com.github.javaparser.ast.type.PrimitiveType; -import com.github.javaparser.ast.type.Type; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.TypeFactory; import unknow.server.util.data.ArrayMap; import unknow.server.util.data.ArraySet; @@ -34,91 +23,9 @@ * @author unknow */ public class Utils { - public static final Modifier.Keyword[] PUBLIC = { Modifier.Keyword.PUBLIC, Modifier.Keyword.FINAL }; - public static final Modifier.Keyword[] PUBLIC_STATIC = { Modifier.Keyword.PUBLIC, Modifier.Keyword.STATIC, Modifier.Keyword.FINAL }; - public static final Modifier.Keyword[] PROTECT = { Modifier.Keyword.PROTECTED, Modifier.Keyword.FINAL }; - public static final Modifier.Keyword[] PSF = { Modifier.Keyword.PRIVATE, Modifier.Keyword.STATIC, Modifier.Keyword.FINAL }; - public static final Modifier.Keyword[] PRIVATE = { Modifier.Keyword.PRIVATE, Modifier.Keyword.FINAL }; - private Utils() { } - public static StringLiteralExpr text(String s) { - return new StringLiteralExpr(s.replace("\\", "\\\\").replace("\"", "\\\"").replace("\u0000", "\\u0000")); - } - - /** - * create a node list - * - * @param type of element - * @param t the values - * @return the node list - */ - @SafeVarargs - public static NodeList list(T... t) { - return new NodeList<>(t); - } - - /** - * new byte[]{values} - * - * @param b the values - * @return the byte array creation - */ - public static Expression byteArray(byte[] b) { - NodeList nodeList = new NodeList<>(); - for (int i = 0; i < b.length; i++) - nodeList.add(new IntegerLiteralExpr(Byte.toString(b[i]))); - - return array(PrimitiveType.byteType(), nodeList); - } - - /** - * @param values the values - * @return new string[] {values} - */ - public static ArrayCreationExpr stringArray(String[] values) { - NodeList nodeList = new NodeList<>(); - for (int i = 0; i < values.length; i++) - nodeList.add(text(values[i])); - - return array(new ClassOrInterfaceType(null, "String"), nodeList); - } - - public static ArrayCreationExpr array(Type type, int... level) { - NodeList l = new NodeList<>(); - for (int i = 0; i < level.length; i++) - l.add(new ArrayCreationLevel(level[i])); - return new ArrayCreationExpr(type, l, null); - } - - /** - * create a new array - * - * @param type the element types - * @param init the values - * @return the array creation - */ - public static ArrayCreationExpr array(Type type, NodeList init) { - return new ArrayCreationExpr(type, list(new ArrayCreationLevel()), new ArrayInitializerExpr(init)); - } - - /** - * T n = value - * - * @param t the variable type - * @param n the variable name - * @param value the value - * @return the assignement - */ - public static AssignExpr assign(Type t, String n, Expression value) { - return new AssignExpr(new VariableDeclarationExpr(t, n), value, Operator.ASSIGN); - } - - public static AssignExpr create(ClassOrInterfaceType t, String n, NodeList arg) { - return assign(t, n, new ObjectCreationExpr(null, t, arg)); - } - /** * create a new ArrayMap * @@ -126,17 +33,17 @@ public static AssignExpr create(ClassOrInterfaceType t, String n, NodeList map, TypeCache types) { + public static ObjectCreationExpr mapInteger(Map map, TypeFactory types) { List list = new ArrayList<>(map.keySet()); Collections.sort(list); NodeList k = new NodeList<>(); NodeList v = new NodeList<>(); for (String key : list) { - k.add(text(key)); + k.add(CodeGenUtils.text(key)); v.add(new IntegerLiteralExpr(map.get(key).toString())); } - return new ObjectCreationExpr(null, types.getClass(ArrayMap.class, TypeCache.EMPTY), - list(array(types.getClass(String.class), k), array(types.getClass(Integer.class), v))); + return new ObjectCreationExpr(null, types.getClass(ArrayMap.class, TypeFactory.EMPTY), + CodeGenUtils.list(CodeGenUtils.array(types.getClass(String.class), k), CodeGenUtils.array(types.getClass(Integer.class), v))); } /** @@ -146,38 +53,23 @@ public static ObjectCreationExpr mapInteger(Map map, TypeCache * @param types the typeCahe * @return the array map creation */ - public static ObjectCreationExpr mapString(Map map, TypeCache types) { + public static ObjectCreationExpr mapString(Map map, TypeFactory types) { List list = new ArrayList<>(map.keySet()); Collections.sort(list); NodeList k = new NodeList<>(); NodeList v = new NodeList<>(); for (String key : list) { - k.add(text(key)); - v.add(text(map.get(key))); + k.add(CodeGenUtils.text(key)); + v.add(CodeGenUtils.text(map.get(key))); } - return new ObjectCreationExpr(null, types.getClass(ArrayMap.class, TypeCache.EMPTY), - list(array(types.getClass(String.class), k), array(types.getClass(String.class), v))); + return new ObjectCreationExpr(null, types.getClass(ArrayMap.class, TypeFactory.EMPTY), + CodeGenUtils.list(CodeGenUtils.array(types.getClass(String.class), k), CodeGenUtils.array(types.getClass(String.class), v))); } - public static ObjectCreationExpr arraySet(Collection list, TypeCache types) { + public static ObjectCreationExpr arraySet(Collection list, TypeFactory types) { NodeList n = new NodeList<>(); for (String p : list) - n.add(text(p)); - return new ObjectCreationExpr(null, types.getClass(ArraySet.class, TypeCache.EMPTY), Utils.list(Utils.array(types.getClass(String.class), n))); - } - - /** - * add all the expression together - * - * @param e expression to add - * @return e[0] + e[1] +... - */ - public static Expression add(Expression... e) { - if (e.length == 1) - return e[0]; - BinaryExpr b = new BinaryExpr(e[0], e[1], BinaryExpr.Operator.PLUS); - for (int i = 2; i < e.length; i++) - b = new BinaryExpr(b, e[i], BinaryExpr.Operator.PLUS); - return b; + n.add(CodeGenUtils.text(p)); + return new ObjectCreationExpr(null, types.getClass(ArraySet.class, TypeFactory.EMPTY), CodeGenUtils.list(CodeGenUtils.array(types.getClass(String.class), n))); } } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/JaxbGeneratorMojo.java b/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/JaxbGeneratorMojo.java index f6884dfa..a45ef6f1 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/JaxbGeneratorMojo.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/JaxbGeneratorMojo.java @@ -22,6 +22,7 @@ import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import com.github.javaparser.ast.CompilationUnit; @@ -34,6 +35,8 @@ import com.github.javaparser.ast.stmt.ReturnStmt; import jakarta.xml.bind.annotation.XmlRootElement; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.TypeFactory; import unknow.model.api.AnnotationModel; import unknow.model.api.TypeModel; import unknow.server.jaxb.XmlHandler; @@ -57,8 +60,6 @@ import unknow.server.jaxb.handler.StringHandler; import unknow.server.jaxb.handler.ZonedDateTimeHandler; import unknow.server.maven.AbstractGeneratorMojo; -import unknow.server.maven.TypeCache; -import unknow.server.maven.Utils; import unknow.server.maven.jaxb.builder.HandlerBuilder; import unknow.server.maven.jaxb.model.XmlCollection; import unknow.server.maven.jaxb.model.XmlLoader; @@ -74,6 +75,9 @@ public class JaxbGeneratorMojo extends AbstractGeneratorMojo { private final Map handlers = new HashMap<>(); private final XmlLoader xmlLoader = new XmlLoader(); + @Parameter(name = "graalvm", defaultValue = "true") + protected boolean graalvm; + public JaxbGeneratorMojo() { handlers.put(XmlLoader.BOOLEAN, BooleanHandler.class.getName()); handlers.put(XmlLoader.BYTE, ByteHandler.class.getName()); @@ -97,15 +101,10 @@ public JaxbGeneratorMojo() { handlers.put(XmlLoader.PERIOD, PeriodHandler.class.getName()); } - @Override - protected String id() { - return "jaxb-generator"; - } - @Override public void execute() throws MojoExecutionException, MojoFailureException { - init(); - process(type -> { + init(session, mojo, repository, codegen); + processSrc(type -> { if (type.annotation(jakarta.xml.bind.annotation.XmlType.class).isPresent()) xmlLoader.add(type); }); @@ -120,7 +119,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { list.sort((a, b) -> a.name().toString().compareTo(b.name().toString())); for (XmlType t : list) { if (!XmlLoader.XS.equals(t.name().getNamespaceURI()) && !(t instanceof XmlCollection)) - handlers.put(t, packageName + "." + t.type().simpleName() + "_" + i++); + handlers.put(t, fullName(t.type().simpleName() + "_" + i++)); } writeXmlLoader(); @@ -141,18 +140,18 @@ private void buildHandler(XmlType xml) throws MojoExecutionException { n = n.substring(j + 1); CompilationUnit cu = newCu(); - TypeCache types = new TypeCache(cu, existingClass); + TypeFactory types = new TypeFactory(cu, existingClass); HANDLER.process(cu.addClass(n), types, new HandlerContext(handlers, loader, xml)); - out.save(cu); + writer.write(cu); } private void writeXmlLoader() throws MojoExecutionException { CompilationUnit cu = newCu(); - TypeCache types = new TypeCache(cu, existingClass); - ClassOrInterfaceDeclaration cl = cu.addClass("XmlLoader", Utils.PUBLIC).addImplementedType(types.getClass(XmlHandlerLoader.class)); + TypeFactory types = new TypeFactory(cu, existingClass); + ClassOrInterfaceDeclaration cl = cu.addClass("XmlLoader", CodeGenUtils.PUBLIC).addImplementedType(types.getClass(XmlHandlerLoader.class)); - cl.addMethod("contextPath", Utils.PUBLIC).addMarkerAnnotation(Override.class).setType(types.getClass(String.class)).createBody() - .addStatement(new ReturnStmt(Utils.text(packageName))); + cl.addMethod("contextPath", CodeGenUtils.PUBLIC).addMarkerAnnotation(Override.class).setType(types.getClass(String.class)).createBody() + .addStatement(new ReturnStmt(CodeGenUtils.text(codegen.packageName))); NodeList list = new NodeList<>(); for (Entry e : handlers.entrySet()) { @@ -161,16 +160,17 @@ private void writeXmlLoader() throws MojoExecutionException { list.add(new FieldAccessExpr(new TypeExpr(types.get(e.getValue())), "INSTANCE")); } - cl.addMethod("handlers", Utils.PUBLIC).addMarkerAnnotation(Override.class).setType(types.getClass(Collection.class, types.getClass(XmlHandler.class, TypeCache.ANY))) - .createBody().addStatement(new ReturnStmt(new MethodCallExpr(new TypeExpr(types.get(Arrays.class)), "asList", list))); + cl.addMethod("handlers", CodeGenUtils.PUBLIC).addMarkerAnnotation(Override.class) + .setType(types.getClass(Collection.class, types.getClass(XmlHandler.class, TypeFactory.ANY))).createBody() + .addStatement(new ReturnStmt(new MethodCallExpr(new TypeExpr(types.get(Arrays.class)), "asList", list))); - out.save(cu); + writer.write(cu); - Path path = Paths.get(resources, "META-INF", "services", XmlHandlerLoader.class.getName()); + Path path = Paths.get(codegen.resources, "META-INF", "services", XmlHandlerLoader.class.getName()); try { Files.createDirectories(path.getParent()); try (BufferedWriter w = Files.newBufferedWriter(path)) { - w.append(packageName).write(".XmlLoader\n"); + w.append(fullName("XmlLoader")).write('\n'); } } catch (IOException e) { throw new MojoExecutionException(e); @@ -183,7 +183,7 @@ private void generateGraalVmResources() throws MojoFailureException { return; try { - Path path = Paths.get(resources + "/META-INF/native-image/" + id() + "/resource-config.json"); + Path path = Paths.get(codegen.resources + "/META-INF/native-image/" + uniquePath + "/resource-config.json"); Files.createDirectories(path.getParent()); try (BufferedWriter w = Files.newBufferedWriter(path)) { w.write("{\"resources\":{\"includes\":["); diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerBuilder.java b/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerBuilder.java index ce857e5c..537359ee 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerBuilder.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerBuilder.java @@ -5,8 +5,8 @@ import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; +import unknow.maven.codegen.TypeFactory; import unknow.server.maven.SourceBuilder; -import unknow.server.maven.TypeCache; import unknow.server.maven.jaxb.HandlerContext; import unknow.server.maven.jaxb.model.XmlEnum; import unknow.server.maven.jaxb.model.XmlTypeComplex; @@ -18,7 +18,7 @@ public class HandlerBuilder implements SourceBuilder { private static final HandlerObject OBJECT = new HandlerObject(); @Override - public void process(ClassOrInterfaceDeclaration cl, TypeCache types, HandlerContext ctx) { + public void process(ClassOrInterfaceDeclaration cl, TypeFactory types, HandlerContext ctx) { if (ctx.xml() instanceof XmlEnum) ENUM.process(cl, types, ctx); else if (ctx.xml() instanceof XmlTypeComplex) diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerEnum.java b/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerEnum.java index 59838b51..7bc78335 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerEnum.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerEnum.java @@ -22,11 +22,11 @@ import com.github.javaparser.ast.type.ClassOrInterfaceType; import jakarta.xml.bind.JAXBException; +import unknow.maven.codegen.CodeGenUtils; import unknow.model.api.TypeModel; import unknow.server.jaxb.XmlRootHandler; import unknow.server.jaxb.XmlSimpleHandler; import unknow.server.maven.SourceBuilder.AbstractSourceBuilder; -import unknow.server.maven.Utils; import unknow.server.maven.jaxb.HandlerContext; import unknow.server.maven.jaxb.JaxbGeneratorMojo; import unknow.server.maven.jaxb.model.XmlEnum; @@ -41,33 +41,33 @@ protected void build() { cl.addImplementedType(types.getClass(XmlSimpleHandler.class, types.getClass(t))); cl.addFieldWithInitializer(new ClassOrInterfaceType(null, cl.getNameAsString()), "INSTANCE", - new ObjectCreationExpr(null, new ClassOrInterfaceType(null, cl.getNameAsString()), Utils.list()), Utils.PUBLIC_STATIC); + new ObjectCreationExpr(null, new ClassOrInterfaceType(null, cl.getNameAsString()), CodeGenUtils.list()), CodeGenUtils.PUBLIC_STATIC); BlockStmt b = cl.addConstructor(Modifier.Keyword.PRIVATE).getBody(); QName qname = JaxbGeneratorMojo.getRootQN(t); if (qname != null) { cl.addExtendedType(types.getClass(XmlRootHandler.class, types.getClass(t))); - b.addStatement(new MethodCallExpr(null, "super", Utils.list(new ObjectCreationExpr(null, types.getClass(QName.class), - Utils.list(new StringLiteralExpr(qname.getNamespaceURI()), new StringLiteralExpr(qname.getLocalPart())))))); + b.addStatement(new MethodCallExpr(null, "super", CodeGenUtils.list(new ObjectCreationExpr(null, types.getClass(QName.class), + CodeGenUtils.list(new StringLiteralExpr(qname.getNamespaceURI()), new StringLiteralExpr(qname.getLocalPart())))))); } - cl.addMethod("clazz", Utils.PUBLIC).setType(types.getClass(Class.class, types.getClass(t))).addMarkerAnnotation(Override.class).createBody() + cl.addMethod("clazz", CodeGenUtils.PUBLIC).setType(types.getClass(Class.class, types.getClass(t))).addMarkerAnnotation(Override.class).createBody() .addStatement(new ReturnStmt(new ClassExpr(types.getClass(t)))); NodeList list = xml.entries().stream() - .map(e -> new SwitchEntry().setLabels(Utils.list(new NameExpr(e.name()))).addStatement(new ReturnStmt(new StringLiteralExpr(e.value())))) - .collect(Collectors.toCollection(() -> Utils.list())); + .map(e -> new SwitchEntry().setLabels(CodeGenUtils.list(new NameExpr(e.name()))).addStatement(new ReturnStmt(new StringLiteralExpr(e.value())))) + .collect(Collectors.toCollection(() -> CodeGenUtils.list())); list.add(new SwitchEntry().addStatement( - new ThrowStmt(new ObjectCreationExpr(null, types.getClass(JAXBException.class), Utils.list(new StringLiteralExpr("Unsupported enum constant")))))); - cl.addMethod("toString", Utils.PUBLIC).addMarkerAnnotation(Override.class).addThrownException(types.getClass(JAXBException.class)) + new ThrowStmt(new ObjectCreationExpr(null, types.getClass(JAXBException.class), CodeGenUtils.list(new StringLiteralExpr("Unsupported enum constant")))))); + cl.addMethod("toString", CodeGenUtils.PUBLIC).addMarkerAnnotation(Override.class).addThrownException(types.getClass(JAXBException.class)) .addParameter(types.get(xml.type()), "o").setType(types.get(String.class)).createBody().addStatement(new SwitchStmt(new NameExpr("o"), list)); - list = xml.entries().stream().map(e -> new SwitchEntry().setLabels(Utils.list(new StringLiteralExpr(e.value()))) - .addStatement(new ReturnStmt(new FieldAccessExpr(new TypeExpr(types.get(t)), e.name())))).collect(Collectors.toCollection(() -> Utils.list())); + list = xml.entries().stream().map(e -> new SwitchEntry().setLabels(CodeGenUtils.list(new StringLiteralExpr(e.value()))) + .addStatement(new ReturnStmt(new FieldAccessExpr(new TypeExpr(types.get(t)), e.name())))).collect(Collectors.toCollection(() -> CodeGenUtils.list())); list.add(new SwitchEntry().addStatement(new ThrowStmt(new ObjectCreationExpr(null, types.getClass(JAXBException.class), - Utils.list(new BinaryExpr(new StringLiteralExpr("Unsupported enum value "), new NameExpr("s"), BinaryExpr.Operator.PLUS)))))); - cl.addMethod("toObject", Utils.PUBLIC).addMarkerAnnotation(Override.class).addThrownException(types.getClass(JAXBException.class)) + CodeGenUtils.list(new BinaryExpr(new StringLiteralExpr("Unsupported enum value "), new NameExpr("s"), BinaryExpr.Operator.PLUS)))))); + cl.addMethod("toObject", CodeGenUtils.PUBLIC).addMarkerAnnotation(Override.class).addThrownException(types.getClass(JAXBException.class)) .addParameter(types.get(String.class), "s").setType(types.get(xml.type())).createBody().addStatement(new SwitchStmt(new NameExpr("s"), list)); } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerObject.java b/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerObject.java index 946f38d4..e4109c83 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerObject.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerObject.java @@ -17,12 +17,12 @@ import com.github.javaparser.ast.stmt.ReturnStmt; import com.github.javaparser.ast.type.ClassOrInterfaceType; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.TypeFactory; import unknow.model.api.TypeModel; import unknow.server.jaxb.XmlHandler; import unknow.server.jaxb.XmlRootHandler; import unknow.server.maven.SourceBuilder.AbstractSourceBuilder; -import unknow.server.maven.TypeCache; -import unknow.server.maven.Utils; import unknow.server.maven.jaxb.HandlerContext; import unknow.server.maven.jaxb.JaxbGeneratorMojo; import unknow.server.maven.jaxb.model.XmlChoice; @@ -42,12 +42,12 @@ protected void build() { cl.addImplementedType(types.getClass(XmlHandler.class, types.getClass(t))); cl.addFieldWithInitializer(new ClassOrInterfaceType(null, cl.getNameAsString()), "INSTANCE", - new ObjectCreationExpr(null, new ClassOrInterfaceType(null, cl.getNameAsString()), Utils.list()), Utils.PUBLIC_STATIC); + new ObjectCreationExpr(null, new ClassOrInterfaceType(null, cl.getNameAsString()), CodeGenUtils.list()), CodeGenUtils.PUBLIC_STATIC); AtomicInteger i = new AtomicInteger(0); for (XmlElement e : xml.getAttributes()) cl.addFieldWithInitializer(types.get(QName.class), e.name() + "$a" + i.getAndIncrement(), - new ObjectCreationExpr(null, types.getClass(QName.class), Utils.list(new StringLiteralExpr(e.ns()), new StringLiteralExpr(e.name()))), Utils.PSF); + new ObjectCreationExpr(null, types.getClass(QName.class), CodeGenUtils.list(new StringLiteralExpr(e.ns()), new StringLiteralExpr(e.name()))), CodeGenUtils.PSF); i.set(0); for (XmlElement e : xml.getElements()) @@ -57,18 +57,18 @@ protected void build() { QName qname = JaxbGeneratorMojo.getRootQN(t); if (qname != null) { cl.addExtendedType(types.getClass(XmlRootHandler.class, types.getClass(t))); - b.addStatement(new MethodCallExpr(null, "super", Utils.list(new ObjectCreationExpr(null, types.getClass(QName.class), - Utils.list(new StringLiteralExpr(qname.getNamespaceURI()), new StringLiteralExpr(qname.getLocalPart())))))); + b.addStatement(new MethodCallExpr(null, "super", CodeGenUtils.list(new ObjectCreationExpr(null, types.getClass(QName.class), + CodeGenUtils.list(new StringLiteralExpr(qname.getNamespaceURI()), new StringLiteralExpr(qname.getLocalPart())))))); } - cl.addMethod("clazz", Utils.PUBLIC).setType(types.getClass(Class.class, types.getClass(t))).addMarkerAnnotation(Override.class).createBody() + cl.addMethod("clazz", CodeGenUtils.PUBLIC).setType(types.getClass(Class.class, types.getClass(t))).addMarkerAnnotation(Override.class).createBody() .addStatement(new ReturnStmt(new ClassExpr(types.getClass(t)))); for (AbstractSourceBuilder m : methods) m.process(cl, types, ctx); } - private void appendInitElement(ClassOrInterfaceDeclaration cl, TypeCache types, XmlElement e, AtomicInteger i) { + private void appendInitElement(ClassOrInterfaceDeclaration cl, TypeFactory types, XmlElement e, AtomicInteger i) { XmlType x = e.xmlType(); if (x instanceof XmlCollection) x = ((XmlCollection) x).component(); @@ -80,9 +80,9 @@ private void appendInitElement(ClassOrInterfaceDeclaration cl, TypeCache types, } cl.addFieldWithInitializer(types.get(QName.class), e.name() + "$e" + i.getAndIncrement(), - new ObjectCreationExpr(null, types.getClass(QName.class), Utils.list(new StringLiteralExpr(e.ns()), new StringLiteralExpr(e.name()))), Utils.PSF); + new ObjectCreationExpr(null, types.getClass(QName.class), CodeGenUtils.list(new StringLiteralExpr(e.ns()), new StringLiteralExpr(e.name()))), CodeGenUtils.PSF); if (e.xmlType() instanceof XmlCollection && e.type().isArray()) - ctx.emptyArray(e.type(), name -> cl.addFieldWithInitializer(types.get(e.type()), name, new ArrayInitializerExpr(), Utils.PSF)); + ctx.emptyArray(e.type(), name -> cl.addFieldWithInitializer(types.get(e.type()), name, new ArrayInitializerExpr(), CodeGenUtils.PSF)); } } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerObjectReader.java b/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerObjectReader.java index b677cf84..133c094f 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerObjectReader.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerObjectReader.java @@ -39,13 +39,13 @@ import jakarta.xml.bind.JAXBElement; import jakarta.xml.bind.JAXBException; import jakarta.xml.bind.Unmarshaller; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.TypeFactory; import unknow.model.api.TypeModel; import unknow.server.jaxb.StrReader; import unknow.server.jaxb.UnmarshallerImpl; import unknow.server.jaxb.XmlHandler; import unknow.server.maven.SourceBuilder.AbstractSourceBuilder; -import unknow.server.maven.TypeCache; -import unknow.server.maven.Utils; import unknow.server.maven.jaxb.HandlerContext; import unknow.server.maven.jaxb.model.XmlChoice; import unknow.server.maven.jaxb.model.XmlCollection; @@ -65,17 +65,17 @@ protected void build() { Expression create; if ("".equals(xml.factory().method)) - create = new ObjectCreationExpr(null, types.getClass(xml.factory().clazz), Utils.list()); + create = new ObjectCreationExpr(null, types.getClass(xml.factory().clazz), CodeGenUtils.list()); else create = new MethodCallExpr(new TypeExpr(types.getClass(xml.factory().clazz)), xml.factory().method); - BlockStmt b = cl.addMethod("read", Utils.PUBLIC).addMarkerAnnotation(Override.class).addThrownException(types.getClass(XMLStreamException.class)) + BlockStmt b = cl.addMethod("read", CodeGenUtils.PUBLIC).addMarkerAnnotation(Override.class).addThrownException(types.getClass(XMLStreamException.class)) .addThrownException(types.getClass(JAXBException.class)).addParameter(types.get(XMLStreamReader.class), "r").setType(types.get(xml.type())) .addParameter(types.get(Object.class), PARENT).addParameter(types.get(UnmarshallerImpl.class), "listener").createBody() - .addStatement(Utils.assign(types.get(xml.type()), "o", create)); + .addStatement(CodeGenUtils.assign(types.get(xml.type()), "o", create)); xml.type().asClass().method("beforeUnmarshal", ctx.type(Unmarshaller.class.getName()), ctx.type(Object.class.getName())) - .ifPresent(m -> b.addStatement(new MethodCallExpr(new NameExpr("o"), "beforeUnmarshal", Utils.list(LISTENER, new NameExpr(PARENT))))); - b.addStatement(new MethodCallExpr(LISTENER, "beforeUnmarshal", Utils.list(new NameExpr("o"), new NameExpr(PARENT)))); + .ifPresent(m -> b.addStatement(new MethodCallExpr(new NameExpr("o"), "beforeUnmarshal", CodeGenUtils.list(LISTENER, new NameExpr(PARENT))))); + b.addStatement(new MethodCallExpr(LISTENER, "beforeUnmarshal", CodeGenUtils.list(new NameExpr("o"), new NameExpr(PARENT)))); readAttributes(xml, b); @@ -83,39 +83,39 @@ protected void build() { processCollection(xml.getElements(), b, end); xml.type().asClass().method("afterUnmarshal", ctx.type(Unmarshaller.class.getName()), ctx.type(Object.class.getName())) - .ifPresent(m -> end.addStatement(new MethodCallExpr(new NameExpr("o"), "afterUnmarshal", Utils.list(LISTENER, new NameExpr(PARENT))))); + .ifPresent(m -> end.addStatement(new MethodCallExpr(new NameExpr("o"), "afterUnmarshal", CodeGenUtils.list(LISTENER, new NameExpr(PARENT))))); IfStmt i = new IfStmt( new BinaryExpr(new NameExpr("n"), new FieldAccessExpr(new TypeExpr(types.get(XMLStreamConstants.class)), "END_ELEMENT"), BinaryExpr.Operator.EQUALS), - end.addStatement(new MethodCallExpr(LISTENER, "afterUnmarshal", Utils.list(new NameExpr("o"), new NameExpr(PARENT)))) + end.addStatement(new MethodCallExpr(LISTENER, "afterUnmarshal", CodeGenUtils.list(new NameExpr("o"), new NameExpr(PARENT)))) .addStatement(new ReturnStmt(new NameExpr("o"))), null); if (xml.getElements().iterator().hasNext()) { AtomicInteger c = new AtomicInteger(0); - Statement j = new ExpressionStmt(new MethodCallExpr(new TypeExpr(types.get(XmlHandler.class)), "skipTag", Utils.list(new NameExpr("r")))); + Statement j = new ExpressionStmt(new MethodCallExpr(new TypeExpr(types.get(XmlHandler.class)), "skipTag", CodeGenUtils.list(new NameExpr("r")))); for (XmlElement e : xml.getElements()) j = readElement(e, j, new NameExpr("o"), e.setter(), c); i = new IfStmt( new BinaryExpr(new NameExpr("n"), new FieldAccessExpr(new TypeExpr(types.get(XMLStreamConstants.class)), "START_ELEMENT"), BinaryExpr.Operator.EQUALS), - new BlockStmt().addStatement(Utils.assign(types.get(QName.class), "q", new MethodCallExpr(new NameExpr("r"), "getName"))).addStatement(j), i); + new BlockStmt().addStatement(CodeGenUtils.assign(types.get(QName.class), "q", new MethodCallExpr(new NameExpr("r"), "getName"))).addStatement(j), i); } - BlockStmt w = new BlockStmt().addStatement(Utils.assign(types.get("int"), "n", new MethodCallExpr(new NameExpr("r"), "next"))); + BlockStmt w = new BlockStmt().addStatement(CodeGenUtils.assign(types.get("int"), "n", new MethodCallExpr(new NameExpr("r"), "next"))); if (xml.getValue() != null) { XmlElement v = xml.getValue(); w.addStatement(new IfStmt( new BinaryExpr(new NameExpr("n"), new FieldAccessExpr(new TypeExpr(types.get(XMLStreamConstants.class)), "CHARACTERS"), BinaryExpr.Operator.EQUALS), new BlockStmt() .addStatement(new MethodCallExpr(new NameExpr("o"), v.setter(), - Utils.list(new MethodCallExpr(new FieldAccessExpr(new TypeExpr(types.get(ctx.handler(v.xmlType()))), INSTANCE), "toObject", - Utils.list(new MethodCallExpr(new TypeExpr(types.get(StrReader.class)), "read", Utils.list(new NameExpr("r")))))))) + CodeGenUtils.list(new MethodCallExpr(new FieldAccessExpr(new TypeExpr(types.get(ctx.handler(v.xmlType()))), INSTANCE), "toObject", + CodeGenUtils.list(new MethodCallExpr(new TypeExpr(types.get(StrReader.class)), "read", CodeGenUtils.list(new NameExpr("r")))))))) .addStatement(new AssignExpr(new NameExpr("n"), new MethodCallExpr(new NameExpr("r"), "getEventType"), AssignExpr.Operator.ASSIGN)), null)); } b.addStatement(new WhileStmt(new MethodCallExpr(new NameExpr("r"), "hasNext"), w.addStatement(i))) - .addStatement(new ThrowStmt(new ObjectCreationExpr(null, types.getClass(XMLStreamException.class), Utils.list(new StringLiteralExpr("EOF"))))); + .addStatement(new ThrowStmt(new ObjectCreationExpr(null, types.getClass(XMLStreamException.class), CodeGenUtils.list(new StringLiteralExpr("EOF"))))); } @@ -126,17 +126,17 @@ private void readAttributes(XmlTypeComplex xml, BlockStmt b) { Statement i = null; int c = 0; for (XmlElement e : xml.getAttributes()) { - i = new IfStmt(new MethodCallExpr(new NameExpr(e.name() + "$a" + c++), "equals", Utils.list(new NameExpr("n"))), + i = new IfStmt(new MethodCallExpr(new NameExpr(e.name() + "$a" + c++), "equals", CodeGenUtils.list(new NameExpr("n"))), new ExpressionStmt(new MethodCallExpr(new NameExpr("o"), e.setter(), - Utils.list(new MethodCallExpr(new FieldAccessExpr(new TypeExpr(types.get(ctx.handler(e.xmlType()))), INSTANCE), "toObject", - Utils.list(new MethodCallExpr(new NameExpr("r"), "getAttributeValue", Utils.list(new NameExpr("i")))))))), + CodeGenUtils.list(new MethodCallExpr(new FieldAccessExpr(new TypeExpr(types.get(ctx.handler(e.xmlType()))), INSTANCE), "toObject", + CodeGenUtils.list(new MethodCallExpr(new NameExpr("r"), "getAttributeValue", CodeGenUtils.list(new NameExpr("i")))))))), i); } - b.addStatement(new ForStmt(Utils.list(Utils.assign(types.get("int"), "i", new IntegerLiteralExpr("0"))), + b.addStatement(new ForStmt(CodeGenUtils.list(CodeGenUtils.assign(types.get("int"), "i", new IntegerLiteralExpr("0"))), new BinaryExpr(new NameExpr("i"), new MethodCallExpr(new NameExpr("r"), "getAttributeCount"), BinaryExpr.Operator.LESS), - Utils.list(new UnaryExpr(new NameExpr("i"), UnaryExpr.Operator.POSTFIX_INCREMENT)), + CodeGenUtils.list(new UnaryExpr(new NameExpr("i"), UnaryExpr.Operator.POSTFIX_INCREMENT)), new BlockStmt() - .addStatement(Utils.assign(types.get(QName.class), "n", new MethodCallExpr(new NameExpr("r"), "getAttributeName", Utils.list(new NameExpr("i"))))) + .addStatement(CodeGenUtils.assign(types.get(QName.class), "n", new MethodCallExpr(new NameExpr("r"), "getAttributeName", CodeGenUtils.list(new NameExpr("i"))))) .addStatement(i))); } @@ -146,12 +146,12 @@ private void processCollection(XmlElements elements, BlockStmt b, BlockStmt end) continue; Expression v = new NameExpr("l$" + e.name()); if (e.type().isArray()) - v = new MethodCallExpr(v, "toArray", Utils.list(new NameExpr(ctx.emptyArray(e.type())))); + v = new MethodCallExpr(v, "toArray", CodeGenUtils.list(new NameExpr(ctx.emptyArray(e.type())))); end.addStatement(new IfStmt(new BinaryExpr(new NameExpr("l$" + e.name()), new NullLiteralExpr(), BinaryExpr.Operator.NOT_EQUALS), - new ExpressionStmt(new MethodCallExpr(new NameExpr("o"), e.setter(), Utils.list(v))), null)); + new ExpressionStmt(new MethodCallExpr(new NameExpr("o"), e.setter(), CodeGenUtils.list(v))), null)); Type t = e.type().isArray() ? types.getClass(List.class, types.get(e.type().asArray().type().asClass())) : types.get(e.type()); - b.addStatement(Utils.assign(t, "l$" + e.name(), new NullLiteralExpr())); + b.addStatement(CodeGenUtils.assign(t, "l$" + e.name(), new NullLiteralExpr())); } } @@ -164,15 +164,15 @@ private Statement readElement(XmlElement e, Statement j, NameExpr n, String sett setter = "add"; s.addStatement(new IfStmt(new BinaryExpr(n, new NullLiteralExpr(), BinaryExpr.Operator.EQUALS), new ExpressionStmt(new AssignExpr(n, - new ObjectCreationExpr(null, types.getClass(e.type().isAssignableTo(Set.class) ? HashSet.class : ArrayList.class, TypeCache.EMPTY), Utils.list()), + new ObjectCreationExpr(null, types.getClass(e.type().isAssignableTo(Set.class) ? HashSet.class : ArrayList.class, TypeFactory.EMPTY), CodeGenUtils.list()), AssignExpr.Operator.ASSIGN)), null)); } if (!(xmlType instanceof XmlChoice)) { - Expression call = new MethodCallExpr(n, setter, Utils.list(new MethodCallExpr(new FieldAccessExpr(new TypeExpr(types.get(ctx.handler(xmlType))), INSTANCE), "read", - Utils.list(new NameExpr("r"), new NameExpr("o"), LISTENER)))); - return new IfStmt(new MethodCallExpr(new NameExpr(e.name() + "$e" + c.getAndIncrement()), "equals", Utils.list(new NameExpr("q"))), + Expression call = new MethodCallExpr(n, setter, CodeGenUtils.list(new MethodCallExpr(new FieldAccessExpr(new TypeExpr(types.get(ctx.handler(xmlType))), INSTANCE), "read", + CodeGenUtils.list(new NameExpr("r"), new NameExpr("o"), LISTENER)))); + return new IfStmt(new MethodCallExpr(new NameExpr(e.name() + "$e" + c.getAndIncrement()), "equals", CodeGenUtils.list(new NameExpr("q"))), s.getStatements().isEmpty() ? new ExpressionStmt(call) : s.addStatement(call), j); } @@ -188,14 +188,14 @@ private Statement readElement(XmlElement e, Statement j, NameExpr n, String sett xmlType = ((XmlCollection) xmlType).component(); Expression v = new MethodCallExpr(new FieldAccessExpr(new TypeExpr(types.get(ctx.handler(xmlType))), INSTANCE), "read", - Utils.list(new NameExpr("r"), new NameExpr("o"), LISTENER)); + CodeGenUtils.list(new NameExpr("r"), new NameExpr("o"), LISTENER)); if (map.get(xmlType.type()).size() > 1) - v = new ObjectCreationExpr(null, types.getClass(JAXBElement.class, TypeCache.EMPTY), - Utils.list(new NameExpr("q"), new ClassExpr(types.get(xmlType.type())), new NullLiteralExpr(), v)); + v = new ObjectCreationExpr(null, types.getClass(JAXBElement.class, TypeFactory.EMPTY), + CodeGenUtils.list(new NameExpr("q"), new ClassExpr(types.get(xmlType.type())), new NullLiteralExpr(), v)); - Expression call = new MethodCallExpr(n, setter, Utils.list(v)); - j = new IfStmt(new MethodCallExpr(new NameExpr(x.name() + "$e" + c.getAndIncrement()), "equals", Utils.list(new NameExpr("q"))), + Expression call = new MethodCallExpr(n, setter, CodeGenUtils.list(v)); + j = new IfStmt(new MethodCallExpr(new NameExpr(x.name() + "$e" + c.getAndIncrement()), "equals", CodeGenUtils.list(new NameExpr("q"))), b.getStatements().isEmpty() ? new ExpressionStmt(call) : b.addStatement(call), j); } return j; diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerObjectWriter.java b/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerObjectWriter.java index 5a07b8db..f5094c89 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerObjectWriter.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/jaxb/builder/HandlerObjectWriter.java @@ -39,11 +39,11 @@ import jakarta.xml.bind.JAXBElement; import jakarta.xml.bind.JAXBException; import jakarta.xml.bind.Marshaller; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.TypeFactory; import unknow.model.api.TypeModel; import unknow.server.jaxb.MarshallerImpl; import unknow.server.maven.SourceBuilder.AbstractSourceBuilder; -import unknow.server.maven.TypeCache; -import unknow.server.maven.Utils; import unknow.server.maven.jaxb.HandlerContext; import unknow.server.maven.jaxb.model.XmlChoice; import unknow.server.maven.jaxb.model.XmlCollection; @@ -59,31 +59,31 @@ public class HandlerObjectWriter extends AbstractSourceBuilder { protected void build() { XmlTypeComplex xml = ctx.xml(); - BlockStmt b = cl.addMethod("write", Utils.PUBLIC).addMarkerAnnotation(Override.class).addThrownException(types.getClass(XMLStreamException.class)) + BlockStmt b = cl.addMethod("write", CodeGenUtils.PUBLIC).addMarkerAnnotation(Override.class).addThrownException(types.getClass(XMLStreamException.class)) .addThrownException(types.getClass(JAXBException.class)).addParameter(types.get(XMLStreamWriter.class), "w").addParameter(types.get(xml.type()), "t") .addParameter(types.get(MarshallerImpl.class), "m").addParameter(types.get(Marshaller.Listener.class), "listener").createBody(); xml.type().asClass().method("beforeMarshal", ctx.type(Marshaller.class.getName())) - .ifPresent(m -> b.addStatement(new MethodCallExpr(new NameExpr("o"), "beforeMarshal", Utils.list(LISTENER)))); + .ifPresent(m -> b.addStatement(new MethodCallExpr(new NameExpr("o"), "beforeMarshal", CodeGenUtils.list(LISTENER)))); b.addStatement(new IfStmt(new BinaryExpr(LISTENER, new NullLiteralExpr(), BinaryExpr.Operator.NOT_EQUALS), - new ExpressionStmt(new MethodCallExpr(LISTENER, "beforeMarshal", Utils.list(new NameExpr("t")))), null)); + new ExpressionStmt(new MethodCallExpr(LISTENER, "beforeMarshal", CodeGenUtils.list(new NameExpr("t")))), null)); buildAttributes(xml.getAttributes(), b); AtomicInteger i = new AtomicInteger(0); for (XmlElement e : xml.getElements()) - buildElement(types, e, b, i); + buildElement(e, b, i); if (xml.getValue() != null) { XmlElement value = xml.getValue(); b.addStatement(new MethodCallExpr(new NameExpr("w"), "writeCharacters", - Utils.list(new MethodCallExpr(new FieldAccessExpr(new TypeExpr(types.get(ctx.handler(value.xmlType()))), INSTANCE), "toString", - Utils.list(new MethodCallExpr(new NameExpr("t"), value.getter())))))); + CodeGenUtils.list(new MethodCallExpr(new FieldAccessExpr(new TypeExpr(types.get(ctx.handler(value.xmlType()))), INSTANCE), "toString", + CodeGenUtils.list(new MethodCallExpr(new NameExpr("t"), value.getter())))))); } xml.type().asClass().method("afterMarshal", ctx.type(Marshaller.class.getName())) - .ifPresent(m -> b.addStatement(new MethodCallExpr(new NameExpr("o"), "afterMarshal", Utils.list(LISTENER)))); + .ifPresent(m -> b.addStatement(new MethodCallExpr(new NameExpr("o"), "afterMarshal", CodeGenUtils.list(LISTENER)))); b.addStatement(new IfStmt(new BinaryExpr(LISTENER, new NullLiteralExpr(), BinaryExpr.Operator.NOT_EQUALS), - new ExpressionStmt(new MethodCallExpr(LISTENER, "afterMarshal", Utils.list(new NameExpr("t")))), null)); + new ExpressionStmt(new MethodCallExpr(LISTENER, "afterMarshal", CodeGenUtils.list(new NameExpr("t")))), null)); } private void buildAttributes(List attrs, BlockStmt b) { @@ -93,12 +93,12 @@ private void buildAttributes(List attrs, BlockStmt b) { b.addStatement(new VariableDeclarationExpr(types.get(String.class), "s")); for (XmlElement e : attrs) { Expression v = new MethodCallExpr(new FieldAccessExpr(new TypeExpr(types.get(ctx.handler(e.xmlType()))), INSTANCE), "toString", - Utils.list(new MethodCallExpr(new NameExpr("t"), e.getter()))); + CodeGenUtils.list(new MethodCallExpr(new NameExpr("t"), e.getter()))); v = new EnclosedExpr(new AssignExpr(new NameExpr("s"), v, AssignExpr.Operator.ASSIGN)); - NodeList l = Utils.list(); + NodeList l = CodeGenUtils.list(); if (!e.ns().isEmpty()) - l.add(Utils.text(e.ns())); - l.add(Utils.text(e.name())); + l.add(CodeGenUtils.text(e.ns())); + l.add(CodeGenUtils.text(e.name())); l.add(new NameExpr("s")); if (e.type().isPrimitive()) b.addStatement(new MethodCallExpr(new NameExpr("w"), "writeAttribute", l)); @@ -108,7 +108,7 @@ private void buildAttributes(List attrs, BlockStmt b) { } } - private void buildElement(TypeCache types, XmlElement e, BlockStmt b, AtomicInteger i) { + private void buildElement(XmlElement e, BlockStmt b, AtomicInteger i) { String n = "o$" + i.getAndIncrement(); BlockStmt w; @@ -121,32 +121,32 @@ private void buildElement(TypeCache types, XmlElement e, BlockStmt b, AtomicInte TypeModel c = t.isArray() ? t.asArray().type() : t.asClass().ancestor(Collection.class.getName()).parameter(0).type(); BlockStmt p = new BlockStmt() .addStatement(new IfStmt(new BinaryExpr(new NameExpr("e"), new NullLiteralExpr(), BinaryExpr.Operator.EQUALS), new ContinueStmt(), null)); - buildElement(types, e, xml, p, new NameExpr("e")); + buildElement(e, xml, p, new NameExpr("e")); if (t.isArray()) { - p.addStatement(0, Utils.assign(types.get(xml.type()), "e", new ArrayAccessExpr(new NameExpr(n), new NameExpr("i")))); - w = new BlockStmt().addStatement(new ForStmt(Utils.list(Utils.assign(types.get("int"), "i", new IntegerLiteralExpr("0"))), + p.addStatement(0, CodeGenUtils.assign(types.get(xml.type()), "e", new ArrayAccessExpr(new NameExpr(n), new NameExpr("i")))); + w = new BlockStmt().addStatement(new ForStmt(CodeGenUtils.list(CodeGenUtils.assign(types.get("int"), "i", new IntegerLiteralExpr("0"))), new BinaryExpr(new NameExpr("i"), new FieldAccessExpr(new NameExpr(n), "length"), BinaryExpr.Operator.LESS), - Utils.list(new UnaryExpr(new NameExpr("i"), UnaryExpr.Operator.POSTFIX_INCREMENT)), p)); + CodeGenUtils.list(new UnaryExpr(new NameExpr("i"), UnaryExpr.Operator.POSTFIX_INCREMENT)), p)); } else { w = new BlockStmt().addStatement(new ForEachStmt(new VariableDeclarationExpr(types.get(c), "e"), new NameExpr(n), p)); } } else - w = buildElement(types, e, xml, new BlockStmt(), new NameExpr(n)); + w = buildElement(e, xml, new BlockStmt(), new NameExpr(n)); - b.addStatement(Utils.assign(types.get(e.type()), n, new MethodCallExpr(new NameExpr("t"), e.getter()))); + b.addStatement(CodeGenUtils.assign(types.get(e.type()), n, new MethodCallExpr(new NameExpr("t"), e.getter()))); if (e.type().isPrimitive()) b.addStatement(w); else b.addStatement(new IfStmt(new BinaryExpr(new NameExpr(n), new NullLiteralExpr(), BinaryExpr.Operator.NOT_EQUALS), w, null)); } - private BlockStmt buildElement(TypeCache types, XmlElement e, XmlType xml, BlockStmt p, Expression name) { + private BlockStmt buildElement(XmlElement e, XmlType xml, BlockStmt p, Expression name) { if (!(xml instanceof XmlChoice)) { - p.addStatement(new MethodCallExpr(new NameExpr("w"), "writeStartElement", Utils.list(Utils.text(e.ns()), Utils.text(e.name())))) + p.addStatement(new MethodCallExpr(new NameExpr("w"), "writeStartElement", CodeGenUtils.list(CodeGenUtils.text(e.ns()), CodeGenUtils.text(e.name())))) .addStatement(new MethodCallExpr(new FieldAccessExpr(new TypeExpr(types.get(ctx.handler(xml))), INSTANCE), "write", - Utils.list(new NameExpr("w"), name, new NameExpr("m"), LISTENER))) - .addStatement(new MethodCallExpr(new NameExpr("w"), "writeEndElement", Utils.list())); + CodeGenUtils.list(new NameExpr("w"), name, new NameExpr("m"), LISTENER))) + .addStatement(new MethodCallExpr(new NameExpr("w"), "writeEndElement", CodeGenUtils.list())); return p; } XmlChoice c = (XmlChoice) xml; @@ -159,13 +159,13 @@ private BlockStmt buildElement(TypeCache types, XmlElement e, XmlType xml, Block list.add(v.get(0)); } - Statement s = new ThrowStmt(new ObjectCreationExpr(null, types.getClass(JAXBException.class), Utils.list(Utils.text("Expected unexpected type")))); + Statement s = new ThrowStmt(new ObjectCreationExpr(null, types.getClass(JAXBException.class), CodeGenUtils.list(CodeGenUtils.text("Expected unexpected type")))); for (XmlElement x : list) s = new IfStmt(new InstanceOfExpr(name, types.getClass(x.xmlType().type())), - buildElement(types, x, x.xmlType(), new BlockStmt(), new CastExpr(types.get(x.xmlType().type()), name)), s); + buildElement(x, x.xmlType(), new BlockStmt(), new CastExpr(types.get(x.xmlType().type()), name)), s); p.addStatement(new IfStmt(new InstanceOfExpr(name, types.getClass(JAXBElement.class)), new ExpressionStmt(new MethodCallExpr(new NameExpr("m"), "write", - Utils.list(new CastExpr(types.getClass(JAXBElement.class, TypeCache.ANY), name), new NameExpr("w"), new NullLiteralExpr()))), s)); + CodeGenUtils.list(new CastExpr(types.getClass(JAXBElement.class, TypeFactory.ANY), name), new NameExpr("w"), new NullLiteralExpr()))), s)); return p; } } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/BeanParamBuilder.java b/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/BeanParamBuilder.java index 9beeb929..cb5d4b7b 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/BeanParamBuilder.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/BeanParamBuilder.java @@ -31,14 +31,14 @@ import jakarta.ws.rs.WebApplicationException; import jakarta.ws.rs.ext.ParamConverter; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.CompilationUnitWriter; +import unknow.maven.codegen.TypeFactory; import unknow.model.api.TypeModel; import unknow.model.jvm.JvmModelLoader; import unknow.server.http.jaxrs.JaxrsContext; import unknow.server.http.jaxrs.JaxrsEntityReader; import unknow.server.http.jaxrs.JaxrsReq; -import unknow.server.maven.Output; -import unknow.server.maven.TypeCache; -import unknow.server.maven.Utils; import unknow.server.maven.jaxrs.JaxrsParam.JaxrsBeanParam; import unknow.server.maven.jaxrs.JaxrsParam.JaxrsBeanParam.JaxrsBeanFieldParam; import unknow.server.maven.jaxrs.JaxrsParam.JaxrsBodyParam; @@ -50,7 +50,7 @@ public class BeanParamBuilder { private final CompilationUnit cu; private final ClassOrInterfaceDeclaration cl; - private final TypeCache types; + private final TypeFactory types; private final Map> beans; private final Map beansVar; @@ -59,8 +59,8 @@ public class BeanParamBuilder { public BeanParamBuilder(CompilationUnit cu, Map existingClass) { this.cu = cu; - types = new TypeCache(cu, existingClass); - cl = cu.addClass("BeansReader", Utils.PUBLIC); + types = new TypeFactory(cu, existingClass); + cl = cu.addClass("BeansReader", CodeGenUtils.PUBLIC); beans = new HashMap<>(); beansVar = new HashMap<>(); @@ -85,13 +85,13 @@ public void add(JaxrsBeanParam param) { for (JaxrsBeanFieldParam p : param.params) processBeanConverter(p.param, n + "$" + i++, init); - MethodDeclaration m = cl.addMethod(beansVar.get(clazz), Utils.PUBLIC_STATIC).addParameter(types.getClass(JaxrsReq.class), "r").setType(types.get(clazz)) + MethodDeclaration m = cl.addMethod(beansVar.get(clazz), CodeGenUtils.PUBLIC_STATIC).addParameter(types.getClass(JaxrsReq.class), "r").setType(types.get(clazz)) .addThrownException(types.getClass(WebApplicationException.class)); if (throwsIoException(param.params)) m.addThrownException(types.getClass(IOException.class)); - BlockStmt b = m.createBody().addStatement(Utils.create(types.getClass(clazz), "b", Utils.list())); + BlockStmt b = m.createBody().addStatement(CodeGenUtils.create(types.getClass(clazz), "b", CodeGenUtils.list())); for (JaxrsBeanFieldParam e : param.params) - b.addStatement(new MethodCallExpr(new NameExpr("b"), e.prop.setter().name(), Utils.list(getParam(e.param)))); + b.addStatement(new MethodCallExpr(new NameExpr("b"), e.prop.setter().name(), CodeGenUtils.list(getParam(e.param)))); b.addStatement(new ReturnStmt(new NameExpr("b"))); } @@ -106,9 +106,9 @@ private boolean throwsIoException(List params) { return false; } - public void save(Output out) throws MojoExecutionException { + public void save(CompilationUnitWriter writer) throws MojoExecutionException { if (!beans.isEmpty()) - out.save(cu); + writer.write(cu); } private void processBeanConverter(JaxrsParam p, String n, BlockStmt b) { @@ -128,34 +128,34 @@ private void processBeanConverter(JaxrsParam p, String n, BlockStmt b) { b.addStatement(new TryStmt( new BlockStmt() - .addStatement(Utils.assign(types.getClass(Field.class), "f", - new MethodCallExpr(new ClassExpr(types.get(p.parent.name())), "getDeclaredField", Utils.list(Utils.text(p.name))))) + .addStatement(CodeGenUtils.assign(types.getClass(Field.class), "f", + new MethodCallExpr(new ClassExpr(types.get(p.parent.name())), "getDeclaredField", CodeGenUtils.list(CodeGenUtils.text(p.name))))) .addStatement(new AssignExpr(new NameExpr("t"), new MethodCallExpr(new TypeExpr(types.get(JaxrsContext.class)), "getParamType", - Utils.list(new MethodCallExpr(new NameExpr("f"), "getGenericType"))), + CodeGenUtils.list(new MethodCallExpr(new NameExpr("f"), "getGenericType"))), AssignExpr.Operator.ASSIGN)) .addStatement(new AssignExpr(new NameExpr("a"), new MethodCallExpr(new NameExpr("f"), "getAnnotations"), AssignExpr.Operator.ASSIGN)), - Utils.list(new CatchClause( + CodeGenUtils.list(new CatchClause( new com.github.javaparser.ast.body.Parameter(types.getClass(Exception.class), "e").addSingleMemberAnnotation(SuppressWarnings.class, - Utils.text("unused")), + CodeGenUtils.text("unused")), new BlockStmt().addStatement(new AssignExpr(new NameExpr("t"), new ClassExpr(types.get(t1.name())), AssignExpr.Operator.ASSIGN)) - .addStatement(new AssignExpr(new NameExpr("a"), Utils.array(types.getClass(Annotation.class), 0), AssignExpr.Operator.ASSIGN)))), + .addStatement(new AssignExpr(new NameExpr("a"), CodeGenUtils.array(types.getClass(Annotation.class), 0), AssignExpr.Operator.ASSIGN)))), null)); if (p instanceof JaxrsBodyParam) { - cl.addField(types.getClass(JaxrsEntityReader.class, types.getClass(p.type)), n, Utils.PSF); - b.addStatement(new AssignExpr(new NameExpr(n), new ObjectCreationExpr(null, types.getClass(JaxrsEntityReader.class, TypeCache.EMPTY), - Utils.list(new ClassExpr(types.get(p.type.name())), new NameExpr("t"), new NameExpr("a"))), AssignExpr.Operator.ASSIGN)); + cl.addField(types.getClass(JaxrsEntityReader.class, types.getClass(p.type)), n, CodeGenUtils.PSF); + b.addStatement(new AssignExpr(new NameExpr(n), new ObjectCreationExpr(null, types.getClass(JaxrsEntityReader.class, TypeFactory.EMPTY), + CodeGenUtils.list(new ClassExpr(types.get(p.type.name())), new NameExpr("t"), new NameExpr("a"))), AssignExpr.Operator.ASSIGN)); } else { - cl.addField(types.getClass(ParamConverter.class, types.get(t)), n, Utils.PSF); + cl.addField(types.getClass(ParamConverter.class, types.get(t)), n, CodeGenUtils.PSF); b.addStatement(new AssignExpr(new NameExpr(n), new MethodCallExpr(new TypeExpr(types.getClass(JaxrsContext.class)), "converter", - Utils.list(new ClassExpr(types.get(t1.name())), new NameExpr("t"), new NameExpr("a"))), AssignExpr.Operator.ASSIGN)); + CodeGenUtils.list(new ClassExpr(types.get(t1.name())), new NameExpr("t"), new NameExpr("a"))), AssignExpr.Operator.ASSIGN)); } } private Expression getParam(JaxrsParam p) { if (p instanceof JaxrsBodyParam) - return new MethodCallExpr(new NameExpr(converterVar.get(p)), "read", Utils.list(new NameExpr("r"))); + return new MethodCallExpr(new NameExpr(converterVar.get(p)), "read", CodeGenUtils.list(new NameExpr("r"))); if (p instanceof JaxrsBeanParam) return new MethodCallExpr(beansVar.get(((JaxrsBeanParam) p).clazz.name()), new NameExpr("r")); return JaxrsModel.getParam(p, types, converterVar); diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/JaxRsServletBuilder.java b/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/JaxRsServletBuilder.java index 39510a0d..1c47e8d3 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/JaxRsServletBuilder.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/JaxRsServletBuilder.java @@ -61,6 +61,8 @@ import jakarta.ws.rs.NotSupportedException; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.ext.ParamConverter; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.TypeFactory; import unknow.model.api.ClassModel; import unknow.model.api.MethodModel; import unknow.model.api.ParamModel; @@ -73,7 +75,6 @@ import unknow.server.http.jaxrs.PathPattern; import unknow.server.http.jaxrs.PathPattern.PathRegexp; import unknow.server.http.jaxrs.PathPattern.PathSimple; -import unknow.server.maven.TypeCache; import unknow.server.maven.Utils; import unknow.server.maven.jaxrs.JaxrsParam.JaxrsBeanParam; import unknow.server.maven.jaxrs.JaxrsParam.JaxrsBodyParam; @@ -108,7 +109,7 @@ public class JaxRsServletBuilder { private final BeanParamBuilder beans; private final MediaTypesBuilder mt; - private final TypeCache types; + private final TypeFactory types; private final ClassOrInterfaceDeclaration cl; private final List mappings; @@ -126,10 +127,10 @@ public JaxRsServletBuilder(CompilationUnit cu, Map existingClass this.mt = mt; this.mappings = mappings; - types = new TypeCache(cu, existingClass); - cl = cu.addClass("Jaxrs" + path.replace('/', '_').replace("*", ""), Utils.PUBLIC).addSingleMemberAnnotation(WebServlet.class, Utils.text(path)) + types = new TypeFactory(cu, existingClass); + cl = cu.addClass("Jaxrs" + path.replace('/', '_').replace("*", ""), CodeGenUtils.PUBLIC).addSingleMemberAnnotation(WebServlet.class, CodeGenUtils.text(path)) .addExtendedType(HttpServlet.class); - cl.addFieldWithInitializer(long.class, "serialVersionUID", new LongLiteralExpr("1L"), Utils.PSF); + cl.addFieldWithInitializer(long.class, "serialVersionUID", new LongLiteralExpr("1L"), CodeGenUtils.PSF); builder = path.endsWith("*") ? new PatternService(path.length() - 1) : new SimpleService(); @@ -138,7 +139,7 @@ public JaxRsServletBuilder(CompilationUnit cu, Map existingClass String n = "s$" + services.size(); if (!services.containsKey(c.name())) { services.put(c.name(), new NameExpr(n)); - cl.addFieldWithInitializer(types.get(c.name()), n, new ObjectCreationExpr(null, types.getClass(c), Utils.list()), Utils.PSF); + cl.addFieldWithInitializer(types.get(c.name()), n, new ObjectCreationExpr(null, types.getClass(c), CodeGenUtils.list()), CodeGenUtils.PSF); } } } @@ -170,30 +171,29 @@ private void buildInializer() { for (ParamModel p : parameters) classes.add(new ClassExpr(types.get(p.type().name()))); NodeList getMethod = new NodeList<>(); - getMethod.add(Utils.text(m.m.name())); + getMethod.add(CodeGenUtils.text(m.m.name())); getMethod.addAll(classes); - BlockStmt t = new BlockStmt() - .addStatement(Utils.assign(types.getClass(Method.class), "m", new MethodCallExpr(new ClassExpr(types.get(m.m.parent().name())), "getMethod", getMethod))); + BlockStmt t = new BlockStmt().addStatement( + CodeGenUtils.assign(types.getClass(Method.class), "m", new MethodCallExpr(new ClassExpr(types.get(m.m.parent().name())), "getMethod", getMethod))); BlockStmt ca = new BlockStmt(); if (hasParamConverter(m)) { t.addStatement(new AssignExpr(new NameExpr("t"), new MethodCallExpr(new NameExpr("m"), "getGenericParameterTypes"), AssignExpr.Operator.ASSIGN)) .addStatement(new AssignExpr(new NameExpr("a"), new MethodCallExpr(new NameExpr("m"), "getParameterAnnotations"), AssignExpr.Operator.ASSIGN)); - ca.addStatement(new AssignExpr(new NameExpr("t"), Utils.array(types.getClass(Type.class), classes), AssignExpr.Operator.ASSIGN)) - .addStatement(new AssignExpr(new NameExpr("a"), Utils.array(types.getClass(Annotation.class), parameters.size(), 0), AssignExpr.Operator.ASSIGN)); + ca.addStatement(new AssignExpr(new NameExpr("t"), CodeGenUtils.array(types.getClass(Type.class), classes), AssignExpr.Operator.ASSIGN)).addStatement( + new AssignExpr(new NameExpr("a"), CodeGenUtils.array(types.getClass(Annotation.class), parameters.size(), 0), AssignExpr.Operator.ASSIGN)); } if (hasReturn(m)) { t.addStatement(new AssignExpr(new NameExpr("r"), new MethodCallExpr(new NameExpr("m"), "getGenericReturnType"), AssignExpr.Operator.ASSIGN)) .addStatement(new AssignExpr(new NameExpr("ra"), new MethodCallExpr(new NameExpr("m"), "getAnnotations"), AssignExpr.Operator.ASSIGN)); ca.addStatement(new AssignExpr(new NameExpr("r"), new ClassExpr(types.get(m.m.type().name())), AssignExpr.Operator.ASSIGN)) - .addStatement(new AssignExpr(new NameExpr("ra"), Utils.array(types.getClass(Annotation.class), 0), AssignExpr.Operator.ASSIGN)); + .addStatement(new AssignExpr(new NameExpr("ra"), CodeGenUtils.array(types.getClass(Annotation.class), 0), AssignExpr.Operator.ASSIGN)); } - b.addStatement(new TryStmt(t, Utils.list(new CatchClause( - new com.github.javaparser.ast.body.Parameter(types.getClass(Exception.class), "e").addSingleMemberAnnotation(SuppressWarnings.class, Utils.text("unused")), - ca)), null)); + b.addStatement(new TryStmt(t, CodeGenUtils.list(new CatchClause(new com.github.javaparser.ast.body.Parameter(types.getClass(Exception.class), "e") + .addSingleMemberAnnotation(SuppressWarnings.class, CodeGenUtils.text("unused")), ca)), null)); int i = 0; for (JaxrsParam p : m.params) @@ -204,9 +204,9 @@ private void buildInializer() { if (type.isPrimitive()) type = JvmModelLoader.GLOBAL.get(type.asPrimitive().boxed()); ClassOrInterfaceType c = types.getClass(type.genericName()); - cl.addField(types.getClass(JaxrsEntityWriter.class, c), m.v + "$r", Utils.PSF); + cl.addField(types.getClass(JaxrsEntityWriter.class, c), m.v + "$r", CodeGenUtils.PSF); b.addStatement(new AssignExpr(new NameExpr(m.v + "$r"), new MethodCallExpr(new TypeExpr(types.getClass(JaxrsEntityWriter.class)), "create", - Utils.list(new ClassExpr(types.get(type.name())), new NameExpr("r"), new NameExpr("ra"))), AssignExpr.Operator.ASSIGN)); + CodeGenUtils.list(new ClassExpr(types.get(type.name())), new NameExpr("r"), new NameExpr("ra"))), AssignExpr.Operator.ASSIGN)); } for (JaxrsParam p : m.params) { if (p instanceof JaxrsBeanParam) @@ -250,10 +250,10 @@ private void buildOptions(String name, Set methods) { if (!methods.contains("HEAD") && methods.contains("GET")) sb.append(",HEAD"); - MethodDeclaration m = cl.addMethod(name, Utils.PRIVATE); + MethodDeclaration m = cl.addMethod(name, CodeGenUtils.PRIVATE); m.addAndGetParameter(types.getClass(JaxrsReq.class), "req").addSingleMemberAnnotation(SuppressWarnings.class, new StringLiteralExpr("unused")); m.addParameter(types.getClass(HttpServletResponse.class), "res").createBody() - .addStatement(new MethodCallExpr(new NameExpr("res"), "setHeader", Utils.list(Utils.text("Allow"), Utils.text(sb.toString())))); + .addStatement(new MethodCallExpr(new NameExpr("res"), "setHeader", CodeGenUtils.list(CodeGenUtils.text("Allow"), CodeGenUtils.text(sb.toString())))); } /** @@ -276,18 +276,18 @@ private void processConverter(JaxrsParam p, String n, int i, BlockStmt b) { if (p instanceof JaxrsBodyParam) { ClassOrInterfaceType type = types.getClass(p.type.genericName()); - cl.addField(types.getClass(JaxrsEntityReader.class, type), n, Utils.PSF); + cl.addField(types.getClass(JaxrsEntityReader.class, type), n, CodeGenUtils.PSF); b.addStatement(new AssignExpr(new NameExpr(n), - new ObjectCreationExpr(null, types.getClass(JaxrsEntityReader.class, TypeCache.EMPTY), Utils.list(new ClassExpr(types.get(p.type.name())), + new ObjectCreationExpr(null, types.getClass(JaxrsEntityReader.class, TypeFactory.EMPTY), CodeGenUtils.list(new ClassExpr(types.get(p.type.name())), new ArrayAccessExpr(new NameExpr("t"), new IntegerLiteralExpr("" + i)), new ArrayAccessExpr(new NameExpr("a"), new IntegerLiteralExpr("" + i)))), AssignExpr.Operator.ASSIGN)); } else { - cl.addField(types.getClass(ParamConverter.class, types.getClass(t)), n, Utils.PSF); + cl.addField(types.getClass(ParamConverter.class, types.getClass(t)), n, CodeGenUtils.PSF); b.addStatement(new AssignExpr(new NameExpr(n), new MethodCallExpr(new TypeExpr(types.getClass(JaxrsContext.class)), "converter", - Utils.list(new ClassExpr(types.get(t1.name())), + CodeGenUtils.list(new ClassExpr(types.get(t1.name())), new MethodCallExpr(new TypeExpr(types.get(JaxrsContext.class)), "getParamType", - Utils.list(new ArrayAccessExpr(new NameExpr("t"), new IntegerLiteralExpr("" + i)))), + CodeGenUtils.list(new ArrayAccessExpr(new NameExpr("t"), new IntegerLiteralExpr("" + i)))), new ArrayAccessExpr(new NameExpr("a"), new IntegerLiteralExpr("" + i)))), AssignExpr.Operator.ASSIGN)); } @@ -299,12 +299,12 @@ private void processConverter(JaxrsParam p, String n, int i, BlockStmt b) { */ private void buildMethod(String name, List list) { BlockStmt b = new BlockStmt(); - cl.addMethod(name, Utils.PRIVATE).addParameter(types.getClass(JaxrsReq.class), "req").addParameter(types.getClass(HttpServletResponse.class), "res") + cl.addMethod(name, CodeGenUtils.PRIVATE).addParameter(types.getClass(JaxrsReq.class), "req").addParameter(types.getClass(HttpServletResponse.class), "res") .addThrownException(IOException.class).createBody() .addStatement(new TryStmt(b, - Utils.list(new CatchClause(new com.github.javaparser.ast.body.Parameter(types.getClass(Throwable.class), "e"), + CodeGenUtils.list(new CatchClause(new com.github.javaparser.ast.body.Parameter(types.getClass(Throwable.class), "e"), new BlockStmt().addStatement(new MethodCallExpr(new TypeExpr(types.getClass(JaxrsContext.class)), "sendError", - Utils.list(new NameExpr("req"), new NameExpr("e"), new NameExpr("res")))))), + CodeGenUtils.list(new NameExpr("req"), new NameExpr("e"), new NameExpr("res")))))), null)); Map> consume = new LinkedHashMap<>(); @@ -329,15 +329,15 @@ private void buildMethod(String name, List list) { if (consume.isEmpty()) buildProduces(b, def); else { - b.addStatement(Utils.assign(types.getClass(MediaType.class), "contentType", new MethodCallExpr(new NameExpr("req"), "getContentType"))); + b.addStatement(CodeGenUtils.assign(types.getClass(MediaType.class), "contentType", new MethodCallExpr(new NameExpr("req"), "getContentType"))); List k = new ArrayList<>(consume.keySet()); k.sort(MIME); - Statement stmt = def == null ? new ThrowStmt(new ObjectCreationExpr(null, types.getClass(NotSupportedException.class), Utils.list())) + Statement stmt = def == null ? new ThrowStmt(new ObjectCreationExpr(null, types.getClass(NotSupportedException.class), CodeGenUtils.list())) : buildProduces(new BlockStmt(), def); for (String s : k) - stmt = new IfStmt(new MethodCallExpr(new NameExpr("contentType"), "isCompatible", Utils.list(mt.type(s))), buildProduces(new BlockStmt(), consume.get(s)), - stmt); + stmt = new IfStmt(new MethodCallExpr(new NameExpr("contentType"), "isCompatible", CodeGenUtils.list(mt.type(s))), + buildProduces(new BlockStmt(), consume.get(s)), stmt); b.addStatement(stmt); } } @@ -345,24 +345,24 @@ private void buildMethod(String name, List list) { private Statement buildProduces(BlockStmt b, Map produce) { MethodCallExpr accept = new MethodCallExpr(new NameExpr("req"), "getAccepted", - Utils.list(mt.predicate(produce.keySet()), mt.type(produce.keySet().iterator().next()))); + CodeGenUtils.list(mt.predicate(produce.keySet()), mt.type(produce.keySet().iterator().next()))); JaxrsMapping def = produce.remove("*/*"); - Statement stmt = new ThrowStmt(new ObjectCreationExpr(null, types.getClass(NotAcceptableException.class), Utils.list())); + Statement stmt = new ThrowStmt(new ObjectCreationExpr(null, types.getClass(NotAcceptableException.class), CodeGenUtils.list())); if (def != null) stmt = new ExpressionStmt(new MethodCallExpr(def.v + "$call", new NameExpr("req"), new NameExpr("res"))); if (produce.isEmpty()) return b.addStatement(accept).addStatement(stmt); - b.addStatement(Utils.assign(types.getClass(MediaType.class), "accept", accept)) + b.addStatement(CodeGenUtils.assign(types.getClass(MediaType.class), "accept", accept)) .addStatement(new IfStmt(new BinaryExpr(new NameExpr("accept"), new NullLiteralExpr(), BinaryExpr.Operator.EQUALS), - new ThrowStmt(new ObjectCreationExpr(null, types.getClass(NotAcceptableException.class), Utils.list())), null)); + new ThrowStmt(new ObjectCreationExpr(null, types.getClass(NotAcceptableException.class), CodeGenUtils.list())), null)); List k = new ArrayList<>(produce.keySet()); k.sort(MIME); for (String s : k) { - stmt = new IfStmt(new MethodCallExpr(new NameExpr("accept"), "isCompatible", Utils.list(mt.type(s))), + stmt = new IfStmt(new MethodCallExpr(new NameExpr("accept"), "isCompatible", CodeGenUtils.list(mt.type(s))), new ExpressionStmt(new MethodCallExpr(produce.get(s).v + "$call", new NameExpr("req"), new NameExpr("res"))), stmt); } b.addStatement(stmt); @@ -370,26 +370,26 @@ private Statement buildProduces(BlockStmt b, Map produce) } private void buildCall(JaxrsMapping mapping, Map services) { - BlockStmt b = cl.addMethod(mapping.v + "$call", Utils.PSF).addParameter(types.getClass(JaxrsReq.class), "r") + BlockStmt b = cl.addMethod(mapping.v + "$call", CodeGenUtils.PSF).addParameter(types.getClass(JaxrsReq.class), "r") .addParameter(types.getClass(HttpServletResponse.class), "res").addThrownException(types.getClass(Exception.class)).createBody(); - b.addStatement( - new MethodCallExpr(new MethodCallExpr(new NameExpr("r"), "getRequest"), "setAttribute", Utils.list(Utils.text("requestPattern"), Utils.text(mapping.path)))); + b.addStatement(new MethodCallExpr(new MethodCallExpr(new NameExpr("r"), "getRequest"), "setAttribute", + CodeGenUtils.list(CodeGenUtils.text("requestPattern"), CodeGenUtils.text(mapping.path)))); NameExpr n = pathParams.get(mapping); if (n != null) - b.addStatement(new MethodCallExpr(new NameExpr("r"), "initPaths", Utils.list(n))); + b.addStatement(new MethodCallExpr(new NameExpr("r"), "initPaths", CodeGenUtils.list(n))); for (JaxrsParam p : mapping.params) - b.addStatement(Utils.assign(types.get(p.type), p.v, getParam(p))); + b.addStatement(CodeGenUtils.assign(types.get(p.type), p.v, getParam(p))); MethodModel m = mapping.m; NodeList arg = mapping.params.stream().map(p -> new NameExpr(p.v)).collect(Collectors.toCollection(() -> new NodeList<>())); MethodCallExpr call = new MethodCallExpr(services.get(mapping.clazz.name()), m.name(), arg); if (m.type().isVoid()) { - b.addStatement(call).addStatement(new MethodCallExpr(new NameExpr("res"), "sendError", Utils.list(new IntegerLiteralExpr("204")))); + b.addStatement(call).addStatement(new MethodCallExpr(new NameExpr("res"), "sendError", CodeGenUtils.list(new IntegerLiteralExpr("204")))); } else { - Expression result = Utils.assign(types.get(m.type()), "result", call); - Expression write = new MethodCallExpr(new NameExpr(mapping.v + "$r"), "write", Utils.list(new NameExpr("r"), new NameExpr("result"), new NameExpr("res"))); + Expression result = CodeGenUtils.assign(types.get(m.type()), "result", call); + Expression write = new MethodCallExpr(new NameExpr(mapping.v + "$r"), "write", CodeGenUtils.list(new NameExpr("r"), new NameExpr("result"), new NameExpr("res"))); if (m.type().isAssignableTo(AutoCloseable.class)) - b.addStatement(new TryStmt().setResources(Utils.list(result)).setTryBlock(new BlockStmt().addStatement(write))); + b.addStatement(new TryStmt().setResources(CodeGenUtils.list(result)).setTryBlock(new BlockStmt().addStatement(write))); else b.addStatement(result).addStatement(write); } @@ -402,9 +402,9 @@ private void buildCall(JaxrsMapping mapping, Map services) { private Expression getParam(JaxrsParam p) { if (p instanceof JaxrsBodyParam) - return new MethodCallExpr(new NameExpr(converterVar.get(p)), "read", Utils.list(new NameExpr("r"))); + return new MethodCallExpr(new NameExpr(converterVar.get(p)), "read", CodeGenUtils.list(new NameExpr("r"))); if (p instanceof JaxrsBeanParam) - return new MethodCallExpr(new NameExpr("BeansReader"), beans.get((JaxrsBeanParam) p), Utils.list(new NameExpr("r"))); + return new MethodCallExpr(new NameExpr("BeansReader"), beans.get((JaxrsBeanParam) p), CodeGenUtils.list(new NameExpr("r"))); return JaxrsModel.getParam(p, types, converterVar); } @@ -423,19 +423,19 @@ public void build() { for (JaxrsMapping m : mappings) methods.computeIfAbsent(m.httpMethod, k -> new ArrayList<>()).add(m); - Statement i = new ExpressionStmt(new MethodCallExpr(new NameExpr("res"), "sendError", Utils.list(new IntegerLiteralExpr("405")))); + Statement i = new ExpressionStmt(new MethodCallExpr(new NameExpr("res"), "sendError", CodeGenUtils.list(new IntegerLiteralExpr("405")))); if (!methods.containsKey("OPTIONS")) - i = new IfStmt(new MethodCallExpr(Utils.text("OPTIONS"), "equals", Utils.list(m)), new ExpressionStmt(new MethodCallExpr("doOptions", p)), i); + i = new IfStmt(new MethodCallExpr(CodeGenUtils.text("OPTIONS"), "equals", CodeGenUtils.list(m)), new ExpressionStmt(new MethodCallExpr("doOptions", p)), i); if (!methods.containsKey("HEAD") && methods.containsKey("GET")) - i = new IfStmt(new MethodCallExpr(Utils.text("HEAD"), "equals", Utils.list(m)), new ExpressionStmt(new MethodCallExpr("doGet", p)), i); + i = new IfStmt(new MethodCallExpr(CodeGenUtils.text("HEAD"), "equals", CodeGenUtils.list(m)), new ExpressionStmt(new MethodCallExpr("doGet", p)), i); for (String method : methods.keySet()) - i = new IfStmt(new MethodCallExpr(Utils.text(method), "equals", Utils.list(m)), + i = new IfStmt(new MethodCallExpr(CodeGenUtils.text(method), "equals", CodeGenUtils.list(m)), new ExpressionStmt(new MethodCallExpr("do" + method.charAt(0) + method.substring(1).toLowerCase(), p)), i); - cl.addMethod("service", Utils.PUBLIC).addMarkerAnnotation(Override.class).addParameter(types.getClass(HttpServletRequest.class), "req") + cl.addMethod("service", CodeGenUtils.PUBLIC).addMarkerAnnotation(Override.class).addParameter(types.getClass(HttpServletRequest.class), "req") .addParameter(types.getClass(HttpServletResponse.class), "res").addThrownException(IOException.class).addThrownException(ServletException.class).getBody() - .get().addStatement(Utils.create(types.getClass(JaxrsReq.class), "r", Utils.list(new NameExpr("req"), new NullLiteralExpr()))) - .addStatement(Utils.assign(types.getClass(String.class), "m", new MethodCallExpr(new NameExpr("req"), "getMethod"))).addStatement(i); + .get().addStatement(CodeGenUtils.create(types.getClass(JaxrsReq.class), "r", CodeGenUtils.list(new NameExpr("req"), new NullLiteralExpr()))) + .addStatement(CodeGenUtils.assign(types.getClass(String.class), "m", new MethodCallExpr(new NameExpr("req"), "getMethod"))).addStatement(i); if (!methods.containsKey("OPTIONS")) buildOptions("doOptions", methods.keySet()); @@ -494,7 +494,7 @@ void addPath(JaxrsMapping mapping, String path) { if (!map.isEmpty() && n == null) { params.put(map, n = new NameExpr("path$" + params.size())); cl.addFieldWithInitializer(types.getClass(Map.class, types.get(String.class), types.get(Integer.class)), n.getNameAsString(), Utils.mapInteger(map, types), - Utils.PSF); + CodeGenUtils.PSF); } pathParams.put(mapping, n); } @@ -505,9 +505,9 @@ public void build() { List list = new ArrayList<>(pattern.keySet()); list.sort((p1, p2) -> p2.length - p1.length); - Expression req = new ObjectCreationExpr(null, types.getClass(JaxrsReq.class), Utils.list(new NameExpr("req"), new NameExpr("l"))); + Expression req = new ObjectCreationExpr(null, types.getClass(JaxrsReq.class), CodeGenUtils.list(new NameExpr("req"), new NameExpr("l"))); BlockStmt b = new BlockStmt().addStatement(new VariableDeclarationExpr(types.getClass(List.class, types.get(String.class)), "l")) - .addStatement(Utils.assign(types.get(String.class), "p", new MethodCallExpr(new NameExpr("req"), "getPathInfo"))); + .addStatement(CodeGenUtils.assign(types.get(String.class), "p", new MethodCallExpr(new NameExpr("req"), "getPathInfo"))); int i = 0; for (Path l : list) { @@ -515,26 +515,27 @@ public void build() { Expression e; if (l.parts == null) - e = new ObjectCreationExpr(null, types.getClass(PathRegexp.class), Utils.list(Utils.text(l.pattern))); + e = new ObjectCreationExpr(null, types.getClass(PathRegexp.class), CodeGenUtils.list(CodeGenUtils.text(l.pattern))); else { - NodeList a = Utils.list(new BooleanLiteralExpr(l.last)); + NodeList a = CodeGenUtils.list(new BooleanLiteralExpr(l.last)); for (String s : l.parts) - a.add(Utils.text(s)); + a.add(CodeGenUtils.text(s)); e = new ObjectCreationExpr(null, types.getClass(PathSimple.class), a); } - cl.addFieldWithInitializer(types.get(PathPattern.class), n, e, Utils.PSF); + cl.addFieldWithInitializer(types.get(PathPattern.class), n, e, CodeGenUtils.PSF); - b.addStatement(new AssignExpr(new NameExpr("l"), new MethodCallExpr(new NameExpr(n), "process", Utils.list(new NameExpr("p"))), Operator.ASSIGN)) - .addStatement(new IfStmt(new BinaryExpr(new NameExpr("l"), new NullLiteralExpr(), BinaryExpr.Operator.NOT_EQUALS), - new BlockStmt().addStatement(new MethodCallExpr(null, "service$" + (i), Utils.list(req, new NameExpr("res")))).addStatement(new ReturnStmt()), + b.addStatement(new AssignExpr(new NameExpr("l"), new MethodCallExpr(new NameExpr(n), "process", CodeGenUtils.list(new NameExpr("p"))), Operator.ASSIGN)) + .addStatement(new IfStmt( + new BinaryExpr(new NameExpr("l"), new NullLiteralExpr(), BinaryExpr.Operator.NOT_EQUALS), new BlockStmt() + .addStatement(new MethodCallExpr(null, "service$" + (i), CodeGenUtils.list(req, new NameExpr("res")))).addStatement(new ReturnStmt()), null)); i++; } - cl.addMethod("service", Utils.PUBLIC).addMarkerAnnotation(Override.class).addParameter(types.getClass(HttpServletRequest.class), "req") + cl.addMethod("service", CodeGenUtils.PUBLIC).addMarkerAnnotation(Override.class).addParameter(types.getClass(HttpServletRequest.class), "req") .addParameter(types.getClass(HttpServletResponse.class), "res").addThrownException(IOException.class).addThrownException(ServletException.class) - .setBody(b.addStatement(new MethodCallExpr(new NameExpr("res"), "sendError", Utils.list(new IntegerLiteralExpr("404"))))); + .setBody(b.addStatement(new MethodCallExpr(new NameExpr("res"), "sendError", CodeGenUtils.list(new IntegerLiteralExpr("404"))))); i = 0; for (Path l : list) { @@ -553,18 +554,19 @@ public void build() { } private void buildService(String name, Map> methods) { - Statement i = new ExpressionStmt(new MethodCallExpr(new NameExpr("res"), "sendError", Utils.list(new IntegerLiteralExpr("405")))); + Statement i = new ExpressionStmt(new MethodCallExpr(new NameExpr("res"), "sendError", CodeGenUtils.list(new IntegerLiteralExpr("405")))); if (!methods.containsKey("OPTIONS")) - i = new IfStmt(new MethodCallExpr(Utils.text("OPTIONS"), "equals", Utils.list(m)), new ExpressionStmt(new MethodCallExpr(name + "$options", p)), i); + i = new IfStmt(new MethodCallExpr(CodeGenUtils.text("OPTIONS"), "equals", CodeGenUtils.list(m)), new ExpressionStmt(new MethodCallExpr(name + "$options", p)), + i); if (!methods.containsKey("HEAD") && methods.containsKey("GET")) - i = new IfStmt(new MethodCallExpr(Utils.text("HEAD"), "equals", Utils.list(m)), new ExpressionStmt(new MethodCallExpr(name + "$get", p)), i); + i = new IfStmt(new MethodCallExpr(CodeGenUtils.text("HEAD"), "equals", CodeGenUtils.list(m)), new ExpressionStmt(new MethodCallExpr(name + "$get", p)), i); for (String method : methods.keySet()) - i = new IfStmt(new MethodCallExpr(Utils.text(method), "equals", Utils.list(m)), new ExpressionStmt(new MethodCallExpr(name + "$" + method.toLowerCase(), p)), - i); + i = new IfStmt(new MethodCallExpr(CodeGenUtils.text(method), "equals", CodeGenUtils.list(m)), + new ExpressionStmt(new MethodCallExpr(name + "$" + method.toLowerCase(), p)), i); - cl.addMethod(name, Utils.PRIVATE).addParameter(types.getClass(JaxrsReq.class), "r").addParameter(types.getClass(HttpServletResponse.class), "res") - .addThrownException(IOException.class).setBody( - new BlockStmt().addStatement(Utils.assign(types.getClass(String.class), "m", new MethodCallExpr(new NameExpr("r"), "getMethod"))).addStatement(i)); + cl.addMethod(name, CodeGenUtils.PRIVATE).addParameter(types.getClass(JaxrsReq.class), "r").addParameter(types.getClass(HttpServletResponse.class), "res") + .addThrownException(IOException.class).setBody(new BlockStmt() + .addStatement(CodeGenUtils.assign(types.getClass(String.class), "m", new MethodCallExpr(new NameExpr("r"), "getMethod"))).addStatement(i)); } } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/JaxrsModel.java b/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/JaxrsModel.java index 16357ae6..41b9676f 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/JaxrsModel.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/JaxrsModel.java @@ -62,6 +62,8 @@ import jakarta.ws.rs.ext.MessageBodyWriter; import jakarta.ws.rs.ext.ParamConverterProvider; import jakarta.ws.rs.ext.Provider; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.TypeFactory; import unknow.model.api.AncestrorIterator; import unknow.model.api.AnnotationModel; import unknow.model.api.BeanProperty; @@ -79,8 +81,6 @@ import unknow.server.http.jaxrs.protostuff.ProtostuffJsonProvider; import unknow.server.http.jaxrs.protostuff.ProtostuffListProvider; import unknow.server.http.jaxrs.protostuff.ProtostuffProvider; -import unknow.server.maven.TypeCache; -import unknow.server.maven.Utils; import unknow.server.maven.jaxrs.JaxrsParam.JaxrsBeanParam; import unknow.server.maven.jaxrs.JaxrsParam.JaxrsBeanParam.JaxrsBeanFieldParam; import unknow.server.maven.jaxrs.JaxrsParam.JaxrsBodyParam; @@ -367,8 +367,8 @@ public static TypeModel getParamType(TypeModel type) { return ancestor.parameter(0).type(); } - public static Expression getParam(JaxrsParam p, TypeCache types, Map, String> converterVar) { - NodeList list = Utils.list(Utils.text(p.value), p.def == null ? new NullLiteralExpr() : Utils.text(p.def)); + public static Expression getParam(JaxrsParam p, TypeFactory types, Map, String> converterVar) { + NodeList list = CodeGenUtils.list(CodeGenUtils.text(p.value), p.def == null ? new NullLiteralExpr() : CodeGenUtils.text(p.def)); String m = "get" + p.getClass().getSimpleName().substring(5, p.getClass().getSimpleName().length() - 5); if (p.type.isArray()) { @@ -384,9 +384,9 @@ public static Expression getParam(JaxrsParam p, TypeCache types, Map t.ifClass(model::process)); + processSrc(t -> t.ifClass(model::process)); model.implicitConstructor.remove("java.lang.String"); beans = new BeanParamBuilder(newCu(), existingClass); @@ -127,11 +125,11 @@ public void execute() throws MojoExecutionException, MojoFailureException { } for (Entry> e : map.entrySet()) - out.save(new JaxRsServletBuilder(newCu(), existingClass, e.getKey(), e.getValue(), beans, mt).build()); + writer.write(new JaxRsServletBuilder(newCu(), existingClass, e.getKey(), e.getValue(), beans, mt).build()); - new OpenApiBuilder().build(openapi.getSpec(project), model, resources + basePath + "/openapi.json"); - beans.save(out); - mt.save(out); + new OpenApiBuilder().build(openapi.getSpec(project), model, codegen.resources + basePath + "/openapi.json"); + beans.save(writer); + mt.save(writer); generateGraalvmResources(); } @@ -141,32 +139,33 @@ public void execute() throws MojoExecutionException, MojoFailureException { */ private void generateInitalizer() throws IOException, MojoExecutionException { - Path path = Paths.get(resources, "META-INF", "services", ServletContainerInitializer.class.getName()); + Path path = Paths.get(codegen.resources, "META-INF", "services", ServletContainerInitializer.class.getName()); Files.createDirectories(path.getParent()); try (Writer w = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) { - w.append(packageName).write(".JaxrsInit\n"); + w.append(fullName("JaxrsInit")).write('\n'); } CompilationUnit cu = newCu(); - types = new TypeCache(cu, existingClass); + types = new TypeFactory(cu, existingClass); TypeExpr ctx = new TypeExpr(types.getClass(JaxrsContext.class)); - cl = cu.addClass("JaxrsInit", Utils.PUBLIC).addImplementedType(ServletContainerInitializer.class); - BlockStmt b = cl.addMethod("onStartup", Utils.PUBLIC).addMarkerAnnotation(Override.class) - .addParameter(types.getClass(Set.class, types.getClass(Class.class, TypeCache.ANY)), "c").addParameter(types.getClass(ServletContext.class), "ctx") + cl = cu.addClass("JaxrsInit", CodeGenUtils.PUBLIC).addImplementedType(ServletContainerInitializer.class); + BlockStmt b = cl.addMethod("onStartup", CodeGenUtils.PUBLIC).addMarkerAnnotation(Override.class) + .addParameter(types.getClass(Set.class, types.getClass(Class.class, TypeFactory.ANY)), "c").addParameter(types.getClass(ServletContext.class), "ctx") .createBody().addStatement(new MethodCallExpr(new TypeExpr(types.getClass(RuntimeDelegate.class)), "setInstance", - Utils.list(new ObjectCreationExpr(null, types.getClass(JaxrsRuntime.class), Utils.list())))); + CodeGenUtils.list(new ObjectCreationExpr(null, types.getClass(JaxrsRuntime.class), CodeGenUtils.list())))); for (ClassModel s : model.converter) { ClassOrInterfaceType t = types.getClass(s); if (!s.parameters().isEmpty()) { t = t.clone(); - t.setTypeArguments(Utils.list(TypeCache.EMPTY)); + t.setTypeArguments(CodeGenUtils.list(TypeFactory.EMPTY)); } - b.addStatement(new MethodCallExpr(ctx, "registerConverter", Utils.list(new ObjectCreationExpr(null, t, Utils.list())))); + b.addStatement(new MethodCallExpr(ctx, "registerConverter", CodeGenUtils.list(new ObjectCreationExpr(null, t, CodeGenUtils.list())))); } if (!model.implicitConstructor.isEmpty() || !model.implicitFromString.isEmpty() || !model.implicitValueOf.isEmpty()) - b.addStatement(new MethodCallExpr(ctx, "registerConverter", Utils.list(new ObjectCreationExpr(null, new ClassOrInterfaceType(null, "P"), Utils.list())))); + b.addStatement( + new MethodCallExpr(ctx, "registerConverter", CodeGenUtils.list(new ObjectCreationExpr(null, new ClassOrInterfaceType(null, "P"), CodeGenUtils.list())))); Expression m = null; if (objectMapper != null) { @@ -184,32 +183,32 @@ private void generateInitalizer() throws IOException, MojoExecutionException { for (Entry e : model.exceptions.entrySet()) { b.addStatement(new MethodCallExpr(ctx, "registerException", - Utils.list(new ClassExpr(types.get(e.getKey())), new ObjectCreationExpr(null, types.getClass(e.getValue()), Utils.list())))); + CodeGenUtils.list(new ClassExpr(types.get(e.getKey())), new ObjectCreationExpr(null, types.getClass(e.getValue()), CodeGenUtils.list())))); } for (String clazz : model.protostuffMessage) { ClassOrInterfaceType type = types.getClass(clazz); b.addStatement(new MethodCallExpr(new TypeExpr(types.get(ProtostuffSchema.class)), "register", - Utils.list(new ClassExpr(type), new MethodCallExpr(new ObjectCreationExpr(null, type, Utils.list()), "cachedSchema")))); + CodeGenUtils.list(new ClassExpr(type), new MethodCallExpr(new ObjectCreationExpr(null, type, CodeGenUtils.list()), "cachedSchema")))); } - out.save(cu); + writer.write(cu); } private NodeList registerParams(ClassModel c, List mimes, Expression m) { - NodeList list = Utils.list(); + NodeList list = CodeGenUtils.list(); if (m != null && c.constructors(loader.get(ObjectMapper.class.getName())).isPresent()) list.add(m); ClassOrInterfaceType t = types.getClass(c); if (!c.parameters().isEmpty()) { t = t.clone(); - t.setTypeArguments(Utils.list(TypeCache.EMPTY)); + t.setTypeArguments(CodeGenUtils.list(TypeFactory.EMPTY)); } NodeList l = new NodeList<>(new ObjectCreationExpr(null, t, list)); l.add(c.annotation(Priority.class).flatMap(a -> a.value()).filter(v -> v.isSet()).map(a -> (Expression) new IntegerLiteralExpr(a.asLiteral())) .orElseGet(() -> new FieldAccessExpr(new TypeExpr(types.get(Priorities.class)), "USER"))); for (String s : mimes) - l.add(Utils.text(s)); + l.add(CodeGenUtils.text(s)); return l; } @@ -241,8 +240,9 @@ private void generateImplicitConverter(CompilationUnit cu) { new ReturnStmt(new CastExpr(p, new NameExpr(n))), null)); } - clazz.addMethod("getConverter", Utils.PUBLIC).addMarkerAnnotation(Override.class).addSingleMemberAnnotation(SuppressWarnings.class, Utils.text("unchecked")) - .addTypeParameter(t).setType(p).addParameter(types.getClass(Class.class, t), "rawType").addParameter(types.getClass(Type.class), "genericType") + clazz.addMethod("getConverter", CodeGenUtils.PUBLIC).addMarkerAnnotation(Override.class) + .addSingleMemberAnnotation(SuppressWarnings.class, CodeGenUtils.text("unchecked")).addTypeParameter(t).setType(p) + .addParameter(types.getClass(Class.class, t), "rawType").addParameter(types.getClass(Type.class), "genericType") .addParameter(types.array(Annotation.class), "Annotation").setBody(b.addStatement(new ReturnStmt(new NullLiteralExpr()))); } @@ -250,19 +250,21 @@ private void generateImplicitConverter(ClassOrInterfaceDeclaration clazz, String ClassOrInterfaceType type = types.getClass(cl); Expression e; if (m == null) - e = new ObjectCreationExpr(null, type, Utils.list(new NameExpr(VALUE))); + e = new ObjectCreationExpr(null, type, CodeGenUtils.list(new NameExpr(VALUE))); else - e = new MethodCallExpr(new TypeExpr(type), m, Utils.list(new NameExpr(VALUE))); - - NodeList> methods = Utils.list( - new MethodDeclaration(Modifier.createModifierList(Modifier.Keyword.PUBLIC, Modifier.Keyword.FINAL), Utils.list(new MarkerAnnotationExpr("Override")), - Utils.list(), type, new SimpleName("fromString"), Utils.list(new com.github.javaparser.ast.body.Parameter(types.getClass(String.class), VALUE)), - Utils.list(), new BlockStmt().addStatement(new ReturnStmt(e))), - new MethodDeclaration(Modifier.createModifierList(Modifier.Keyword.PUBLIC, Modifier.Keyword.FINAL), Utils.list(new MarkerAnnotationExpr("Override")), - Utils.list(), types.getClass(String.class), new SimpleName("toString"), Utils.list(new com.github.javaparser.ast.body.Parameter(type, VALUE)), - Utils.list(), new BlockStmt().addStatement(new ReturnStmt(new MethodCallExpr(new NameExpr(VALUE), "toString"))))); + e = new MethodCallExpr(new TypeExpr(type), m, CodeGenUtils.list(new NameExpr(VALUE))); + + NodeList> methods = CodeGenUtils.list( + new MethodDeclaration(Modifier.createModifierList(Modifier.Keyword.PUBLIC, Modifier.Keyword.FINAL), CodeGenUtils.list(new MarkerAnnotationExpr("Override")), + CodeGenUtils.list(), type, new SimpleName("fromString"), + CodeGenUtils.list(new com.github.javaparser.ast.body.Parameter(types.getClass(String.class), VALUE)), CodeGenUtils.list(), + new BlockStmt().addStatement(new ReturnStmt(e))), + new MethodDeclaration(Modifier.createModifierList(Modifier.Keyword.PUBLIC, Modifier.Keyword.FINAL), CodeGenUtils.list(new MarkerAnnotationExpr("Override")), + CodeGenUtils.list(), types.getClass(String.class), new SimpleName("toString"), + CodeGenUtils.list(new com.github.javaparser.ast.body.Parameter(type, VALUE)), CodeGenUtils.list(), + new BlockStmt().addStatement(new ReturnStmt(new MethodCallExpr(new NameExpr(VALUE), "toString"))))); clazz.addFieldWithInitializer(types.getClass(ParamConverter.class, type), name, - new ObjectCreationExpr(null, types.getClass(ParamConverter.class, TypeCache.EMPTY), null, Utils.list(), methods), Utils.PSF); + new ObjectCreationExpr(null, types.getClass(ParamConverter.class, TypeFactory.EMPTY), null, CodeGenUtils.list(), methods), CodeGenUtils.PSF); } private void generateGraalvmResources() throws MojoFailureException { @@ -270,7 +272,7 @@ private void generateGraalvmResources() throws MojoFailureException { return; try { - Path path = Paths.get(resources + "/META-INF/native-image/" + id() + "/resource-config.json"); + Path path = Paths.get(codegen.resources + "/META-INF/native-image/" + uniquePath + "/resource-config.json"); Files.createDirectories(path.getParent()); try (BufferedWriter w = Files.newBufferedWriter(path)) { w.write("{\"resources\":{\"includes\":["); diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/MediaTypesBuilder.java b/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/MediaTypesBuilder.java index 25d50d23..1da403b0 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/MediaTypesBuilder.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/MediaTypesBuilder.java @@ -23,10 +23,10 @@ import com.github.javaparser.ast.type.ClassOrInterfaceType; import jakarta.ws.rs.core.MediaType; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.CompilationUnitWriter; +import unknow.maven.codegen.TypeFactory; import unknow.server.http.jaxrs.MTPredicate; -import unknow.server.maven.Output; -import unknow.server.maven.TypeCache; -import unknow.server.maven.Utils; /** * @author unknow @@ -34,7 +34,7 @@ public class MediaTypesBuilder { private final CompilationUnit cu; private final ClassOrInterfaceDeclaration cl; - private final TypeCache types; + private final TypeFactory types; private final ClassOrInterfaceType mt; @@ -43,8 +43,8 @@ public class MediaTypesBuilder { public MediaTypesBuilder(CompilationUnit cu, Map existingClass) { this.cu = cu; - types = new TypeCache(cu, existingClass); - cl = cu.addClass("MediaTypes", Utils.PUBLIC); + types = new TypeFactory(cu, existingClass); + cl = cu.addClass("MediaTypes", CodeGenUtils.PUBLIC); mt = types.getClass(MediaType.class); @@ -66,9 +66,9 @@ public MediaTypesBuilder(CompilationUnit cu, Map existingClass) mts.put("application/json-patch+json", new FieldAccessExpr(new TypeExpr(mt), "APPLICATION_JSON_PATCH_JSON_TYPE")); } - public void save(Output out) throws MojoExecutionException { + public void save(CompilationUnitWriter writer) throws MojoExecutionException { if (!predicates.isEmpty() || mts.size() > 13) - out.save(cu); + writer.write(cu); } public Expression type(String t) { @@ -79,8 +79,8 @@ public Expression type(String t) { String name = t.toUpperCase().replaceAll("[^_a-zA-Z]", "_"); cl.addFieldWithInitializer(mt, name, - new ObjectCreationExpr(null, types.getClass(MediaType.class), Utils.list(new StringLiteralExpr(split[0]), new StringLiteralExpr(split[1]))), - Utils.PUBLIC_STATIC); + new ObjectCreationExpr(null, types.getClass(MediaType.class), CodeGenUtils.list(new StringLiteralExpr(split[0]), new StringLiteralExpr(split[1]))), + CodeGenUtils.PUBLIC_STATIC); mts.put(t, n = new FieldAccessExpr(new TypeExpr(types.getClass(cl)), name)); return n; } @@ -113,7 +113,7 @@ public Expression predicate(Collection mediaTypes) { } else e = new FieldAccessExpr(new TypeExpr(types.get(MTPredicate.class)), "ANY"); - cl.addFieldWithInitializer(types.getClass(MTPredicate.class), name, e, Utils.PUBLIC_STATIC); + cl.addFieldWithInitializer(types.getClass(MTPredicate.class), name, e, CodeGenUtils.PUBLIC_STATIC); predicates.put(k, n = new FieldAccessExpr(new TypeExpr(types.getClass(cl)), name)); return n; } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/jaxws/JaxwsGeneratorMojo.java b/unknow-server-maven/src/main/java/unknow/server/maven/jaxws/JaxwsGeneratorMojo.java index d8c2aa94..2d50ebe7 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/jaxws/JaxwsGeneratorMojo.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/jaxws/JaxwsGeneratorMojo.java @@ -23,6 +23,7 @@ import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,9 +31,9 @@ import com.github.javaparser.ast.CompilationUnit; import jakarta.jws.WebService; +import unknow.maven.codegen.TypeFactory; import unknow.model.api.AnnotationModel; import unknow.server.maven.AbstractGeneratorMojo; -import unknow.server.maven.TypeCache; import unknow.server.maven.jaxb.model.XmlLoader; import unknow.server.maven.jaxws.binding.Service; @@ -44,23 +45,20 @@ public class JaxwsGeneratorMojo extends AbstractGeneratorMojo { private static final Logger logger = LoggerFactory.getLogger(JaxwsGeneratorMojo.class); private static final XMLOutputFactory f = XMLOutputFactory.newInstance(); - @org.apache.maven.plugins.annotations.Parameter(name = "publishUrl", defaultValue = "http://127.0.0.1:8080") + @Parameter(name = "graalvm", defaultValue = "true") + protected boolean graalvm; + @Parameter(name = "publishUrl", defaultValue = "http://127.0.0.1:8080") private String publishUrl; - @org.apache.maven.plugins.annotations.Parameter(name = "basePath", defaultValue = "/") + @Parameter(name = "basePath", defaultValue = "/") private String basePath; - @org.apache.maven.plugins.annotations.Parameter(name = "jaxbFactory") + @Parameter(name = "jaxbFactory") private String jaxbFactory; private final XmlLoader xmlLoader = new XmlLoader(); - @Override - protected String id() { - return "jaxws-generator"; - } - @Override public void execute() throws MojoExecutionException, MojoFailureException { - init(); + init(session, mojo, repository, codegen); if (!basePath.endsWith("/")) basePath += "/"; @@ -71,27 +69,27 @@ public void execute() throws MojoExecutionException, MojoFailureException { throw new MojoFailureException("no jaxb factory found"); List wsdl = new ArrayList<>(); - process(t -> { + processSrc(t -> { if (!t.isClass()) return; Optional a = t.annotation(WebService.class); if (!a.isPresent()) return; CompilationUnit cu = newCu(); - TypeCache types = new TypeCache(cu, existingClass); + TypeFactory types = new TypeFactory(cu, existingClass); try { Service service = Service.build(t.asClass(), basePath, loader, xmlLoader); - String n = "generated/" + id() + "/" + service.name + ".wsdl"; - Path path = Paths.get(resources, n); + String n = "generated/" + uniquePath + "/" + service.name + ".wsdl"; + Path path = Paths.get(codegen.resources, n); Files.createDirectories(path.getParent()); try (BufferedWriter w = Files.newBufferedWriter(path)) { new WsdlBuilder(service, publishUrl).write(f.createXMLStreamWriter(w)); } wsdl.add(n); new JaxwsServletBuilder(t.asClass(), service).generate(cu, types, jaxbFactory, n); - out.save(cu); + writer.write(cu); } catch (Exception e) { throw new MojoFailureException("failed to generate/save output class", e); } @@ -99,7 +97,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { if (graalvm && !wsdl.isEmpty()) { try { - Path path = Paths.get(resources + "/META-INF/native-image/" + id() + "/resource-config.json"); + Path path = Paths.get(codegen.resources + "/META-INF/native-image/" + uniquePath + "/resource-config.json"); Files.createDirectories(path.getParent()); try (BufferedWriter w = Files.newBufferedWriter(path)) { w.write("{\"resources\":{\"includes\":["); diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/jaxws/JaxwsServletBuilder.java b/unknow-server-maven/src/main/java/unknow/server/maven/jaxws/JaxwsServletBuilder.java index 4f8087b3..bbb8621d 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/jaxws/JaxwsServletBuilder.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/jaxws/JaxwsServletBuilder.java @@ -52,14 +52,14 @@ import jakarta.xml.bind.JAXBElement; import jakarta.xml.bind.JAXBException; import jakarta.xml.bind.Unmarshaller; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.TypeFactory; import unknow.model.api.ClassModel; import unknow.model.api.TypeModel; import unknow.server.jaxws.AbstractWs; import unknow.server.jaxws.Envelope; import unknow.server.jaxws.OperationWrapper; import unknow.server.jaxws.WSMethod; -import unknow.server.maven.TypeCache; -import unknow.server.maven.Utils; import unknow.server.maven.jaxws.binding.Operation; import unknow.server.maven.jaxws.binding.Service; @@ -78,18 +78,18 @@ public JaxwsServletBuilder(ClassModel serviceClass, Service service) { this.service = service; } - public void generate(CompilationUnit cu, TypeCache types, String factory, String wsdl) { + public void generate(CompilationUnit cu, TypeFactory types, String factory, String wsdl) { String name = service.name; - NodeList list = Utils.list(); + NodeList list = CodeGenUtils.list(); for (String s : service.urls) - list.add(Utils.text(s)); + list.add(CodeGenUtils.text(s)); - servlet = cu.addClass(Character.toUpperCase(name.charAt(0)) + name.substring(1) + "Servlet", Utils.PUBLIC).addExtendedType(types.getClass(AbstractWs.class)); - servlet.addAndGetAnnotation(WebServlet.class).addPair("urlPatterns", new ArrayInitializerExpr(list)).addPair("name", Utils.text(name)); + servlet = cu.addClass(Character.toUpperCase(name.charAt(0)) + name.substring(1) + "Servlet", CodeGenUtils.PUBLIC).addExtendedType(types.getClass(AbstractWs.class)); + servlet.addAndGetAnnotation(WebServlet.class).addPair("urlPatterns", new ArrayInitializerExpr(list)).addPair("name", CodeGenUtils.text(name)); - servlet.addFieldWithInitializer(types.get(long.class), "serialVersionUID", new LongLiteralExpr("1L"), Utils.PSF); + servlet.addFieldWithInitializer(types.get(long.class), "serialVersionUID", new LongLiteralExpr("1L"), CodeGenUtils.PSF); - servlet.addFieldWithInitializer(types.getClass(serviceClass), "WS", new ObjectCreationExpr(null, types.getClass(serviceClass), Utils.list()), Utils.PSF); + servlet.addFieldWithInitializer(types.getClass(serviceClass), "WS", new ObjectCreationExpr(null, types.getClass(serviceClass), CodeGenUtils.list()), CodeGenUtils.PSF); Collections.sort(service.operations, (o1, o2) -> o1.sig().compareTo(o2.sig())); @@ -101,36 +101,36 @@ public void generate(CompilationUnit cu, TypeCache types, String factory, String BlockStmt b = new BlockStmt(); if (o.wrapped) { b.addStatement(new AssignExpr(new VariableDeclarationExpr(types.getClass(OperationWrapper.class), "o"), - new CastExpr(types.getClass(OperationWrapper.class), new MethodCallExpr(new NameExpr("e"), "getBody", Utils.list(new IntegerLiteralExpr("0")))), + new CastExpr(types.getClass(OperationWrapper.class), new MethodCallExpr(new NameExpr("e"), "getBody", CodeGenUtils.list(new IntegerLiteralExpr("0")))), Operator.ASSIGN)); String n = "N$" + w; servlet.addFieldWithInitializer(types.getClass(QName.class), n, - new ObjectCreationExpr(null, types.getClass(QName.class), Utils.list(Utils.text(o.name.getNamespaceURI()), Utils.text(o.name.getLocalPart()))), - Utils.PSF); - Expression e = new MethodCallExpr(new NameExpr(n), "equals", Utils.list(new NameExpr("n"))); + new ObjectCreationExpr(null, types.getClass(QName.class), CodeGenUtils.list(CodeGenUtils.text(o.name.getNamespaceURI()), CodeGenUtils.text(o.name.getLocalPart()))), + CodeGenUtils.PSF); + Expression e = new MethodCallExpr(new NameExpr(n), "equals", CodeGenUtils.list(new NameExpr("n"))); if (wrapped != null) wrapped = new BinaryExpr(wrapped, e, BinaryExpr.Operator.OR); else wrapped = e; } - NodeList param = Utils.list(); + NodeList param = CodeGenUtils.list(); int h = 0; int bi = 0; for (unknow.server.maven.jaxws.binding.Parameter p : o.params) { servlet.addFieldWithInitializer(types.getClass(QName.class), "P$" + w + "$" + (bi + h), - new ObjectCreationExpr(null, types.getClass(QName.class), Utils.list(Utils.text(p.name.getNamespaceURI()), Utils.text(p.name.getLocalPart()))), - Utils.PSF); + new ObjectCreationExpr(null, types.getClass(QName.class), CodeGenUtils.list(CodeGenUtils.text(p.name.getNamespaceURI()), CodeGenUtils.text(p.name.getLocalPart()))), + CodeGenUtils.PSF); clazz.add(p.type); Expression v; if (p.header) - v = new MethodCallExpr(new NameExpr("e"), "getHeader", Utils.list(new IntegerLiteralExpr(Integer.toString(h++)))); + v = new MethodCallExpr(new NameExpr("e"), "getHeader", CodeGenUtils.list(new IntegerLiteralExpr(Integer.toString(h++)))); else if (o.wrapped) - v = new MethodCallExpr(new NameExpr("o"), "get", Utils.list(new IntegerLiteralExpr(Integer.toString(bi++)))); + v = new MethodCallExpr(new NameExpr("o"), "get", CodeGenUtils.list(new IntegerLiteralExpr(Integer.toString(bi++)))); else - v = new MethodCallExpr(new NameExpr("e"), "getBody", Utils.list(new IntegerLiteralExpr(Integer.toString(bi++)))); + v = new MethodCallExpr(new NameExpr("e"), "getBody", CodeGenUtils.list(new IntegerLiteralExpr(Integer.toString(bi++)))); param.add(new CastExpr(types.get(p.type), v)); } @@ -141,68 +141,68 @@ else if (o.wrapped) clazz.add(o.result.type); b.addStatement( new AssignExpr(new VariableDeclarationExpr(types.getClass(o.result.type), "ro"), new MethodCallExpr(new NameExpr("WS"), o.m, param), Operator.ASSIGN)); - e = new ObjectCreationExpr(null, types.getClass(JAXBElement.class, TypeCache.EMPTY), - Utils.list( + e = new ObjectCreationExpr(null, types.getClass(JAXBElement.class, TypeFactory.EMPTY), + CodeGenUtils.list( new ObjectCreationExpr(null, types.getClass(QName.class), - Utils.list(Utils.text(o.result.name.getNamespaceURI()), Utils.text(o.result.name.getLocalPart()))), + CodeGenUtils.list(CodeGenUtils.text(o.result.name.getNamespaceURI()), CodeGenUtils.text(o.result.name.getLocalPart()))), new ClassExpr(types.get(o.result.type)), new NameExpr("ro"))); } - NodeList header = Utils.list(); - NodeList body = Utils.list(); + NodeList header = CodeGenUtils.list(); + NodeList body = CodeGenUtils.list(); if (o.wrapped) { // TODO out param Expression c = new ClassExpr(types.get(e == null ? Object.class : JAXBElement.class)); if (e == null) e = new NullLiteralExpr(); - e = new ObjectCreationExpr(null, types.getClass(JAXBElement.class, TypeCache.EMPTY), Utils.list(new ObjectCreationExpr(null, types.getClass(QName.class), - Utils.list(Utils.text(o.name.getNamespaceURI()), Utils.text(o.name.getLocalPart() + "Response"))), c, e)); + e = new ObjectCreationExpr(null, types.getClass(JAXBElement.class, TypeFactory.EMPTY), CodeGenUtils.list(new ObjectCreationExpr(null, types.getClass(QName.class), + CodeGenUtils.list(CodeGenUtils.text(o.name.getNamespaceURI()), CodeGenUtils.text(o.name.getLocalPart() + "Response"))), c, e)); } else { // TODO out param } if (e != null) (o.result != null && o.result.header ? header : body).add(e); - b.addStatement(new ReturnStmt(new ObjectCreationExpr(null, types.getClass(Envelope.class), Utils.list( + b.addStatement(new ReturnStmt(new ObjectCreationExpr(null, types.getClass(Envelope.class), CodeGenUtils.list( new MethodCallExpr(new TypeExpr(types.get(Arrays.class)), "asList", header), new MethodCallExpr(new TypeExpr(types.get(Arrays.class)), "asList", body))))); String n = "CALL$" + entries.size(); - entries.add(new SwitchEntry().setLabels(Utils.list(new StringLiteralExpr(o.sig()))).addStatement(new ReturnStmt(new NameExpr(n)))); - servlet.addFieldWithInitializer(types.get(WSMethod.class), n, new LambdaExpr(Utils.list(new Parameter(new UnknownType(), "e")), b), Utils.PSF); + entries.add(new SwitchEntry().setLabels(CodeGenUtils.list(new StringLiteralExpr(o.sig()))).addStatement(new ReturnStmt(new NameExpr(n)))); + servlet.addFieldWithInitializer(types.get(WSMethod.class), n, new LambdaExpr(CodeGenUtils.list(new Parameter(new UnknownType(), "e")), b), CodeGenUtils.PSF); w++; } - servlet.addConstructor(Modifier.Keyword.PUBLIC).getBody().addStatement(new MethodCallExpr(null, "super", Utils.list(new StringLiteralExpr(wsdl)))); + servlet.addConstructor(Modifier.Keyword.PUBLIC).getBody().addStatement(new MethodCallExpr(null, "super", CodeGenUtils.list(new StringLiteralExpr(wsdl)))); NodeList l = clazz.stream().map(v -> new ClassExpr(types.get(v))).collect(Collectors.toCollection(() -> new NodeList<>())); - servlet.addMethod("getCtx", Utils.PROTECT).addMarkerAnnotation(Override.class).setType(types.get(JAXBContext.class)).getBody().get().addStatement(new TryStmt( - new BlockStmt().addStatement(new ReturnStmt(new MethodCallExpr(new ObjectCreationExpr(null, types.getClass(factory), Utils.list()), "createContext", - Utils.list(Utils.array(types.get(Class.class), l), new NullLiteralExpr())))), - Utils.list(new CatchClause(new Parameter(types.get(JAXBException.class), "e"), - new BlockStmt().addStatement(new ThrowStmt(new ObjectCreationExpr(null, types.getClass(RuntimeException.class), Utils.list(new NameExpr("e"))))))), + servlet.addMethod("getCtx", CodeGenUtils.PROTECT).addMarkerAnnotation(Override.class).setType(types.get(JAXBContext.class)).getBody().get().addStatement(new TryStmt( + new BlockStmt().addStatement(new ReturnStmt(new MethodCallExpr(new ObjectCreationExpr(null, types.getClass(factory), CodeGenUtils.list()), "createContext", + CodeGenUtils.list(CodeGenUtils.array(types.get(Class.class), l), new NullLiteralExpr())))), + CodeGenUtils.list(new CatchClause(new Parameter(types.get(JAXBException.class), "e"), + new BlockStmt().addStatement(new ThrowStmt(new ObjectCreationExpr(null, types.getClass(RuntimeException.class), CodeGenUtils.list(new NameExpr("e"))))))), null)); entries.add(new SwitchEntry().addStatement(new ReturnStmt(new NullLiteralExpr()))); - servlet.addMethod("getCall", Utils.PROTECT).addMarkerAnnotation(Override.class).setType(types.get(WSMethod.class)) + servlet.addMethod("getCall", CodeGenUtils.PROTECT).addMarkerAnnotation(Override.class).setType(types.get(WSMethod.class)) .addParameter(new Parameter(types.get(String.class), "sig")).getBody().get().addStatement(new SwitchStmt(new NameExpr("sig"), entries)); Statement s = new IfStmt(wrapped, new ReturnStmt(new MethodCallExpr(null, "read", - Utils.list(new NameExpr("r"), new NameExpr("u"), - new ObjectCreationExpr(null, types.getClass(OperationWrapper.class), Utils.list(new NameExpr("n")))))), - new ThrowStmt(new ObjectCreationExpr(null, types.getClass(IOException.class), Utils.list(Utils.text("Invalid request"))))); + CodeGenUtils.list(new NameExpr("r"), new NameExpr("u"), + new ObjectCreationExpr(null, types.getClass(OperationWrapper.class), CodeGenUtils.list(new NameExpr("n")))))), + new ThrowStmt(new ObjectCreationExpr(null, types.getClass(IOException.class), CodeGenUtils.list(CodeGenUtils.text("Invalid request"))))); w = 0; for (Operation o : service.operations) { int i = 0; for (unknow.server.maven.jaxws.binding.Parameter p : o.params) - s = new IfStmt(new MethodCallExpr(new NameExpr("P$" + w + "$" + i++), "equals", Utils.list(new NameExpr("n"))), new ReturnStmt( - new MethodCallExpr(new MethodCallExpr(new NameExpr("u"), "unmarshal", Utils.list(new NameExpr("r"), new ClassExpr(types.get(p.type)))), "getValue")), + s = new IfStmt(new MethodCallExpr(new NameExpr("P$" + w + "$" + i++), "equals", CodeGenUtils.list(new NameExpr("n"))), new ReturnStmt( + new MethodCallExpr(new MethodCallExpr(new NameExpr("u"), "unmarshal", CodeGenUtils.list(new NameExpr("r"), new ClassExpr(types.get(p.type)))), "getValue")), s); w++; } - servlet.addMethod("read", Utils.PROTECT).addMarkerAnnotation(Override.class).setType(types.get(Object.class)) + servlet.addMethod("read", CodeGenUtils.PROTECT).addMarkerAnnotation(Override.class).setType(types.get(Object.class)) .addParameter(new Parameter(types.get(XMLStreamReader.class), "r")).addParameter(new Parameter(types.get(Unmarshaller.class), "u")) .addThrownException(types.getClass(XMLStreamException.class)).addThrownException(types.getClass(JAXBException.class)) .addThrownException(types.getClass(IOException.class)).getBody().get() - .addStatement(Utils.assign(types.get(QName.class), "n", new MethodCallExpr(new NameExpr("r"), "getName"))).addStatement(s); + .addStatement(CodeGenUtils.assign(types.get(QName.class), "n", new MethodCallExpr(new NameExpr("r"), "getName"))).addStatement(s); } } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/jsp/JspGeneratorMojo.java b/unknow-server-maven/src/main/java/unknow/server/maven/jsp/JspGeneratorMojo.java index a2e62d64..05f0731c 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/jsp/JspGeneratorMojo.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/jsp/JspGeneratorMojo.java @@ -21,8 +21,8 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import unknow.server.maven.TypeCache; -import unknow.server.maven.Utils; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.TypeFactory; import unknow.server.servlet.impl.ServletJsp; /** @@ -49,14 +49,14 @@ public class JspGeneratorMojo { private final StringBuilder print = new StringBuilder(); private final StringBuilder sb = new StringBuilder(); - private TypeCache types; + private TypeFactory types; private BlockStmt b; public void generate(Path file) throws IOException { CompilationUnit cu = new CompilationUnit("jsp"); ClassOrInterfaceDeclaration cl = cu.addClass("Impl", Modifier.Keyword.PUBLIC, Modifier.Keyword.FINAL).addExtendedType(ServletJsp.class); - types = new TypeCache(cu, Collections.emptyMap()); + types = new TypeFactory(cu, Collections.emptyMap()); b = cl.addMethod("jspService", Modifier.Keyword.PROTECTED, Modifier.Keyword.FINAL).addParameter(types.getClass(HttpServletRequest.class), "request") .addParameter(types.getClass(HttpServletResponse.class), "response").addMarkerAnnotation(Override.class).createBody(); @@ -84,7 +84,7 @@ private void parse(Reader r) throws IOException { private void print() { if (print.length() == 0) return; - b.addStatement(new MethodCallExpr(OUT, "print", Utils.list(Utils.text(print.toString())))); + b.addStatement(new MethodCallExpr(OUT, "print", CodeGenUtils.list(CodeGenUtils.text(print.toString())))); print.setLength(0); } @@ -187,7 +187,7 @@ private void processEcho(Reader r) throws IOException { } sb.append((char) c); } - b.addStatement(new MethodCallExpr(OUT, "print", Utils.list(StaticJavaParser.parseExpression(sb.toString())))); + b.addStatement(new MethodCallExpr(OUT, "print", CodeGenUtils.list(StaticJavaParser.parseExpression(sb.toString())))); sb.setLength(0); } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/Builder.java b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/Builder.java index 3c383b32..5dda0e04 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/Builder.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/Builder.java @@ -5,8 +5,8 @@ import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; +import unknow.maven.codegen.TypeFactory; import unknow.model.api.ModelLoader; -import unknow.server.maven.TypeCache; import unknow.server.maven.servlet.descriptor.Descriptor; /** @@ -22,7 +22,7 @@ public static interface BuilderContext { Descriptor descriptor(); - TypeCache type(); + TypeFactory type(); ModelLoader loader(); diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/ServletGenMojo.java b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/ServletGenMojo.java index eba5bc9b..627aff64 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/ServletGenMojo.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/ServletGenMojo.java @@ -27,14 +27,13 @@ import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.Modifier; -import com.github.javaparser.ast.Node; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import jakarta.servlet.DispatcherType; import jakarta.servlet.ServletContainerInitializer; +import unknow.maven.codegen.TypeFactory; import unknow.model.api.ModelLoader; import unknow.server.maven.AbstractGeneratorMojo; -import unknow.server.maven.TypeCache; import unknow.server.maven.servlet.Builder.BuilderContext; import unknow.server.maven.servlet.builder.CreateContext; import unknow.server.maven.servlet.builder.CreateEventManager; @@ -67,14 +66,17 @@ public class ServletGenMojo extends AbstractGeneratorMojo implements BuilderCont private static final Path WEBXML = Paths.get("WEB-INF", "web.xml"); private static final Path INITIALIZER = Paths.get("META-INF", "services", ServletContainerInitializer.class.getName()); - private final CompilationUnit cu = new CompilationUnit(); + private CompilationUnit cu; - private TypeCache types; + private TypeFactory types; private ClassOrInterfaceDeclaration cl; private final Descriptor descriptor = new Descriptor(); + @Parameter(name = "graalvm", defaultValue = "true") + protected boolean graalvm; + @Parameter(defaultValue = "Server") private String className; @@ -90,18 +92,15 @@ public class ServletGenMojo extends AbstractGeneratorMojo implements BuilderCont @Parameter(defaultValue = "WEB-INF,META-INF,generated") private List ignoredResources; - @Override - protected String id() { - return "servlet-generator"; - } - @Override public void execute() throws MojoExecutionException, MojoFailureException { - init(); + init(session, mojo, repository, codegen); + + cu = newCu(); - cu.setData(Node.SYMBOL_RESOLVER_KEY, javaSymbolSolver); if (addAccessLog) - descriptor.filters.add(new SD(descriptor.filters.size()).addPattern("/*").clazz(AccessLogFilter.class.getName()).name("acessLog").addDispatcher(DispatcherType.REQUEST)); + descriptor.filters + .add(new SD(descriptor.filters.size()).addPattern("/*").clazz(AccessLogFilter.class.getName()).name("acessLog").addDispatcher(DispatcherType.REQUEST)); try { classLoader.loadClass("io.prometheus.client.Counter"); descriptor.filters @@ -109,7 +108,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { } catch (@SuppressWarnings("unused") Throwable t) { // ok } - process(descriptor); + processSrc(descriptor); processResources(this::process); if (graalvm && !descriptor.resources.isEmpty()) generateGraalvmResources(); @@ -117,16 +116,14 @@ public void execute() throws MojoExecutionException, MojoFailureException { logger.info("descriptor:\n{}", descriptor); // generate class - types = new TypeCache(cu, existingClass); + types = new TypeFactory(cu, existingClass); - if (packageName != null && !packageName.isEmpty()) - cu.setPackageDeclaration(packageName); cl = cu.addClass(className, Modifier.Keyword.FINAL).addExtendedType(AbstractHttpServer.class); for (Builder b : BUILDER) b.add(this); - out.save(cu); + writer.write(cu); } private void process(Path full, Path file) { @@ -176,7 +173,7 @@ private void process(Path full, Path file) { */ private void generateGraalvmResources() throws MojoFailureException { try { - Path path = Paths.get(resources + "/META-INF/native-image/" + id() + "/resource-config.json"); + Path path = Paths.get(codegen.resources + "/META-INF/native-image/" + uniquePath + "/resource-config.json"); Files.createDirectories(path.getParent()); try (BufferedWriter w = Files.newBufferedWriter(path)) { w.write("{\"resources\":{\"includes\":["); @@ -207,7 +204,7 @@ public Descriptor descriptor() { } @Override - public TypeCache type() { + public TypeFactory type() { return types; } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateContext.java b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateContext.java index 3cc93c0e..a4efe6d6 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateContext.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateContext.java @@ -8,7 +8,8 @@ import com.github.javaparser.ast.expr.ObjectCreationExpr; import com.github.javaparser.ast.stmt.ReturnStmt; -import unknow.server.maven.TypeCache; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.TypeFactory; import unknow.server.maven.Utils; import unknow.server.maven.servlet.Builder; import unknow.server.maven.servlet.Names; @@ -21,13 +22,13 @@ public class CreateContext extends Builder { @Override public void add(BuilderContext ctx) { - TypeCache t = ctx.type(); + TypeFactory t = ctx.type(); ctx.self().addMethod("createContext", Modifier.Keyword.PROTECTED, Modifier.Keyword.FINAL).setType(t.getClass(ServletContextImpl.class)) .addParameter(String.class, "vhost").addMarkerAnnotation(Override.class).createBody() .addStatement(new ReturnStmt(new ObjectCreationExpr(null, t.getClass(ServletContextImpl.class), - Utils.list(Utils.text(ctx.descriptor().name), new NameExpr("vhost"), Utils.mapString(ctx.descriptor().param, t), Names.EVENTS, - new ObjectCreationExpr(null, t.getClass(ctx.sessionFactory()), Utils.list()), Utils.mapString(ctx.descriptor().localeMapping, t), + CodeGenUtils.list(CodeGenUtils.text(ctx.descriptor().name), new NameExpr("vhost"), Utils.mapString(ctx.descriptor().param, t), Names.EVENTS, + new ObjectCreationExpr(null, t.getClass(ctx.sessionFactory()), CodeGenUtils.list()), Utils.mapString(ctx.descriptor().localeMapping, t), Utils.mapString(ctx.descriptor().mimeTypes, t))))); } } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateEventManager.java b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateEventManager.java index e43db7dd..1761ea73 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateEventManager.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateEventManager.java @@ -19,8 +19,8 @@ import com.github.javaparser.ast.stmt.BlockStmt; import com.github.javaparser.ast.stmt.ReturnStmt; -import unknow.server.maven.TypeCache; -import unknow.server.maven.Utils; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.TypeFactory; import unknow.server.maven.servlet.Builder; import unknow.server.maven.servlet.descriptor.Descriptor; import unknow.server.maven.servlet.descriptor.LD; @@ -32,7 +32,7 @@ public class CreateEventManager extends Builder { @Override public void add(BuilderContext ctx) { - TypeCache t = ctx.type(); + TypeFactory t = ctx.type(); BlockStmt init = ctx.self().addMethod("createEventManager", Modifier.Keyword.PROTECTED, Modifier.Keyword.FINAL).setType(t.getClass(EventManager.class)) .addMarkerAnnotation(Override.class).createBody(); Map, NodeList> map = new HashMap<>(); @@ -41,7 +41,7 @@ public void add(BuilderContext ctx) { for (LD l : ctx.descriptor().listeners) { String n = "l" + i++; NameExpr name = new NameExpr(n); - init.addStatement(Utils.assign(t.getClass(l.clazz), n, new ObjectCreationExpr(null, t.getClass(l.clazz), Utils.list()))); + init.addStatement(CodeGenUtils.assign(t.getClass(l.clazz), n, new ObjectCreationExpr(null, t.getClass(l.clazz), CodeGenUtils.list()))); for (Class cl : l.listener) { NodeList ll = map.get(cl); @@ -60,7 +60,7 @@ public void add(BuilderContext ctx) { else a = new IntegerLiteralExpr("0"); - list.add(new ObjectCreationExpr(null, t.getClass(ArrayList.class, TypeCache.EMPTY), Utils.list(a))); + list.add(new ObjectCreationExpr(null, t.getClass(ArrayList.class, TypeFactory.EMPTY), CodeGenUtils.list(a))); } init.addStatement(new ReturnStmt(new ObjectCreationExpr(null, t.getClass(EventManager.class), list))); } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateFilters.java b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateFilters.java index a7e782fc..bdddfca6 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateFilters.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateFilters.java @@ -15,7 +15,8 @@ import com.github.javaparser.ast.type.ClassOrInterfaceType; import jakarta.servlet.DispatcherType; -import unknow.server.maven.TypeCache; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.TypeFactory; import unknow.server.maven.Utils; import unknow.server.maven.servlet.Builder; import unknow.server.maven.servlet.Names; @@ -31,7 +32,7 @@ public class CreateFilters extends Builder { @Override public void add(BuilderContext ctx) { Descriptor descriptor = ctx.descriptor(); - TypeCache types = ctx.type(); + TypeFactory types = ctx.type(); ClassOrInterfaceType t = types.getClass(FilterConfigImpl.class); BlockStmt b = ctx.self().addMethod("createFilters", Modifier.Keyword.PROTECTED, Modifier.Keyword.FINAL).setType(types.array(FilterConfigImpl.class)) .addMarkerAnnotation(Override.class).createBody(); @@ -45,14 +46,14 @@ public void add(BuilderContext ctx) { TypeExpr type = new TypeExpr(types.getClass(DispatcherType.class)); for (DispatcherType d : f.dispatcher) list.add(new FieldAccessExpr(type, d.name())); - Expression dispatcher = new ObjectCreationExpr(null, types.getClass(ArraySet.class, TypeCache.EMPTY), - Utils.list(Utils.array(types.getClass(DispatcherType.class), list))); + Expression dispatcher = new ObjectCreationExpr(null, types.getClass(ArraySet.class, TypeFactory.EMPTY), + CodeGenUtils.list(CodeGenUtils.array(types.getClass(DispatcherType.class), list))); - b.addStatement( - Utils.assign(t, n, new ObjectCreationExpr(null, t, Utils.list(Utils.text(f.name), new ObjectCreationExpr(null, types.getClass(f.clazz), Utils.list()), + b.addStatement(CodeGenUtils.assign(t, n, + new ObjectCreationExpr(null, t, CodeGenUtils.list(CodeGenUtils.text(f.name), new ObjectCreationExpr(null, types.getClass(f.clazz), CodeGenUtils.list()), Names.CTX, Utils.mapString(f.param, types), Utils.arraySet(f.servletNames, types), Utils.arraySet(f.pattern, types), dispatcher)))); } - b.addStatement(new ReturnStmt(Utils.array(t, filters))); + b.addStatement(new ReturnStmt(CodeGenUtils.array(t, filters))); } } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateServletManager.java b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateServletManager.java index ff8c21a6..67f24878 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateServletManager.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateServletManager.java @@ -19,8 +19,8 @@ import com.github.javaparser.ast.stmt.ReturnStmt; import com.github.javaparser.ast.type.PrimitiveType; -import unknow.server.maven.TypeCache; -import unknow.server.maven.Utils; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.TypeFactory; import unknow.server.maven.servlet.Builder; import unknow.server.maven.servlet.Names; import unknow.server.maven.servlet.descriptor.Descriptor; @@ -36,13 +36,13 @@ public class CreateServletManager extends Builder { @Override public void add(BuilderContext ctx) { Descriptor descriptor = ctx.descriptor(); - TypeCache types = ctx.type(); + TypeFactory types = ctx.type(); ctx.self().addMethod("createServletManager", Modifier.Keyword.PROTECTED, Modifier.Keyword.FINAL).setType(types.getClass(ServletManager.class)) .addMarkerAnnotation(Override.class).createBody().addStatement(new ReturnStmt( - new ObjectCreationExpr(null, types.getClass(ServletManager.class), Utils.list(errorCode(descriptor, types), errorClass(descriptor, types))))); + new ObjectCreationExpr(null, types.getClass(ServletManager.class), CodeGenUtils.list(errorCode(descriptor, types), errorClass(descriptor, types))))); } - private static ObjectCreationExpr errorCode(Descriptor descriptor, TypeCache t) { + private static ObjectCreationExpr errorCode(Descriptor descriptor, TypeFactory t) { NodeList k = new NodeList<>(); NodeList v = new NodeList<>(); List l = new ArrayList<>(descriptor.errorCode.keySet()); @@ -53,13 +53,13 @@ private static ObjectCreationExpr errorCode(Descriptor descriptor, TypeCache t) if (s == null) continue; k.add(new IntegerLiteralExpr(e.toString())); - v.add(Utils.text(path)); + v.add(CodeGenUtils.text(path)); } - return new ObjectCreationExpr(null, t.getClass(IntArrayMap.class, TypeCache.EMPTY), - Utils.list(Utils.array(PrimitiveType.intType(), k), Utils.array(t.getClass(String.class), v))); + return new ObjectCreationExpr(null, t.getClass(IntArrayMap.class, TypeFactory.EMPTY), + CodeGenUtils.list(CodeGenUtils.array(PrimitiveType.intType(), k), CodeGenUtils.array(t.getClass(String.class), v))); } - private static ObjectCreationExpr errorClass(Descriptor descriptor, TypeCache t) { + private static ObjectCreationExpr errorClass(Descriptor descriptor, TypeFactory t) { NodeList k = new NodeList<>(); NodeList v = new NodeList<>(); List l = new ArrayList<>(descriptor.errorClass.keySet()); @@ -70,11 +70,11 @@ private static ObjectCreationExpr errorClass(Descriptor descriptor, TypeCache t) if (s == null || e.isEmpty()) continue; k.add(new ClassExpr(t.get(e.toString()))); - k.add(Utils.text(path)); + k.add(CodeGenUtils.text(path)); } - LambdaExpr cmp = new LambdaExpr(Utils.list(new Parameter(TypeCache.EMPTY, "a"), new Parameter(TypeCache.EMPTY, "b")), - new MethodCallExpr(new MethodCallExpr(Names.a, "getName"), "compareTo", Utils.list(new MethodCallExpr(Names.b, "getName")))); - return new ObjectCreationExpr(null, t.getClass(ObjectArrayMap.class, TypeCache.EMPTY), - Utils.list(Utils.array(t.getClass(Class.class), k), Utils.array(t.getClass(String.class), v), cmp)); + LambdaExpr cmp = new LambdaExpr(CodeGenUtils.list(new Parameter(TypeFactory.EMPTY, "a"), new Parameter(TypeFactory.EMPTY, "b")), + new MethodCallExpr(new MethodCallExpr(Names.a, "getName"), "compareTo", CodeGenUtils.list(new MethodCallExpr(Names.b, "getName")))); + return new ObjectCreationExpr(null, t.getClass(ObjectArrayMap.class, TypeFactory.EMPTY), + CodeGenUtils.list(CodeGenUtils.array(t.getClass(Class.class), k), CodeGenUtils.array(t.getClass(String.class), v), cmp)); } } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateServlets.java b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateServlets.java index 4219d4c0..600809e8 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateServlets.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/CreateServlets.java @@ -16,7 +16,8 @@ import com.github.javaparser.ast.stmt.ReturnStmt; import com.github.javaparser.ast.type.ClassOrInterfaceType; -import unknow.server.maven.TypeCache; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.TypeFactory; import unknow.server.maven.Utils; import unknow.server.maven.servlet.Builder; import unknow.server.maven.servlet.Names; @@ -32,7 +33,7 @@ public class CreateServlets extends Builder { @Override public void add(BuilderContext ctx) { Descriptor descriptor = ctx.descriptor(); - TypeCache types = ctx.type(); + TypeFactory types = ctx.type(); ClassOrInterfaceType t = types.getClass(ServletConfigImpl.class); BlockStmt b = ctx.self().addMethod("createServlets", Modifier.Keyword.PROTECTED, Modifier.Keyword.FINAL).setType(types.array(ServletConfigImpl.class)) .addMarkerAnnotation(Override.class).createBody(); @@ -47,10 +48,10 @@ public void add(BuilderContext ctx) { NodeList params = new NodeList<>(); if (s.name.startsWith("Resource:")) { Resource r = descriptor.resources.get(s.pattern.get(0)); - params = Utils.list(Utils.text(s.pattern.get(0)), new LongLiteralExpr(r.getLastModified() + "L"), new LongLiteralExpr(r.getSize() + "L")); + params = CodeGenUtils.list(CodeGenUtils.text(s.pattern.get(0)), new LongLiteralExpr(r.getLastModified() + "L"), new LongLiteralExpr(r.getSize() + "L")); } - b.addStatement(Utils.assign(t, n, new ObjectCreationExpr(null, t, Utils.list(Utils.text(s.name), new ObjectCreationExpr(null, types.getClass(s.clazz), params), - Names.CTX, Utils.mapString(s.param, types), Utils.arraySet(s.pattern, types))))); + b.addStatement(CodeGenUtils.assign(t, n, new ObjectCreationExpr(null, t, CodeGenUtils.list(CodeGenUtils.text(s.name), + new ObjectCreationExpr(null, types.getClass(s.clazz), params), Names.CTX, Utils.mapString(s.param, types), Utils.arraySet(s.pattern, types))))); for (String p : s.pattern) { if (saw.contains(p)) System.err.println("duplicate servlet pattern '" + p + "'"); @@ -58,6 +59,6 @@ public void add(BuilderContext ctx) { } } - b.addStatement(new ReturnStmt(Utils.array(t, servlets))); + b.addStatement(new ReturnStmt(CodeGenUtils.array(t, servlets))); } } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/LoadInitializer.java b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/LoadInitializer.java index df383517..eaa6ba9e 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/LoadInitializer.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/LoadInitializer.java @@ -22,7 +22,7 @@ import jakarta.servlet.ServletContainerInitializer; import jakarta.servlet.ServletException; -import unknow.server.maven.Utils; +import unknow.maven.codegen.CodeGenUtils; import unknow.server.maven.servlet.Builder; /** @@ -50,7 +50,7 @@ public void add(BuilderContext ctx) { BlockStmt b = ctx.self().addMethod("loadInitializer", Keyword.PROTECTED, Keyword.FINAL).addThrownException(ctx.type().getClass(ServletException.class)) .addMarkerAnnotation(Override.class).createBody(); for (String s : clazz) - b.addStatement(new MethodCallExpr(new ObjectCreationExpr(null, ctx.type().getClass(s), Utils.list()), "onStartup", - Utils.list(new NullLiteralExpr(), new NameExpr("ctx")))); + b.addStatement(new MethodCallExpr(new ObjectCreationExpr(null, ctx.type().getClass(s), CodeGenUtils.list()), "onStartup", + CodeGenUtils.list(new NullLiteralExpr(), new NameExpr("ctx")))); } } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/Main.java b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/Main.java index ebb8af16..faafc123 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/Main.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/builder/Main.java @@ -8,8 +8,8 @@ import com.github.javaparser.ast.expr.NameExpr; import com.github.javaparser.ast.expr.ObjectCreationExpr; -import unknow.server.maven.TypeCache; -import unknow.server.maven.Utils; +import unknow.maven.codegen.CodeGenUtils; +import unknow.maven.codegen.TypeFactory; import unknow.server.maven.servlet.Builder; /** @@ -19,8 +19,8 @@ public class Main extends Builder { @Override public void add(BuilderContext ctx) { - TypeCache t = ctx.type(); + TypeFactory t = ctx.type(); ctx.self().addMethod("main", Modifier.Keyword.PUBLIC, Modifier.Keyword.STATIC).addParameter(String[].class, "arg").addThrownException(t.getClass(Exception.class)) - .createBody().addStatement(new MethodCallExpr(new ObjectCreationExpr(null, t.getClass(ctx.self()), Utils.list()), "process", Utils.list(new NameExpr("arg")))); + .createBody().addStatement(new MethodCallExpr(new ObjectCreationExpr(null, t.getClass(ctx.self()), CodeGenUtils.list()), "process", CodeGenUtils.list(new NameExpr("arg")))); } } diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/descriptor/Descriptor.java b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/descriptor/Descriptor.java index 960e6dff..4e4c4071 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/servlet/descriptor/Descriptor.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/servlet/descriptor/Descriptor.java @@ -23,9 +23,9 @@ import jakarta.servlet.http.HttpSessionAttributeListener; import jakarta.servlet.http.HttpSessionIdListener; import jakarta.servlet.http.HttpSessionListener; +import unknow.maven.codegen.AbstractCodeGenMojo.TypeConsumer; import unknow.model.api.AnnotationModel; import unknow.model.api.TypeModel; -import unknow.server.maven.AbstractGeneratorMojo.TypeConsumer; import unknow.server.servlet.impl.ServletCookieConfigImpl; import unknow.server.servlet.utils.Resource; diff --git a/unknow-server-test/unknow-server-test-jar/pom.xml b/unknow-server-test/unknow-server-test-jar/pom.xml index bcbd64ed..0636f05b 100644 --- a/unknow-server-test/unknow-server-test-jar/pom.xml +++ b/unknow-server-test/unknow-server-test-jar/pom.xml @@ -44,11 +44,13 @@ generate-sources + + unknow.server.http.test.generated + + ${project.groupId}:unknow-server-test-pojo:${project.version} + + /rest - unknow.server.http.test.generated - - ${project.groupId}:unknow-server-test-pojo:${project.version} - @@ -60,12 +62,15 @@ generate-sources + + unknow.server.http.test.generated + + ${project.groupId}:unknow-server-test-pojo:${project.version} + + true - unknow.server.http.test.generated + - - ${project.groupId}:unknow-server-test-pojo:${project.version} - diff --git a/unknow-server-test/unknow-server-test-tomcat/pom.xml b/unknow-server-test/unknow-server-test-tomcat/pom.xml index 49adce99..f09a92b7 100644 --- a/unknow-server-test/unknow-server-test-tomcat/pom.xml +++ b/unknow-server-test/unknow-server-test-tomcat/pom.xml @@ -45,11 +45,13 @@ generate-sources + + unknow.server.http.test.generated + + ${project.groupId}:unknow-server-test-pojo:${project.version} + + /rest - unknow.server.http.test.generated - - ${project.groupId}:unknow-server-test-pojo:${project.version} - @@ -60,12 +62,14 @@ generate-sources + + unknow.server.http.test.generated + + ${project.groupId}:unknow-server-test-pojo:${project.version} + + false - unknow.server.http.test.generated - - ${project.groupId}:unknow-server-test-pojo:${project.version} -