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 2017/09/03 12:48:48 UTC

[15/24] incubator-netbeans-html4j git commit: [INFRA-15006] Initial donation of HTML/Java NetBeans API. Equivalent to the content of html4j-donation-review.zip donated as part of ApacheNetBeansDonation1.zip with SHA256 being 7f2ca0f61953a190613c9a0fbcc1b

http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/geo/src/test/java/org/netbeans/html/geo/impl/Compile.java
----------------------------------------------------------------------
diff --git a/geo/src/test/java/org/netbeans/html/geo/impl/Compile.java b/geo/src/test/java/org/netbeans/html/geo/impl/Compile.java
new file mode 100644
index 0000000..69c0273
--- /dev/null
+++ b/geo/src/test/java/org/netbeans/html/geo/impl/Compile.java
@@ -0,0 +1,286 @@
+/**
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * Contributor(s):
+ *
+ * The Original Software is NetBeans. The Initial Developer of the Original
+ * Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved.
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ */
+package org.netbeans.html.geo.impl;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.tools.Diagnostic;
+import javax.tools.DiagnosticListener;
+import javax.tools.FileObject;
+import javax.tools.ForwardingJavaFileManager;
+import javax.tools.JavaFileManager;
+import javax.tools.JavaFileObject;
+import javax.tools.JavaFileObject.Kind;
+import javax.tools.SimpleJavaFileObject;
+import javax.tools.StandardJavaFileManager;
+import javax.tools.StandardLocation;
+import javax.tools.ToolProvider;
+import static org.testng.Assert.*;
+
+/**
+ *
+ * @author Jaroslav Tulach
+ */
+final class Compile implements DiagnosticListener<JavaFileObject> {
+    private final List<Diagnostic<? extends JavaFileObject>> errors = 
+            new ArrayList<Diagnostic<? extends JavaFileObject>>();
+    private final Map<String, byte[]> classes;
+    private final String pkg;
+    private final String cls;
+    private final String html;
+    private final String sourceLevel;
+
+    private Compile(String html, String code, String sl) throws IOException {
+        this.pkg = findPkg(code);
+        this.cls = findCls(code);
+        this.html = html;
+        this.sourceLevel = sl;
+        classes = compile(html, code);
+    }
+
+    /** Performs compilation of given HTML page and associated Java code
+     */
+    public static Compile create(String html, String code) throws IOException {
+        return create(html, code, "1.7");
+    }
+    static Compile create(String html, String code, String sourceLevel) throws IOException {
+        return new Compile(html, code, sourceLevel);
+    }
+    
+    /** Checks for given class among compiled resources */
+    public byte[] get(String res) {
+        return classes.get(res);
+    }
+    
+    /** Obtains errors created during compilation.
+     */
+    public List<Diagnostic<? extends JavaFileObject>> getErrors() {
+        List<Diagnostic<? extends JavaFileObject>> err;
+        err = new ArrayList<Diagnostic<? extends JavaFileObject>>();
+        for (Diagnostic<? extends JavaFileObject> diagnostic : errors) {
+            if (diagnostic.getKind() == Diagnostic.Kind.ERROR) {
+                err.add(diagnostic);
+            }
+        }
+        return err;
+    }
+    
+    private Map<String, byte[]> compile(final String html, final String code) throws IOException {
+        StandardJavaFileManager sjfm = ToolProvider.getSystemJavaCompiler().getStandardFileManager(this, null, null);
+
+        final Map<String, ByteArrayOutputStream> class2BAOS;
+        class2BAOS = new HashMap<String, ByteArrayOutputStream>();
+
+        JavaFileObject file = new SimpleJavaFileObject(URI.create("mem://mem"), Kind.SOURCE) {
+            @Override
+            public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
+                return code;
+            }
+        };
+        final JavaFileObject htmlFile = new SimpleJavaFileObject(URI.create("mem://mem2"), Kind.OTHER) {
+            @Override
+            public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
+                return html;
+            }
+
+            @Override
+            public InputStream openInputStream() throws IOException {
+                return new ByteArrayInputStream(html.getBytes());
+            }
+        };
+        
+        final URI scratch;
+        try {
+            scratch = new URI("mem://mem3");
+        } catch (URISyntaxException ex) {
+            throw new IOException(ex);
+        }
+        
+        JavaFileManager jfm = new ForwardingJavaFileManager<JavaFileManager>(sjfm) {
+            @Override
+            public JavaFileObject getJavaFileForOutput(Location location, String className, Kind kind, FileObject sibling) throws IOException {
+                if (kind  == Kind.CLASS) {
+                    final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+
+                    class2BAOS.put(className.replace('.', '/') + ".class", buffer);
+                    return new SimpleJavaFileObject(sibling.toUri(), kind) {
+                        @Override
+                        public OutputStream openOutputStream() throws IOException {
+                            return buffer;
+                        }
+                    };
+                }
+                
+                if (kind == Kind.SOURCE) {
+                    final String n = className.replace('.', '/') + ".java";
+                    final URI un;
+                    try {
+                        un = new URI("mem://" + n);
+                    } catch (URISyntaxException ex) {
+                        throw new IOException(ex);
+                    }
+                    return new VirtFO(un/*sibling.toUri()*/, kind, n);
+                }
+                
+                throw new IllegalStateException();
+            }
+
+            @Override
+            public FileObject getFileForInput(Location location, String packageName, String relativeName) throws IOException {
+                if (location == StandardLocation.SOURCE_PATH) {
+                    if (packageName.equals(pkg)) {
+                        return htmlFile;
+                    }
+                }
+                
+                return null;
+            }
+
+            @Override
+            public boolean isSameFile(FileObject a, FileObject b) {
+                if (a instanceof VirtFO && b instanceof VirtFO) {
+                    return ((VirtFO)a).getName().equals(((VirtFO)b).getName());
+                }
+                
+                return super.isSameFile(a, b);
+            }
+
+            class VirtFO extends SimpleJavaFileObject {
+
+                private final String n;
+
+                public VirtFO(URI uri, Kind kind, String n) {
+                    super(uri, kind);
+                    this.n = n;
+                }
+                private final ByteArrayOutputStream data = new ByteArrayOutputStream();
+
+                @Override
+                public OutputStream openOutputStream() throws IOException {
+                    return data;
+                }
+
+                @Override
+                public String getName() {
+                    return n;
+                }
+
+                @Override
+                public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException {
+                    data.close();
+                    return new String(data.toByteArray());
+                }
+            }
+        };
+
+        ToolProvider.getSystemJavaCompiler().getTask(null, jfm, this, /*XXX:*/Arrays.asList("-source", sourceLevel, "-target", "1.7"), null, Arrays.asList(file)).call();
+
+        Map<String, byte[]> result = new HashMap<String, byte[]>();
+
+        for (Map.Entry<String, ByteArrayOutputStream> e : class2BAOS.entrySet()) {
+            result.put(e.getKey(), e.getValue().toByteArray());
+        }
+
+        return result;
+    }
+
+
+    @Override
+    public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
+        errors.add(diagnostic);
+    }
+    private static String findPkg(String java) throws IOException {
+        Pattern p = Pattern.compile("package\\p{javaWhitespace}*([\\p{Alnum}\\.]+)\\p{javaWhitespace}*;", Pattern.MULTILINE);
+        Matcher m = p.matcher(java);
+        if (!m.find()) {
+            throw new IOException("Can't find package declaration in the java file");
+        }
+        String pkg = m.group(1);
+        return pkg;
+    }
+    private static String findCls(String java) throws IOException {
+        Pattern p = Pattern.compile("class\\p{javaWhitespace}*([\\p{Alnum}\\.]+)\\p{javaWhitespace}", Pattern.MULTILINE);
+        Matcher m = p.matcher(java);
+        if (!m.find()) {
+            throw new IOException("Can't find package declaration in the java file");
+        }
+        String cls = m.group(1);
+        return cls;
+    }
+
+    String getHtml() {
+        String fqn = "'" + pkg + '.' + cls + "'";
+        return html.replace("'${fqn}'", fqn);
+    }
+
+    void assertErrors() {
+        assertFalse(getErrors().isEmpty(), "There are supposed to be some errors");
+    }
+
+    void assertError(String expMsg) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("Can't find ").append(expMsg).append(" among:");
+        for (Diagnostic<? extends JavaFileObject> e : errors) {
+            String msg = e.getMessage(Locale.US);
+            if (msg.contains(expMsg)) {
+                return;
+            }
+            sb.append("\n");
+            sb.append(msg);
+        }
+        fail(sb.toString());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/geo/src/test/java/org/netbeans/html/geo/impl/GeoProcessorTest.java
----------------------------------------------------------------------
diff --git a/geo/src/test/java/org/netbeans/html/geo/impl/GeoProcessorTest.java b/geo/src/test/java/org/netbeans/html/geo/impl/GeoProcessorTest.java
new file mode 100644
index 0000000..8ef0846
--- /dev/null
+++ b/geo/src/test/java/org/netbeans/html/geo/impl/GeoProcessorTest.java
@@ -0,0 +1,114 @@
+/**
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * Contributor(s):
+ *
+ * The Original Software is NetBeans. The Initial Developer of the Original
+ * Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved.
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ */
+package org.netbeans.html.geo.impl;
+
+import java.io.IOException;
+import org.testng.annotations.Test;
+
+/** Test whether the annotation processor detects errors correctly.
+ *
+ * @author Jaroslav Tulach
+ */
+public class GeoProcessorTest {
+    
+    public GeoProcessorTest() {
+    }
+
+    @Test public void onLocationMethodHasToTakePositionParameter() throws IOException {
+        Compile res = Compile.create("", "package x;\n"
+            + "class UseOnLocation {\n"
+            + "  @net.java.html.geo.OnLocation\n"
+            + "  public static void cantCallMe() {}\n"
+            + "}\n"
+        );
+        res.assertErrors();
+        res.assertError("first argument must be net.java.html.geo.Position");
+    }
+    
+    @Test public void onLocationMethodCannotBePrivate() throws IOException {
+        Compile res = Compile.create("", "package x;\n"
+            + "class UseOnLocation {\n"
+            + "  @net.java.html.geo.OnLocation\n"
+            + "  private static void cantCallMe(net.java.html.geo.Position p) {}\n"
+            + "}\n"
+        );
+        res.assertErrors();
+        res.assertError("cannot be private");
+    }
+    
+    @Test public void onErrorHasToExist() throws IOException {
+        Compile res = Compile.create("", "package x;\n"
+            + "class UseOnLocation {\n"
+            + "  @net.java.html.geo.OnLocation(onError=\"doesNotExist\")\n"
+            + "  static void cantCallMe(net.java.html.geo.Position p) {}\n"
+            + "}\n"
+        );
+        res.assertErrors();
+        res.assertError("not find doesNotExist");
+    }
+
+    @Test public void onErrorWouldHaveToBeStatic() throws IOException {
+        Compile res = Compile.create("", "package x;\n"
+            + "class UseOnLocation {\n"
+            + "  @net.java.html.geo.OnLocation(onError=\"notStatic\")\n"
+            + "  static void cantCallMe(net.java.html.geo.Position p) {}\n"
+            + "  void notStatic(Exception e) {}\n"
+            + "}\n"
+        );
+        res.assertErrors();
+        res.assertError("have to be static");
+    }
+
+    @Test public void onErrorMustAcceptExceptionArgument() throws IOException {
+        Compile res = Compile.create("", "package x;\n"
+            + "class UseOnLocation {\n"
+            + "  @net.java.html.geo.OnLocation(onError=\"notStatic\")\n"
+            + "  static void cantCallMe(net.java.html.geo.Position p) {}\n"
+            + "  static void notStatic(java.io.IOException e) {}\n"
+            + "}\n"
+        );
+        res.assertErrors();
+        res.assertError("Error method first argument needs to be Exception");
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/geo/src/test/java/org/netbeans/html/geo/impl/JsGLProviderTest.java
----------------------------------------------------------------------
diff --git a/geo/src/test/java/org/netbeans/html/geo/impl/JsGLProviderTest.java b/geo/src/test/java/org/netbeans/html/geo/impl/JsGLProviderTest.java
new file mode 100644
index 0000000..d2a73a4
--- /dev/null
+++ b/geo/src/test/java/org/netbeans/html/geo/impl/JsGLProviderTest.java
@@ -0,0 +1,76 @@
+/**
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * Contributor(s):
+ *
+ * The Original Software is NetBeans. The Initial Developer of the Original
+ * Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved.
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ */
+package org.netbeans.html.geo.impl;
+
+import net.java.html.geo.Position;
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+
+/**
+ *
+ * @author Jaroslav Tulach <jt...@netbeans.org>
+ */
+public class JsGLProviderTest extends Position.Handle {
+    public JsGLProviderTest() {
+        super(true);
+    }
+
+    @Test public void checkWhetherWeCanInstantiate() {
+        assertNotNull(new JsGLProvider());
+    }
+
+    @Test public void canCallIsSupported() {
+        assertFalse(isSupported(), "Well, it is not, as we are not in a browser context");
+    }
+
+    @Override
+    protected void onLocation(Position p) throws Throwable {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected void onError(Exception ex) throws Throwable {
+        throw new UnsupportedOperationException();
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/geo/src/test/java/org/netbeans/html/geo/spi/CoordImplTest.java
----------------------------------------------------------------------
diff --git a/geo/src/test/java/org/netbeans/html/geo/spi/CoordImplTest.java b/geo/src/test/java/org/netbeans/html/geo/spi/CoordImplTest.java
new file mode 100644
index 0000000..01f1b31
--- /dev/null
+++ b/geo/src/test/java/org/netbeans/html/geo/spi/CoordImplTest.java
@@ -0,0 +1,106 @@
+/**
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * Contributor(s):
+ *
+ * The Original Software is NetBeans. The Initial Developer of the Original
+ * Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved.
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ */
+package org.netbeans.html.geo.spi;
+
+import static org.testng.Assert.*;
+import org.testng.annotations.Test;
+
+/**
+ *
+ * @author Jaroslav Tulach
+ */
+public class CoordImplTest extends GLProvider<Double, Object> {
+    
+    public CoordImplTest() {
+    }
+    @Test public void testGetLatitude() {
+        CoordImpl<Double> c = new CoordImpl<Double>(50.5, this);
+        assertEquals(c.getLatitude(), 50.5, 0.1, "Latitude returned as provided");
+    }
+
+    @Override
+    protected Object start(Query c) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected void stop(Object watch) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected double latitude(Double coords) {
+        return coords;
+    }
+
+    @Override
+    protected double longitude(Double coords) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected double accuracy(Double coords) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected Double altitude(Double coords) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected Double altitudeAccuracy(Double coords) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected Double heading(Double coords) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected Double speed(Double coords) {
+        throw new UnsupportedOperationException();
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/html4j-maven-plugin/pom.xml
----------------------------------------------------------------------
diff --git a/html4j-maven-plugin/pom.xml b/html4j-maven-plugin/pom.xml
new file mode 100644
index 0000000..56cf9b6
--- /dev/null
+++ b/html4j-maven-plugin/pom.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+    Copyright 2013-2016 Oracle and/or its affiliates. All rights reserved.
+
+    Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+    Other names may be trademarks of their respective owners.
+
+    The contents of this file are subject to the terms of either the GNU
+    General Public License Version 2 only ("GPL") or the Common
+    Development and Distribution License("CDDL") (collectively, the
+    "License"). You may not use this file except in compliance with the
+    License. You can obtain a copy of the License at
+    http://www.netbeans.org/cddl-gplv2.html
+    or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+    specific language governing permissions and limitations under the
+    License.  When distributing the software, include this License Header
+    Notice in each file and include the License file at
+    nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+    particular file as subject to the "Classpath" exception as provided
+    by Oracle in the GPL Version 2 section of the License file that
+    accompanied this code. If applicable, add the following below the
+    License Header, with the fields enclosed by brackets [] replaced by
+    your own identifying information:
+    "Portions Copyrighted [year] [name of copyright owner]"
+
+    Contributor(s):
+
+    The Original Software is NetBeans. The Initial Developer of the Original
+    Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved.
+
+    If you wish your version of this file to be governed by only the CDDL
+    or only the GPL Version 2, indicate your decision by adding
+    "[Contributor] elects to include this software in this distribution
+    under the [CDDL or GPL Version 2] license." If you do not indicate a
+    single choice of license, a recipient has the option to distribute
+    your version of this file under either the CDDL, the GPL Version 2 or
+    to extend the choice of license to its licensees as provided above.
+    However, if you add GPL Version 2 code and therefore, elected the GPL
+    Version 2 license, then the option applies only if the new code is
+    made subject to such option by the copyright holder.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.netbeans.html</groupId>
+    <artifactId>pom</artifactId>
+    <version>2.0-SNAPSHOT</version>
+  </parent>
+  <packaging>maven-plugin</packaging>
+  <groupId>org.netbeans.html</groupId>
+  <artifactId>html4j-maven-plugin</artifactId>
+  <version>2.0-SNAPSHOT</version>
+  <name>Html for Java Maven Plugin</name>
+  <url>http://maven.apache.org</url>
+  <description>Maven plugin to post process the classes with @JavaScriptBody annotations</description>
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+  <build>
+      <plugins>
+          <plugin>
+              <groupId>org.apache.maven.plugins</groupId>
+              <artifactId>maven-plugin-plugin</artifactId>
+              <version>3.1</version>
+              <configuration>
+                  <extractors>
+                      <extractor>java-annotations</extractor>
+                  </extractors>
+                  <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
+              </configuration>
+              <executions>
+                  <execution>
+                      <id>mojo-descriptor</id>
+                      <phase>process-classes</phase>
+                      <goals>
+                          <goal>descriptor</goal>
+                      </goals>
+                  </execution>
+              </executions>
+          </plugin>
+      </plugins>
+  </build>
+      
+  <dependencies>
+      <dependency>
+          <groupId>org.apache.maven</groupId>
+          <artifactId>maven-plugin-api</artifactId>
+          <version>3.0.4</version>
+          <type>jar</type>
+      </dependency>
+      <dependency>
+          <groupId>org.apache.maven.plugin-tools</groupId>
+          <artifactId>maven-plugin-annotations</artifactId>
+          <version>3.0</version>
+          <type>jar</type>
+      </dependency>
+      <dependency>
+          <groupId>org.apache.maven</groupId>
+          <artifactId>maven-core</artifactId>
+          <version>3.0.2</version>
+          <type>jar</type>
+      </dependency>
+      <dependency>
+          <groupId>org.ow2.asm</groupId> 
+          <artifactId>asm</artifactId>
+          <type>jar</type>
+      </dependency>
+      <dependency>
+          <groupId>org.testng</groupId>
+          <artifactId>testng</artifactId>
+          <scope>test</scope>
+          <type>jar</type>
+      </dependency>
+  </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/html4j-maven-plugin/src/main/java/org/netbeans/html/mojo/ProcessJsAnnotationsMojo.java
----------------------------------------------------------------------
diff --git a/html4j-maven-plugin/src/main/java/org/netbeans/html/mojo/ProcessJsAnnotationsMojo.java b/html4j-maven-plugin/src/main/java/org/netbeans/html/mojo/ProcessJsAnnotationsMojo.java
new file mode 100644
index 0000000..4755ee2
--- /dev/null
+++ b/html4j-maven-plugin/src/main/java/org/netbeans/html/mojo/ProcessJsAnnotationsMojo.java
@@ -0,0 +1,223 @@
+/**
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * Contributor(s):
+ *
+ * The Original Software is NetBeans. The Initial Developer of the Original
+ * Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved.
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ */
+package org.netbeans.html.mojo;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.Component;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.plugins.annotations.ResolutionScope;
+import org.apache.maven.project.MavenProject;
+import org.objectweb.asm.ClassReader;
+
+@Mojo(
+    name="process-js-annotations",
+    requiresDependencyResolution = ResolutionScope.COMPILE,
+    defaultPhase= LifecyclePhase.PROCESS_CLASSES
+)
+public final class ProcessJsAnnotationsMojo extends AbstractMojo {
+    @Component
+    private MavenProject prj;
+    
+    @Parameter(defaultValue = "${project.build.directory}/classes")
+    private File classes;
+    
+    public ProcessJsAnnotationsMojo() {
+    }
+
+    @Override
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        LinkedList<URL> arr = new LinkedList<URL>();
+        boolean foundAsm = false;
+        for (Artifact a : prj.getArtifacts()) {
+            final File f = a.getFile();
+            if (f != null) {
+                if (a.getArtifactId().equals("asm")) {
+                    foundAsm = true;
+                }
+                try {
+                    arr.add(f.toURI().toURL());
+                } catch (MalformedURLException ex) {
+                    throw new IllegalStateException(ex);
+                }
+            }
+        }
+        if (!foundAsm) {
+            URL loc = ClassReader.class.getProtectionDomain().getCodeSource().getLocation();
+            arr.addFirst(loc);
+        }
+        try {
+            arr.add(classes.toURI().toURL());
+            URLClassLoader l = new URLClassLoader(arr.toArray(new URL[arr.size()]));
+            File master = new File(new File(classes, "META-INF"), "net.java.html.js.classes");
+            processClasses(l, master, classes);
+        } catch (IOException ex) {
+            throw new MojoExecutionException("Problem converting JavaScriptXXX annotations", ex);
+        }
+    }
+    
+    private void processClasses(ClassLoader l, File master, File f) throws IOException, MojoExecutionException {
+        if (!f.exists()) {
+            return;
+        }
+        if (f.isDirectory()) {
+            boolean classes = new File(f, "net.java.html.js.classes").exists();
+            File[] arr = f.listFiles();
+            if (arr != null) {
+                for (File file : arr) {
+                    if (classes || file.isDirectory()) {
+                        processClasses(l, master, file);
+                    }
+                }
+            }
+            return;
+        }
+        
+        if (!f.getName().endsWith(".class")) {
+            return;
+        }
+        
+        byte[] arr = new byte[(int)f.length()];
+        FileInputStream is = new FileInputStream(f);
+        try {
+            readArr(arr, is);
+        } finally {
+            is.close();
+        }
+
+        byte[] newArr = null;
+        try {
+            Class<?> fnUtils = l.loadClass("org.netbeans.html.boot.impl.FnUtils");
+            Method transform = fnUtils.getMethod("transform", byte[].class, ClassLoader.class);
+            
+            newArr = (byte[]) transform.invoke(null, arr, l);
+            if (newArr == null || newArr == arr) {
+                return;
+            }
+            filterClass(new File(f.getParentFile(), "net.java.html.js.classes"), f.getName());
+            filterClass(master, f.getName());
+        } catch (Exception ex) {
+            throw new MojoExecutionException("Can't process " + f, ex);
+        }
+        getLog().info("Processing " + f);
+        writeArr(f, newArr);        
+    }
+
+    private void writeArr(File f, byte[] newArr) throws IOException, FileNotFoundException {
+        FileOutputStream os = new FileOutputStream(f);
+        try {
+            os.write(newArr);
+        } finally {
+            os.close();
+        }
+    }
+
+    private static void readArr(byte[] arr, InputStream is) throws IOException {
+        int off = 0;
+        while (off< arr.length) {
+            int read = is.read(arr, off, arr.length - off);
+            if (read == -1) {
+                break;
+            }
+            off += read;
+        }
+    }
+    
+    private static void filterClass(File f, String className) throws IOException {
+        if (!f.exists()) {
+            return;
+        }
+        if (className.endsWith(".class")) {
+            className = className.substring(0, className.length() - 6);
+        }
+        
+        BufferedReader r = new BufferedReader(new FileReader(f));
+        List<String> arr = new ArrayList<String>();
+        boolean modified = false;
+        for (;;) {
+            String line = r.readLine();
+            if (line == null) {
+                break;
+            }
+            if (line.endsWith(className)) {
+                modified = true;
+                continue;
+            }
+            arr.add(line);
+        }
+        r.close();
+        
+        if (modified) {
+            if (arr.isEmpty()) {
+                f.delete();
+            } else {
+                FileWriter w = new FileWriter(f);
+                for (String l : arr) {
+                    w.write(l);
+                    w.write("\n");
+                }
+                w.close();
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json-tck/pom.xml
----------------------------------------------------------------------
diff --git a/json-tck/pom.xml b/json-tck/pom.xml
new file mode 100644
index 0000000..161b19d
--- /dev/null
+++ b/json-tck/pom.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+    Copyright 2013-2016 Oracle and/or its affiliates. All rights reserved.
+
+    Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+    Other names may be trademarks of their respective owners.
+
+    The contents of this file are subject to the terms of either the GNU
+    General Public License Version 2 only ("GPL") or the Common
+    Development and Distribution License("CDDL") (collectively, the
+    "License"). You may not use this file except in compliance with the
+    License. You can obtain a copy of the License at
+    http://www.netbeans.org/cddl-gplv2.html
+    or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+    specific language governing permissions and limitations under the
+    License.  When distributing the software, include this License Header
+    Notice in each file and include the License file at
+    nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+    particular file as subject to the "Classpath" exception as provided
+    by Oracle in the GPL Version 2 section of the License file that
+    accompanied this code. If applicable, add the following below the
+    License Header, with the fields enclosed by brackets [] replaced by
+    your own identifying information:
+    "Portions Copyrighted [year] [name of copyright owner]"
+
+    Contributor(s):
+
+    The Original Software is NetBeans. The Initial Developer of the Original
+    Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved.
+
+    If you wish your version of this file to be governed by only the CDDL
+    or only the GPL Version 2, indicate your decision by adding
+    "[Contributor] elects to include this software in this distribution
+    under the [CDDL or GPL Version 2] license." If you do not indicate a
+    single choice of license, a recipient has the option to distribute
+    your version of this file under either the CDDL, the GPL Version 2 or
+    to extend the choice of license to its licensees as provided above.
+    However, if you add GPL Version 2 code and therefore, elected the GPL
+    Version 2 license, then the option applies only if the new code is
+    made subject to such option by the copyright holder.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>org.netbeans.html</groupId>
+    <artifactId>pom</artifactId>
+    <version>2.0-SNAPSHOT</version>
+  </parent>
+  <groupId>org.netbeans.html</groupId>
+  <artifactId>net.java.html.json.tck</artifactId>
+  <version>2.0-SNAPSHOT</version>
+  <packaging>bundle</packaging>
+  <name>HTML for Java TCK</name>
+  <url>http://maven.apache.org</url>
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <publicPackages>org.netbeans.html.json.tck</publicPackages>
+  </properties>
+  <build>
+      <plugins>
+          <plugin>
+              <groupId>org.apache.felix</groupId>
+              <artifactId>maven-bundle-plugin</artifactId>
+          </plugin>
+          <plugin>
+              <groupId>org.netbeans.html</groupId>
+              <artifactId>html4j-maven-plugin</artifactId>
+          </plugin>
+          <plugin>
+              <groupId>org.apache.maven.plugins</groupId>
+              <artifactId>maven-javadoc-plugin</artifactId>
+              <configuration>
+                  <subpackages>org.netbeans.html.json.tck,org.netbeans.html.json.spi</subpackages>
+                  <skip>false</skip>
+                  <includeDependencySources>true</includeDependencySources>
+              </configuration>
+          </plugin>
+      </plugins>
+  </build>
+  <dependencies>
+    <dependency>
+      <groupId>org.netbeans.html</groupId>
+      <artifactId>net.java.html.json</artifactId>
+      <version>2.0-SNAPSHOT</version>
+      <type>jar</type>
+    </dependency>
+    <dependency>
+      <groupId>org.testng</groupId>
+      <artifactId>testng</artifactId>
+      <scope>compile</scope>
+      <type>jar</type>
+      <exclusions>
+        <exclusion>
+          <artifactId>bsh</artifactId>
+          <groupId>org.beanshell</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.netbeans.api</groupId>
+      <artifactId>org-openide-util</artifactId>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>net.java.html.boot</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+    <description>Test Compatibility Kit for anyone who wants to consume the net.java.html.json APIs and
+render their objects using own technology (e.g. own browser, MVVC, etc.).</description>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json-tck/src/main/java/net/java/html/js/tests/Bodies.java
----------------------------------------------------------------------
diff --git a/json-tck/src/main/java/net/java/html/js/tests/Bodies.java b/json-tck/src/main/java/net/java/html/js/tests/Bodies.java
new file mode 100644
index 0000000..029a3a2
--- /dev/null
+++ b/json-tck/src/main/java/net/java/html/js/tests/Bodies.java
@@ -0,0 +1,254 @@
+/**
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * Contributor(s):
+ *
+ * The Original Software is NetBeans. The Initial Developer of the Original
+ * Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved.
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ */
+package net.java.html.js.tests;
+
+import java.util.concurrent.Callable;
+import net.java.html.js.JavaScriptBody;
+
+/**
+ *
+ * @author Jaroslav Tulach
+ */
+final class Bodies {
+    @JavaScriptBody(args = { "a", "b" }, body = "return a + b;")
+    public static native int sum(int a, int b);
+
+    @JavaScriptBody(args = { "a", "b" }, javacall = true, body = 
+        "return @net.java.html.js.tests.Bodies::sum(II)(a, b);"
+    )
+    public static native int sumJS(int a, int b);
+    
+    @JavaScriptBody(args = {"r"}, javacall = true, body = "r.@java.lang.Runnable::run()();")
+    static native void callback(Runnable r);
+
+    @JavaScriptBody(args = {"r"}, wait4js = false, keepAlive = false, javacall = true, body = "r.@java.lang.Runnable::run()();")
+    static native void asyncCallback(Runnable r);
+    
+    @JavaScriptBody(args = {"c", "v"}, javacall = true, body = "var arr = c.@java.util.concurrent.Callable::call()(); arr.push(v); return arr;")
+    static native Object callbackAndPush(Callable<String[]> c, String v);
+    
+    @JavaScriptBody(args = { "v" }, body = "return v;")
+    public static native Object id(Object v);
+    
+    @JavaScriptBody(args = { "v" }, body = "return { 'x' : v };")
+    public static native Object instance(int v);
+    
+    @JavaScriptBody(args = "o", body = "o.x++;")
+    public static native void incrementX(Object o);
+
+    @JavaScriptBody(args = "o", wait4js = true, body = "o.x++;")
+    static native void incrementXAsync(Object o);
+
+    @JavaScriptBody(args = "o", body = "return o.x;")
+    public static native int readIntX(Object o);
+    
+    @JavaScriptBody(args = "o", body = "return o.x;")
+    public static native Object readX(Object o);
+    
+    @JavaScriptBody(args = { "o", "x" }, keepAlive = false, body = "o.x = x;")
+    public static native Object setX(Object o, Object x);
+
+    @JavaScriptBody(args = { "c", "a", "b" }, keepAlive = false, javacall = true, body = 
+        "return c.@net.java.html.js.tests.Sum::sum(II)(a, b);"
+    )
+    public static native int sumIndirect(Sum c, int a, int b);
+    
+    @JavaScriptBody(args = { "arr", "index" }, body = "return arr[index];")
+    public static native Object select(Object[] arr, int index);
+
+    @JavaScriptBody(args = { "arr" }, body = "return arr.length;")
+    public static native int length(Object[] arr);
+    
+    @JavaScriptBody(args = { "o", "vo" }, body = "if (vo) o = o.valueOf(); return typeof o;")
+    public static native String typeof(Object o, boolean useValueOf);
+
+    @JavaScriptBody(args = { "b" }, body = "return typeof b;")
+    public static native String typeof(boolean b);
+
+    @JavaScriptBody(args = { "o" }, body = "return Array.isArray(o);")
+    public static native boolean isArray(Object o);
+
+    @JavaScriptBody(args = { "arr", "i", "value" }, body = "arr[i] = value; return arr[i];")
+    public static native String modify(String[] arr, int i, String value);
+    
+    @JavaScriptBody(args = {}, body = "return true;")
+    public static native boolean truth();
+    
+    @JavaScriptBody(args = { "s" }, javacall = true, body = 
+        "return s.@net.java.html.js.tests.Sum::sum([Ljava/lang/Object;)([1, 2, 3]);"
+    )
+    public static native int sumArr(Sum s);
+    
+    @JavaScriptBody(args = {}, javacall = true, body = 
+        "return @net.java.html.js.tests.Bodies::fourtyTwo()();"
+    )
+    public static native int staticCallback();
+
+    @JavaScriptBody(args = {}, javacall = true, body = 
+        "return function() { return @net.java.html.js.tests.Bodies::fourtyTwo()(); }"
+    )
+    public static native Object delayCallback();
+    
+    @JavaScriptBody(args = { "fn" }, body = "return fn();")
+    public static native Object invokeFn(Object fn);
+    
+    static int fourtyTwo() {
+        return 42;
+    }
+    
+    @JavaScriptBody(args = { "arr" }, body = 
+        "var sum = 0;\n" +
+        "for (var i = 0; i < arr.length; i++) {\n" +
+        "  sum += arr[i];\n" +
+        "}\n" +
+        "return sum;\n"
+    )
+    public static native double sumVector(double[] arr);
+    
+    @JavaScriptBody(args = { "arr" }, body = 
+        "var sum = 0;\n" +
+        "for (var i = 0; i < arr.length; i++) {\n" +
+        "  for (var j = 0; j < arr[i].length; j++) {\n" +
+        "    sum += arr[i][j];\n" +
+        "  }\n" +
+        "}\n" +
+        "return sum;\n"
+    )
+    public static native double sumMatrix(double[][] arr);
+
+    static void incCounter(int howMuch, final Object js) {
+        for (int i = 0; i < howMuch; i++) {
+            asyncCallback(new Runnable() {
+                @Override
+                public void run() {
+                    incrementXAsync(js);
+                }
+            });
+        }
+    }
+    
+    @JavaScriptBody(args = {}, javacall = true, body = 
+        "var v = { x : 0 };\n" +
+        "@net.java.html.js.tests.Bodies::incCounter(ILjava/lang/Object;)(42, v);\n" +
+        "return v.x;\n"
+    )
+    static native int incAsync();
+    
+    @JavaScriptBody(args = { "arr" }, body = 
+        "var ret = [];\n" +
+        "for (var i in arr) {\n" +
+        "  ret.push(arr[i]);\n" +
+        "}\n" +
+        "return ret;\n"
+    )
+    static native Object[] forIn(Object[] in);
+
+    @JavaScriptBody(args = { "max" }, body = 
+        "var arr = [];\n"
+      + "for (var i = 0; i < max; i++) {\n"
+      + "  arr.push(i);\n"
+      + "}\n"
+      + "return arr.length;"
+    )
+    static native int gc(double max);
+
+    @JavaScriptBody(args = {}, body = ""
+        + "var o = {};\n"
+        + "return o.x;\n"
+    )
+    static native Object unknown();
+
+    @JavaScriptBody(args = {}, body = ""
+        + "return new Array(2);\n"
+    )
+    static native Object[] unknownArray();
+
+    @JavaScriptBody(args = { "sum" }, javacall = true, body = ""
+        + "var arr = [];\n"
+        + "arr[1] = null;\n"
+        + "arr[2] = 1;\n"
+        + "return sum.@net.java.html.js.tests.Sum::sumNonNull([Ljava/lang/Object;)(arr);\n"
+    )
+    static native int sumNonNull(Sum sum);
+
+    @JavaScriptBody(args = { "sum", "p" }, javacall = true, body = ""
+        + "var obj = {};\n"
+        + "obj.x = 1;\n"
+        + "return sum.@net.java.html.js.tests.Sum::checkNonNull(Ljava/lang/Object;)(obj[p]);\n"
+    )
+    static native boolean nonNull(Sum sum, String p);
+
+    @JavaScriptBody(args = {}, javacall = true, body = 
+        "return @net.java.html.js.tests.Bodies::problematicString()();"
+    )
+    public static native String problematicCallback();
+
+    @JavaScriptBody(args = { "sum" }, javacall = true, body = 
+        "return sum.@net.java.html.js.tests.Sum::all(ZBSIJFDCLjava/lang/String;)(false, 1, 2, 3, 5, 6, 7, 32, 'TheEND');\n"
+    )
+    static native String primitiveTypes(Sum sum);
+
+    @JavaScriptBody(args = { "call" }, javacall = true, body = ""
+        + "var b = call.@java.util.concurrent.Callable::call()();\n"
+        + "return b ? 'yes' : 'no';\n"
+    )
+    static native String yesNo(Callable<Boolean> call);
+
+    @JavaScriptBody(args = {"arr", "val"}, body = "return arr[0] === val;")
+    public static native boolean isInArray(Object[] arr, Object val);
+    
+    @JavaScriptBody(args = {}, body = "return globalString;")
+    static native String readGlobalString();
+
+    @JavaScriptBody(args = {}, body = "return global2String;")
+    static native String readGlobal2String();
+    
+    static String problematicString() {
+        return "{\n" +
+"    MyViewModel: {\n" +
+"//      ViewModel: JavaViewModel,\n" +
+"\n" +
+"    }          \n" +
+"}";
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json-tck/src/main/java/net/java/html/js/tests/Factorial.java
----------------------------------------------------------------------
diff --git a/json-tck/src/main/java/net/java/html/js/tests/Factorial.java b/json-tck/src/main/java/net/java/html/js/tests/Factorial.java
new file mode 100644
index 0000000..d5d631a
--- /dev/null
+++ b/json-tck/src/main/java/net/java/html/js/tests/Factorial.java
@@ -0,0 +1,62 @@
+/**
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * Contributor(s):
+ *
+ * The Original Software is NetBeans. The Initial Developer of the Original
+ * Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved.
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ */
+package net.java.html.js.tests;
+
+import net.java.html.js.JavaScriptBody;
+
+/**
+ *
+ * @author Jaroslav Tulach
+ */
+public final class Factorial {
+    int minusOne(int i) {
+        return i - 1;
+    }
+
+    @JavaScriptBody(args = { "i" }, javacall = true,body = 
+        "if (i <= 1) return 1;\n"
+      + "var im1 = this.@net.java.html.js.tests.Factorial::minusOne(I)(i);\n"
+      + "return this.@net.java.html.js.tests.Factorial::factorial(I)(im1) * i;"
+    )
+    native int factorial(int n);
+}

http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json-tck/src/main/java/net/java/html/js/tests/GCBodyTest.java
----------------------------------------------------------------------
diff --git a/json-tck/src/main/java/net/java/html/js/tests/GCBodyTest.java b/json-tck/src/main/java/net/java/html/js/tests/GCBodyTest.java
new file mode 100644
index 0000000..46d0775
--- /dev/null
+++ b/json-tck/src/main/java/net/java/html/js/tests/GCBodyTest.java
@@ -0,0 +1,178 @@
+/**
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * Contributor(s):
+ *
+ * The Original Software is NetBeans. The Initial Developer of the Original
+ * Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved.
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ */
+package net.java.html.js.tests;
+
+import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
+import org.netbeans.html.json.tck.KOTest;
+import static net.java.html.js.tests.JavaScriptBodyTest.*;
+
+/**
+ *
+ * @author Jaroslav Tulach
+ */
+public class GCBodyTest {
+    Reference<?> ref;
+    int[] arr;
+    
+    @KOTest public void callbackInterfaceCanDisappear() throws InterruptedException {
+        if (ref != null) {
+            assertGC(ref, "Can disappear!");
+            return;
+        }
+        Sum s = new Sum();
+        int res = Bodies.sumIndirect(s, 22, 20);
+        assertEquals(res, 42, "Expecting 42");
+        Reference<?> ref = new WeakReference<Object>(s);
+        s = null;
+        assertGC(ref, "Can disappear!");
+    }
+    
+    private Object assignInst() {
+        Object obj = Bodies.instance(0);
+        Object s = new EmptyInstance();
+        Bodies.setX(obj, s);
+        assertEquals(s, Bodies.readX(obj));
+        ref = new WeakReference<Object>(s);
+        return obj;
+}
+    
+    @KOTest public void holdObjectAndReleaseObject() throws InterruptedException {
+        if (ref != null) {
+            assertGC(ref, "Can disappear!");
+            return;
+        }
+        
+        Object obj = assignInst();
+        assertNotNull(ref, "Reference assigned");
+        
+        assertGC(ref, "Can disappear as it is keepAlive false!");
+        assertNotNull(obj, "Object is still present");
+    }
+
+    @KOTest public void strongReceiverBehavior() {
+        Object v = new EmptyInstance();
+        Receiver r = new Receiver(v);
+        r.apply();
+        assertEquals(v, r.value, "Value is as expected");
+    }
+    
+    @KOTest public void gcReceiverBehavior() throws InterruptedException {
+        Receiver r = new Receiver(new EmptyInstance());
+        assertGC(r.ref, "The empty instance can be GCed even when referenced from JS");
+        r.apply();
+        assertEquals(r.value, null, "Setter called with null value");
+    }
+
+    private static Reference<?> sendRunnable(final int[] arr) {
+        Runnable r = new Runnable() {
+            @Override
+            public void run() {
+                arr[0]++;
+            }
+        };
+        Bodies.asyncCallback(r);
+        return new WeakReference<Object>(r);
+    }
+    
+    private static class EmptyInstance {
+    }
+    
+    @KOTest public void parametersNeedToRemainInAsyncMode() throws InterruptedException {
+        if (ref != null) {
+            if (arr[0] != 1) {
+                throw new InterruptedException();
+            }
+            assertGC(ref, "Now the runnable can disappear");
+            return;
+        }
+        arr = new int[] { 0 };
+        ref = sendRunnable(arr);
+        if (arr[0] == 1) {
+            return;
+        }
+        assertNotGC(ref, false, "The runnable should not be GCed");
+        throw new InterruptedException();
+    }
+    
+    private static void assertGC(Reference<?> ref, String msg) throws InterruptedException {
+        for (int i = 0; i < 100; i++) {
+            if (isGone(ref)) return;
+            long then = System.currentTimeMillis();
+            int size = Bodies.gc(Math.pow(2.0, i));
+            long took = System.currentTimeMillis() - then;
+            if (took > 3000) {
+                throw new InterruptedException(msg + " - giving up after " + took + " ms at size of " + size);
+            }
+            
+            try {
+                System.gc();
+                System.runFinalization();
+            } catch (Error err) {
+                err.printStackTrace();
+            }
+        }
+        throw new InterruptedException(msg);
+    }
+
+    private static boolean isGone(Reference<?> ref) {
+        return ref.get() == null;
+    }
+    
+    private static void assertNotGC(Reference<?> ref, boolean clearJS, String msg) throws InterruptedException {
+        for (int i = 0; i < 10; i++) {
+            if (ref.get() == null) {
+                throw new IllegalStateException(msg);
+            }
+            if (clearJS) {
+                Bodies.gc(Math.pow(2.0, i));
+            }
+            try {
+                System.gc();
+                System.runFinalization();
+            } catch (Error err) {
+                err.printStackTrace();
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json-tck/src/main/java/net/java/html/js/tests/Global2String.java
----------------------------------------------------------------------
diff --git a/json-tck/src/main/java/net/java/html/js/tests/Global2String.java b/json-tck/src/main/java/net/java/html/js/tests/Global2String.java
new file mode 100644
index 0000000..afd847c
--- /dev/null
+++ b/json-tck/src/main/java/net/java/html/js/tests/Global2String.java
@@ -0,0 +1,52 @@
+/**
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * Contributor(s):
+ *
+ * The Original Software is NetBeans. The Initial Developer of the Original
+ * Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved.
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ */
+package net.java.html.js.tests;
+
+import net.java.html.js.JavaScriptBody;
+import net.java.html.js.JavaScriptResource;
+
+@JavaScriptResource("global2.js")
+class Global2String {
+    @JavaScriptBody(args = {}, body = "return global2String;")
+    public static native String init();
+}

http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json-tck/src/main/java/net/java/html/js/tests/GlobalString.java
----------------------------------------------------------------------
diff --git a/json-tck/src/main/java/net/java/html/js/tests/GlobalString.java b/json-tck/src/main/java/net/java/html/js/tests/GlobalString.java
new file mode 100644
index 0000000..fe46bff
--- /dev/null
+++ b/json-tck/src/main/java/net/java/html/js/tests/GlobalString.java
@@ -0,0 +1,52 @@
+/**
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
+ *
+ * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
+ * Other names may be trademarks of their respective owners.
+ *
+ * The contents of this file are subject to the terms of either the GNU
+ * General Public License Version 2 only ("GPL") or the Common
+ * Development and Distribution License("CDDL") (collectively, the
+ * "License"). You may not use this file except in compliance with the
+ * License. You can obtain a copy of the License at
+ * http://www.netbeans.org/cddl-gplv2.html
+ * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
+ * specific language governing permissions and limitations under the
+ * License.  When distributing the software, include this License Header
+ * Notice in each file and include the License file at
+ * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the GPL Version 2 section of the License file that
+ * accompanied this code. If applicable, add the following below the
+ * License Header, with the fields enclosed by brackets [] replaced by
+ * your own identifying information:
+ * "Portions Copyrighted [year] [name of copyright owner]"
+ *
+ * Contributor(s):
+ *
+ * The Original Software is NetBeans. The Initial Developer of the Original
+ * Software is Oracle. Portions Copyright 2013-2016 Oracle. All Rights Reserved.
+ *
+ * If you wish your version of this file to be governed by only the CDDL
+ * or only the GPL Version 2, indicate your decision by adding
+ * "[Contributor] elects to include this software in this distribution
+ * under the [CDDL or GPL Version 2] license." If you do not indicate a
+ * single choice of license, a recipient has the option to distribute
+ * your version of this file under either the CDDL, the GPL Version 2 or
+ * to extend the choice of license to its licensees as provided above.
+ * However, if you add GPL Version 2 code and therefore, elected the GPL
+ * Version 2 license, then the option applies only if the new code is
+ * made subject to such option by the copyright holder.
+ */
+package net.java.html.js.tests;
+
+import net.java.html.js.JavaScriptBody;
+import net.java.html.js.JavaScriptResource;
+
+@JavaScriptResource("global.js")
+class GlobalString {
+    @JavaScriptBody(args = {}, body = "return globalString;")
+    public static native String init();
+}