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