Reputation: 22379
Is it possible to log to the java console?
I've tried to supply an object with a method on it to use for logging but nothing shows up in debug console.
Am I missing something?
window.setMember("mylog", new Console());
execute("mylog.log('11111111'))
public class Console {
public void log(Object ... objects) {
Logger...get..then..log(obj);
}
}
Is there a better way to log to the Java console ?
This is not working.
Upvotes: -1
Views: 172
Reputation: 22379
Unfortunately, my code relies on a number of libraries and I am unable to push the solution to the UI4J repo.
It basically overrides the normal console.log and works similarly. It intentionally avoids to JSON.stringify(object) since circular dependencies can cause serious issues.
The code:
import netscape.javascript.JSObject;
import momomo.com.Opensource.sources.Functional.lambdas.version.interfaces.Lambda;
....
try {
this.page = navigate( IO.toString(file) );
putConsole();
}
finally {
IO.remove(file);
}
private void putConsole() {
// Note that we call log using the entire arguments ( array )
execute("console.log = function() {" +
put(CONSOLE) + ".log(arguments);" +
"};");
}
}
private static final Console CONSOLE = new Console();
public static final class Console {
public void log(JSObject js) {
StringBuilder sb = new StringBuilder();
iterate(js, (o) -> {
sb.append(o).append(" ");
});
$Log.info(Console.class, sb.toString());
}
}
public static void iterate(JSObject js, Lambda.V1<Object> lambda) {
iterate(js, lambda.R1());
}
public static void iterate(JSObject js, Lambda.R1<Boolean, Object> lambda) {
if ( js != null ) {
Object member;
int i = 0;
while (true) {
member = js.getSlot(i);
if ( "undefined".equals(member) || Is.False( lambda.call(member) ) ) {
return;
}
i++;
}
}
}
Outdated but useful Lambda.java reference:
Note that put(CONSOLE) call above, basically calls execute("window").setMember("key", new Console()), so there is no magic there, although I have some other logic to achive the same result.
Upvotes: 0