json/src/main/java/net/java/html/json/Model.java
author Jaroslav Tulach <jaroslav.tulach@netbeans.org>
Fri, 07 Feb 2014 07:44:34 +0100
changeset 551 7ca2253fa86d
parent 549 11198031c76a
child 655 7211ec5f3172
permissions -rw-r--r--
Updating copyright headers to mention current year
     1 /**
     2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
     3  *
     4  * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
     5  *
     6  * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
     7  * Other names may be trademarks of their respective owners.
     8  *
     9  * The contents of this file are subject to the terms of either the GNU
    10  * General Public License Version 2 only ("GPL") or the Common
    11  * Development and Distribution License("CDDL") (collectively, the
    12  * "License"). You may not use this file except in compliance with the
    13  * License. You can obtain a copy of the License at
    14  * http://www.netbeans.org/cddl-gplv2.html
    15  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
    16  * specific language governing permissions and limitations under the
    17  * License.  When distributing the software, include this License Header
    18  * Notice in each file and include the License file at
    19  * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
    20  * particular file as subject to the "Classpath" exception as provided
    21  * by Oracle in the GPL Version 2 section of the License file that
    22  * accompanied this code. If applicable, add the following below the
    23  * License Header, with the fields enclosed by brackets [] replaced by
    24  * your own identifying information:
    25  * "Portions Copyrighted [year] [name of copyright owner]"
    26  *
    27  * Contributor(s):
    28  *
    29  * The Original Software is NetBeans. The Initial Developer of the Original
    30  * Software is Oracle. Portions Copyright 2013-2014 Oracle. All Rights Reserved.
    31  *
    32  * If you wish your version of this file to be governed by only the CDDL
    33  * or only the GPL Version 2, indicate your decision by adding
    34  * "[Contributor] elects to include this software in this distribution
    35  * under the [CDDL or GPL Version 2] license." If you do not indicate a
    36  * single choice of license, a recipient has the option to distribute
    37  * your version of this file under either the CDDL, the GPL Version 2 or
    38  * to extend the choice of license to its licensees as provided above.
    39  * However, if you add GPL Version 2 code and therefore, elected the GPL
    40  * Version 2 license, then the option applies only if the new code is
    41  * made subject to such option by the copyright holder.
    42  */
    43 package net.java.html.json;
    44 
    45 import java.lang.annotation.ElementType;
    46 import java.lang.annotation.Retention;
    47 import java.lang.annotation.RetentionPolicy;
    48 import java.lang.annotation.Target;
    49 import java.net.URL;
    50 
    51 /** Defines a model class that represents a single 
    52  * <a href="http://en.wikipedia.org/wiki/JSON">JSON</a>-like object
    53  * named {@link #className()}. The generated class contains
    54  * getters and setters for properties defined via {@link #properties()} and
    55  * getters for other, derived properties defined by annotating methods
    56  * of this class by {@link ComputedProperty}. Each property
    57  * can be of primitive type, an {@link Enum enum type} or (in order to create 
    58  * nested <a href="http://en.wikipedia.org/wiki/JSON">JSON</a> structure)
    59  * of another {@link Model class generated by @Model} annotation. Each property
    60  * can either represent a single value or be an array of its values.
    61  * <p>
    62  * The {@link #className() generated class}'s <code>toString</code> method
    63  * converts the state of the object into 
    64  * <a href="http://en.wikipedia.org/wiki/JSON">JSON</a> format. One can
    65  * use {@link Models#parse(net.java.html.BrwsrCtx, java.lang.Class, java.io.InputStream)}
    66  * method to read the JSON text stored in a file or other stream back into the Java model. 
    67  * One can also use {@link OnReceive @OnReceive} annotation to read the model
    68  * asynchronously from a {@link URL}.
    69  * <p>
    70  * An example where one defines class <code>Person</code> with four
    71  * properties (<code>firstName</code>, <code>lastName</code>, array of <code>addresses</code> and
    72  * <code>fullName</code>) follows:
    73  * <pre>
    74  * {@link Model @Model}(className="Person", properties={
    75  *   {@link Property @Property}(name = "firstName", type=String.class),
    76  *   {@link Property @Property}(name = "lastName", type=String.class)
    77  *   {@link Property @Property}(name = "addresses", type=Address.class, array = true)
    78  * })
    79  * static class PersonModel {
    80  *   {@link ComputedProperty @ComputedProperty}
    81  *   static String fullName(String firstName, String lastName) {
    82  *     return firstName + " " + lastName;
    83  *   }
    84  * 
    85  *   {@link Model @Model}(className="Address", properties={
    86  *     {@link Property @Property}(name = "street", type=String.class),
    87  *     {@link Property @Property}(name = "town", type=String.class)
    88  *   })
    89  *   static class AddressModel {
    90  *   }
    91  * }
    92  * </pre>
    93  * The generated model class has a default constructor, and also <em>quick
    94  * instantiation</em> constructor that accepts all non-array properties 
    95  * (in the order used in the {@link #properties()} attribute) and vararg list
    96  * for the first array property (if any). One can thus use following code
    97  * to create an instance of the Person and Address classes:
    98  * <pre>
    99  * 
   100  * Person p = new Person("Jaroslav", "Tulach",
   101  *   new Address("Markoušovice", "Úpice"),
   102  *   new Address("V Parku", "Praha")
   103  * );
   104  * // p.toString() then returns equivalent of following <a href="http://en.wikipedia.org/wiki/JSON">JSON</a> object
   105  * {
   106  *   "firstName" : "Jaroslav",
   107  *   "lastName" : "Tulach",
   108  *   "addresses" : [
   109  *     { "street" : "Markoušovice", "town" : "Úpice" },
   110  *     { "street" : "V Parku", "town" : "Praha" },
   111  *   ]
   112  * }
   113  * </pre>
   114  * <p>
   115  * In case you are using <a href="http://knockoutjs.com/">Knockout technology</a>
   116  * for Java then you can associate such model object with surrounding HTML page by
   117  * calling: <code>p.applyBindings();</code>. The page can then use regular
   118  * <a href="http://knockoutjs.com/">Knockout</a> bindings to reference your
   119  * model and create dynamic connection between your model in Java and 
   120  * live DOM structure in the browser:
   121  * <pre>
   122  * Name: &lt;span data-bind="text: fullName"&gt;
   123  * &lt;div data-bind="foreach: addresses"&gt;
   124  *   Lives in &lt;span data-bind="text: town"/&gt;
   125  * &lt;/div&gt;
   126  * </pre>
   127  * <p>
   128  * Visit an <a target="_blank" href="http://dew.apidesign.org/dew/#7510833">on-line demo</a>
   129  * to see a histogram driven by the {@link Model} annotation or try 
   130  * a little <a target="_blank" href="http://dew.apidesign.org/dew/#7263102">math test</a>.
   131  *
   132  * @author Jaroslav Tulach <jtulach@netbeans.org>
   133  */
   134 @Retention(RetentionPolicy.SOURCE)
   135 @Target(ElementType.TYPE)
   136 public @interface Model {
   137     /** Name of the model class */
   138     String className();
   139     /** List of properties in the model.
   140      */
   141     Property[] properties();
   142 }