From 2fb1d2b6ed325637bf1703269567d736165837f4 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Mon, 29 Oct 2018 18:11:22 +0100 Subject: [PATCH 1/5] Fail on warning --- pom.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3e59babd..47152010 100644 --- a/pom.xml +++ b/pom.xml @@ -290,10 +290,17 @@ org.netbeans.html.boot.impl:org.netbeans.html.boot.fx:org.netbeans.html.context. org.apache.maven.plugins maven-compiler-plugin - 2.5.1 + 3.6.0 1.6 1.6 + + -Xlint:-options + -Xlint:unchecked + + true + true + true From ee1f753cc4c30dc4663333bd2b507c550d611a2f Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Mon, 29 Oct 2018 18:12:06 +0100 Subject: [PATCH 2/5] Suppress warnings and provide better parameterized types --- .../org/netbeans/html/boot/impl/FnUtils.java | 22 ++++---- .../html/boot/impl/JavaScriptProcesor.java | 20 ++++--- .../org/netbeans/html/json/impl/JSON.java | 2 + .../org/netbeans/html/json/impl/JSONList.java | 3 + .../html/json/impl/ModelProcessor.java | 2 + .../netbeans/html/json/impl/SimpleList.java | 11 ++++ .../html/json/spi/FunctionBinding.java | 2 +- .../html/json/spi/PropertyBinding.java | 4 +- .../org/netbeans/html/json/spi/Proto.java | 56 ++++++++++++++----- .../java/net/java/html/json/MapModelTest.java | 3 +- .../java/net/java/html/json/ModelTest.java | 3 +- .../html/json/impl/DeepChangeTest.java | 3 +- .../html/json/impl/DependsChangeTest.java | 3 +- .../netbeans/html/json/impl/JSONListTest.java | 5 +- .../org/netbeans/html/json/spi/ProtoTest.java | 1 + 15 files changed, 99 insertions(+), 41 deletions(-) diff --git a/boot/src/main/java/org/netbeans/html/boot/impl/FnUtils.java b/boot/src/main/java/org/netbeans/html/boot/impl/FnUtils.java index 9d47b066..7bb9bc23 100644 --- a/boot/src/main/java/org/netbeans/html/boot/impl/FnUtils.java +++ b/boot/src/main/java/org/netbeans/html/boot/impl/FnUtils.java @@ -233,7 +233,7 @@ private boolean generateBody(boolean hasCode) { super.visitMethodInsn( Opcodes.INVOKESTATIC, "org/netbeans/html/boot/spi/Fn", "isValid", - "(Lorg/netbeans/html/boot/spi/Fn;)Z" + "(Lorg/netbeans/html/boot/spi/Fn;)Z", false ); Label ifNotNull = new Label(); super.visitJumpInsn(Opcodes.IFNE, ifNotNull); @@ -257,7 +257,8 @@ private boolean generateBody(boolean hasCode) { } super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/netbeans/html/boot/spi/Fn", "define", - "(Ljava/lang/Class;ZLjava/lang/String;[Ljava/lang/String;)Lorg/netbeans/html/boot/spi/Fn;" + "(Ljava/lang/Class;ZLjava/lang/String;[Ljava/lang/String;)Lorg/netbeans/html/boot/spi/Fn;", + false ); Label noPresenter = new Label(); super.visitInsn(Opcodes.DUP); @@ -272,7 +273,8 @@ private boolean generateBody(boolean hasCode) { super.visitLdcInsn(resource); super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/netbeans/html/boot/spi/Fn", "preload", - "(Lorg/netbeans/html/boot/spi/Fn;Ljava/lang/Class;Ljava/lang/String;)Lorg/netbeans/html/boot/spi/Fn;" + "(Lorg/netbeans/html/boot/spi/Fn;Ljava/lang/Class;Ljava/lang/String;)Lorg/netbeans/html/boot/spi/Fn;", + false ); } super.visitInsn(Opcodes.DUP); @@ -350,7 +352,7 @@ public void visitBaseType(char descriptor) { throw new IllegalStateException(t.toString()); } FindInMethod.super.visitMethodInsn(Opcodes.INVOKESTATIC, - factory, "valueOf", "(" + descriptor + ")L" + factory + ";" + factory, "valueOf", "(" + descriptor + ")L" + factory + ";", false ); FindInMethod.super.visitInsn(Opcodes.AASTORE); } @@ -407,13 +409,13 @@ private void loadObject() { int lastSlash = FindInClass.this.name.lastIndexOf('/'); String jsCallbacks = FindInClass.this.name.substring(0, lastSlash + 1) + "$JsCallbacks$"; FindInMethod.super.visitFieldInsn(Opcodes.GETSTATIC, jsCallbacks, "VM", "L" + jsCallbacks + ";"); - FindInMethod.super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, jsCallbacks, "current", "()L" + jsCallbacks + ";"); + FindInMethod.super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, jsCallbacks, "current", "()L" + jsCallbacks + ";", false); FindInMethod.super.visitInsn(Opcodes.AASTORE); } if (fia.wait4js) { super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, - "org/netbeans/html/boot/spi/Fn", "invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;" + "org/netbeans/html/boot/spi/Fn", "invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;", false ); switch (sv.returnType.getSort()) { case Type.VOID: @@ -430,7 +432,7 @@ private void loadObject() { super.visitJumpInsn(Opcodes.IFNULL, handleNullValue); super.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Boolean"); super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, - "java/lang/Boolean", "booleanValue", "()Z" + "java/lang/Boolean", "booleanValue", "()Z", false ); super.visitInsn(Opcodes.IRETURN); super.visitLabel(handleNullValue); @@ -441,13 +443,13 @@ private void loadObject() { default: super.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/Number"); super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, - "java/lang/Number", sv.returnType.getClassName() + "Value", "()" + sv.returnType.getDescriptor() + "java/lang/Number", sv.returnType.getClassName() + "Value", "()" + sv.returnType.getDescriptor(), false ); super.visitInsn(sv.returnType.getOpcode(Opcodes.IRETURN)); } } else { super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, - "org/netbeans/html/boot/spi/Fn", "invokeLater", "(Ljava/lang/Object;[Ljava/lang/Object;)V" + "org/netbeans/html/boot/spi/Fn", "invokeLater", "(Ljava/lang/Object;[Ljava/lang/Object;)V", false ); super.visitInsn(Opcodes.RETURN); } @@ -459,7 +461,7 @@ private void loadObject() { super.visitInsn(Opcodes.DUP); super.visitLdcInsn("No presenter active. Use BrwsrCtx.execute!"); super.visitMethodInsn(Opcodes.INVOKESPECIAL, - "java/lang/IllegalStateException", "", "(Ljava/lang/String;)V" + "java/lang/IllegalStateException", "", "(Ljava/lang/String;)V", false ); this.visitInsn(Opcodes.ATHROW); } diff --git a/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java b/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java index bf97dde9..bb74c123 100644 --- a/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java +++ b/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java @@ -70,6 +70,7 @@ public final class JavaScriptProcesor extends AbstractProcessor { private final Map> bodies = new HashMap>(); + @SuppressWarnings("deprecation") @Override public Set getSupportedAnnotationTypes() { Set set = new HashSet(); @@ -153,6 +154,18 @@ public boolean process(Set annotations, RoundEnvironment checkJavaScriptBody(r, e, msg); } + processGroup(roundEnv, msg); + + if (roundEnv.processingOver()) { + generateCallbackClass(javacalls); + generateJavaScriptBodyList(bodies); + javacalls.clear(); + } + return true; + } + + @SuppressWarnings("deprecation") + private void processGroup(RoundEnvironment roundEnv, final Messager msg) { for (Element e : roundEnv.getElementsAnnotatedWith(JavaScriptResource.Group.class)) { JavaScriptResource.Group g = e.getAnnotation(JavaScriptResource.Group.class); if (g == null) { @@ -162,13 +175,6 @@ public boolean process(Set annotations, RoundEnvironment checkJavaScriptBody(r, e, msg); } } - - if (roundEnv.processingOver()) { - generateCallbackClass(javacalls); - generateJavaScriptBodyList(bodies); - javacalls.clear(); - } - return true; } private void checkJavaScriptBody(JavaScriptResource r, Element e, final Messager msg) { diff --git a/json/src/main/java/org/netbeans/html/json/impl/JSON.java b/json/src/main/java/org/netbeans/html/json/impl/JSON.java index 99730a64..fbc32b55 100644 --- a/json/src/main/java/org/netbeans/html/json/impl/JSON.java +++ b/json/src/main/java/org/netbeans/html/json/impl/JSON.java @@ -383,6 +383,7 @@ static Proto.Type findType(Class clazz) { return null; } + @SuppressWarnings("unchecked") public static Model bindTo(Model model, BrwsrCtx c) { Proto.Type from = (Proto.Type) findType(model.getClass()); if (from == null) { @@ -501,6 +502,7 @@ public Object toJSON(InputStream is) throws IOException { throw new IOException("Not supported"); } + @Deprecated @Override public void runSafe(Runnable r) { r.run(); diff --git a/json/src/main/java/org/netbeans/html/json/impl/JSONList.java b/json/src/main/java/org/netbeans/html/json/impl/JSONList.java index 4bbd80ad..67cb2bc4 100644 --- a/json/src/main/java/org/netbeans/html/json/impl/JSONList.java +++ b/json/src/main/java/org/netbeans/html/json/impl/JSONList.java @@ -41,6 +41,7 @@ public JSONList(Proto proto, String name, int changeIndex, String... deps) { this.index = changeIndex; } + @SuppressWarnings("unchecked") public void init(Object values) { int len; if (values == null || (len = Array.getLength(values)) == 0) { @@ -51,6 +52,8 @@ public void init(Object values) { super.add((T)data); } } + + @SuppressWarnings("unchecked") public static void init(Collection to, Object values) { int len; if (values == null || (len = Array.getLength(values)) == 0) { diff --git a/json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java b/json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java index c8babcaa..5830f3dc 100644 --- a/json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java +++ b/json/src/main/java/org/netbeans/html/json/impl/ModelProcessor.java @@ -2029,6 +2029,7 @@ private String findDataSpecified(ExecutableElement e, OnReceive onR) { return null; } + @SuppressWarnings("unchecked") static List getAnnoValues(ProcessingEnvironment pe, Element e, AnnotationMirror am) { try { Class trees = Class.forName("com.sun.tools.javac.api.JavacTrees"); @@ -2102,6 +2103,7 @@ String typeName(ProcessingEnvironment env) { } + @SuppressWarnings("unchecked") static Prprt[] wrap(ProcessingEnvironment pe, Element e, Property[] arr) { if (arr.length == 0) { return new Prprt[0]; diff --git a/json/src/main/java/org/netbeans/html/json/impl/SimpleList.java b/json/src/main/java/org/netbeans/html/json/impl/SimpleList.java index 566397c4..1b8b0ef1 100644 --- a/json/src/main/java/org/netbeans/html/json/impl/SimpleList.java +++ b/json/src/main/java/org/netbeans/html/json/impl/SimpleList.java @@ -38,6 +38,8 @@ private SimpleList(Object[] data) { size = data.length; } + @SafeVarargs + @SuppressWarnings("varargs") public static List asList(T... arr) { return new SimpleList(arr); } @@ -89,6 +91,7 @@ public T[] toArray(T[] a) { return toArrayImpl(a, 0, size); } + @SuppressWarnings("unchecked") final T[] toArrayImpl(T[] a, int from, int to) { if (a.length < to - from) { a = newArr(a, to - from); @@ -191,6 +194,7 @@ public void sort(Comparator c) { sortImpl(c, 0, size); } + @SuppressWarnings("unchecked") final void sortImpl(Comparator c, int from, int to) { for (int i = from; i < to; i++) { Object min = arr[i]; @@ -227,6 +231,7 @@ void clearImpl(int from, int to) { size -= to; } + @SuppressWarnings("unchecked") @Override public E get(int index) { checkAccess(index); @@ -264,6 +269,7 @@ private void ensureSize(int newSize) { this.size = ensureAccess(newSize); } + @SuppressWarnings("unchecked") @Override public E set(int index, E element) { checkAccess(index); @@ -272,11 +278,13 @@ public E set(int index, E element) { return prev; } + @SuppressWarnings("unchecked") @Override public void add(int index, E element) { addImpl(index, asList(element)); } + @SuppressWarnings("unchecked") @Override public E remove(int index) { checkAccess(index); @@ -339,6 +347,7 @@ private static boolean equals(Object o1, Object o2) { } } + @SuppressWarnings("unchecked") private static T[] newArr(T[] a, int size) { return (T[]) Array.newInstance(a.getClass().getComponentType(), size); } @@ -613,6 +622,7 @@ public boolean hasNext() { return at < max + add; } + @SuppressWarnings("unchecked") @Override public E next() { if (at == max + add) { @@ -627,6 +637,7 @@ public boolean hasPrevious() { return at > min; } + @SuppressWarnings("unchecked") @Override public E previous() { if (at == min) { diff --git a/json/src/main/java/org/netbeans/html/json/spi/FunctionBinding.java b/json/src/main/java/org/netbeans/html/json/spi/FunctionBinding.java index bd7d4869..8642d6c5 100644 --- a/json/src/main/java/org/netbeans/html/json/spi/FunctionBinding.java +++ b/json/src/main/java/org/netbeans/html/json/spi/FunctionBinding.java @@ -115,7 +115,7 @@ protected M model() { @Override public FunctionBinding weak() { if (weakSupported) { - return new Weak(model, name, index, access); + return new Weak(model, name, index, access); } else { return this; } diff --git a/json/src/main/java/org/netbeans/html/json/spi/PropertyBinding.java b/json/src/main/java/org/netbeans/html/json/spi/PropertyBinding.java index ef83ffdb..46b83060 100644 --- a/json/src/main/java/org/netbeans/html/json/spi/PropertyBinding.java +++ b/json/src/main/java/org/netbeans/html/json/spi/PropertyBinding.java @@ -73,7 +73,7 @@ protected Object read(Proto.Type from, BrwsrCtx c, Object data) { @Override protected PropertyBinding newBinding( Proto.Type access, Bindings bindings, String name, int index, M model, byte propertyType) { - return new Impl(model, bindings, name, index, access, propertyType); + return new Impl(model, bindings, name, index, access, propertyType); } }; boolean weakOK; @@ -199,7 +199,7 @@ protected M model() { @Override public PropertyBinding weak() { if (weakSupported) { - return new Weak(model, bindings, name, index, access, propertyType); + return new Weak(model, bindings, name, index, access, propertyType); } else { return this; } diff --git a/json/src/main/java/org/netbeans/html/json/spi/Proto.java b/json/src/main/java/org/netbeans/html/json/spi/Proto.java index dfa1ab75..e6354f3b 100644 --- a/json/src/main/java/org/netbeans/html/json/spi/Proto.java +++ b/json/src/main/java/org/netbeans/html/json/spi/Proto.java @@ -48,13 +48,13 @@ */ public final class Proto { private final Object obj; - private final Type type; + private final Type type; private final net.java.html.BrwsrCtx context; private org.netbeans.html.json.impl.Bindings ko; private Observers observers; private Observers.Usages usages; - Proto(Object obj, Type type, BrwsrCtx context) { + Proto(Object obj, Type type, BrwsrCtx context) { this.obj = obj; this.type = type; this.context = context; @@ -223,7 +223,7 @@ public void runInBrowser(final int index, final Object... args) { @Override public void run() { try { - type.call(obj, index, args, null); + type.callRaw(obj, index, args, null); } catch (Exception ex) { ex.printStackTrace(); } @@ -340,12 +340,12 @@ public void loadJSONWithHeaders(final int index, class Rcvr extends RcvrJSON { @Override protected void onMessage(MsgEvnt msg) { - type.onMessage(obj, index, 1, msg.getValues(), params); + type.onMessageRaw(obj, index, 1, msg.getValues(), params); } @Override protected void onError(MsgEvnt msg) { - type.onMessage(obj, index, 2, msg.getException(), params); + type.onMessageRaw(obj, index, 2, msg.getException(), params); } } JSONCall call = PropertyBindingAccessor.createCall( @@ -368,22 +368,22 @@ public Object wsOpen(final int index, String url, Object data) { class WSrcvr extends RcvrJSON { @Override protected void onError(MsgEvnt msg) { - type.onMessage(obj, index, 2, msg.getException()); + type.onMessageRaw(obj, index, 2, msg.getException()); } @Override protected void onMessage(MsgEvnt msg) { - type.onMessage(obj, index, 1, msg.getValues()); + type.onMessageRaw(obj, index, 1, msg.getValues()); } @Override protected void onClose(MsgEvnt msg) { - type.onMessage(obj, index, 3, null); + type.onMessageRaw(obj, index, 3, null); } @Override protected void onOpen(MsgEvnt msg) { - type.onMessage(obj, index, 0, null); + type.onMessageRaw(obj, index, 0, null); } } WS ws = WS.create(JSON.findWSTransfer(context), new WSrcvr()); @@ -487,19 +487,19 @@ final String toStr() { final Bindings initBindings(Object originalObject) { if (ko == null) { - Bindings b = Bindings.apply(context); + Bindings b = Bindings.apply(context); PropertyBinding[] pb = new PropertyBinding[type.properties.size()]; for (int i = 0; i < pb.length; i++) { final PropertyInfo info = (PropertyInfo) type.properties.get(i); if (info != null) { - pb[i] = b.registerProperty(info.name, i, obj, type, info.type); + pb[i] = type.registerProperty(b, info.name, i, obj, info.type); } } FunctionBinding[] fb = new FunctionBinding[type.functions.size()]; for (int i = 0; i < fb.length; i++) { final String fnName = (String) type.functions.get(i); if (fnName != null) { - fb[i] = FunctionBinding.registerFunction(fnName, i, obj, type); + fb[i] = type.registerFunction(fnName, i, obj); } } ko = b; @@ -513,7 +513,7 @@ final Bindings getBindings() { } final void onChange(int index) { - type.onChange(obj, index); + type.onChangeRaw(obj, index); } final Observers observers(boolean create) { @@ -655,6 +655,10 @@ public Proto createProto(Object obj, BrwsrCtx context) { protected abstract void call(Model model, int index, Object data, Object event) throws Exception; + final void callRaw(Object model, int index, Object data, Object event) throws Exception { + call(clazz.cast(model), index, data, event); + } + /** Re-binds the model object to new browser context. * * @param model the instance of {@link Model model class} @@ -679,6 +683,10 @@ protected abstract void call(Model model, int index, Object data, Object event) */ protected abstract void onChange(Model model, int index); + final void onChangeRaw(Object model, int index) { + onChange(clazz.cast(model), index); + } + /** Finds out if there is an associated proto-object for given * object. * @@ -721,6 +729,10 @@ protected void onMessage(Model model, int index, int type, Object data, Object[] onMessage(model, index, type, data); } + final void onMessageRaw(Object model, int index, int type, Object data, Object... params) { + onMessage(clazz.cast(model), index, type, data, params); + } + // // Various support methods the generated classes use // @@ -869,11 +881,16 @@ public final T extractValue(Class type, Object val) { val = val instanceof Number ? ((Number) val).floatValue() : Float.NaN; } if (type.isEnum() && val instanceof String) { - val = Enum.valueOf(type.asSubclass(Enum.class), (String)val); + val = enumByName(type, (String)val); } return type.cast(val); } + @SuppressWarnings("unchecked") + private static Object enumByName(Class enumType, String name) { + return Enum.valueOf(enumType.asSubclass(Enum.class), name); + } + /** Special dealing with array & {@link List} values. This method * takes the provided collection, empties it and fills it again * with values extracted from value (which is supposed @@ -886,6 +903,7 @@ public final T extractValue(Class type, Object val) { * value is not an array it is wrapped into array with only element * @since 1.0 */ + @SuppressWarnings("unchecked") public final void replaceValue(Collection arr, Class type, Object value) { List tmp = Models.asList(); if (value instanceof Object[]) { @@ -928,12 +946,20 @@ public final void replaceValue(Collection arr, Class type, Obj tmp.add(extractValue(type, value)); } if (arr instanceof JSONList) { - JSONList jsList = (JSONList) arr; + JSONList jsList = (JSONList) arr; jsList.fastReplace(tmp); } else { arr.clear(); arr.addAll(tmp); } } + + final PropertyBinding registerProperty(Bindings b, String name, int index, Object obj, byte type) { + return b.registerProperty(name, index, clazz.cast(obj), this, type); + } + + final FunctionBinding registerFunction(String fnName, int i, Object obj) { + return FunctionBinding.registerFunction(fnName, i, clazz.cast(obj), this); + } } } diff --git a/json/src/test/java/net/java/html/json/MapModelTest.java b/json/src/test/java/net/java/html/json/MapModelTest.java index cc5f2d33..3c109d31 100644 --- a/json/src/test/java/net/java/html/json/MapModelTest.java +++ b/json/src/test/java/net/java/html/json/MapModelTest.java @@ -484,8 +484,9 @@ public Object toJSON(InputStream is) throws IOException { } @Override + @Deprecated public void runSafe(Runnable r) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + throw new UnsupportedOperationException("Not supported yet."); } @Override diff --git a/json/src/test/java/net/java/html/json/ModelTest.java b/json/src/test/java/net/java/html/json/ModelTest.java index ce19ff50..80feca17 100644 --- a/json/src/test/java/net/java/html/json/ModelTest.java +++ b/json/src/test/java/net/java/html/json/ModelTest.java @@ -471,8 +471,9 @@ public M toModel(Class modelClass, Object data) { } @Override + @Deprecated public void runSafe(Runnable r) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + throw new UnsupportedOperationException("Not supported yet."); } } } diff --git a/json/src/test/java/org/netbeans/html/json/impl/DeepChangeTest.java b/json/src/test/java/org/netbeans/html/json/impl/DeepChangeTest.java index 4e3427a1..7e9ec74d 100644 --- a/json/src/test/java/org/netbeans/html/json/impl/DeepChangeTest.java +++ b/json/src/test/java/org/netbeans/html/json/impl/DeepChangeTest.java @@ -639,8 +639,9 @@ public Object toJSON(InputStream is) throws IOException { } @Override + @Deprecated public void runSafe(Runnable r) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + throw new UnsupportedOperationException("Not supported yet."); } } diff --git a/json/src/test/java/org/netbeans/html/json/impl/DependsChangeTest.java b/json/src/test/java/org/netbeans/html/json/impl/DependsChangeTest.java index 3102e08d..6a83395e 100644 --- a/json/src/test/java/org/netbeans/html/json/impl/DependsChangeTest.java +++ b/json/src/test/java/org/netbeans/html/json/impl/DependsChangeTest.java @@ -211,8 +211,9 @@ public Object toJSON(InputStream is) throws IOException { } @Override + @Deprecated public void runSafe(Runnable r) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + throw new UnsupportedOperationException("Not supported yet."); } } diff --git a/json/src/test/java/org/netbeans/html/json/impl/JSONListTest.java b/json/src/test/java/org/netbeans/html/json/impl/JSONListTest.java index 580ded14..3f088613 100644 --- a/json/src/test/java/org/netbeans/html/json/impl/JSONListTest.java +++ b/json/src/test/java/org/netbeans/html/json/impl/JSONListTest.java @@ -157,7 +157,7 @@ public JSONListTest() { List vals = new ArrayList(); vals.add(12); vals.add(30); - ((JSONList)p.getAge()).fastReplace(vals); + ((JSONList)p.getAge()).fastReplace(vals); assertEquals(changed.size(), 1, "One change"); assertEquals(changed.get(0), "age", "One change"); @@ -206,7 +206,8 @@ public M toModel(Class modelClass, Object data) { } @Override + @Deprecated public void runSafe(Runnable r) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + throw new UnsupportedOperationException("Not supported yet."); } } diff --git a/json/src/test/java/org/netbeans/html/json/spi/ProtoTest.java b/json/src/test/java/org/netbeans/html/json/spi/ProtoTest.java index 89ed6abc..4e6427aa 100644 --- a/json/src/test/java/org/netbeans/html/json/spi/ProtoTest.java +++ b/json/src/test/java/org/netbeans/html/json/spi/ProtoTest.java @@ -83,6 +83,7 @@ public Object wrapArray(Object[] arr) { } @Override + @Deprecated public void runSafe(Runnable r) { throw new UnsupportedOperationException("runSafe"); } From 9d0e2cd1c64cec29a5449e4d4de93324430f75c8 Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Sat, 11 Jun 2022 08:21:26 +0200 Subject: [PATCH 3/5] Addressing warnings, deprecations, etc. --- .../main/java/net/java/html/json/Models.java | 1 + .../org/netbeans/html/json/impl/JSON.java | 18 +++++++++------ .../netbeans/html/json/impl/ReactiveTech.java | 1 + .../html/json/impl/DeepChangeTest.java | 19 ++++++++++------ .../html/json/impl/DependsChangeTest.java | 22 +------------------ 5 files changed, 26 insertions(+), 35 deletions(-) diff --git a/json/src/main/java/net/java/html/json/Models.java b/json/src/main/java/net/java/html/json/Models.java index 28740d32..acdd10aa 100644 --- a/json/src/main/java/net/java/html/json/Models.java +++ b/json/src/main/java/net/java/html/json/Models.java @@ -177,6 +177,7 @@ public static void applyBindings(Object model, String targetId) { * @return full features implementation of mutable and extendable list * @since 1.5 */ + @SafeVarargs public static List asList(T... values) { return SimpleList.asList(values); } diff --git a/json/src/main/java/org/netbeans/html/json/impl/JSON.java b/json/src/main/java/org/netbeans/html/json/impl/JSON.java index fbc32b55..801ed949 100644 --- a/json/src/main/java/org/netbeans/html/json/impl/JSON.java +++ b/json/src/main/java/org/netbeans/html/json/impl/JSON.java @@ -21,6 +21,7 @@ import java.io.EOFException; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; import java.util.Collection; import net.java.html.BrwsrCtx; import org.netbeans.html.context.spi.Contexts; @@ -348,13 +349,16 @@ static ModelTypes initModelTypes(String preload, String implName) { try { Class.forName(preload); Class clazz = Class.forName(implName); - types = (ModelTypes) clazz.newInstance(); - } catch (ClassNotFoundException ex) { - // OK, not supported - } catch (NoClassDefFoundError ex) { + types = (ModelTypes) clazz.getDeclaredConstructor().newInstance(); + } catch ( + InvocationTargetException | + IllegalAccessException | + ClassNotFoundException | + NoClassDefFoundError | + NoSuchMethodException | + InstantiationException ex + ) { // OK, not supported - } catch (Throwable ex) { - ex.printStackTrace(); } finally { if (types == null) { types = new LinkedListTypes(); @@ -444,7 +448,7 @@ static void initClass(Class modelClazz) { if (l != null) { Class.forName(modelClazz.getName(), true, l); } - modelClazz.newInstance(); + modelClazz.getDeclaredConstructor().newInstance(); } catch (Exception ex) { // ignore and try again } diff --git a/json/src/main/java/org/netbeans/html/json/impl/ReactiveTech.java b/json/src/main/java/org/netbeans/html/json/impl/ReactiveTech.java index ce10980e..c2478cf2 100644 --- a/json/src/main/java/org/netbeans/html/json/impl/ReactiveTech.java +++ b/json/src/main/java/org/netbeans/html/json/impl/ReactiveTech.java @@ -62,6 +62,7 @@ public Object wrapArray(Object[] arr) { return arr; } + @SuppressWarnings("deprecation") @Override public void runSafe(Runnable r) { } diff --git a/json/src/test/java/org/netbeans/html/json/impl/DeepChangeTest.java b/json/src/test/java/org/netbeans/html/json/impl/DeepChangeTest.java index 399cf181..1c91f513 100644 --- a/json/src/test/java/org/netbeans/html/json/impl/DeepChangeTest.java +++ b/json/src/test/java/org/netbeans/html/json/impl/DeepChangeTest.java @@ -643,21 +643,26 @@ public void runSafe(Runnable r) { } } - private static void assertGC(Reference ref, String msg) throws InterruptedException { + static void assertGC(Reference ref, String msg) throws InterruptedException { for (int i = 0; i < 100; i++) { if (isGone(ref)) { return; } - try { - System.gc(); - System.runFinalization(); - } catch (Error err) { - err.printStackTrace(); - } + forceGC(); } throw new InterruptedException(msg); } + @SuppressWarnings("deprecation") + private static void forceGC() { + try { + System.gc(); + System.runFinalization(); + } catch (Error err) { + err.printStackTrace(); + } + } + private static boolean isGone(Reference ref) { return ref.get() == null; } diff --git a/json/src/test/java/org/netbeans/html/json/impl/DependsChangeTest.java b/json/src/test/java/org/netbeans/html/json/impl/DependsChangeTest.java index 6a83395e..47e3fa66 100644 --- a/json/src/test/java/org/netbeans/html/json/impl/DependsChangeTest.java +++ b/json/src/test/java/org/netbeans/html/json/impl/DependsChangeTest.java @@ -79,7 +79,7 @@ public void disappearModel() throws Exception { Reference ref = new WeakReference(p); p = null; - assertGC(ref, "MyOverall can now disappear"); + DeepChangeTest.assertGC(ref, "MyOverall can now disappear"); assertNotNull(refStrong, "Submodel still used"); } @@ -216,24 +216,4 @@ public void runSafe(Runnable r) { throw new UnsupportedOperationException("Not supported yet."); } } - - private static void assertGC(Reference ref, String msg) throws InterruptedException { - for (int i = 0; i < 100; i++) { - if (isGone(ref)) { - return; - } - try { - System.gc(); - System.runFinalization(); - } catch (Error err) { - err.printStackTrace(); - } - } - throw new InterruptedException(msg); - } - - private static boolean isGone(Reference ref) { - return ref.get() == null; - } - } From 453783f4ac1b55e735f628b66aa7207fbf2bdd0a Mon Sep 17 00:00:00 2001 From: Jaroslav Tulach Date: Sat, 11 Jun 2022 15:32:39 +0200 Subject: [PATCH 4/5] Less deprecations --- .../org/netbeans/html/bootagent/KOFx.java | 2 +- .../org/netbeans/html/boot/fx/FXBrwsr.java | 1 + .../netbeans/html/boot/fx/FXGCPresenter.java | 9 +++++-- .../java/org/netbeans/html/boot/fx/KOFx.java | 2 +- .../net/java/html/boot/script/KOCase.java | 2 +- .../html/boot/script/KnockoutEnvJSTest.java | 12 +++++----- .../html/boot/script/ScriptEngineCase.java | 3 +-- .../html/boot/impl/JavaScriptProcesor.java | 7 +++--- .../html/boot/impl/JsClassLoaderBase.java | 9 +++---- .../html/presenters/browser/Browser.java | 10 ++++++-- .../html/presenters/browser/DynamicHTTP.java | 1 + .../html/presenters/browser/KOScript.java | 2 +- .../presenters/browser/KoBrowserTest.java | 4 ++-- .../presenters/browser/ServerFactories.java | 1 + generic/pom.xml | 1 + .../netbeans/html/presenters/spi/Generic.java | 2 +- .../html/presenters/spi/test/Case.java | 2 +- .../netbeans/html/geo/impl/GeoProcessor.java | 8 +++++-- .../netbeans/html/geo/impl/JsGLProvider.java | 2 +- html4j-maven-plugin/pom.xml | 3 ++- .../html/mojo/ProcessJsAnnotationsGradle.java | 4 +--- .../java/net/java/html/js/tests/Bodies.java | 7 +++++- .../net/java/html/js/tests/Factorial.java | 2 +- .../net/java/html/js/tests/GCBodyTest.java | 24 +++++++++---------- .../java/net/java/html/js/tests/JsUtils.java | 1 + .../java/html/json/tests/GCKnockoutTest.java | 12 ++++++---- .../java/html/json/tests/PhaseExecutor.java | 7 +++--- .../ko/felix/test/KnockoutFelixTCKImpl.java | 6 ++--- .../org/netbeans/html/ko/felix/test/KOFx.java | 2 +- .../ko/felix/test/KnockoutFelixAriesIT.java | 3 ++- .../html/ko/felix/test/KnockoutFelixIT.java | 3 ++- .../ko/osgi/test/KnockoutEquinoxTCKImpl.java | 8 +++---- .../org/netbeans/html/ko/osgi/test/KOFx.java | 2 +- .../html/ko/osgi/test/KnockoutEquinoxIT.java | 3 ++- .../org/netbeans/html/wstyrus/TyrusFX.java | 2 +- .../html/wstyrus/TyrusKnockoutTest.java | 12 +++++----- .../java/org/netbeans/html/ko4j/KOTech.java | 3 ++- .../java/org/netbeans/html/ko4j/KOFx.java | 2 +- .../netbeans/html/ko4j/KnockoutFXTest.java | 6 ++--- .../ko4j/OffThreadInitializationTest.java | 1 + .../html/presenters/render/Cocoa.java | 6 +++-- .../netbeans/html/presenters/render/GTK.java | 3 ++- .../netbeans/html/presenters/render/JSC.java | 2 +- .../netbeans/html/presenters/render/Show.java | 2 +- .../java/net/java/html/sound/AudioClip.java | 12 +++++----- webkit/pom.xml | 1 + .../presenters/webkit/WebKitPresenter.java | 1 + .../netbeans/html/presenters/webkit/Case.java | 2 +- .../presenters/webkit/GtkKnockoutTest.java | 6 ++--- .../java/org/netbeans/html/xhr4j/JsonFX.java | 2 +- .../netbeans/html/xhr4j/JsonKnockoutTest.java | 8 +++---- 51 files changed, 139 insertions(+), 99 deletions(-) diff --git a/boot-agent-test/src/test/java/org/netbeans/html/bootagent/KOFx.java b/boot-agent-test/src/test/java/org/netbeans/html/bootagent/KOFx.java index 190b202f..7d905c55 100644 --- a/boot-agent-test/src/test/java/org/netbeans/html/bootagent/KOFx.java +++ b/boot-agent-test/src/test/java/org/netbeans/html/bootagent/KOFx.java @@ -68,7 +68,7 @@ public synchronized void run() { boolean notify = true; try (var ctx = Fn.activate(p)) { if (inst == null) { - inst = m.getDeclaringClass().newInstance(); + inst = m.getDeclaringClass().getConstructor().newInstance(); } result = m.invoke(inst); if (result == null) { diff --git a/boot-fx/src/main/java/org/netbeans/html/boot/fx/FXBrwsr.java b/boot-fx/src/main/java/org/netbeans/html/boot/fx/FXBrwsr.java index 12c73a29..0856d6e8 100644 --- a/boot-fx/src/main/java/org/netbeans/html/boot/fx/FXBrwsr.java +++ b/boot-fx/src/main/java/org/netbeans/html/boot/fx/FXBrwsr.java @@ -137,6 +137,7 @@ public void start(Stage primaryStage) throws Exception { start(primaryStage, this.getParameters().getRaw().get(0)); } + @SuppressWarnings("unchecked") final void start(Stage primaryStage, String callee) { BorderPane r = new BorderPane(); Object[] arr = findInitialSize(callee); diff --git a/boot-fx/src/main/java/org/netbeans/html/boot/fx/FXGCPresenter.java b/boot-fx/src/main/java/org/netbeans/html/boot/fx/FXGCPresenter.java index a816725e..a265e4ed 100644 --- a/boot-fx/src/main/java/org/netbeans/html/boot/fx/FXGCPresenter.java +++ b/boot-fx/src/main/java/org/netbeans/html/boot/fx/FXGCPresenter.java @@ -101,8 +101,7 @@ private static void assertGC(Reference ref) { } try { - System.gc(); - System.runFinalization(); + forceGC(); } catch (Error err) { LOG.log(Level.INFO, "Problems during GCing attempt of " + ref.get(), err); } @@ -111,4 +110,10 @@ private static void assertGC(Reference ref) { LOG.log(Level.FINE, "Good: No GC of {1} for {0} ms.", new Object[]{took, ref.get()}); } + @SuppressWarnings("deprecation") + private static void forceGC() { + System.gc(); + System.runFinalization(); + } + } diff --git a/boot-fx/src/test/java/org/netbeans/html/boot/fx/KOFx.java b/boot-fx/src/test/java/org/netbeans/html/boot/fx/KOFx.java index 42d3de0c..345d9554 100644 --- a/boot-fx/src/test/java/org/netbeans/html/boot/fx/KOFx.java +++ b/boot-fx/src/test/java/org/netbeans/html/boot/fx/KOFx.java @@ -72,7 +72,7 @@ public synchronized void run() { try (var ctx = Fn.activate(p)) { assert ctx != null; if (inst == null) { - inst = m.getDeclaringClass().newInstance(); + inst = m.getDeclaringClass().getConstructor().newInstance(); } result = m.invoke(inst); if (result == null) { diff --git a/boot-script/src/test/java/net/java/html/boot/script/KOCase.java b/boot-script/src/test/java/net/java/html/boot/script/KOCase.java index 3f67ddae..9cf30eb4 100644 --- a/boot-script/src/test/java/net/java/html/boot/script/KOCase.java +++ b/boot-script/src/test/java/net/java/html/boot/script/KOCase.java @@ -75,7 +75,7 @@ public synchronized void run() { try (Closeable a = Fn.activate(p)) { assert a != null; if (inst == null) { - inst = m.getDeclaringClass().newInstance(); + inst = m.getDeclaringClass().getConstructor().newInstance(); } result = m.invoke(inst); if (result == null) { diff --git a/boot-script/src/test/java/net/java/html/boot/script/KnockoutEnvJSTest.java b/boot-script/src/test/java/net/java/html/boot/script/KnockoutEnvJSTest.java index c77f74aa..8c6107c5 100644 --- a/boot-script/src/test/java/net/java/html/boot/script/KnockoutEnvJSTest.java +++ b/boot-script/src/test/java/net/java/html/boot/script/KnockoutEnvJSTest.java @@ -199,7 +199,7 @@ public static void initialized() throws Exception { @Override public BrwsrCtx createContext() { - KO4J fx = new KO4J(browserContext); + KO4J fx = new KO4J(); TyrusContext tc = new TyrusContext(); Contexts.Builder cb = Contexts.newBuilder(). register(Technology.class, fx.knockout(), 10). @@ -225,19 +225,19 @@ public Object createJSON(Map values) { private static native void setProperty(Object json, String key, Object value); @Override - @JavaScriptBody(args = { "s", "args" }, body = """ - var f = new Function(s); + @JavaScriptBody(args = { "script", "args" }, body = """ + var f = new Function(script); return f.apply(null, args); """ ) - public native Object executeScript(String script, Object[] arguments); + public native Object executeScript(String script, Object[] args); private static String findBaseURL() { return baseUri.toString(); } @Override - public URI prepareURL(String content, String mimeType, String[] parameters) { + public String prepareWebResource(String content, String mimeType, String[] parameters) { try { final URL baseURL = new URL(findBaseURL()); StringBuilder sb = new StringBuilder(); @@ -253,7 +253,7 @@ public URI prepareURL(String content, String mimeType, String[] parameters) { URLConnection c = query.openConnection(); BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream())); URI connectTo = new URI(br.readLine()); - return connectTo; + return connectTo.toString(); } catch (IOException ex) { throw new IllegalStateException(ex); } catch (URISyntaxException ex) { diff --git a/boot-script/src/test/java/net/java/html/boot/script/ScriptEngineCase.java b/boot-script/src/test/java/net/java/html/boot/script/ScriptEngineCase.java index 409839a5..c3aca651 100644 --- a/boot-script/src/test/java/net/java/html/boot/script/ScriptEngineCase.java +++ b/boot-script/src/test/java/net/java/html/boot/script/ScriptEngineCase.java @@ -23,7 +23,6 @@ import java.lang.reflect.Method; import net.java.html.js.JavaScriptBody; import org.netbeans.html.boot.spi.Fn; -import org.netbeans.html.boot.impl.FnContext; import org.testng.IHookCallBack; import org.testng.IHookable; import org.testng.ITest; @@ -55,7 +54,7 @@ public String getTestName() { public synchronized void executeTest() throws Throwable { skipAsyncJavaTestWhenNoPromise(); // BEGIN: net.java.html.boot.script.ScriptEngineCase#run - Object instance = method.getDeclaringClass().newInstance();; + Object instance = method.getDeclaringClass().getConstructor().newInstance(); for (int round = 0;; round++) { try (var ctx = Fn.activate(p)) { assert ctx != null; diff --git a/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java b/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java index d5b76089..c6cee062 100644 --- a/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java +++ b/boot/src/main/java/org/netbeans/html/boot/impl/JavaScriptProcesor.java @@ -155,10 +155,11 @@ public boolean process(Set annotations, RoundEnvironment processGroup(roundEnv, msg); + generateCallbackClass(javacalls); + javacalls.clear(); if (roundEnv.processingOver()) { - generateCallbackClass(javacalls); generateJavaScriptBodyList(bodies); - javacalls.clear(); + bodies.clear(); } return true; } @@ -534,7 +535,7 @@ private void generateCallbackClass(Map> pr Map map = pkgEn.getValue(); StringBuilder source = new StringBuilder(); source.append("package ").append(pkgName).append(";\n"); - source.append("@java.lang.SuppressWarnings(\"all\")\n"); + source.append("@java.lang.SuppressWarnings({\"unchecked\", \"all\"})\n"); source.append("public final class $JsCallbacks$ {\n"); source.append(" static final $JsCallbacks$ VM = new $JsCallbacks$(null);\n"); source.append(" private final org.netbeans.html.boot.spi.Fn.Ref ref;\n"); diff --git a/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java b/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java index 04ca4621..79ca757f 100644 --- a/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java +++ b/boot/src/test/java/org/netbeans/html/boot/impl/JsClassLoaderBase.java @@ -76,7 +76,7 @@ public void assertClassDefined() { @Test public void instanceMethod() throws Throwable { Method plus = methodClass.getMethod("plusInst", int.class); - java.lang.Object inst = methodClass.newInstance(); + java.lang.Object inst = methodClass.getConstructor().newInstance(); try { assertEquals(plus.invoke(inst, 10), 10); } catch (InvocationTargetException ex) { @@ -94,7 +94,7 @@ public void assertClassDefined() { } @Test public void getThis() throws Throwable { - java.lang.Object th = methodClass.newInstance(); + java.lang.Object th = methodClass.getConstructor().newInstance(); Method st = methodClass.getMethod("getThis"); try { assertEquals(st.invoke(th), th); @@ -154,7 +154,7 @@ public void run() { @Test public void callJavaScriptMethodOnOwnClass() throws Throwable { try { - java.lang.Object thiz = methodClass.newInstance(); + java.lang.Object thiz = methodClass.getConstructor().newInstance(); Method st = methodClass.getMethod("returnYourSelf", methodClass); assertEquals(st.invoke(null, thiz), thiz, "Returns this"); } catch (InvocationTargetException ex) { @@ -172,6 +172,7 @@ public void run() { assertEquals(st.invoke(null, "42"), 42, "Meaning of JavaScript?"); } + @SuppressWarnings("unchecked") @Test public void passEnum() throws Throwable { Class enmClazz = methodClass.getDeclaredClasses()[0]; assertTrue(Enum.class.isAssignableFrom(enmClazz), "It is an enum: " + enmClazz); @@ -199,7 +200,7 @@ public void run() { @Test public void recordError() throws Throwable { Method st = methodClass.getMethod("recordError", java.lang.Object.class); - assertEquals(st.invoke(methodClass.newInstance(), "Hello"), "Hello", "The same parameter returned"); + assertEquals(st.invoke(methodClass.getConstructor().newInstance(), "Hello"), "Hello", "The same parameter returned"); } @Test public void plusOrMul() throws Throwable { diff --git a/browser/src/main/java/org/netbeans/html/presenters/browser/Browser.java b/browser/src/main/java/org/netbeans/html/presenters/browser/Browser.java index 13f7ece5..8ad888ea 100644 --- a/browser/src/main/java/org/netbeans/html/presenters/browser/Browser.java +++ b/browser/src/main/java/org/netbeans/html/presenters/browser/Browser.java @@ -204,6 +204,7 @@ public final void displayPage(URL page, Runnable onPageLoad) { } } + @SuppressWarnings("unchecked") static T raise(Class aClass, Exception ex) throws T { throw (T)ex; } @@ -357,7 +358,7 @@ public void service(HttpServer serv String prefix = "http://" + server.getServerName(rqst) + ":" + server.getServerPort(rqst) + "/"; Writer w = server.getWriter(rspns); server.setContentType(rspns, "text/html"); - final Command cmd = new Command(server, Browser.this, prefix); + final Command cmd = new Command<>(server, Browser.this, prefix); try { is = new InputStreamReader(page.openStream()); } catch (IOException ex) { @@ -403,7 +404,7 @@ public void service(HttpServer serv w.close(); } else if (path.equals("/command.js")) { String id = server.getParameter(rqst, "id"); - Command c = SESSIONS.get(id); + Command c = findCommand(id); if (c == null) { server.getWriter(rspns).write("No command for " + id); server.setStatus(rspns, 404); @@ -461,6 +462,11 @@ public void service(HttpServer serv } } + @SuppressWarnings("unchecked") + private Command findCommand(String id) { + return SESSIONS.get(id); + } + private void emitScript(Writer w, String prefix, String id) throws IOException { w.write("