From 8cacc5b39bed5bcbcdc3f3200be3e57f5d6e07c6 Mon Sep 17 00:00:00 2001 From: Unknow Date: Tue, 15 Oct 2024 23:55:18 +0200 Subject: [PATCH] up --- .../main/java/io/protostuff/JsonXIOUtil2.java | 32 +++--- .../main/java/io/protostuff/JsonXInput.java | 44 ++++---- .../ProtostuffJsonLineProvider.java | 41 ------- .../ProtostuffJsonListAbstract.java | 103 ------------------ .../ProtostuffJsonListProvider.java | 48 -------- .../ProtostuffJsonListAbstract.java | 66 +++++++++++ .../protostuff/ProtostuffListAbstract.java | 2 +- .../protostuff/ProtostuffListProvider.java | 3 +- .../jaxrs/protostuff/ProtostuffSchema.java | 12 +- .../java/io/protostuff/JsonXInputTest.java | 2 +- unknow-server-maven/pom.xml | 4 + .../unknow/server/maven/jaxrs/JaxrsModel.java | 59 ++++++---- .../unknow/server/maven/jaxrs/JaxrsMojo.java | 8 +- .../java/unknow/server/maven/TestMaven.java | 4 - 14 files changed, 170 insertions(+), 258 deletions(-) delete mode 100644 unknow-server-jaxrs/src/main/java/io/protostuff/ProtostuffJsonLineProvider.java delete mode 100644 unknow-server-jaxrs/src/main/java/io/protostuff/ProtostuffJsonListAbstract.java delete mode 100644 unknow-server-jaxrs/src/main/java/io/protostuff/ProtostuffJsonListProvider.java create mode 100644 unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/protostuff/ProtostuffJsonListAbstract.java diff --git a/unknow-server-jaxrs/src/main/java/io/protostuff/JsonXIOUtil2.java b/unknow-server-jaxrs/src/main/java/io/protostuff/JsonXIOUtil2.java index 713d7d2..05fb623 100644 --- a/unknow-server-jaxrs/src/main/java/io/protostuff/JsonXIOUtil2.java +++ b/unknow-server-jaxrs/src/main/java/io/protostuff/JsonXIOUtil2.java @@ -6,6 +6,7 @@ import java.io.OutputStream; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; public class JsonXIOUtil2 { @@ -64,13 +65,16 @@ public static void writeListTo(OutputStream out, Collection messages, Sch throw new IllegalArgumentException("Buffer previously used and had not been reset."); if (messages.isEmpty()) { - System.arraycopy(EMPTY_ARRAY, 0, buffer.buffer, buffer.offset, EMPTY_ARRAY.length); - buffer.offset += EMPTY_ARRAY.length; + byte[] b = fmt.start(); + System.arraycopy(b, 0, buffer.buffer, buffer.offset, b.length); + buffer.offset += b.length; + b = fmt.end(); + System.arraycopy(b, 0, buffer.buffer, buffer.offset, b.length); + buffer.offset += b.length; return; } final JsonXOutput output = new JsonXOutput(buffer, out, numeric, schema); - boolean first = true; for (T m : messages) { if (first) { @@ -105,34 +109,34 @@ public static void mergeFrom(byte[] data, int offset, int length, T message, */ public static void mergeFrom(InputStream in, T message, Schema schema, boolean numeric) throws IOException { JsonXInput input = new JsonXInput(in, numeric); - input.readStartObject(); + input.readNext('{'); schema.mergeFrom(input, message); } /** * Parses the {@code messages} from the stream using the given {@code schema}. */ - public static List parseListFrom(InputStream in, Schema schema, boolean numeric) throws IOException { + public static List parseListFrom(InputStream in, Schema schema, boolean numeric, ListFormat fmt) throws IOException { final JsonXInput input = new JsonXInput(in, numeric); - input.readStartArray(); - final List list = new ArrayList(); - if (input.isNext(']')) - return list; + input.readNext(fmt.start()); - do { - input.readStartObject(); + if (input.isNext(fmt.end())) + return Collections.emptyList(); + final List list = new ArrayList(); + do { + input.readNext('{'); final T message = schema.newMessage(); schema.mergeFrom(input, message); list.add(message); input.reset(); - } while (input.isNext(',')); - input.readEndArray(); + } while (input.isNext(fmt.delimiter)); + input.readNext(fmt.end()); return list; } - public static enum ListFormat { + public enum ListFormat { JSON(new byte[] { '[' }, new byte[] { ',' }, new byte[] { ']' }), NDJSON(new byte[] {}, new byte[] { '\n' }, new byte[] {}); private final byte[] start; diff --git a/unknow-server-jaxrs/src/main/java/io/protostuff/JsonXInput.java b/unknow-server-jaxrs/src/main/java/io/protostuff/JsonXInput.java index 9f37f29..cda8aae 100644 --- a/unknow-server-jaxrs/src/main/java/io/protostuff/JsonXInput.java +++ b/unknow-server-jaxrs/src/main/java/io/protostuff/JsonXInput.java @@ -51,22 +51,6 @@ public int getLastNumber() { return lastNumber; } - public void readStartObject() throws IOException { - readNext('{'); - } - - public void readEndObject() throws IOException { - readNext('}'); - } - - public void readStartArray() throws IOException { - readNext('['); - } - - public void readEndArray() throws IOException { - readNext(']'); - } - public void reset() { lastRepeated = false; lastSchema = null; @@ -253,7 +237,7 @@ public long readUInt64() throws IOException { @Override public T mergeObject(T value, final Schema schema) throws IOException { - readStartObject(); + readNext('{'); final int previousNumber = this.lastNumber; final boolean previousRepeated = this.lastRepeated; @@ -353,7 +337,7 @@ private boolean readNull() throws IOException { return false; } - private void throwUnexpectedContent(char expected, int actual) throws JsonInputException { + private void throwUnexpectedContent(int expected, int actual) throws JsonInputException { throwUnexpectedContent(Character.toString(expected), actual == -1 ? "EOF" : Character.toString(actual)); } @@ -368,12 +352,34 @@ private void throwEOF() throws JsonInputException { throwUnexpectedContent("data", "EOF"); } - private void readNext(char expected) throws IOException { + public void readNext(char expected) throws IOException { byte b = readNext(); if (expected != b) throwUnexpectedContent(expected, b); } + public void readNext(byte[] expected) throws IOException { + byte b = readNext(); + checkBuffer(expected.length); + for (int i = 0; i < expected.length; i++) { + if (b != expected[i]) + throwUnexpectedContent(expected[i], b); + if (++o == l) + throwEOF(); + } + } + + public boolean isNext(byte[] c) throws IOException { + if (c.length == 0) + return false; + readNext(); + --o; + checkBuffer(c.length); + if (l - o < c.length) + return false; + return Arrays.equals(c, 0, c.length, buf, o, c.length); + } + public boolean isNext(char c) { return buf[o] == c; } diff --git a/unknow-server-jaxrs/src/main/java/io/protostuff/ProtostuffJsonLineProvider.java b/unknow-server-jaxrs/src/main/java/io/protostuff/ProtostuffJsonLineProvider.java deleted file mode 100644 index 95b91f6..0000000 --- a/unknow-server-jaxrs/src/main/java/io/protostuff/ProtostuffJsonLineProvider.java +++ /dev/null @@ -1,41 +0,0 @@ -//package io.protostuff; -// -//import java.io.IOException; -//import java.io.InputStream; -//import java.io.OutputStream; -//import java.lang.annotation.Annotation; -//import java.lang.reflect.ParameterizedType; -//import java.lang.reflect.Type; -//import java.util.Collection; -// -//import com.fasterxml.jackson.core.JsonParser; -// -//import jakarta.annotation.Priority; -//import jakarta.ws.rs.Consumes; -//import jakarta.ws.rs.Produces; -//import jakarta.ws.rs.WebApplicationException; -//import jakarta.ws.rs.core.MediaType; -//import jakarta.ws.rs.core.MultivaluedMap; -//import jakarta.ws.rs.ext.Provider; -//import unknow.server.http.jaxrs.protostuff.ProtostuffListAbstract; -//import unknow.server.http.jaxrs.protostuff.ProtostuffSchema; -// -//@Provider -//@Priority(4500) -//@Consumes({ "application/x-ndjson", "application/jsonl" }) -//@Produces({ "application/x-ndjson", "application/jsonl" }) -//public class ProtostuffJsonLineProvider> extends ProtostuffListAbstract { -// private static final byte[] EMPTY = {}; -// private static final byte[] LF = { '\n' }; -// -// @Override -// public final void writeTo(Collection t, Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, -// OutputStream out) throws IOException, WebApplicationException { -// if (t.isEmpty()) -// return; -// Type p = ((ParameterizedType) genericType).getActualTypeArguments()[0]; -// Schema schema = ProtostuffSchema.get(p); -// LinkedBuffer buffer = LinkedBuffer.allocate(4096); -// JsonXIOUtil2.writeListTo(out, t, schema, false, buffer, EMPTY, LF, EMPTY); -// } -//} diff --git a/unknow-server-jaxrs/src/main/java/io/protostuff/ProtostuffJsonListAbstract.java b/unknow-server-jaxrs/src/main/java/io/protostuff/ProtostuffJsonListAbstract.java deleted file mode 100644 index 658ff65..0000000 --- a/unknow-server-jaxrs/src/main/java/io/protostuff/ProtostuffJsonListAbstract.java +++ /dev/null @@ -1,103 +0,0 @@ -//package io.protostuff; -// -//import java.io.IOException; -//import java.io.InputStream; -//import java.io.OutputStream; -//import java.lang.annotation.Annotation; -//import java.lang.reflect.ParameterizedType; -//import java.lang.reflect.Type; -//import java.util.ArrayList; -//import java.util.Collection; -//import java.util.Iterator; -//import java.util.List; -// -//import com.fasterxml.jackson.core.JsonFactory; -//import com.fasterxml.jackson.core.JsonParser; -//import com.fasterxml.jackson.core.JsonToken; -// -//import jakarta.ws.rs.WebApplicationException; -//import jakarta.ws.rs.core.MediaType; -//import jakarta.ws.rs.core.MultivaluedMap; -//import unknow.server.http.jaxrs.protostuff.ProtostuffListAbstract; -//import unknow.server.http.jaxrs.protostuff.ProtostuffSchema; -// -//public abstract class ProtostuffJsonListAbstract> extends ProtostuffListAbstract { -// private static final JsonFactory FACTORY = JsonFactory.builder().build(); -// -// protected abstract void writeEmpty(OutputStream out) throws IOException; -// -// protected abstract void writeEnd(JsonXOutput output) throws IOException; -// -// protected abstract void writeSeparator(JsonXOutput output) throws IOException; -// -// protected abstract void writeStart(JsonXOutput output) throws IOException; -// -// @Override -// public final void writeTo(Collection t, Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, -// OutputStream out) throws IOException, WebApplicationException { -// -// JsonXIOUtil2.writeListTo(buffer, messages, schema, numeric, start, delimiter, end); -// -// if (t.isEmpty()) { -// writeEmpty(out); -// return; -// } -// -// Type p = ((ParameterizedType) genericType).getActualTypeArguments()[0]; -// -// LinkedBuffer buffer = LinkedBuffer.allocate(4096); -// Schema schema = ProtostuffSchema.get(p); -// final JsonXOutput output = new JsonXOutput(buffer, out, false, schema); -// -// writeStart(output); -// -// Iterator it = t.iterator(); -// output.writeStartObject(); -// schema.writeTo(output, it.next()); -// if (output.isLastRepeated()) -// output.writeEndArray(); -// output.writeEndObject(); -// while (it.hasNext()) { -// writeSeparator(output); -// output.writeStartObject(); -// schema.writeTo(output, it.next()); -// if (output.isLastRepeated()) -// output.writeEndArray(); -// output.writeEndObject(); -// } -// -// writeEnd(output); -// LinkedBuffer.writeTo(out, buffer); -// } -// -// protected abstract void readStart(JsonParser parser) throws IOException; -// -// @Override -// public final Collection readFrom(Class> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, -// InputStream in) throws IOException, WebApplicationException { -// Type p = ((ParameterizedType) genericType).getActualTypeArguments()[0]; -// -// Schema schema = ProtostuffSchema.get(p); -// List list = new ArrayList(); -// try (JsonParser parser = FACTORY.createParser(in)) { -// readStart(parser); -// -// JsonInput input = new JsonInput(parser, false); -// JsonToken t; -// while ((t = parser.nextToken()) != JsonToken.END_ARRAY && t != null) { -// if (t != JsonToken.START_OBJECT) -// throw new JsonInputException("Expected token: { but was " + parser.getCurrentToken() + " on message " + schema.messageFullName()); -// -// final T message = schema.newMessage(); -// schema.mergeFrom(input, message); -// -// if (parser.getCurrentToken() != JsonToken.END_OBJECT) -// throw new JsonInputException("Expected token: } but was " + parser.getCurrentToken() + " on message " + schema.messageFullName()); -// -// list.add(message); -// input.reset(); -// } -// return list; -// } -// } -//} diff --git a/unknow-server-jaxrs/src/main/java/io/protostuff/ProtostuffJsonListProvider.java b/unknow-server-jaxrs/src/main/java/io/protostuff/ProtostuffJsonListProvider.java deleted file mode 100644 index 0c0c92b..0000000 --- a/unknow-server-jaxrs/src/main/java/io/protostuff/ProtostuffJsonListProvider.java +++ /dev/null @@ -1,48 +0,0 @@ -//package io.protostuff; -// -//import java.io.IOException; -//import java.io.OutputStream; -// -//import com.fasterxml.jackson.core.JsonParser; -//import com.fasterxml.jackson.core.JsonToken; -// -//import jakarta.annotation.Priority; -//import jakarta.ws.rs.Consumes; -//import jakarta.ws.rs.Produces; -//import jakarta.ws.rs.ext.Provider; -// -//@Provider -//@Priority(4500) -//@Consumes({ "application/json" }) -//@Produces({ "application/json" }) -//public class ProtostuffJsonListProvider> extends ProtostuffJsonListAbstract { -// -// private static final byte[] EMPTY = { '[', ']' }; -// -// @Override -// protected void writeEmpty(OutputStream out) throws IOException { -// out.write(EMPTY); -// } -// -// @Override -// protected void writeStart(JsonXOutput output) throws IOException { -// output.writeStartArray(); -// } -// -// @Override -// protected void writeSeparator(JsonXOutput output) throws IOException { -// output.tail = output.sink.writeByte((byte) ',', output, output.tail); -// } -// -// @Override -// protected void writeEnd(JsonXOutput output) throws IOException { -// output.writeEndArray(); -// } -// -// @Override -// protected void readStart(JsonParser parser) throws IOException { -// if (parser.nextToken() != JsonToken.START_ARRAY) -// throw new JsonInputException("Expected token: [ but was " + parser.getCurrentToken()); -// -// } -//} diff --git a/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/protostuff/ProtostuffJsonListAbstract.java b/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/protostuff/ProtostuffJsonListAbstract.java new file mode 100644 index 0000000..70bf661 --- /dev/null +++ b/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/protostuff/ProtostuffJsonListAbstract.java @@ -0,0 +1,66 @@ +package unknow.server.http.jaxrs.protostuff; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.annotation.Annotation; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Collection; + +import io.protostuff.JsonXIOUtil2; +import io.protostuff.JsonXIOUtil2.ListFormat; +import io.protostuff.LinkedBuffer; +import io.protostuff.Message; +import io.protostuff.Schema; +import jakarta.annotation.Priority; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.Provider; + +public abstract class ProtostuffJsonListAbstract> extends ProtostuffListAbstract { + private final ListFormat fmt; + + public ProtostuffJsonListAbstract(ListFormat fmt) { + this.fmt = fmt; + } + + @Override + public final void writeTo(Collection t, Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, + OutputStream out) throws IOException, WebApplicationException { + Type p = ((ParameterizedType) genericType).getActualTypeArguments()[0]; + Schema schema = ProtostuffSchema.get(p); + JsonXIOUtil2.writeListTo(out, t, schema, false, LinkedBuffer.allocate(4096), fmt); + } + + @Override + public final Collection readFrom(Class> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, + InputStream in) throws IOException, WebApplicationException { + Type p = ((ParameterizedType) genericType).getActualTypeArguments()[0]; + Schema schema = ProtostuffSchema.get(p); + return JsonXIOUtil2.parseListFrom(in, schema, false, fmt); + } + + @Provider + @Priority(4500) + @Consumes({ "application/x-ndjson", "application/jsonl" }) + @Produces({ "application/x-ndjson", "application/jsonl" }) + public static class ProtostuffJsonLineProvider> extends ProtostuffJsonListAbstract { + public ProtostuffJsonLineProvider() { + super(ListFormat.NDJSON); + } + } + + @Provider + @Priority(4500) + @Consumes({ "application/json" }) + @Produces({ "application/json" }) + public static class ProtostuffJsonListProvider> extends ProtostuffJsonListAbstract { + public ProtostuffJsonListProvider() { + super(ListFormat.JSON); + } + } +} diff --git a/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/protostuff/ProtostuffListAbstract.java b/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/protostuff/ProtostuffListAbstract.java index 65cf921..0597eda 100644 --- a/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/protostuff/ProtostuffListAbstract.java +++ b/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/protostuff/ProtostuffListAbstract.java @@ -10,7 +10,7 @@ import jakarta.ws.rs.ext.MessageBodyReader; import jakarta.ws.rs.ext.MessageBodyWriter; -public abstract class ProtostuffListAbstract> implements MessageBodyReader>, MessageBodyWriter> { +public abstract class ProtostuffListAbstract implements MessageBodyReader>, MessageBodyWriter> { @Override public final boolean isWriteable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { diff --git a/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/protostuff/ProtostuffListProvider.java b/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/protostuff/ProtostuffListProvider.java index 9be21ea..5d516b4 100644 --- a/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/protostuff/ProtostuffListProvider.java +++ b/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/protostuff/ProtostuffListProvider.java @@ -9,7 +9,6 @@ import java.util.Collection; import io.protostuff.LinkedBuffer; -import io.protostuff.Message; import io.protostuff.ProtobufIOUtil; import io.protostuff.ProtobufOutput; import io.protostuff.Schema; @@ -25,7 +24,7 @@ @Priority(4500) @Consumes({ "application/x-protobuf" }) @Produces({ "application/x-protobuf" }) -public class ProtostuffListProvider> extends ProtostuffListAbstract { +public class ProtostuffListProvider extends ProtostuffListAbstract { private static final byte[] EMPTY = { '[', ']' }; diff --git a/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/protostuff/ProtostuffSchema.java b/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/protostuff/ProtostuffSchema.java index 883edd1..4bca5a6 100644 --- a/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/protostuff/ProtostuffSchema.java +++ b/unknow-server-jaxrs/src/main/java/unknow/server/http/jaxrs/protostuff/ProtostuffSchema.java @@ -14,16 +14,22 @@ public class ProtostuffSchema { private ProtostuffSchema() { } - public static Schema get(Type type) { + public static void register(Class clazz, Schema schema) { + SCHEMA.put(clazz, schema); + } + + public static Schema get(Type type) { if (!(type instanceof Class)) throw new IllegalArgumentException("No schema for type " + type); Class cl = (Class) type; return SCHEMA.computeIfAbsent(cl, ProtostuffSchema::createSchema); } - private static Schema createSchema(Class clazz) { + private static Schema createSchema(Class clazz) { try { - return clazz.getDeclaredConstructor().newInstance().cachedSchema(); + if (!Message.class.isAssignableFrom(clazz)) + throw new IllegalArgumentException("Can't create schema of " + clazz); + return ((Message) clazz.getDeclaredConstructor().newInstance()).cachedSchema(); } catch (Exception e) { throw new IllegalArgumentException(e); } diff --git a/unknow-server-jaxrs/src/test/java/io/protostuff/JsonXInputTest.java b/unknow-server-jaxrs/src/test/java/io/protostuff/JsonXInputTest.java index d5ea591..6bdb1c8 100644 --- a/unknow-server-jaxrs/src/test/java/io/protostuff/JsonXInputTest.java +++ b/unknow-server-jaxrs/src/test/java/io/protostuff/JsonXInputTest.java @@ -43,7 +43,7 @@ public static final Stream test() { public void test(String json, Truc result) throws IOException { JsonXInput in = new JsonXInput(new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8))); try { - in.readStartObject(); + in.readNext('{'); Truc truc = new Truc(); Truc.getSchema().mergeFrom(in, truc); assertEquals(result, truc); diff --git a/unknow-server-maven/pom.xml b/unknow-server-maven/pom.xml index 2d386b7..20f6f9f 100644 --- a/unknow-server-maven/pom.xml +++ b/unknow-server-maven/pom.xml @@ -139,5 +139,9 @@ com.fasterxml.jackson.core jackson-databind + + io.protostuff + protostuff-api + 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 ab66505..32e1deb 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 @@ -37,6 +37,7 @@ import com.github.javaparser.ast.expr.NullLiteralExpr; import com.github.javaparser.ast.expr.ObjectCreationExpr; +import io.protostuff.Message; import io.swagger.v3.oas.annotations.Hidden; import jakarta.ws.rs.BeanParam; import jakarta.ws.rs.Consumes; @@ -61,6 +62,11 @@ import jakarta.ws.rs.ext.MessageBodyWriter; import jakarta.ws.rs.ext.ParamConverterProvider; import jakarta.ws.rs.ext.Provider; +import unknow.server.http.jaxrs.protostuff.ProtostuffJsonListAbstract.ProtostuffJsonLineProvider; +import unknow.server.http.jaxrs.protostuff.ProtostuffJsonListAbstract.ProtostuffJsonListProvider; +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; @@ -101,7 +107,7 @@ public class JaxrsModel { private final ModelLoader loader; private final String path; - + private final TypeModel paramProvider; private final TypeModel exceptionMapper; private final TypeModel bodyReader; @@ -117,6 +123,8 @@ public class JaxrsModel { public final Set implicitFromString = new HashSet<>(); public final Set implicitValueOf = new HashSet<>(); + public final Set protostuffMessage = new HashSet<>(); + /** * create new JaxrsModel * @@ -151,26 +159,26 @@ public JaxrsModel(ModelLoader loader, ClassLoader cl, String path) { writers.put(c, list); }; -// try { XXX -// cl.loadClass("io.protostuff.ProtobufOutput"); -// reader.accept(ProtostuffProvider.class.getName()); -// reader.accept(ProtostuffListProvider.class.getName()); -// writer.accept(ProtostuffProvider.class.getName()); -// writer.accept(ProtostuffListProvider.class.getName()); -// } catch (@SuppressWarnings("unused") ClassNotFoundException e) { -// logger.warn("No protostuff-core"); -// } -// try { -// cl.loadClass("io.protostuff.JsonInput"); -// reader.accept(ProtostuffJsonProvider.class.getName()); -// reader.accept(ProtostuffJsonListProvider.class.getName()); -// reader.accept(ProtostuffJsonLineProvider.class.getName()); -// writer.accept(ProtostuffJsonProvider.class.getName()); -// writer.accept(ProtostuffJsonListProvider.class.getName()); -// writer.accept(ProtostuffJsonLineProvider.class.getName()); -// } catch (@SuppressWarnings("unused") ClassNotFoundException e) { -// logger.warn("No protostuff-json"); -// } + try { + cl.loadClass("io.protostuff.ProtobufOutput"); + reader.accept(ProtostuffProvider.class.getName()); + reader.accept(ProtostuffListProvider.class.getName()); + writer.accept(ProtostuffProvider.class.getName()); + writer.accept(ProtostuffListProvider.class.getName()); + } catch (@SuppressWarnings("unused") ClassNotFoundException e) { + logger.warn("No protostuff-core"); + } + try { + cl.loadClass("io.protostuff.JsonXInput"); + reader.accept(ProtostuffJsonProvider.class.getName()); + reader.accept(ProtostuffJsonListProvider.class.getName()); + reader.accept(ProtostuffJsonLineProvider.class.getName()); + writer.accept(ProtostuffJsonProvider.class.getName()); + writer.accept(ProtostuffJsonListProvider.class.getName()); + writer.accept(ProtostuffJsonLineProvider.class.getName()); + } catch (@SuppressWarnings("unused") ClassNotFoundException e) { + logger.warn("No protostuff-json"); + } loadService(cl, MessageBodyReader.class, reader); loadService(cl, MessageBodyWriter.class, writer); @@ -326,7 +334,9 @@ private void process(String defaultMethod, String basePath, String[] consume, St if (l.size() > 1) throw new RuntimeException("Duplicate parameter annotation on " + errorName + " " + param.name()); params.add(l.isEmpty() ? new JaxrsBodyParam<>(param) : buildParam(param, l.get(0))); + 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); produce = m.annotation(Produces.class).flatMap(v -> v.value()).filter(v -> v.isSet()).map(v -> v.asArrayLiteral()).orElse(produce); @@ -334,6 +344,13 @@ private void process(String defaultMethod, String basePath, String[] consume, St mappings.add(new JaxrsMapping("m$" + mappings.size(), clazz, m, method, params, p, consume, produce)); } + private void addProtostuffMessage(TypeModel type) { + if (type.isAssignableTo(Collection.class)) + type = type.asClass().parameter(0).type(); + if (type.isAssignableTo(Message.class)) + protostuffMessage.add(type.name()); + } + private static Optional getSetter(ClassModel cl, String name, TypeModel type) { String set = "set" + Character.toUpperCase(name.charAt(0)) + name.substring(1); return cl.method(set, 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 95a1218..f828134 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 @@ -61,6 +61,7 @@ import jakarta.ws.rs.ext.RuntimeDelegate; import unknow.server.http.jaxrs.JaxrsContext; import unknow.server.http.jaxrs.JaxrsRuntime; +import unknow.server.http.jaxrs.protostuff.ProtostuffSchema; import unknow.server.maven.AbstractGeneratorMojo; import unknow.server.maven.TypeCache; import unknow.server.maven.Utils; @@ -189,7 +190,6 @@ private void generateInitalizer() throws IOException, MojoExecutionException { l.add(Utils.text(s)); b.addStatement(new MethodCallExpr(ctx, "registerWriter", l)); } - generateImplicitConverter(cu); for (Entry e : model.exceptions.entrySet()) { @@ -198,6 +198,12 @@ private void generateInitalizer() throws IOException, MojoExecutionException { Utils.list(new ClassExpr(types.get(e.getKey())), new ObjectCreationExpr(null, types.getClass(e.getValue()), Utils.list())))); } + for (String cl : model.protostuffMessage) { + ClassOrInterfaceType type = types.getClass(cl); + 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")))); + } + out.save(cu); } diff --git a/unknow-server-maven/src/test/java/unknow/server/maven/TestMaven.java b/unknow-server-maven/src/test/java/unknow/server/maven/TestMaven.java index 09bf468..b564955 100644 --- a/unknow-server-maven/src/test/java/unknow/server/maven/TestMaven.java +++ b/unknow-server-maven/src/test/java/unknow/server/maven/TestMaven.java @@ -1,18 +1,14 @@ package unknow.server.maven; -import java.io.StringReader; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import io.protostuff.JsonXInput; - public class TestMaven { private static final Pattern pa = Pattern.compile("\\{\\s*(\\w[\\w\\.\\-]*)\\s*(?::\\s*((?:[^\\{\\}]|\\{[^\\{\\}]*\\})*)\\s*)?\\}"); public static void main(String[] arg) { - String path = "/{q}/list/{t}";