2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
4 * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
6 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
7 * Other names may be trademarks of their respective owners.
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]"
29 * The Original Software is NetBeans. The Initial Developer of the Original
30 * Software is Oracle. Portions Copyright 2013-2014 Oracle. All Rights Reserved.
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.
43 package org.apidesign.html.json.spi;
45 import net.java.html.BrwsrCtx;
46 import org.netbeans.html.json.impl.Bindings;
47 import org.netbeans.html.json.impl.JSON;
48 import org.netbeans.html.json.impl.PropertyBindingAccessor;
49 import org.netbeans.html.json.impl.RcvrJSON;
51 /** Describes a property when one is asked to
54 * @author Jaroslav Tulach <jtulach@netbeans.org>
56 public abstract class PropertyBinding {
61 new PropertyBindingAccessor() {
63 protected JSONCall newCall(BrwsrCtx ctx, RcvrJSON callback, String urlBefore, String urlAfter, String method, Object data) {
64 return new JSONCall(ctx, callback, urlBefore, urlAfter, method, data);
68 protected Bindings bindings(Proto proto, boolean initialize) {
69 return initialize ? proto.initBindings() : proto.getBindings();
73 protected void notifyChange(Proto proto, int propIndex) {
74 proto.onChange(propIndex);
78 protected Proto findProto(Proto.Type<?> type, Object object) {
79 return type.protoFor(object);
83 protected <Model> Model cloneTo(Proto.Type<Model> type, Model model, BrwsrCtx c) {
84 return type.cloneTo(model, c);
88 protected Object read(Proto.Type<?> from, BrwsrCtx c, Object data) {
89 return from.read(c, data);
93 protected <M> PropertyBinding newBinding(
94 Proto.Type<M> access, Bindings<?> bindings, String name,
95 int index, M model, boolean readOnly
97 return new Impl(bindings, name, index, model, access, readOnly);
102 /** Name of the property this binding represents.
103 * @return name of the property
105 public abstract String getPropertyName();
107 /** Changes value of the property. Can be called only on dedicated
108 * thread. See {@link Technology#runSafe(java.lang.Runnable)}.
110 * @param v new value of the property
112 public abstract void setValue(Object v);
114 /** Obtains current value of the property this binding represents.
115 * Can be called only on dedicated
116 * thread. See {@link Technology#runSafe(java.lang.Runnable)}.
118 * @return the value or <code>null</code>
120 public abstract Object getValue();
122 /** Is this property read only? Or can one call {@link #setValue(java.lang.Object)}?
124 * @return true, if this property is read only
126 public abstract boolean isReadOnly();
128 private static final class Impl<M> extends PropertyBinding {
129 public final String name;
130 public final boolean readOnly;
131 private final M model;
132 private final Proto.Type<M> access;
133 private final Bindings<?> bindings;
134 private final int index;
136 public Impl(Bindings<?> bindings, String name, int index, M model, Proto.Type<M> access, boolean readOnly) {
137 this.bindings = bindings;
141 this.access = access;
142 this.readOnly = readOnly;
146 public void setValue(Object v) {
147 access.setValue(model, index, v);
151 public Object getValue() {
152 Object v = access.getValue(model, index);
153 Object r = JSON.find(v, bindings);
154 return r == null ? v : r;
158 public boolean isReadOnly() {
163 public String getPropertyName() {