You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by jt...@apache.org on 2020/03/31 17:44:02 UTC
[netbeans-html4j] 01/02: Record booting sequence and print the log
in case of timeout
This is an automated email from the ASF dual-hosted git repository.
jtulach pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans-html4j.git
commit c5449e128067ed7416248697907e29f6736145ff
Author: Jaroslav Tulach <ja...@apidesign.org>
AuthorDate: Tue Mar 31 19:24:31 2020 +0200
Record booting sequence and print the log in case of timeout
---
.../org/netbeans/html/presenters/spi/Generic.java | 98 ++++++++++++----------
.../html/presenters/spi/ProtoPresenterBuilder.java | 2 +-
.../netbeans/html/presenters/spi/ValueOfTest.java | 5 +-
.../html/presenters/spi/test/GenericTest.java | 2 +-
4 files changed, 56 insertions(+), 51 deletions(-)
diff --git a/generic/src/main/java/org/netbeans/html/presenters/spi/Generic.java b/generic/src/main/java/org/netbeans/html/presenters/spi/Generic.java
index df12a8b..1481efd 100644
--- a/generic/src/main/java/org/netbeans/html/presenters/spi/Generic.java
+++ b/generic/src/main/java/org/netbeans/html/presenters/spi/Generic.java
@@ -40,11 +40,12 @@ import java.util.NavigableSet;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import org.netbeans.html.boot.spi.Fn;
abstract class Generic implements Fn.Presenter, Fn.KeepAlive, Flushable {
- private String msg;
+ private StringBuilder msg;
private Item call;
private final NavigableSet<Exported> exported;
private final int key;
@@ -69,7 +70,22 @@ abstract class Generic implements Fn.Presenter, Fn.KeepAlive, Flushable {
return initialized;
}
- abstract void log(Level level, String msg, Object... args);
+ final void log(Level level, String msg, Object... args) {
+ StringBuilder sb = this.msg;
+ if (sb != null) {
+ for (int i = 0; i < args.length; i++) {
+ String txt = args[i] == null ? "null" : args[i].toString();
+ msg = msg.replace("{" + i + "}", txt);
+ }
+ synchronized (lock()) {
+ sb.append('[').append(level).append("] ");
+ sb.append(msg);
+ sb.append('\n');
+ }
+ }
+ handleLog(level, msg, args);
+ }
+ abstract void handleLog(Level level, String msg, Object... args);
@Texts({
"begin=try {\n"
@@ -165,43 +181,43 @@ abstract class Generic implements Fn.Presenter, Fn.KeepAlive, Flushable {
+ "\n impl.toVM = toVM;"
+ "\n impl.toVM('r', 'OK', 'Initialized', null, null);"
+ "\n})(this);",
-
+ "initializationProtocol=--- Initialization protocol ---\n",
"error=Cannot initialize DukeScript: @1",
"version=$version"
})
final void init() {
- if (msg != null) {
- for (;;) {
- try {
- log(Level.FINE, "Awaiting as of {0}", msg);
- initialized.await();
- log(Level.FINE, "Waiting is over");
- return;
- } catch (InterruptedException ex) {
- log(Level.INFO, "Interrupt", ex);
- }
+ if (initialized.getCount() == 0) {
+ return;
+ }
+ synchronized (lock()) {
+ if (initialized.getCount() == 0) {
+ return;
+ }
+ if (msg == null) {
+ this.msg = new StringBuilder(Strings.initializationProtocol());
+ callbackFn(new ProtoPresenterBuilder.OnPrepared() {
+ @Override
+ public void callbackIsPrepared(String clbk) {
+ log(Level.FINE, "callbackReady with {0}", clbk);
+ loadJS(Strings.begin(clbk).toString());
+ log(Level.FINE, "checking OK state");
+ loadJS(Strings.init(key, clbk).toString());
+ }
+ });
}
}
- this.msg = "";
- callbackFn(new ProtoPresenterBuilder.OnPrepared() {
- @Override
- public void callbackIsPrepared(String clbk) {
- log(Level.FINE, "callbackReady with {0}", clbk);
- loadJS(Strings.begin(clbk).toString());
- log(Level.FINE, "checking OK state");
- if (!assertOK()) {
- final CharSequence err = Strings.error(msg);
- log(Level.WARNING, "no OK: {0}", err);
- throw new IllegalStateException(err.toString());
+ for (int counter = 0;; counter++) {
+ try {
+ handleLog(Level.FINE, "Awaiting as of {0}", counter);
+ if (initialized.await(10, TimeUnit.SECONDS)) {
+ handleLog(Level.FINE, "Waiting is over");
+ return;
}
- log(Level.FINE, "assertOK");
-
- loadJS(Strings.init(key, clbk).toString());
-
- log(Level.FINE, "callbackReady: countingDown");
- initialized.countDown();
+ handleLog(Level.INFO, msg.toString());
+ } catch (InterruptedException ex) {
+ handleLog(Level.INFO, "Interrupt", ex);
}
- });
+ }
}
/** @return the name of the callback function */
@@ -589,8 +605,13 @@ abstract class Generic implements Fn.Presenter, Fn.KeepAlive, Flushable {
synchronized (lock()) {
if ("OK".equals(typeof)) {
log(Level.FINE, "init: {0}", res);
- this.msg = res;
lock().notifyAll();
+ if ("Initialized".equals(res)) {
+ log(Level.FINE, "callbackReady: countingDown");
+ handleLog(Level.FINE, msg.toString());
+ msg = null;
+ initialized.countDown();
+ }
return;
}
call.result(typeof, res);
@@ -746,19 +767,6 @@ abstract class Generic implements Fn.Presenter, Fn.KeepAlive, Flushable {
}
return ret;
}
-
- final boolean assertOK() {
- synchronized (lock()) {
- if (msg == null || msg.length() == 0) {
- try {
- lock().wait(10000);
- } catch (InterruptedException ex) {
- // OK, go on and check
- }
- }
- return "OK".equals(msg) || "Initialized".equals(msg);
- }
- }
private static Object[] adaptParams(Method toCall, List<Object> args) {
final Object[] arr = new Object[args.size()];
diff --git a/generic/src/main/java/org/netbeans/html/presenters/spi/ProtoPresenterBuilder.java b/generic/src/main/java/org/netbeans/html/presenters/spi/ProtoPresenterBuilder.java
index c510b86..f56b56b 100644
--- a/generic/src/main/java/org/netbeans/html/presenters/spi/ProtoPresenterBuilder.java
+++ b/generic/src/main/java/org/netbeans/html/presenters/spi/ProtoPresenterBuilder.java
@@ -244,7 +244,7 @@ public final class ProtoPresenterBuilder {
}
@Override
- void log(Level level, String msg, Object... args) {
+ void handleLog(Level level, String msg, Object... args) {
if (logger != null) {
logger.log(level.intValue(), msg, args);
}
diff --git a/generic/src/test/java/org/netbeans/html/presenters/spi/ValueOfTest.java b/generic/src/test/java/org/netbeans/html/presenters/spi/ValueOfTest.java
index 8f0338c..a19f983 100644
--- a/generic/src/test/java/org/netbeans/html/presenters/spi/ValueOfTest.java
+++ b/generic/src/test/java/org/netbeans/html/presenters/spi/ValueOfTest.java
@@ -18,9 +18,6 @@
*/
package org.netbeans.html.presenters.spi;
-import org.netbeans.html.presenters.spi.Level;
-import org.netbeans.html.presenters.spi.Generic;
-import org.netbeans.html.presenters.spi.ProtoPresenterBuilder;
import java.net.URL;
import static org.testng.Assert.*;
import org.testng.annotations.BeforeMethod;
@@ -31,7 +28,7 @@ public class ValueOfTest {
@BeforeMethod public void initInstance() {
p = new Generic(true, true, "type", "app") {
@Override
- void log(Level level, String msg, Object... args) {
+ void handleLog(Level level, String msg, Object... args) {
}
@Override
diff --git a/generic/src/test/java/org/netbeans/html/presenters/spi/test/GenericTest.java b/generic/src/test/java/org/netbeans/html/presenters/spi/test/GenericTest.java
index 180b538..9df6444 100644
--- a/generic/src/test/java/org/netbeans/html/presenters/spi/test/GenericTest.java
+++ b/generic/src/test/java/org/netbeans/html/presenters/spi/test/GenericTest.java
@@ -53,7 +53,7 @@ public class GenericTest extends JavaScriptTCK {
}
});
- List<Object> res = new ArrayList<Object>();
+ List<Object> res = new ArrayList<>();
Class<? extends Annotation> test =
loadClass().getClassLoader().loadClass(KOTest.class.getName()).
asSubclass(Annotation.class);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists