json/src/main/java/org/netbeans/html/json/spi/Technology.java
author Jaroslav Tulach <jtulach@netbeans.org>
Tue, 16 Dec 2014 21:03:16 +0100
branchApplyId
changeset 908 ee7a0b3b2d4c
parent 886 88d62267a0b5
child 1028 453e44c757ff
permissions -rw-r--r--
Providing an ability to apply model to element with certain id
jaroslav@9
     1
/**
jaroslav@358
     2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
jaroslav@9
     3
 *
jaroslav@551
     4
 * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
jaroslav@9
     5
 *
jaroslav@358
     6
 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
jaroslav@358
     7
 * Other names may be trademarks of their respective owners.
jaroslav@9
     8
 *
jaroslav@358
     9
 * The contents of this file are subject to the terms of either the GNU
jaroslav@358
    10
 * General Public License Version 2 only ("GPL") or the Common
jaroslav@358
    11
 * Development and Distribution License("CDDL") (collectively, the
jaroslav@358
    12
 * "License"). You may not use this file except in compliance with the
jaroslav@358
    13
 * License. You can obtain a copy of the License at
jaroslav@358
    14
 * http://www.netbeans.org/cddl-gplv2.html
jaroslav@358
    15
 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
jaroslav@358
    16
 * specific language governing permissions and limitations under the
jaroslav@358
    17
 * License.  When distributing the software, include this License Header
jaroslav@358
    18
 * Notice in each file and include the License file at
jaroslav@358
    19
 * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
jaroslav@358
    20
 * particular file as subject to the "Classpath" exception as provided
jaroslav@358
    21
 * by Oracle in the GPL Version 2 section of the License file that
jaroslav@358
    22
 * accompanied this code. If applicable, add the following below the
jaroslav@358
    23
 * License Header, with the fields enclosed by brackets [] replaced by
jaroslav@358
    24
 * your own identifying information:
jaroslav@358
    25
 * "Portions Copyrighted [year] [name of copyright owner]"
jaroslav@358
    26
 *
jaroslav@358
    27
 * Contributor(s):
jaroslav@358
    28
 *
jaroslav@358
    29
 * The Original Software is NetBeans. The Initial Developer of the Original
jaroslav@551
    30
 * Software is Oracle. Portions Copyright 2013-2014 Oracle. All Rights Reserved.
jaroslav@358
    31
 *
jaroslav@358
    32
 * If you wish your version of this file to be governed by only the CDDL
jaroslav@358
    33
 * or only the GPL Version 2, indicate your decision by adding
jaroslav@358
    34
 * "[Contributor] elects to include this software in this distribution
jaroslav@358
    35
 * under the [CDDL or GPL Version 2] license." If you do not indicate a
jaroslav@358
    36
 * single choice of license, a recipient has the option to distribute
jaroslav@358
    37
 * your version of this file under either the CDDL, the GPL Version 2 or
jaroslav@358
    38
 * to extend the choice of license to its licensees as provided above.
jaroslav@358
    39
 * However, if you add GPL Version 2 code and therefore, elected the GPL
jaroslav@358
    40
 * Version 2 license, then the option applies only if the new code is
jaroslav@358
    41
 * made subject to such option by the copyright holder.
jaroslav@9
    42
 */
jtulach@838
    43
package org.netbeans.html.json.spi;
jaroslav@6
    44
jaroslav@575
    45
import net.java.html.BrwsrCtx;
jaroslav@6
    46
import net.java.html.json.Model;
jaroslav@308
    47
import net.java.html.json.Models;
jtulach@886
    48
import org.netbeans.html.context.spi.Contexts.Id;
jaroslav@6
    49
jaroslav@6
    50
/** An implementation of a binding between model classes (see {@link Model})
jaroslav@6
    51
 * and particular technology like <a href="http://knockoutjs.com">knockout.js</a>
jaroslav@6
    52
 * in a browser window, etc.
jtulach@886
    53
 * Since introduction of {@link Id technology identifiers} one can choose between
jtulach@886
    54
 * different background implementations to handle the conversion and
jtulach@886
    55
 * communication requests. The currently known provider is
jtulach@886
    56
 * <code>org.netbeans.html:ko4j</code> module which registers 
jtulach@886
    57
 * a <a href="http://knockoutjs.com" target="_blank">knockout.js</a>
jtulach@886
    58
 * implementation called <b>ko4j</b>.
jaroslav@6
    59
 *
jtulach@790
    60
 * @author Jaroslav Tulach
jaroslav@6
    61
 */
