All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.netbeans.html.json.spi.Technology Maven / Gradle / Ivy

Go to download

API for smooth representation of JSON objects in Java. Write your application in Java and present it using modern HTML rendering technologies like Knockout.

The newest version!
/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
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 knockout.js
 * in a browser window, etc.Since introduction of {@link Id technology identifiers} one can choose between
 different background implementations to handle the conversion and
 communication requests.
 * The currently known provider is
 org.netbeans.html:ko4j module which registers 
 * a knockout.js
 * implementation called ko4j.
 *
 * @param  technology internal type that keeps internal data for each
 *    instance of {@linkplain Model model class}.
 *
 * @author Jaroslav Tulach
 */
public interface Technology {
    /** 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  the type of the modelClass
     * @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 null
     */
    public  M toModel(Class 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 extends Technology {
        /** Wrap the given model into rendering technology appropriate object
         * D 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  internal type of the technology
     * @since 0.7.6
     */
    public static interface ValueMutated extends Technology {
        /** 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.
         * 

* If both oldValue and newValue are * null then the real value of the technology is * not known. *

* 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 applyBindings(String) generated when one * is using the {@link Model} annotation. * * @param the internal data for the technology * @since 1.1 */ public static interface ApplyId extends Technology { /** 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 extends Technology { /** Wrap the given model into rendering technology appropriate object * D 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 null * @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); } /** Convertor of the internal data type to object suitable as a JavaScript * representation. Certain technologies need to keep some data in Java * and only part of them in JavaScript-ready object. With the help of * {@code ToJavaScript} interface, they can parametrize their * {@link Technology} with the Java type and implement * {@link #toJavaScript(java.lang.Object)} * method to extract the proper JavaScript part from that object. * * @param the internal data type * @since 1.5.1 */ public static interface ToJavaScript extends Technology { /** Extracts JavaScript ready representation. * * @param data technology's internal data structure * @return object ready to represent the data in JavaScript * @since 1.5.1 */ public Object toJavaScript(D data); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy