diff --git a/pom.xml b/pom.xml index 2375f26b..e5c37efe 100644 --- a/pom.xml +++ b/pom.xml @@ -386,7 +386,7 @@ io.github.unknow0.model unknow-model-bom - 1.0.1 + 1.1.0 pom import diff --git a/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/JaxrsContext.java b/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/JaxrsContext.java index d4f1ad89..eddc1e4a 100644 --- a/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/JaxrsContext.java +++ b/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/JaxrsContext.java @@ -116,19 +116,23 @@ public static ParamConverter converter(Class clazz, Type type, Annotat } @SuppressWarnings("unchecked") - public static void sendError(JaxrsReq r, Throwable t, HttpServletResponse res) throws IOException { - Class c = t.getClass(); - do { - ExceptionMapper m = exceptions.get(c); - if (m != null) { - try (Response response = m.toResponse(t)) { - JaxrsEntityWriter.RESPONSE.write(r, response, res); + public static void sendError(JaxrsReq r, Throwable t, HttpServletResponse res) { + try { + Class c = t.getClass(); + do { + ExceptionMapper m = exceptions.get(c); + if (m != null) { + try (Response response = m.toResponse(t)) { + JaxrsEntityWriter.RESPONSE.write(r, response, res); + } + return; } - return; - } - } while ((c = c.getSuperclass()) != Object.class); - logger.error("No exception mapping found", t); - res.sendError(500); + } while ((c = c.getSuperclass()) != Object.class); + logger.error("No exception mapping found", t); + res.sendError(500); + } catch (IOException | IllegalStateException e) { + logger.warn("Failed to send error", e); + } } @SuppressWarnings("unchecked") diff --git a/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/JaxrsEntityWriter.java b/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/JaxrsEntityWriter.java index 1751e9fb..ac117a87 100644 --- a/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/JaxrsEntityWriter.java +++ b/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/JaxrsEntityWriter.java @@ -99,6 +99,8 @@ public void write(JaxrsReq r, Response e, HttpServletResponse res) throws WebApp MediaType mediaType = e.getMediaType(); if (mediaType == null) mediaType = r.getAccept(); + if (mediaType == null) + mediaType = MediaType.TEXT_PLAIN_TYPE; res.setContentType(mediaType.toString()); Class clazz = o.getClass(); diff --git a/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/JaxrsReq.java b/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/JaxrsReq.java index a9c63d68..2917d9e0 100644 --- a/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/JaxrsReq.java +++ b/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/JaxrsReq.java @@ -72,10 +72,9 @@ public MediaType getContentType() { } public MediaType getAccepted(MTPredicate allowed, MediaType def) { - accept = def; String a = r.getHeader("accept"); if (a == null) - return accept; + return accept = def; int i; int l = 0; double lq = -1; diff --git a/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/MTPredicate.java b/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/MTPredicate.java index c8dbbc27..4e63af16 100644 --- a/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/MTPredicate.java +++ b/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/MTPredicate.java @@ -11,7 +11,66 @@ public interface MTPredicate { MediaType getMatching(MediaType t); - public static MTPredicate ANY = t -> t; + boolean isCompatible(MediaType t); + + public static MTPredicate ANY = new MTPredicate() { + + @Override + public MediaType getMatching(MediaType t) { + return t; + } + + @Override + public boolean isCompatible(MediaType t) { + return true; + } + }; + public static MTPredicate NONE = new MTPredicate() { + + @Override + public MediaType getMatching(MediaType t) { + return null; + } + + @Override + public boolean isCompatible(MediaType t) { + return false; + } + }; + + public static class Single implements MTPredicate { + private final MediaType mt; + + public Single(MediaType mt) { + this.mt = mt; + } + + @Override + public MediaType getMatching(MediaType t) { + String charset = t.getParameters().get(MediaType.CHARSET_PARAMETER); + if (t.isWildcardType()) { + if (t.isWildcardSubtype() || t.getSubtype().equals(mt.getSubtype())) { + if (charset == null) + return mt; + return new MediaType(mt.getType(), mt.getSubtype(), charset); + } + } else if (t.getType().equals(mt.getType())) { + if (t.isWildcardSubtype()) { + if (charset == null) + return mt; + return new MediaType(mt.getType(), mt.getSubtype(), charset); + } + if (t.getSubtype().equals(mt.getSubtype())) + return t; + } + return null; + } + + @Override + public boolean isCompatible(MediaType t) { + return t != null && t.isCompatible(mt); + } + } public static class OneOf implements MTPredicate { private final MediaType[] mts; @@ -43,5 +102,16 @@ public MediaType getMatching(MediaType t) { } return null; } + + @Override + public boolean isCompatible(MediaType t) { + if (t == null) + return false; + for (int i = 0; i < mts.length; i++) { + if (t.isCompatible(mts[i])) + return true; + } + return false; + } } } diff --git a/unknow-server-jaxrs/src/test/java/unknow/server/http/jaxrs/JaxrsReqTest.java b/unknow-server-jaxrs/src/test/java/unknow/server/http/jaxrs/JaxrsReqTest.java index 52871924..933302c7 100644 --- a/unknow-server-jaxrs/src/test/java/unknow/server/http/jaxrs/JaxrsReqTest.java +++ b/unknow-server-jaxrs/src/test/java/unknow/server/http/jaxrs/JaxrsReqTest.java @@ -54,7 +54,7 @@ void matrix(String expected, String path, String def) { public static final Stream accept() { //@formatter:off return Stream.of( - Arguments.of(MediaType.WILDCARD_TYPE, "*/*", (MTPredicate) m -> null), + Arguments.of(null, "*/*", MTPredicate.NONE), Arguments.of(MediaType.WILDCARD_TYPE, "*/*", MTPredicate.ANY), Arguments.of(MediaType.TEXT_XML_TYPE, "text/plain,text/xml", new MTPredicate.OneOf(MediaType.TEXT_XML_TYPE)), Arguments.of(MediaType.WILDCARD_TYPE, null, new MTPredicate.OneOf(MediaType.TEXT_XML_TYPE)), 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 a45ef6f1..09884ba1 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,7 +22,6 @@ 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; @@ -75,9 +74,6 @@ 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()); @@ -179,7 +175,7 @@ private void writeXmlLoader() throws MojoExecutionException { } private void generateGraalVmResources() throws MojoFailureException { - if (!graalvm) + if (!codegen.graalvm) return; try { 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 1c47e8d3..658b4659 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 @@ -11,6 +11,7 @@ import java.util.Collection; import java.util.Comparator; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -21,6 +22,8 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; +import org.apache.maven.plugin.MojoFailureException; + import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.NodeList; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; @@ -128,8 +131,7 @@ public JaxRsServletBuilder(CompilationUnit cu, Map existingClass this.mappings = mappings; types = new TypeFactory(cu, existingClass); - cl = cu.addClass("Jaxrs" + path.replace('/', '_').replace("*", ""), CodeGenUtils.PUBLIC).addSingleMemberAnnotation(WebServlet.class, CodeGenUtils.text(path)) - .addExtendedType(HttpServlet.class); + cl = cu.addClass(toClass(path), CodeGenUtils.PUBLIC).addSingleMemberAnnotation(WebServlet.class, CodeGenUtils.text(path)).addExtendedType(HttpServlet.class); cl.addFieldWithInitializer(long.class, "serialVersionUID", new LongLiteralExpr("1L"), CodeGenUtils.PSF); builder = path.endsWith("*") ? new PatternService(path.length() - 1) : new SimpleService(); @@ -144,7 +146,22 @@ public JaxRsServletBuilder(CompilationUnit cu, Map existingClass } } - public CompilationUnit build() { + private static String toClass(String path) { + StringBuilder sb = new StringBuilder("Jaxrs"); + String[] split = path.split("[^a-zA-Z0-9_$*]+"); + for (int i = 0; i < split.length; i++) { + String s = split[i]; + if (s.isEmpty()) + continue; + if ("*".equals(s)) + sb.append("Wildcard"); + else + sb.append(Character.toUpperCase(s.charAt(0))).append(s.substring(1).toLowerCase()); + } + return sb.append('_').append(Integer.toString(path.hashCode(), 36)).toString(); + } + + public CompilationUnit build() throws MojoFailureException { buildInializer(); builder.build(); @@ -154,6 +171,10 @@ public CompilationUnit build() { return cu; } + private static Expression sendError(String res, int code) { + return new MethodCallExpr(new NameExpr(res), "sendError", CodeGenUtils.list(new IntegerLiteralExpr(Integer.toString(code)))); + } + /** * @param mappings */ @@ -296,53 +317,70 @@ private void processConverter(JaxrsParam p, String n, int i, BlockStmt b) { /** * @param method * @param mapping + * @throws MojoFailureException */ - private void buildMethod(String name, List list) { - BlockStmt b = new BlockStmt(); - 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, - 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", - CodeGenUtils.list(new NameExpr("req"), new NameExpr("e"), new NameExpr("res")))))), - null)); - - Map> consume = new LinkedHashMap<>(); - for (JaxrsMapping mapping : list) { - for (int i = 0; i < mapping.consume.length; i++) { - String c = mapping.consume[i]; - Map map = consume.get(c); - if (map == null) - consume.put(c, map = new LinkedHashMap<>()); - - for (int j = 0; j < mapping.produce.length; j++) { - String p = mapping.produce[j]; - JaxrsMapping m = map.get(p); - if (map.containsKey(p)) - throw new RuntimeException("Duplicate mapping on " + m.m + " and " + mapping.m); - map.put(p, mapping); - } + private void buildMethod(String name, List list) throws MojoFailureException { + + BlockStmt b = cl.addMethod(name, CodeGenUtils.PRIVATE).addParameter(types.getClass(JaxrsReq.class), "req") + .addParameter(types.getClass(HttpServletResponse.class), "res").addThrownException(Exception.class).createBody(); + + Map, Collection> consume = buildConsumeMap(list); + Iterator, Collection>> it = consume.entrySet().iterator(); + List def = null; + while (it.hasNext()) { + Entry, Collection> e = it.next(); + if (e.getValue().contains("*/*")) { + it.remove(); + def = e.getKey(); + break; } } - - Map def = consume.remove("*/*"); - if (consume.isEmpty()) + if (consume.isEmpty()) { buildProduces(b, def); - else { - 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), CodeGenUtils.list())) - : buildProduces(new BlockStmt(), def); - for (String s : k) - stmt = new IfStmt(new MethodCallExpr(new NameExpr("contentType"), "isCompatible", CodeGenUtils.list(mt.type(s))), - buildProduces(new BlockStmt(), consume.get(s)), stmt); - b.addStatement(stmt); + return; + } + b.addStatement(CodeGenUtils.assign(types.getClass(MediaType.class), "contentType", new MethodCallExpr(new NameExpr("req"), "getContentType"))); + + Statement stmt = new ThrowStmt(new ObjectCreationExpr(null, types.getClass(NotSupportedException.class), CodeGenUtils.list())); + if (def != null) + stmt = buildProduces(new BlockStmt(), def); + for (Entry, Collection> e : consume.entrySet()) { + List key = e.getKey(); + Collection value = e.getValue(); + stmt = new IfStmt(new MethodCallExpr(mt.predicate(value), "isCompatible", CodeGenUtils.list(new NameExpr("contentType"))), buildProduces(new BlockStmt(), key), + stmt); + } + b.addStatement(stmt); + } + + private static Map, Collection> buildConsumeMap(List list) { + Map> map = new LinkedHashMap<>(); + + for (JaxrsMapping m : list) { + for (String c : m.consume) + map.computeIfAbsent(c, k -> new ArrayList<>()).add(m); } + + Map, Collection> group = new HashMap<>(); + for (Entry> e : map.entrySet()) { + String c = e.getKey(); + List l = e.getValue(); + l.sort((a, b) -> a.hashCode() - b.hashCode()); // only need to be stable for this run + group.computeIfAbsent(l, k -> new ArrayList<>()).add(c); + } + return group; } - private Statement buildProduces(BlockStmt b, Map produce) { + private Statement buildProduces(BlockStmt b, Collection mappings) throws MojoFailureException { + + Map produce = new HashMap<>(); + for (JaxrsMapping m : mappings) { + for (String p : m.produce) { + JaxrsMapping other = produce.put(p, m); + if (other != null) + throw new MojoFailureException("Duplicate mapping on " + m.m + " and " + other.m); + } + } MethodCallExpr accept = new MethodCallExpr(new NameExpr("req"), "getAccepted", CodeGenUtils.list(mt.predicate(produce.keySet()), mt.type(produce.keySet().iterator().next()))); @@ -355,15 +393,21 @@ private Statement buildProduces(BlockStmt b, Map produce) if (produce.isEmpty()) return b.addStatement(accept).addStatement(stmt); - 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), CodeGenUtils.list())), null)); + Map> map = new HashMap<>(); + for (Entry e : produce.entrySet()) + map.computeIfAbsent(e.getValue(), k -> new ArrayList<>()).add(e.getKey()); - List k = new ArrayList<>(produce.keySet()); - k.sort(MIME); - for (String s : k) { - 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); + if (map.size() == 1) { + JaxrsMapping m = map.keySet().iterator().next(); + return b.addStatement(new IfStmt(new BinaryExpr(accept, new NullLiteralExpr(), BinaryExpr.Operator.NOT_EQUALS), + new ExpressionStmt(new MethodCallExpr(m.v + "$call", new NameExpr("req"), new NameExpr("res"))), stmt)); + } + + b.addStatement(CodeGenUtils.assign(types.getClass(MediaType.class), "accept", accept)); + + for (Entry> e : map.entrySet()) { + stmt = new IfStmt(new MethodCallExpr(mt.predicate(produce.keySet()), "isCompatible", CodeGenUtils.list(new NameExpr("accept"))), + new ExpressionStmt(new MethodCallExpr(e.getKey().v + "$call", new NameExpr("req"), new NameExpr("res"))), stmt); } b.addStatement(stmt); return b; @@ -384,7 +428,7 @@ private void buildCall(JaxrsMapping mapping, Map services) { 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", CodeGenUtils.list(new IntegerLiteralExpr("204")))); + b.addStatement(call).addStatement(sendError("res", 204)); } else { 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"))); @@ -412,18 +456,18 @@ private interface ServiceBuilder { final NameExpr m = new NameExpr("m"); final Expression[] p = { new NameExpr("r"), new NameExpr("res") }; - void build(); + void build() throws MojoFailureException; } private class SimpleService implements ServiceBuilder { @Override - public void build() { + public void build() throws MojoFailureException { Map> methods = new HashMap<>(); for (JaxrsMapping m : mappings) methods.computeIfAbsent(m.httpMethod, k -> new ArrayList<>()).add(m); - Statement i = new ExpressionStmt(new MethodCallExpr(new NameExpr("res"), "sendError", CodeGenUtils.list(new IntegerLiteralExpr("405")))); + Statement i = new ExpressionStmt(sendError("res", 405)); if (!methods.containsKey("OPTIONS")) 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")) @@ -500,7 +544,7 @@ void addPath(JaxrsMapping mapping, String path) { } @Override - public void build() { + public void build() throws MojoFailureException { List list = new ArrayList<>(pattern.keySet()); list.sort((p1, p2) -> p2.length - p1.length); @@ -535,7 +579,7 @@ public void build() { 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", CodeGenUtils.list(new IntegerLiteralExpr("404"))))); + .setBody(b.addStatement(sendError("res", 404))); i = 0; for (Path l : list) { @@ -554,7 +598,7 @@ public void build() { } private void buildService(String name, Map> methods) { - Statement i = new ExpressionStmt(new MethodCallExpr(new NameExpr("res"), "sendError", CodeGenUtils.list(new IntegerLiteralExpr("405")))); + Statement i = new ExpressionStmt(sendError("res", 405)); if (!methods.containsKey("OPTIONS")) i = new IfStmt(new MethodCallExpr(CodeGenUtils.text("OPTIONS"), "equals", CodeGenUtils.list(m)), new ExpressionStmt(new MethodCallExpr(name + "$options", p)), i); @@ -563,10 +607,18 @@ private void buildService(String name, Map> methods) for (String method : methods.keySet()) i = new IfStmt(new MethodCallExpr(CodeGenUtils.text(method), "equals", CodeGenUtils.list(m)), new ExpressionStmt(new MethodCallExpr(name + "$" + method.toLowerCase(), p)), 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)); + BlockStmt b = new BlockStmt().addStatement(CodeGenUtils.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").createBody() + .addStatement(new TryStmt(b, + 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", + CodeGenUtils.list(new NameExpr("r"), new NameExpr("e"), new NameExpr("res")))))), + null)); } } 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 41b9676f..192138c4 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 @@ -338,8 +338,10 @@ private void process(String defaultMethod, String basePath, String[] consume, St addProtostuffMessage(param.type()); } addProtostuffMessage(m.type()); - - consume = m.annotation(Consumes.class).flatMap(v -> v.value()).filter(v -> v.isSet()).map(v -> v.asArrayLiteral()).orElse(consume); + if (hasBody(params)) + consume = m.annotation(Consumes.class).flatMap(v -> v.value()).filter(v -> v.isSet()).map(v -> v.asArrayLiteral()).orElse(consume); + else + consume = ALL; produce = m.annotation(Produces.class).flatMap(v -> v.value()).filter(v -> v.isSet()).map(v -> v.asArrayLiteral()).orElse(produce); mappings.add(new JaxrsMapping("m$" + mappings.size(), clazz, m, method, params, p, consume, produce)); @@ -352,6 +354,14 @@ private void addProtostuffMessage(TypeModel type) { protostuffMessage.add(type.name()); } + private static boolean hasBody(List> params) { + for (JaxrsParam p : params) { + if (p.inBody()) + return true; + } + return false; + } + public static TypeModel getParamType(TypeModel type) { if (type.isArray()) type = type.asArray().type(); diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/JaxrsMojo.java b/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/JaxrsMojo.java index 660540c0..7c01905f 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/JaxrsMojo.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/JaxrsMojo.java @@ -81,9 +81,6 @@ public class JaxrsMojo extends AbstractGeneratorMojo { private TypeFactory types; private ClassOrInterfaceDeclaration cl; - @Parameter(name = "graalvm", defaultValue = "true") - protected boolean graalvm; - @Parameter(name = "openapi") private OpenApiConfig openapi = new OpenApiConfig(); @@ -268,7 +265,7 @@ private void generateImplicitConverter(ClassOrInterfaceDeclaration clazz, String } private void generateGraalvmResources() throws MojoFailureException { - if (!graalvm) + if (!codegen.graalvm) return; try { diff --git a/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/JaxrsParam.java b/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/JaxrsParam.java index 3f0b559e..2d27a26c 100644 --- a/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/JaxrsParam.java +++ b/unknow-server-maven/src/main/java/unknow/server/maven/jaxrs/JaxrsParam.java @@ -59,6 +59,10 @@ public void collect(Consumer> c) { c.accept(this); } + public boolean inBody() { + return false; + } + public static class JaxrsBeanParam extends JaxrsParam { public final ClassModel clazz; public final List params; @@ -76,6 +80,15 @@ public void collect(Consumer> c) { c.accept(this); } + @Override + public boolean inBody() { + for (JaxrsBeanFieldParam p : params) { + if (p.param.inBody()) + return true; + } + return false; + } + public static class JaxrsBeanFieldParam { public final JaxrsParam param; public final BeanProperty prop; @@ -107,6 +120,11 @@ public static class JaxrsFormParam extends JaxrsParam { @@ -135,5 +153,10 @@ public static class JaxrsBodyParam mediaTypes) { List l = new ArrayList<>(mediaTypes); l.sort(null); StringJoiner s = new StringJoiner(","); - for (String str : l) { - if (!"*/*".equals(str)) - s.add(str); - } + for (String str : l) + s.add(str); k = s.toString(); } @@ -105,13 +103,16 @@ public Expression predicate(Collection mediaTypes) { String name = "p$" + predicates.size(); Expression e = null; - if (!mediaTypes.contains("*/*")) { + if (mediaTypes.contains("*/*")) + e = new FieldAccessExpr(new TypeExpr(types.get(MTPredicate.class)), "ANY"); + else if (mediaTypes.size() == 1) + e = new ObjectCreationExpr(null, types.getClass(MTPredicate.Single.class), CodeGenUtils.list(type(mediaTypes.iterator().next()))); + else { NodeList l = new NodeList<>(); for (String s : mediaTypes) l.add(type(s)); e = new ObjectCreationExpr(null, types.getClass(MTPredicate.OneOf.class), l); - } else - e = new FieldAccessExpr(new TypeExpr(types.get(MTPredicate.class)), "ANY"); + } cl.addFieldWithInitializer(types.getClass(MTPredicate.class), name, e, CodeGenUtils.PUBLIC_STATIC); predicates.put(k, n = new FieldAccessExpr(new TypeExpr(types.getClass(cl)), name)); 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 2d50ebe7..25a2f432 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 @@ -45,8 +45,6 @@ public class JaxwsGeneratorMojo extends AbstractGeneratorMojo { private static final Logger logger = LoggerFactory.getLogger(JaxwsGeneratorMojo.class); private static final XMLOutputFactory f = XMLOutputFactory.newInstance(); - @Parameter(name = "graalvm", defaultValue = "true") - protected boolean graalvm; @Parameter(name = "publishUrl", defaultValue = "http://127.0.0.1:8080") private String publishUrl; @Parameter(name = "basePath", defaultValue = "/") @@ -95,7 +93,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { } }); - if (graalvm && !wsdl.isEmpty()) { + if (codegen.graalvm && !wsdl.isEmpty()) { try { Path path = Paths.get(codegen.resources + "/META-INF/native-image/" + uniquePath + "/resource-config.json"); Files.createDirectories(path.getParent()); 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 627aff64..1f5b6ed6 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 @@ -74,9 +74,6 @@ public class ServletGenMojo extends AbstractGeneratorMojo implements BuilderCont private final Descriptor descriptor = new Descriptor(); - @Parameter(name = "graalvm", defaultValue = "true") - protected boolean graalvm; - @Parameter(defaultValue = "Server") private String className; @@ -110,7 +107,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { processSrc(descriptor); processResources(this::process); - if (graalvm && !descriptor.resources.isEmpty()) + if (codegen.graalvm && !descriptor.resources.isEmpty()) generateGraalvmResources(); logger.info("descriptor:\n{}", descriptor); diff --git a/unknow-server-test/unknow-server-test-jar/pom.xml b/unknow-server-test/unknow-server-test-jar/pom.xml index 0636f05b..074a87e5 100644 --- a/unknow-server-test/unknow-server-test-jar/pom.xml +++ b/unknow-server-test/unknow-server-test-jar/pom.xml @@ -49,6 +49,12 @@ ${project.groupId}:unknow-server-test-pojo:${project.version} + + + TABS + 1 + + /rest @@ -67,6 +73,12 @@ ${project.groupId}:unknow-server-test-pojo:${project.version} + + + TABS + 1 + + true