http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json/src/main/java/org/netbeans/html/json/spi/Technology.java ---------------------------------------------------------------------- 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 new file mode 100644 index 0000000..b53f05e --- /dev/null +++ b/json/src/main/java/org/netbeans/html/json/spi/Technology.java @@ -0,0 +1,216 @@ +/** + * 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.json.spi; + +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 <a href="http://knockoutjs.com">knockout.js</a> + * 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 + * <code>org.netbeans.html:ko4j</code> module which registers + * a <a href="http://knockoutjs.com" target="_blank">knockout.js</a> + * implementation called <b>ko4j</b>. + * + * @author Jaroslav Tulach + */ +public interface Technology<Data> { + /** Creates an object to wrap the provided model object. The model + * has previously been generated by annotation processor associated + * with {@link Model} annotation. + * + * @param model the model generated from {@link Model} + * @return internal object representing the model + */ + public Data wrapModel(Object model); + + /** Converts an element potentially representing a model into the model. + * @param <M> the type of the <code>modelClass</code> + * @param modelClass expected class to convert the data to + * @param data the current data provided from the browser + * @return the instance of modelClass somehow extracted from the data, may return <code>null</code> + */ + public <M> M toModel(Class<M> modelClass, Object data); + + /** Binds a property between the model and the data as used by the technology. + * + * @param b the description of the requested binding + * @param model the original instance of the model + * @param data the data to bind with the model + */ + public void bind(PropertyBinding b, Object model, Data data); + + /** Model for given data has changed its value. The technology is + * supposed to update its state (for example DOM nodes associated + * with the model). The update usually happens asynchronously. + * + * @param data technology's own representation of the model + * @param propertyName name of the model property that changed + */ + public void valueHasMutated(Data data, String propertyName); + + public void expose(FunctionBinding fb, Object model, Data d); + + /** Applies given data to current context (usually an HTML page). + * @param data the data to apply + */ + public void applyBindings(Data data); + + /** + * Some technologies may require wrapping a Java array into a special + * object. In such case they may return it from this method. + * + * @param arr original array + * @return wrapped array + */ + public Object wrapArray(Object[] arr); + + /** + * Run given runnable in a safe mode. If the runnable can be executed + * immediately, do it. If we need to switch to some other thread, do it + * and invoke r asynchronously immediately returning from the call to + * runSafe method. + * + * @param r the runnable to execute + * @deprecated Use {@link BrwsrCtx#execute(java.lang.Runnable)} + */ + @Deprecated + public void runSafe(Runnable r); + + /** For certain rendering technologies it may be more efficient to register + * property and function bindings for one instance of the model at once, + * rather then doing it incrementally via + * {@link Technology#expose(org.netbeans.html.json.spi.FunctionBinding, java.lang.Object, java.lang.Object) } + * and + * {@link Technology#bind(org.netbeans.html.json.spi.PropertyBinding, java.lang.Object, java.lang.Object) }. + * In such case implement the {@link #wrapModel(java.lang.Object, org.netbeans.html.json.spi.PropertyBinding[], org.netbeans.html.json.spi.FunctionBinding[]) } + * method of this interface and it will be called instead of the + * previous two ones. + * + * @since 0.6 + */ + public static interface BatchInit<D> extends Technology<D> { + /** Wrap the given model into rendering technology appropriate object + * <code>D</code> and expose given properties and functions on it. + * + * @param model the {@link Models#isModel(java.lang.Class) model} in Java + * @param propArr array of property bindings to expose + * @param funcArr array of functions to expose + * @return appropriate wrapper around the model + */ + public D wrapModel(Object model, PropertyBinding[] propArr, FunctionBinding[] funcArr); + } + + /** Some technologies are more effective when number of calls between + * Java and JavaScript is limited - to do that when a value of property + * is changed they should implement this additional interface. + * + * @param <D> internal type of the technology + * @since 0.7.6 + */ + public static interface ValueMutated<D> extends Technology<D> { + /** Model for given data has changed its value. The technology is + * supposed to update its state (for example DOM nodes associated + * with the model). The update usually happens asynchronously. + * <p> + * If both <code>oldValue</code> and <code>newValue</code> are + * <code>null</code> then the real value of the technology is + * not known. + * <p> + * If this method is present, then it is called instead of + * old, plain {@link #valueHasMutated(java.lang.Object, java.lang.String)} + * which is never called by the infrastructure then. + * + * @param data technology's own representation of the model + * @param propertyName name of the model property that changed + * @param oldValue provides previous value of the property + * @param newValue provides new value of the property + */ + public void valueHasMutated(D data, String propertyName, Object oldValue, Object newValue); + } + + /** Apply technology bindings at selected subtree of the HTML page. + * Can be accessed via {@link Proto#applyBindings(java.lang.String)} or + * via method <code>applyBindings(String)</code> generated when one + * is using the {@link Model} annotation. + * + * @param <D> the internal data for the technology + * @since 1.1 + */ + public static interface ApplyId<D> extends Technology<D> { + /** Applies given data to current context (usually an element on an + * HTML page). + * + * @param id the id of an element to apply the data to + * @param data the data to apply + */ + public void applyBindings(String id, D data); + } + + /** Extension of {@link BatchInit} with enhanced support for + * copying values. Technologies that support this interface provide a + * guarantee that result {@link Models#toRaw(java.lang.Object)} + * wrapped by {@link Models#fromRaw(net.java.html.BrwsrCtx, java.lang.Class, java.lang.Object)} + * will share essential properties (and not just values) of the original object. + * + * @since 1.3 + */ + public static interface BatchCopy<D> extends Technology<D> { + /** Wrap the given model into rendering technology appropriate object + * <code>D</code> and expose given properties and functions on it. + * + * @param model the {@link Models#isModel(java.lang.Class) model} in Java + * @param copyFrom the object to copy data from + * (expectably of type D, but that isn't guaranteed) or <code>null</code> + * @param propArr array of property bindings to expose + * @param funcArr array of functions to expose + * @return appropriate wrapper around the model + */ + public D wrapModel(Object model, Object copyFrom, PropertyBinding[] propArr, FunctionBinding[] funcArr); + } +}
http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json/src/main/java/org/netbeans/html/json/spi/Transfer.java ---------------------------------------------------------------------- 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 new file mode 100644 index 0000000..b70371f --- /dev/null +++ b/json/src/main/java/org/netbeans/html/json/spi/Transfer.java @@ -0,0 +1,96 @@ +/** + * 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.json.spi; + +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 + * <code>org.netbeans.html:ko4j</code> module which registers + * a native browser implementation called <b>xhr</b>, and a + * <code>org.netbeans.html:ko-ws-tyrus</code> module which registers + * Java based implementation named <b>tyrus</b>. + * + * @author Jaroslav Tulach + */ +public interface Transfer { + /** + * Called to inspect properties of an object (usually a JSON or JavaScript + * wrapper). + * + * @param obj the object to inspect + * @param props the names of properties to check on the object + * <code>obj</code> + * @param values array of the same length as <code>props</code> should be + * filled by values of properties on the <code>obj</code>. If a property is + * not defined, a <code>null</code> value should be stored in the array + */ + public void extract(Object obj, String[] props, Object[] values); + + /** Reads content of a stream and creates its JSON representation. + * The returned object is implementation dependant. It however needs + * to be acceptable as first argument of {@link #extract(java.lang.Object, java.lang.String[], java.lang.Object[]) extract} + * method. If the stream contains representation or a JSON array, + * an Object[] should be returned - each of its members should, by itself + * be acceptable argument to + * the {@link #extract(java.lang.Object, java.lang.String[], java.lang.Object[]) extract} method. + * + * @param is input stream to read data from + * @return an object representing the JSON data + * @throws IOException if something goes wrong + */ + public Object toJSON(InputStream is) throws IOException; + + /** Starts the JSON or JSONP query. + * + * @param call description of the call to make + */ + public void loadJSON(JSONCall call); + +} http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json/src/main/java/org/netbeans/html/json/spi/WSTransfer.java ---------------------------------------------------------------------- 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 new file mode 100644 index 0000000..16a8882 --- /dev/null +++ b/json/src/main/java/org/netbeans/html/json/spi/WSTransfer.java @@ -0,0 +1,92 @@ +/** + * 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.json.spi; + +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}. + * 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 + * <code>org.netbeans.html:ko4j</code> module which registers + * a native browser implementation called <b>websocket</b>, and a + * <code>org.netbeans.html:ko-ws-tyrus</code> module which registers + * Java based implementation named <b>tyrus</b>. + * + * @author Jaroslav Tulach + * @param <WebSocket> internal implementation type representing the socket + * @since 0.5 + */ +public interface WSTransfer<WebSocket> { + /** Initializes a web socket. The <code>callback</code> object should + * have mostly empty values: {@link JSONCall#isDoOutput()} should be + * <code>false</code> and thus there should be no {@link JSONCall#getMessage()}. + * The method of connection {@link JSONCall#getMethod()} is "WebSocket". + * Once the connection is open call {@link JSONCall#notifySuccess(java.lang.Object) notifySuccess(null)}. + * When the server sends some data then, pass them to + * {@link JSONCall#notifySuccess(java.lang.Object) notifySuccess} method + * as well. If there is an error call {@link JSONCall#notifyError(java.lang.Throwable)}. + * + * @param url the URL to connect to + * @param callback a way to provide results back to the client + * @return your object representing the established web socket + */ + public WebSocket open(String url, JSONCall callback); + + /** Sends data to the server. The most important value + * of the <code>data</code> parameter is {@link JSONCall#getMessage()}, + * rest can be ignored. + * + * @param socket internal representation of the socket + * @param data the message to be sent + */ + public void send(WebSocket socket, JSONCall data); + + /** A request to close the socket. + * @param socket internal representation of the socket + */ + public void close(WebSocket socket); +} http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json/src/main/java/org/netbeans/html/json/spi/package.html ---------------------------------------------------------------------- diff --git a/json/src/main/java/org/netbeans/html/json/spi/package.html b/json/src/main/java/org/netbeans/html/json/spi/package.html new file mode 100644 index 0000000..1912dd1 --- /dev/null +++ b/json/src/main/java/org/netbeans/html/json/spi/package.html @@ -0,0 +1,51 @@ +<!-- + + 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. + +--> +<html> + <body> + <div>Service Provider Interfaces for those who wish to integrate own + <a href="Technology.html">technology</a> with the HTML for Java API. + </div> + </body> +</html> http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json/src/main/resources/org/netbeans/html/json/impl/Bundle.properties ---------------------------------------------------------------------- diff --git a/json/src/main/resources/org/netbeans/html/json/impl/Bundle.properties b/json/src/main/resources/org/netbeans/html/json/impl/Bundle.properties new file mode 100644 index 0000000..489c7be --- /dev/null +++ b/json/src/main/resources/org/netbeans/html/json/impl/Bundle.properties @@ -0,0 +1,97 @@ +# +# 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. +# + +MSG_Completion_GET=The GET method means retrieve whatever information \ + (in the form of an entity) is identified by the Request-URI. \ + If the Request-URI refers to a data-producing process, \ + it is the produced data which shall be returned as the entity in \ + the response and not the source text of the process, \ + unless that text happens to be the output of the process. + +MSG_Completion_HEAD=The HEAD method is identical to GET except that the server \ + MUST NOT return a message-body in the response. The metainformation \ + contained in the HTTP headers in response to a HEAD request SHOULD be \ + identical to the information sent in response to a GET request. \ + This method can be used for obtaining metainformation about the entity implied \ + by the request without transferring the entity-body itself. \ + This method is often used for testing hypertext links for validity, \ + accessibility, and recent modification. + +MSG_Completion_POST=The POST method is used to request that the origin server \ + accept the entity enclosed in the request as a new subordinate of the resource \ + identified by the Request-URI in the Request-Line. POST is designed to allow \ + a uniform method to cover annotation of existing resources,\ + posting a message to a bulletin board, newsgroup, mailing list, or similar \ + group of articles, providing a block of data, such as the result of submitting a \ + form, to a data-handling process or extending a database through an append operation. \ + The actual function performed by the POST method is determined by the server \ + and is usually dependent on the Request-URI. The posted entity is subordinate \ + to that URI in the same way that a file is subordinate to a directory containing it, \ + a news article is subordinate to a newsgroup to which it is posted, \ + or a record is subordinate to a database. + +MSG_Completion_PUT=The PUT method requests that the enclosed entity be stored \ + under the supplied Request-URI. If the Request-URI refers to an already \ + existing resource, the enclosed entity SHOULD be considered as a modified \ + version of the one residing on the origin server. If the Request-URI does \ + not point to an existing resource, and that URI is capable of being defined \ + as a new resource by the requesting user agent, the origin server can \ + create the resource with that URI. If a new resource is created, the origin \ + server MUST inform the user agent via the 201 (Created) response. \ + If an existing resource is modified, either the 200 (OK) or 204 (No Content) \ + response codes SHOULD be sent to indicate successful completion of the request. \ + If the resource could not be created or modified with the Request-URI, an \ + appropriate error response SHOULD be given that reflects the nature of the problem. \ + The recipient of the entity MUST NOT ignore any Content-* (e.g. Content-Range) \ + headers that it does not understand or implement and MUST return \ + a 501 (Not Implemented) response in such cases. + +MSG_Completion_DELETE=The DELETE method requests that the origin server delete \ + the resource identified by the Request-URI. This method MAY be overridden \ + by human intervention (or other means) on the origin server. The client \ + cannot be guaranteed that the operation has been carried out, even if \ + the status code returned from the origin server indicates that the action \ + has been completed successfully. However, the server SHOULD NOT indicate \ + success unless, at the time the response is given, it intends to delete \ + the resource or move it to an inaccessible location. + http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json/src/main/resources/org/netbeans/html/json/spi/package.html ---------------------------------------------------------------------- diff --git a/json/src/main/resources/org/netbeans/html/json/spi/package.html b/json/src/main/resources/org/netbeans/html/json/spi/package.html new file mode 100644 index 0000000..80517a4 --- /dev/null +++ b/json/src/main/resources/org/netbeans/html/json/spi/package.html @@ -0,0 +1,59 @@ +<!-- + + 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. + +--> +<!DOCTYPE html> +<html> + <head> + <title></title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + </head> + <body> + <div>Implement + <a href="Technology.html">Technology</a> and + <a href="Transfer.html">Transfer</a> and use + <a href="ContextBuilder.html">ContextBuilder</a> to create an instance + of <code>Context</code> representing your technology. + </div> + </body> +</html> http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json/src/test/java/net/java/html/json/AdressTest.java ---------------------------------------------------------------------- diff --git a/json/src/test/java/net/java/html/json/AdressTest.java b/json/src/test/java/net/java/html/json/AdressTest.java new file mode 100644 index 0000000..8388fab --- /dev/null +++ b/json/src/test/java/net/java/html/json/AdressTest.java @@ -0,0 +1,59 @@ +/** + * 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.json; + +import net.java.html.json.Model; +import net.java.html.json.Property; +import static org.testng.Assert.assertNotNull; +import org.testng.annotations.Test; + +@Model(className = "Address", properties = { + @Property(name = "street", type = net.java.html.json.sub.Street.class) +}) +public class AdressTest { + @Test + public void addressHoldsAPerson() { + Address address = new Address(); + assertNotNull(address.getStreet(), "Street is initialized"); + } +} http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json/src/test/java/net/java/html/json/BoardTest.java ---------------------------------------------------------------------- diff --git a/json/src/test/java/net/java/html/json/BoardTest.java b/json/src/test/java/net/java/html/json/BoardTest.java new file mode 100644 index 0000000..4b8d645 --- /dev/null +++ b/json/src/test/java/net/java/html/json/BoardTest.java @@ -0,0 +1,83 @@ +/** + * 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.json; + +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; +import org.testng.annotations.Test; + +/** + * + * @author Jaroslav Tulach + */ +@Model(className = "Board", properties = { + @Property(name = "rows", type = Row.class, array = true) +}) +public class BoardTest { + + @Model(className = "Row", properties = { + @Property(name = "column", type = Column.class, array = true) + }) + static class RowModel { + } + + @Model(className = "Column", properties = { + @Property(name = "black", type = boolean.class) + }) + static class ColumnModel { + } + + @Test public void deepClone() { + Board orig = new Board(new Row(new Column(true))); + assertTrue(orig.getRows().get(0).getColumn().get(0).isBlack(), "Really true"); + + Board clone = orig.clone(); + assertTrue(clone.getRows().get(0).getColumn().get(0).isBlack(), "Clone also true"); + + clone.getRows().get(0).getColumn().get(0).setBlack(false); + + assertFalse(clone.getRows().get(0).getColumn().get(0).isBlack(), "Clone also is not false"); + assertTrue(orig.getRows().get(0).getColumn().get(0).isBlack(), "Orig still true"); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json/src/test/java/net/java/html/json/BooleanArrayTest.java ---------------------------------------------------------------------- diff --git a/json/src/test/java/net/java/html/json/BooleanArrayTest.java b/json/src/test/java/net/java/html/json/BooleanArrayTest.java new file mode 100644 index 0000000..78c134d --- /dev/null +++ b/json/src/test/java/net/java/html/json/BooleanArrayTest.java @@ -0,0 +1,80 @@ +/** + * 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.json; + +import java.util.Collections; +import java.util.List; +import org.testng.Assert; +import org.testng.annotations.Test; + +/** + * + * @author Jaroslav Tulach + */ +@Model(className="BooleanArray", builder = "put", properties = { + @Property(name = "array", type = boolean.class, array = true) +}) +public class BooleanArrayTest { + @ComputedProperty static int length(List<Boolean> array) { + return array.size(); + } + + @ComputedProperty static List<Integer> lengthAsList(List<Boolean> array) { + return Collections.nCopies(1, array.size()); + } + + @ComputedProperty static List<String> lengthTextList(List<Boolean> array) { + return Collections.nCopies(1, "" + array.size()); + } + + @Test public void generatedConstructorWithPrimitiveType() { + boolean[] arr = new boolean[10]; + arr[3] = true; + BooleanArray a = new BooleanArray().putArray(arr); + Assert.assertEquals(a.getArray().size(), 10, "Ten elements"); + Assert.assertEquals(a.getArray().get(3).booleanValue(), true, "Value ten"); + Assert.assertEquals(a.getLength(), 10, "Derived property is OK too"); + Assert.assertEquals(a.getLengthTextList().get(0), "10", "Derived string list property is OK"); + Assert.assertEquals((int)a.getLengthAsList().get(0), 10, "Derived Integer list property is OK"); + } +} http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json/src/test/java/net/java/html/json/Compile.java ---------------------------------------------------------------------- diff --git a/json/src/test/java/net/java/html/json/Compile.java b/json/src/test/java/net/java/html/json/Compile.java new file mode 100644 index 0000000..13b812e --- /dev/null +++ b/json/src/test/java/net/java/html/json/Compile.java @@ -0,0 +1,311 @@ +/** + * 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.json; + +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 void close() throws IOException { + super.close(); + + int opening = count(toString(), '{'); + int closing = count(toString(), '}'); + + assertEquals(opening, closing, "There should be pair number of { and } in\n" + toString()); + } + }; + + int count(String where, char what) { + int at = -1; + int cnt = 0; + for (;;) { + at = where.indexOf(what, at + 1); + if (at == -1) { + return cnt; + } + cnt++; + } + } + + @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 assertNoErrors() { + assertTrue(getErrors().isEmpty(), "There are supposed to be no errors: " + getErrors()); + } + + 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/json/src/test/java/net/java/html/json/KeywordsTest.java ---------------------------------------------------------------------- diff --git a/json/src/test/java/net/java/html/json/KeywordsTest.java b/json/src/test/java/net/java/html/json/KeywordsTest.java new file mode 100644 index 0000000..9e79895 --- /dev/null +++ b/json/src/test/java/net/java/html/json/KeywordsTest.java @@ -0,0 +1,99 @@ +/** + * 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.json; + +import static org.testng.Assert.*; +import org.testng.annotations.Test; + +@Model(className = "Keywords", properties = { + @Property(name = "private", type = String.class), + @Property(name = "public", type = double.class), + @Property(name = "final", type = String.class), + @Property(name = "int", type = int.class), + @Property(name = "class", type = String.class), +// @Property(name = "{", type = String.class), + @Property(name = "array", type = KeywordsInArray.class) +}) +public class KeywordsTest { + @Model(className = "KeywordsInArray", properties = { + @Property(name = "private", type = String.class, array = true), + @Property(name = "public", type = double.class, array = true), + @Property(name = "final", type = String.class, array = true), + @Property(name = "int", type = int.class, array = true), + @Property(name = "class", type = String.class, array = true), +// @Property(name = "{", type = String.class), + @Property(name = "array", type = Keywords.class, array = true) + }) + static class KeywordsInArrayCntrl { + } + + @Test public void verifyKeywordsClassCompiles() { + Keywords k = new Keywords(); + k.setClass("c"); + k.setFinal("f"); + k.setInt(10); + k.setPrivate("p"); + k.setPublic(42.0); + + assertEquals(k.accessClass(), "c"); + assertEquals(k.getFinal(), "f"); + assertEquals(k.getInt(), 10); + assertEquals(k.getPrivate(), "p"); + assertEquals(k.getPublic(), 42.0); + } + + @Test public void verifyKeywordsInArrayClassCompiles() { + KeywordsInArray k = new KeywordsInArray(); + k.accessClass().add("c"); + k.getFinal().add("f"); + k.getInt().add(10); + k.getPrivate().add("p"); + k.getPublic().add(42.0); + + assertEquals(k.accessClass().get(0), "c"); + assertEquals(k.getFinal().get(0), "f"); + assertEquals(k.getInt().get(0), Integer.valueOf(10)); + assertEquals(k.getPrivate().get(0), "p"); + assertEquals(k.getPublic().get(0), 42.0); + } +} http://git-wip-us.apache.org/repos/asf/incubator-netbeans-html4j/blob/226089a5/json/src/test/java/net/java/html/json/MapModelNotMutableTest.java ---------------------------------------------------------------------- diff --git a/json/src/test/java/net/java/html/json/MapModelNotMutableTest.java b/json/src/test/java/net/java/html/json/MapModelNotMutableTest.java new file mode 100644 index 0000000..4851c5a --- /dev/null +++ b/json/src/test/java/net/java/html/json/MapModelNotMutableTest.java @@ -0,0 +1,227 @@ +/** + * 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.json; + +import java.util.Map; +import net.java.html.BrwsrCtx; +import org.netbeans.html.context.spi.Contexts; +import org.netbeans.html.json.spi.Technology; +import org.netbeans.html.json.spi.Transfer; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.fail; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +@Model(className = "ConstantValues", properties = { + @Property(name = "byteNumber", type = byte.class, mutable = false), + @Property(name = "shortNumber", type = short.class, mutable = false), + @Property(name = "intNumber", type = int.class, mutable = false), + @Property(name = "longNumber", type = long.class, mutable = false), + @Property(name = "floatNumber", type = float.class, mutable = false), + @Property(name = "doubleNumber", type = double.class, mutable = false), + @Property(name = "stringValue", type = String.class, mutable = false), + @Property(name = "byteArray", type = byte.class, mutable = false, array = true), + @Property(name = "shortArray", type = short.class, mutable = false, array = true), + @Property(name = "intArray", type = int.class, mutable = false, array = true), + @Property(name = "longArray", type = long.class, mutable = false, array = true), + @Property(name = "floatArray", type = float.class, mutable = false, array = true), + @Property(name = "doubleArray", type = double.class, mutable = false, array = true), + @Property(name = "stringArray", type = String.class, mutable = false, array = true), +}) +public class MapModelNotMutableTest { + private BrwsrCtx c; + + @BeforeMethod + public void initTechnology() { + MapModelTest.MapTechnology t = new MapModelTest.MapTechnology(); + c = Contexts.newBuilder().register(Technology.class, t, 1). + register(Transfer.class, t, 1).build(); + } + + @Test + public void byteConstant() throws Exception { + ConstantValues value = Models.bind(new ConstantValues(), c); + value.setByteNumber((byte)13); + + Map m = (Map) Models.toRaw(value); + Object v = m.get("byteNumber"); + assertNotNull(v, "Value should be in the map"); + assertEquals(v.getClass(), MapModelTest.One.class, "It is instance of One"); + MapModelTest.One o = (MapModelTest.One) v; + assertEquals(o.changes, 0, "No change so far the only one change happened before we connected"); + assertEquals((byte)13, o.get()); + + try { + value.setByteNumber((byte)15); + fail("Changing value shouldn't succeed!"); + } catch (IllegalStateException ex) { + // OK + } + assertEquals(o.get(), (byte)13, "Old value should still be in the map"); + assertEquals(o.changes, 0, "No change"); + assertFalse(o.pb.isReadOnly(), "Mutable property"); + } + + @Test + public void shortConstant() throws Exception { + ConstantValues value = Models.bind(new ConstantValues(), c); + value.setShortNumber((short)13); + + Map m = (Map) Models.toRaw(value); + Object v = m.get("shortNumber"); + assertNotNull(v, "Value should be in the map"); + assertEquals(v.getClass(), MapModelTest.One.class, "It is instance of One"); + MapModelTest.One o = (MapModelTest.One) v; + assertEquals(o.changes, 0, "No change so far the only one change happened before we connected"); + assertEquals((short)13, o.get()); + + try { + value.setShortNumber((short)15); + fail("Changing value shouldn't succeed!"); + } catch (IllegalStateException ex) { + // OK + } + assertEquals(o.get(), (short)13, "Old value should still be in the map"); + assertEquals(o.changes, 0, "No change"); + assertFalse(o.pb.isReadOnly(), "Mutable property"); + } + + @Test + public void intConstant() throws Exception { + ConstantValues value = Models.bind(new ConstantValues(), c); + value.setIntNumber(13); + + Map m = (Map) Models.toRaw(value); + Object v = m.get("intNumber"); + assertNotNull(v, "Value should be in the map"); + assertEquals(v.getClass(), MapModelTest.One.class, "It is instance of One"); + MapModelTest.One o = (MapModelTest.One) v; + assertEquals(o.changes, 0, "No change so far the only one change happened before we connected"); + assertEquals(13, o.get()); + + try { + value.setIntNumber(15); + fail("Changing value shouldn't succeed!"); + } catch (IllegalStateException ex) { + // OK + } + assertEquals(o.get(), 13, "Old value should still be in the map"); + assertEquals(o.changes, 0, "No change"); + assertFalse(o.pb.isReadOnly(), "Mutable property"); + } + + @Test + public void doubleConstant() throws Exception { + ConstantValues value = Models.bind(new ConstantValues(), c); + value.setDoubleNumber(13); + + Map m = (Map) Models.toRaw(value); + Object v = m.get("doubleNumber"); + assertNotNull(v, "Value should be in the map"); + assertEquals(v.getClass(), MapModelTest.One.class, "It is instance of One"); + MapModelTest.One o = (MapModelTest.One) v; + assertEquals(o.changes, 0, "No change so far the only one change happened before we connected"); + assertEquals(13.0, o.get()); + + try { + value.setDoubleNumber(15); + fail("Changing value shouldn't succeed!"); + } catch (IllegalStateException ex) { + // OK + } + assertEquals(o.get(), 13.0, "Old value should still be in the map"); + assertEquals(o.changes, 0, "No change"); + assertFalse(o.pb.isReadOnly(), "Mutable property"); + } + + @Test + public void stringConstant() throws Exception { + ConstantValues value = Models.bind(new ConstantValues(), c); + value.setStringValue("Hi"); + + Map m = (Map) Models.toRaw(value); + Object v = m.get("stringValue"); + assertNotNull(v, "Value should be in the map"); + assertEquals(v.getClass(), MapModelTest.One.class, "It is instance of One"); + MapModelTest.One o = (MapModelTest.One) v; + assertEquals(o.changes, 0, "No change so far the only one change happened before we connected"); + assertEquals("Hi", o.get()); + + try { + value.setStringValue("Hello"); + fail("Changing value shouldn't succeed!"); + } catch (IllegalStateException ex) { + // OK + } + assertEquals(o.get(), "Hi", "Old value should still be in the map"); + assertEquals(o.changes, 0, "No change"); + assertFalse(o.pb.isReadOnly(), "Mutable property"); + } + + @Test + public void stringArray() throws Exception { + ConstantValues value = Models.bind(new ConstantValues(), c); + value.getStringArray().add("Hi"); + + Map m = (Map) Models.toRaw(value); + Object v = m.get("stringArray"); + assertNotNull(v, "Value should be in the map"); + assertEquals(v.getClass(), MapModelTest.One.class, "It is instance of One"); + MapModelTest.One o = (MapModelTest.One) v; + assertEquals(o.changes, 0, "No change so far the only one change happened before we connected"); + assertEquals(o.get(), new String[] { "Hi" }, "One element"); + + try { + value.getStringArray().add("Hello"); + fail("Changing value shouldn't succeed!"); + } catch (UnsupportedOperationException ex) { + // OK + } + assertEquals(o.get(), new String[] { "Hi" }, "Old value should still be in the map"); + assertEquals(o.changes, 0, "No change"); + assertFalse(o.pb.isReadOnly(), "Mutable property"); + } + +}
