* This method sets {@link WebView#getUserData()} and {@link #runInBrowser(javafx.scene.web.WebView, java.lang.Runnable)}
* relies on the value. Please don't alter it.
+ *
+ * Since introduction of {@link Id technology identifiers} the
+ * provided args strings are also passed to the
+ * {@link BrwsrCtx context} when it is being
+ * {@link Contexts#newBuilder(java.lang.Object...) created}
+ * and can influence the selection
+ * of available technologies
+ * (like {@link org.netbeans.html.json.spi.Technology},
+ * {@link org.netbeans.html.json.spi.Transfer} or
+ * {@link org.netbeans.html.json.spi.WSTransfer}).
*
* @param webView the instance of Web View to tweak
* @param url the URL of the HTML page to load into the view
@@ -94,7 +106,10 @@
Class> onPageLoad, String methodName,
String... args
) {
- BrowserBuilder.newBrowser(new Load(webView)).
+ Object[] context = new Object[args.length + 1];
+ System.arraycopy(args, 0, context, 1, args.length);
+ context[0] = new Load(webView);
+ BrowserBuilder.newBrowser(context).
loadPage(url.toExternalForm()).
loadClass(onPageLoad).
invoke(methodName, args).
diff --git a/boot/src/main/java/net/java/html/boot/BrowserBuilder.java b/boot/src/main/java/net/java/html/boot/BrowserBuilder.java
--- a/boot/src/main/java/net/java/html/boot/BrowserBuilder.java
+++ b/boot/src/main/java/net/java/html/boot/BrowserBuilder.java
@@ -65,6 +65,7 @@
import org.netbeans.html.boot.spi.Fn;
import org.netbeans.html.boot.spi.Fn.Presenter;
import org.netbeans.html.context.spi.Contexts;
+import org.netbeans.html.context.spi.Contexts.Id;
import org.netbeans.html.boot.impl.FindResources;
import org.netbeans.html.boot.impl.FnContext;
import org.netbeans.html.boot.impl.FnUtils;
@@ -121,6 +122,15 @@
/** Entry method to obtain a new browser builder. Follow by calling
* its instance methods like {@link #loadClass(java.lang.Class)} and
* {@link #loadPage(java.lang.String)}.
+ * Since introduction of {@link Id technology identifiers} the
+ * provided context objects are also passed to the
+ * {@link BrwsrCtx context} when it is being
+ * {@link Contexts#newBuilder(java.lang.Object...) created}
+ * and can influence the selection
+ * of available technologies
+ * (like {@link org.netbeans.html.json.spi.Technology},
+ * {@link org.netbeans.html.json.spi.Transfer} or
+ * {@link org.netbeans.html.json.spi.WSTransfer}) by name.
*
* @param context any instances that should be available to the builder -
* implementation dependant
@@ -301,7 +311,7 @@
if (browserClass != null) {
browserClass[0] = newClazz;
}
- Contexts.Builder cb = Contexts.newBuilder();
+ Contexts.Builder cb = Contexts.newBuilder(context);
if (!Contexts.fillInByProviders(newClazz, cb)) {
LOG.log(Level.WARNING, "Using empty technology for {0}", newClazz);
}
diff --git a/context/src/main/java/net/java/html/BrwsrCtx.java b/context/src/main/java/net/java/html/BrwsrCtx.java
--- a/context/src/main/java/net/java/html/BrwsrCtx.java
+++ b/context/src/main/java/net/java/html/BrwsrCtx.java
@@ -47,6 +47,7 @@
import org.netbeans.html.context.impl.CtxAccssr;
import org.netbeans.html.context.impl.CtxImpl;
import org.netbeans.html.context.spi.Contexts;
+import org.netbeans.html.context.spi.Contexts.Id;
/** Represents context where the net.java.html.json.Model
* and other objects
@@ -54,7 +55,12 @@
* The context is also associated with the actual HTML technology
* in the HTML page - there is likely to be different context for
* knockout.js and different one
- * for angular.
+ * for angular. Since version 1.1
+ * the content of contexts can be selected by registering
+ * implementations under specific
+ * {@link Id technology identifiers} and requesting them during
+ * {@link Contexts#newBuilder(java.lang.Object...) construction} of the
+ * context.
*
* @author Jaroslav Tulach
*/
diff --git a/context/src/main/java/org/netbeans/html/context/impl/CtxImpl.java b/context/src/main/java/org/netbeans/html/context/impl/CtxImpl.java
--- a/context/src/main/java/org/netbeans/html/context/impl/CtxImpl.java
+++ b/context/src/main/java/org/netbeans/html/context/impl/CtxImpl.java
@@ -44,8 +44,10 @@
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
import java.util.List;
import net.java.html.BrwsrCtx;
+import org.netbeans.html.context.spi.Contexts;
/** Implementation detail. Holds list of technologies for particular
* {@link BrwsrCtx}.
@@ -54,13 +56,15 @@
*/
public final class CtxImpl {
private final List> techs;
+ private final Object[] context;
- public CtxImpl() {
- techs = new ArrayList>();
+ public CtxImpl(Object[] context) {
+ this(context, new ArrayList>());
}
- private CtxImpl(List> techs) {
+ private CtxImpl(Object[] context, List> techs) {
this.techs = techs;
+ this.context = context;
}
public static Tech find(BrwsrCtx context, Class technology) {
@@ -74,9 +78,9 @@
}
public BrwsrCtx build() {
- Collections.sort(techs);
+ Collections.sort(techs, new BindCompare());
final List> arr = Collections.unmodifiableList(techs);
- CtxImpl impl = new CtxImpl(arr);
+ CtxImpl impl = new CtxImpl(context, arr);
BrwsrCtx ctx = CtxAccssr.getDefault().newContext(impl);
return ctx;
}
@@ -85,7 +89,7 @@
techs.add(new Bind(type, impl, priority));
}
- private static final class Bind implements Comparable> {
+ private static final class Bind {
private final Class clazz;
private final Tech impl;
private final int priority;
@@ -97,16 +101,39 @@
}
@Override
- public int compareTo(Bind> o) {
- if (priority != o.priority) {
- return priority - o.priority;
- }
- return clazz.getName().compareTo(o.clazz.getName());
- }
-
- @Override
public String toString() {
return "Bind{" + "clazz=" + clazz + "@" + clazz.getClassLoader() + ", impl=" + impl + ", priority=" + priority + '}';
}
}
+
+ private final class BindCompare implements Comparator> {
+ boolean isPrefered(Bind> b) {
+ final Class> implClazz = b.impl.getClass();
+ Contexts.Id id = implClazz.getAnnotation(Contexts.Id.class);
+ if (id == null) {
+ return false;
+ }
+ for (String v : id.value()) {
+ for (Object c : context) {
+ if (v.equals(c)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public int compare(Bind> o1, Bind> o2) {
+ boolean p1 = isPrefered(o1);
+ boolean p2 = isPrefered(o2);
+ if (p1 != p2) {
+ return p1 ? -1 : 1;
+ }
+ if (o1.priority != o2.priority) {
+ return o1.priority - o2.priority;
+ }
+ return o1.clazz.getName().compareTo(o2.clazz.getName());
+ }
+ } // end of BindCompare
}
diff --git a/context/src/main/java/org/netbeans/html/context/spi/Contexts.java b/context/src/main/java/org/netbeans/html/context/spi/Contexts.java
--- a/context/src/main/java/org/netbeans/html/context/spi/Contexts.java
+++ b/context/src/main/java/org/netbeans/html/context/spi/Contexts.java
@@ -42,6 +42,10 @@
*/
package org.netbeans.html.context.spi;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
import java.util.ServiceLoader;
import net.java.html.BrwsrCtx;
import org.netbeans.html.context.impl.CtxImpl;
@@ -59,11 +63,23 @@
/** Creates new, empty builder for creation of {@link BrwsrCtx}. At the
* end call the {@link Builder#build()} method to generate the context.
- *
+ *
+ * @param context instances of various classes or names of {@link Id technologies}
+ * to be preferred and used in the built {@link BrwsrCtx context}.
+ * @return new instance of the builder
+ * @since 1.1
+ */
+ public static Builder newBuilder(Object... context) {
+ return new Builder(context);
+ }
+ /** Creates new, empty builder for creation of {@link BrwsrCtx}. At the
+ * end call the {@link Builder#build()} method to generate the context.
+ * Simply calls {@link #newBuilder(java.lang.Object...) newBuilder(new Object[0])}.
+ *
* @return new instance of the builder
*/
public static Builder newBuilder() {
- return new Builder();
+ return newBuilder(new Object[0]);
}
/** Seeks for the specified technology in the provided context.
@@ -118,6 +134,23 @@
}
return found;
}
+
+ /** Identifies the technologies passed to {@link Builder context builder}
+ * by a name. Each implementation of a technology
+ * {@link Builder#register(java.lang.Class, java.lang.Object, int) registered into a context}
+ * can be annotated with a name (or multiple names). Such implementation
+ * will later be
+ * {@link Contexts#fillInByProviders(java.lang.Class, org.netbeans.html.context.spi.Contexts.Builder) preferred during lookup}
+ * if their name(s) has been requested in when
+ * {@link Contexts#newBuilder(java.lang.Object...) creating a context}.
+ * @since 1.1
+ */
+ @Retention(RetentionPolicy.RUNTIME)
+ @Target(ElementType.TYPE)
+ public @interface Id {
+ /** Identifier(s) for the implementation. */
+ public String[] value();
+ }
/** Implementors of various HTML technologies should
* register their implementation via org.openide.util.lookup.ServiceProvider, so
@@ -152,9 +185,10 @@
* @author Jaroslav Tulach
*/
public static final class Builder {
- private final CtxImpl impl = new CtxImpl();
+ private final CtxImpl impl;
- Builder() {
+ public Builder(Object[] context) {
+ this.impl = new CtxImpl(context);
}
/** Registers new technology into the context. Each technology is
diff --git a/context/src/test/java/net/java/html/BrwsrCtxTest.java b/context/src/test/java/net/java/html/BrwsrCtxTest.java
--- a/context/src/test/java/net/java/html/BrwsrCtxTest.java
+++ b/context/src/test/java/net/java/html/BrwsrCtxTest.java
@@ -44,6 +44,7 @@
import org.netbeans.html.context.spi.Contexts;
import static org.testng.Assert.*;
+import org.testng.annotations.Test;
/**
*
@@ -72,4 +73,48 @@
assertTrue(arr[0], "Runnable was executed");
}
+
+ @Test public void defaultOrderOfRegistrations() {
+ BrwsrCtx ctx = registerRs(Contexts.newBuilder());
+ Class extends Runnable> clazz = Contexts.find(ctx, Runnable.class).getClass();
+ assertEquals(clazz, R1.class, "R1 is registered at value 10");
+ }
+
+ @Test public void preferOne() {
+ BrwsrCtx ctx = registerRs(Contexts.newBuilder("one"));
+ Class extends Runnable> clazz = Contexts.find(ctx, Runnable.class).getClass();
+ assertEquals(clazz, R1.class, "R1 is registered at value 10");
+ }
+
+ @Test public void preferTwo() {
+ BrwsrCtx ctx = registerRs(Contexts.newBuilder("two"));
+ Class extends Runnable> clazz = Contexts.find(ctx, Runnable.class).getClass();
+ assertEquals(clazz, R2.class, "R2 is preferred");
+ }
+
+ @Test public void preferBoth() {
+ BrwsrCtx ctx = registerRs(Contexts.newBuilder("one", "two"));
+ Class extends Runnable> clazz = Contexts.find(ctx, Runnable.class).getClass();
+ assertEquals(clazz, R1.class, "R1 is registered at value 10");
+ }
+
+ private static BrwsrCtx registerRs(Contexts.Builder b) {
+ b.register(Runnable.class, new R1(), 10);
+ b.register(Runnable.class, new R2(), 20);
+ return b.build();
+ }
+
+ @Contexts.Id("one")
+ static final class R1 implements Runnable {
+ @Override
+ public void run() {
+ }
+ }
+ @Contexts.Id("two")
+ static final class R2 implements Runnable {
+ @Override
+ public void run() {
+ }
+ }
+
}
\ No newline at end of file
diff --git a/json/src/main/java/org/netbeans/html/json/spi/Technology.java b/json/src/main/java/org/netbeans/html/json/spi/Technology.java
--- a/json/src/main/java/org/netbeans/html/json/spi/Technology.java
+++ b/json/src/main/java/org/netbeans/html/json/spi/Technology.java
@@ -45,10 +45,17 @@
import net.java.html.BrwsrCtx;
import net.java.html.json.Model;
import net.java.html.json.Models;
+import org.netbeans.html.context.spi.Contexts.Id;
/** An implementation of a binding between model classes (see {@link Model})
* and particular technology like knockout.js
* in a browser window, etc.
+ * Since introduction of {@link Id technology identifiers} one can choose between
+ * different background implementations to handle the conversion and
+ * communication requests. The currently known provider is
+ * org.netbeans.html:ko4j module which registers
+ * a knockout.js
+ * implementation called ko4j.
*
* @author Jaroslav Tulach
*/
diff --git a/json/src/main/java/org/netbeans/html/json/spi/Transfer.java b/json/src/main/java/org/netbeans/html/json/spi/Transfer.java
--- a/json/src/main/java/org/netbeans/html/json/spi/Transfer.java
+++ b/json/src/main/java/org/netbeans/html/json/spi/Transfer.java
@@ -45,9 +45,17 @@
import java.io.IOException;
import java.io.InputStream;
import org.netbeans.html.context.spi.Contexts.Builder;
+import org.netbeans.html.context.spi.Contexts.Id;
/** A {@link Builder service provider interface} responsible for
* conversion of JSON objects to Java ones and vice-versa.
+ * Since introduction of {@link Id technology identifiers} one can choose between
+ * different background implementations to handle the conversion and
+ * communication requests. The known providers include
+ * org.netbeans.html:ko4j module which registers
+ * a native browser implementation called xhr, and a
+ * org.netbeans.html:ko-ws-tyrus module which registers
+ * Java based implementation named tyrus.
*
* @author Jaroslav Tulach
*/
diff --git a/json/src/main/java/org/netbeans/html/json/spi/WSTransfer.java b/json/src/main/java/org/netbeans/html/json/spi/WSTransfer.java
--- a/json/src/main/java/org/netbeans/html/json/spi/WSTransfer.java
+++ b/json/src/main/java/org/netbeans/html/json/spi/WSTransfer.java
@@ -44,9 +44,17 @@
import net.java.html.BrwsrCtx;
import org.netbeans.html.context.spi.Contexts.Provider;
+import org.netbeans.html.context.spi.Contexts.Id;
/** Interface for providers of WebSocket protocol. Register into a
- * {@link BrwsrCtx context} in your own {@link Provider}
+ * {@link BrwsrCtx context} in your own {@link Provider}.
+ * Since introduction of {@link Id technology identifiers} one can choose between
+ * different background implementations to handle the conversion and
+ * communication requests. The known providers include
+ * org.netbeans.html:ko4j module which registers
+ * a native browser implementation called websocket, and a
+ * org.netbeans.html:ko-ws-tyrus module which registers
+ * Java based implementation named tyrus.
*
* @author Jaroslav Tulach
* @param internal implementation type representing the socket
diff --git a/ko-felix-test/src/main/java/org/netbeans/html/ko/felix/test/KnockoutFelixTCKImpl.java b/ko-felix-test/src/main/java/org/netbeans/html/ko/felix/test/KnockoutFelixTCKImpl.java
--- a/ko-felix-test/src/main/java/org/netbeans/html/ko/felix/test/KnockoutFelixTCKImpl.java
+++ b/ko-felix-test/src/main/java/org/netbeans/html/ko/felix/test/KnockoutFelixTCKImpl.java
@@ -46,6 +46,7 @@
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
@@ -140,16 +141,9 @@
@Override
public BrwsrCtx createContext() {
try {
- Class> fxCls = loadOSGiClass(
- "org.netbeans.html.ko4j.FXContext",
- FrameworkUtil.getBundle(KnockoutFelixTCKImpl.class).getBundleContext()
- );
- final Constructor> cnstr = fxCls.getConstructor(Fn.Presenter.class);
- cnstr.setAccessible(true);
- Object fx = cnstr.newInstance(browserContext);
Contexts.Builder cb = Contexts.newBuilder().
- register(Technology.class, (Technology)fx, 10).
- register(Transfer.class, (Transfer)fx, 10).
+ register(Technology.class, (Technology)osgiInstance("KOTech"), 10).
+ register(Transfer.class, (Transfer)osgiInstance("KOTransfer"), 10).
register(Executor.class, (Executor)browserContext, 10);
// if (fx.areWebSocketsSupported()) {
// cb.register(WSTransfer.class, fx, 10);
@@ -160,6 +154,17 @@
}
}
+ private Object osgiInstance(String simpleName) throws IllegalAccessException, SecurityException, IllegalArgumentException, Exception, NoSuchMethodException, InstantiationException, InvocationTargetException {
+ Class> fxCls = loadOSGiClass(
+ "org.netbeans.html.ko4j." + simpleName,
+ FrameworkUtil.getBundle(KnockoutFelixTCKImpl.class).getBundleContext()
+ );
+ final Constructor> cnstr = fxCls.getDeclaredConstructor();
+ cnstr.setAccessible(true);
+ Object fx = cnstr.newInstance();
+ return fx;
+ }
+
@Override
public Object createJSON(Map values) {
JSONObject json = new JSONObject();
diff --git a/ko-osgi-test/src/main/java/org/netbeans/html/ko/osgi/test/KnockoutEquinoxTCKImpl.java b/ko-osgi-test/src/main/java/org/netbeans/html/ko/osgi/test/KnockoutEquinoxTCKImpl.java
--- a/ko-osgi-test/src/main/java/org/netbeans/html/ko/osgi/test/KnockoutEquinoxTCKImpl.java
+++ b/ko-osgi-test/src/main/java/org/netbeans/html/ko/osgi/test/KnockoutEquinoxTCKImpl.java
@@ -46,6 +46,7 @@
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
@@ -135,16 +136,9 @@
@Override
public BrwsrCtx createContext() {
try {
- Class> fxCls = loadOSGiClass(
- "org.netbeans.html.ko4j.FXContext",
- FrameworkUtil.getBundle(KnockoutEquinoxTCKImpl.class).getBundleContext()
- );
- final Constructor> cnstr = fxCls.getConstructor(Fn.Presenter.class);
- cnstr.setAccessible(true);
- Object fx = cnstr.newInstance(browserContext);
Contexts.Builder cb = Contexts.newBuilder().
- register(Technology.class, (Technology)fx, 10).
- register(Transfer.class, (Transfer)fx, 10).
+ register(Technology.class, (Technology)osgiInstance("KOTech"), 10).
+ register(Transfer.class, (Transfer)osgiInstance("KOTransfer"), 10).
register(Executor.class, (Executor)browserContext, 10);
// if (fx.areWebSocketsSupported()) {
// cb.register(WSTransfer.class, fx, 10);
@@ -154,6 +148,16 @@
throw new IllegalStateException(ex);
}
}
+ private Object osgiInstance(String simpleName) throws IllegalAccessException, SecurityException, IllegalArgumentException, Exception, NoSuchMethodException, InstantiationException, InvocationTargetException {
+ Class> fxCls = loadOSGiClass(
+ "org.netbeans.html.ko4j." + simpleName,
+ FrameworkUtil.getBundle(KnockoutEquinoxTCKImpl.class).getBundleContext()
+ );
+ final Constructor> cnstr = fxCls.getDeclaredConstructor();
+ cnstr.setAccessible(true);
+ Object fx = cnstr.newInstance();
+ return fx;
+ }
@Override
public Object createJSON(Map values) {
diff --git a/ko-ws-tyrus/src/main/java/org/netbeans/html/wstyrus/TyrusContext.java b/ko-ws-tyrus/src/main/java/org/netbeans/html/wstyrus/TyrusContext.java
--- a/ko-ws-tyrus/src/main/java/org/netbeans/html/wstyrus/TyrusContext.java
+++ b/ko-ws-tyrus/src/main/java/org/netbeans/html/wstyrus/TyrusContext.java
@@ -82,6 +82,7 @@
*
* @author Jaroslav Tulach
*/
+@Contexts.Id("tyrus")
@ServiceProvider(service = Contexts.Provider.class)
public final class TyrusContext
implements Contexts.Provider, WSTransfer, Transfer {
diff --git a/ko4j/src/main/java/org/netbeans/html/ko4j/KO4J.java b/ko4j/src/main/java/org/netbeans/html/ko4j/KO4J.java
--- a/ko4j/src/main/java/org/netbeans/html/ko4j/KO4J.java
+++ b/ko4j/src/main/java/org/netbeans/html/ko4j/KO4J.java
@@ -42,7 +42,9 @@
*/
package org.netbeans.html.ko4j;
+import java.util.logging.Logger;
import net.java.html.json.Model;
+import net.java.html.json.OnReceive;
import org.netbeans.html.boot.spi.Fn;
import org.netbeans.html.context.spi.Contexts;
import org.netbeans.html.context.spi.Contexts.Provider;
@@ -54,35 +56,49 @@
/** Support for knockout.js
* and its Java binding via {@link Model model classes}.
* Registers {@link Provider}, so {@link java.util.ServiceLoader} can find it.
+ * The provider registers following technologies:
+ *
+ *
ko4j - bindings for knockout.js
+ * and the classes generated by the {@link Model} annotation.
+ *
+ *
xhr - XMLHttpRequest
+ * based implementation for REST calls
+ * (GET, PUT, POST, DELETE methods)
+ * for {@link OnReceive} annotation.
+ *
+ *
websocket -
+ * native browser websockets
+ * based implementation for {@link OnReceive} annotation and its WebSocket
+ * subprotocol.
+ *
+ *
*
* @author Jaroslav Tulach
* @since 0.7
*/
@ServiceProvider(service = Provider.class)
public final class KO4J implements Provider {
- private final Fn.Presenter presenter;
- private FXContext c;
+ static final Logger LOG = Logger.getLogger(KOSockets.class.getName());
+ private KOTech ko4j;
+ private KOTransfer trans;
+ private KOSockets socks;
public KO4J() {
this(null);
}
-
+
+ @Deprecated
public KO4J(Fn.Presenter presenter) {
- this.presenter = presenter;
- }
-
- private FXContext getKO() {
- if (c == null) {
- c = new FXContext(presenter == null ? Fn.activePresenter() : presenter);
- }
- return c;
}
/** Return instance of the knockout.js for Java technology.
* @return non-null instance
*/
public Technology knockout() {
- return getKO();
+ if (ko4j == null) {
+ ko4j = new KOTech();
+ }
+ return ko4j;
}
/** Browser based implementation of transfer interface. Uses
@@ -91,7 +107,10 @@
* @return non-null instance
*/
public Transfer transfer() {
- return getKO();
+ if (trans == null) {
+ trans = new KOTransfer();
+ }
+ return trans;
}
/** Returns browser based implementation of websocket transfer.
@@ -102,7 +121,13 @@
* WebSocket object in the browser
*/
public WSTransfer> websockets() {
- return getKO().areWebSocketsSupported() ? getKO() : null;
+ if (!KOSockets.areWebSocketsSupported()) {
+ return null;
+ }
+ if (socks == null) {
+ socks = new KOSockets();
+ }
+ return socks;
}
/** Registers technologies at position 100:
diff --git a/ko4j/src/main/java/org/netbeans/html/ko4j/FXContext.java b/ko4j/src/main/java/org/netbeans/html/ko4j/KOSockets.java
rename from ko4j/src/main/java/org/netbeans/html/ko4j/FXContext.java
rename to ko4j/src/main/java/org/netbeans/html/ko4j/KOSockets.java
--- a/ko4j/src/main/java/org/netbeans/html/ko4j/FXContext.java
+++ b/ko4j/src/main/java/org/netbeans/html/ko4j/KOSockets.java
@@ -42,20 +42,9 @@
*/
package org.netbeans.html.ko4j;
-import java.io.ByteArrayOutputStream;
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.net.URL;
-import java.util.logging.Logger;
-import org.netbeans.html.boot.spi.Fn;
-import org.netbeans.html.json.spi.FunctionBinding;
+import net.java.html.js.JavaScriptBody;
+import org.netbeans.html.context.spi.Contexts;
import org.netbeans.html.json.spi.JSONCall;
-import org.netbeans.html.json.spi.PropertyBinding;
-import org.netbeans.html.json.spi.Technology;
-import org.netbeans.html.json.spi.Transfer;
import org.netbeans.html.json.spi.WSTransfer;
/** This is an implementation package - just
@@ -65,134 +54,13 @@
*
* @author Jaroslav Tulach
*/
-final class FXContext
-implements Technology.BatchInit
+
What's New in Version 1.1?
+
+
+ The content of a {@link net.java.html.BrwsrCtx context}
+ can be selected by registering implementations under specific
+ {@link org.netbeans.html.context.spi.Contexts.Id technology identifiers}
+ and requesting them during
+ {@link org.netbeans.html.context.spi.Contexts#newBuilder(java.lang.Object...) construction}
+ of the context. org.netbeans.html:ko4j module's implementation
+ offers ko4j, xhr and websocket identifiers
+ for its registered services
+ (e.g. {@link org.netbeans.html.json.spi.Technology},
+ {@link org.netbeans.html.json.spi.Transfer} and
+ {@link org.netbeans.html.json.spi.WSTransfer}).
+ org.netbeans.html:ko-ws-tyrus
+ module registers its
+ {@link org.netbeans.html.json.spi.Transfer Java based JSON} and
+ {@link org.netbeans.html.json.spi.WSTransfer WebSocket} implementations
+ under the name tyrus.
+