]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/accessor/java/JavaLong.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / accessor / java / JavaLong.java
1 /*******************************************************************************\r
2  *  Copyright (c) 2010 Association for Decentralized Information Management in\r
3  *  Industry THTH ry.\r
4  *  All rights reserved. This program and the accompanying materials\r
5  *  are made available under the terms of the Eclipse Public License v1.0\r
6  *  which accompanies this distribution, and is available at\r
7  *  http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  *  Contributors:\r
10  *      VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.databoard.accessor.java;
13
14 import org.simantics.databoard.Bindings;\r
15 import org.simantics.databoard.accessor.Accessor;\r
16 import org.simantics.databoard.accessor.LongAccessor;\r
17 import org.simantics.databoard.accessor.error.AccessorConstructionException;\r
18 import org.simantics.databoard.accessor.error.AccessorException;\r
19 import org.simantics.databoard.accessor.error.ReferenceException;\r
20 import org.simantics.databoard.accessor.event.Event;\r
21 import org.simantics.databoard.accessor.event.ValueAssigned;\r
22 import org.simantics.databoard.accessor.impl.AccessorParams;\r
23 import org.simantics.databoard.accessor.impl.ListenerEntry;\r
24 import org.simantics.databoard.accessor.interestset.LongInterestSet;\r
25 import org.simantics.databoard.accessor.reference.ChildReference;\r
26 import org.simantics.databoard.binding.ArrayBinding;\r
27 import org.simantics.databoard.binding.Binding;\r
28 import org.simantics.databoard.binding.LongBinding;\r
29 import org.simantics.databoard.binding.RecordBinding;\r
30 import org.simantics.databoard.binding.VariantBinding;\r
31 import org.simantics.databoard.binding.error.BindingException;\r
32 import org.simantics.databoard.binding.mutable.ContainerOptionalBinding;\r
33 import org.simantics.databoard.type.LongType;\r
34
35 public class JavaLong extends JavaObject implements LongAccessor {
36         
37         public JavaLong(Accessor parent, LongBinding binding, Object object, AccessorParams params) {
38                 super(parent, binding, object, params);
39         }
40         
41         public LongBinding getBinding() {
42                 return (LongBinding) binding;
43         }
44
45         @Override
46         public LongType type() {
47                 return getBinding().type();
48         }
49
50         @Override
51         public long getValue() throws AccessorException {\r
52                 readLock();
53                 try {
54                         return getBinding().getValue_(object);
55                 } catch (BindingException e) {
56                         throw new AccessorException(e);
57                 } finally {\r
58                         readUnlock();\r
59                 }
60         }\r
61         
62         @Override
63         public void setValue(long newValue) throws AccessorException {
64                 if (newValue == getValue()) return;\r
65                 writeLock();\r
66                 try {
67                         if (binding.isImmutable() && parent!=null && parent instanceof JavaArray) {\r
68                                 JavaObject jo = (JavaObject) parent;\r
69                                 ArrayBinding ab = (ArrayBinding) jo.binding;\r
70                                 Object nv = getBinding().create(newValue);\r
71                                 ab.set(jo.object, (Integer)keyInParent, nv);\r
72                                 this.object = nv;\r
73                         } else if (binding.isImmutable() && parent!=null && parent instanceof JavaRecord) {\r
74                                 JavaObject jo = (JavaObject) parent;\r
75                                 RecordBinding rb = (RecordBinding) jo.binding;\r
76                                 Object nv = getBinding().create(newValue);\r
77                                 rb.setComponent(jo.object, (Integer)keyInParent, nv);\r
78                                 this.object = nv;\r
79                         } else if (binding.isImmutable() && parent!=null && parent instanceof JavaVariant) {\r
80                                 JavaObject jo = (JavaObject) parent;\r
81                                 VariantBinding vb = (VariantBinding) jo.binding;\r
82                                 Object nv = getBinding().create(newValue);\r
83                                 vb.setContent(jo.object, getBinding(), nv);\r
84                                 this.object = nv;\r
85                         } else if (binding.isImmutable() && parent!=null && parent instanceof JavaOptional) {\r
86                                 // Plain assign\r
87                                 JavaOptional jo = (JavaOptional) parent;\r
88                                 ContainerOptionalBinding vb = (ContainerOptionalBinding) jo.binding;\r
89                                 vb.setValue(jo.object, newValue);\r
90                                 this.object = newValue;\r
91                         } else {\r
92                                 // Set value\r
93                                 getBinding().setValue(object, newValue);\r
94                         }\r
95 \r
96                         
97                         // Notify
98                         ListenerEntry le = listeners;
99                         while (le!=null) {
100                                 LongInterestSet is = le.getInterestSet();
101                                 if (is.inNotifications()) {
102                                         Event e = new ValueAssigned( Bindings.LONG, is.inValues() ? newValue : null );
103                                         emitEvent(le, e);
104                                 }
105                                 le = le.next;
106                         }
107                         
108                 } catch (BindingException e) {
109                         throw new AccessorException(e);
110                 } finally {\r
111                         writeUnlock();\r
112                 }
113         }
114
115         @Override
116         public void setValue(Binding binding, Object newValue) throws AccessorException {
117                 try {
118                         long nv = ((LongBinding)binding).getValue_(newValue);
119                         setValue(nv);
120                 } catch (BindingException e) {
121                         throw new AccessorException(e);
122                 }
123         }
124
125         @SuppressWarnings("unchecked")
126         @Override
127         public <T extends Accessor> T getComponent(ChildReference reference)
128         throws AccessorConstructionException {
129                 if (reference==null) return (T) this;           
130                 throw new ReferenceException(reference.getClass()+" is not a subreference of LongType");        
131         }
132
133         @Override
134         Event applyLocal(Event e, boolean makeRollback) throws AccessorException {
135                 Event rollback = makeRollback ? new ValueAssigned( Bindings.LONG, getValue() ) : null;          \r
136                 if (e instanceof ValueAssigned) {\r
137                         ValueAssigned va = (ValueAssigned) e;\r
138                         if (va.newValue == null) throw new AccessorException("Long value expected, got null");                  \r
139                         setValue(va.newValue.getBinding(), va.newValue.getValue());\r
140                         return rollback;\r
141                 } else {\r
142                         throw new AccessorException("Cannot apply "+e.getClass().getName()+" to Long");                 \r
143                 }
144         }
145
146
147 }
148