jaroslav@6
    62
public interface Technology<Data> {
jaroslav@6
    63
    /** Creates an object to wrap the provided model object. The model
jaroslav@6
    64
     * has previously been generated by annotation processor associated 
jaroslav@6
    65
     * with {@link Model} annotation.
jaroslav@6
    66
     * 
jaroslav@6
    67
     * @param model the model generated from {@link Model}
jaroslav@34
    68
     * @return internal object representing the model
jaroslav@6
    69
     */
jaroslav@6
    70
    public Data wrapModel(Object model);
jaroslav@9
    71
    
jaroslav@38
    72
    /** Converts an element potentially representing a model into the model.
jtulach@835
    73
     * @param <M> the type of the <code>modelClass</code>
jaroslav@38
    74
     * @param modelClass expected class to convert the data to
jaroslav@38
    75
     * @param data the current data provided from the browser
jaroslav@38
    76
     * @return the instance of modelClass somehow extracted from the data, may return <code>null</code>
jaroslav@38
    77
     */
jaroslav@38
    78
    public <M> M toModel(Class<M> modelClass, Object data);
jaroslav@38
    79
    
jaroslav@9
    80
    /** Binds a property between the model and the data as used by the technology.
jaroslav@9
    81
     * 
jaroslav@9
    82
     * @param b the description of the requested binding
jaroslav@9
    83
     * @param model the original instance of the model
jaroslav@9
    84
     * @param data the data to bind with the model
jaroslav@9
    85
     */
jaroslav@9
    86
    public void bind(PropertyBinding b, Object model, Data data);
jaroslav@6
    87
jaroslav@6
    88
    /** Model for given data has changed its value. The technology is
jaroslav@6
    89
     * supposed to update its state (for example DOM nodes associated
jaroslav@6
    90
     * with the model). The update usually happens asynchronously.
jaroslav@6
    91
     * 
jaroslav@6
    92
     * @param data technology's own representation of the model
jaroslav@6
    93
     * @param propertyName name of the model property that changed
jaroslav@6
    94
     */
jaroslav@6
    95
    public void valueHasMutated(Data data, String propertyName);
jaroslav@11
    96
jaroslav@11
    97
    public void expose(FunctionBinding fb, Object model, Data d);
jaroslav@14
    98
    
jaroslav@14
    99
    /** Applies given data to current context (usually an HTML page).
jaroslav@14
   100
     * @param data the data to apply
jaroslav@14
   101
     */
jaroslav@14
   102
    public void applyBindings(Data data);
jaroslav@23
   103
    
jaroslav@23
   104
    /**
jaroslav@23
   105
     * Some technologies may require wrapping a Java array into a special
jaroslav@17
   106
     * object. In such case they may return it from this method.
jaroslav@23
   107
     *
jaroslav@17
   108
     * @param arr original array
jaroslav@17
   109
     * @return wrapped array
jaroslav@17
   110
     */
jaroslav@17
   111
    public Object wrapArray(Object[] arr);
jaroslav@240
   112
    
jaroslav@240
   113
    /** 
jaroslav@240
   114
     * Run given runnable in a safe mode. If the runnable can be executed
jaroslav@240
   115
     * immediately, do it. If we need to switch to some other thread, do it
jaroslav@240
   116
     * and invoke r asynchronously immediately returning from the call to
jaroslav@240
   117
     * runSafe method.
jaroslav@240
   118
     * 
jaroslav@240
   119
     * @param r the runnable to execute
jaroslav@575
   120
     * @deprecated Use {@link BrwsrCtx#execute(java.lang.Runnable)}
jaroslav@240
   121
     */
jaroslav@575
   122
    @Deprecated
jaroslav@240
   123
    public void runSafe(Runnable r);
jaroslav@275
   124
jaroslav@308
   125
    /** For certain rendering technologies it may be more efficient to register
jaroslav@308
   126
     * property and function bindings for one instance of the model at once, 
jaroslav@308
   127
     * rather then doing it incrementally via 
jtulach@838
   128
     * {@link Technology#expose(org.netbeans.html.json.spi.FunctionBinding, java.lang.Object, java.lang.Object) }
jaroslav@308
   129
     * and 
jtulach@838
   130
     * {@link Technology#bind(org.netbeans.html.json.spi.PropertyBinding, java.lang.Object, java.lang.Object) }.
jtulach@838
   131
     * In such case implement the {@link #wrapModel(java.lang.Object, org.netbeans.html.json.spi.PropertyBinding[], org.netbeans.html.json.spi.FunctionBinding[]) }
jaroslav@308
   132
     * method of this interface and it will be called instead of the 
jaroslav@308
   133
     * previous two ones.
jaroslav@308
   134
     * 
jaroslav@534
   135
     * @since 0.6
jaroslav@308
   136
     */
jaroslav@275
   137
    public static interface BatchInit<D> extends Technology<D> {
jaroslav@308
   138
        /** Wrap the given model into redering technology appropriate object 
jaroslav@308
   139
         * <code>D</code> and expose given properties and functions on it.
jaroslav@308
   140
         * 
jaroslav@308
   141
         * @param model the {@link Models#isModel(java.lang.Class) model} in Java
jaroslav@308
   142
         * @param propArr array of property bindings to expose
jaroslav@308
   143
         * @param funcArr array of functions to expose
jaroslav@308
   144
         * @return appropriate wrapper around the model
jaroslav@308
   145
         */
jaroslav@275
   146
        public D wrapModel(Object model, PropertyBinding[] propArr, FunctionBinding[] funcArr);
jaroslav@275
   147
    }
jaroslav@567
   148
jaroslav@567
   149
    /** Some technologies are more effective when number of calls between
jaroslav@567
   150
     * Java and JavaScript is limited - to do that when a value of property
jaroslav@567
   151
     * is changed they should implement this additional interface.
jaroslav@567
   152
     * 
jaroslav@567
   153
     * @param <D> internal type of the technology
jaroslav@567
   154
     * @since 0.7.6
jaroslav@567
   155
     */
jaroslav@567
   156
    public static interface ValueMutated<D> extends Technology<D> {
jaroslav@567
   157
        /** Model for given data has changed its value. The technology is
jaroslav@567
   158
         * supposed to update its state (for example DOM nodes associated
jaroslav@567
   159
         * with the model). The update usually happens asynchronously.
jaroslav@567
   160
         * <p>
jaroslav@567
   161
         * If both <code>oldValue</code> and <code>newValue</code> are 
jaroslav@567
   162
         * <code>null</code> then the real value of the technology is
jaroslav@567
   163
         * not known.
jaroslav@567
   164
         * <p>
jaroslav@567
   165
         * If this method is present, then it is called instead of 
jaroslav@567
   166
         * old, plain {@link #valueHasMutated(java.lang.Object, java.lang.String)}
jaroslav@567
   167
         * which is never called by the infrastructure then.
jaroslav@567
   168
         * 
jaroslav@567
   169
         * @param data technology's own representation of the model
jaroslav@567
   170
         * @param propertyName name of the model property that changed
jaroslav@567
   171
         * @param oldValue provides previous value of the property
jaroslav@567
   172
         * @param newValue provides new value of the property
jaroslav@567
   173
         */
jaroslav@567
   174
        public void valueHasMutated(D data, String propertyName, Object oldValue, Object newValue);
jaroslav@567
   175
    }
jtulach@908
   176
    
jtulach@908
   177
    /** Apply technology bindings at selected subtree of the HTML page.
jtulach@908
   178
     * Can be accessed via {@link Proto#applyBindings(java.lang.String)} or
jtulach@908
   179
     * via method <code>applyBindings(String)</code> generated when one
jtulach@908
   180
     * is using the {@link Model} annotation.
jtulach@908
   181
     * 
jtulach@908
   182
     * @param <D> the internal data for the technology
jtulach@908
   183
     * @since 1.1
jtulach@908
   184
     */
jtulach@908
   185
    public static interface ApplyId<D> extends Technology<D> {
jtulach@908
   186
        /** Applies given data to current context (usually an element on an 
jtulach@908
   187
         * HTML page).
jtulach@908
   188
         * 
jtulach@908
   189
         * @param id the id of an element to apply the data to
jtulach@908
   190
         * @param data the data to apply
jtulach@908
   191
         */
jtulach@908
   192
        public void applyBindings(String id, D data);
jtulach@908
   193
    }
jaroslav@6
   194
}