/******************************************************************************* * Copyright (c) 2010 Association for Decentralized Information Management in * Industry THTH ry. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.databoard.accessor.java; import org.simantics.databoard.Bindings; import org.simantics.databoard.accessor.Accessor; import org.simantics.databoard.accessor.ByteAccessor; import org.simantics.databoard.accessor.error.AccessorConstructionException; import org.simantics.databoard.accessor.error.AccessorException; import org.simantics.databoard.accessor.error.ReferenceException; import org.simantics.databoard.accessor.event.Event; import org.simantics.databoard.accessor.event.ValueAssigned; import org.simantics.databoard.accessor.impl.AccessorParams; import org.simantics.databoard.accessor.impl.ListenerEntry; import org.simantics.databoard.accessor.interestset.ByteInterestSet; import org.simantics.databoard.accessor.reference.ChildReference; import org.simantics.databoard.binding.ArrayBinding; import org.simantics.databoard.binding.Binding; import org.simantics.databoard.binding.ByteBinding; import org.simantics.databoard.binding.RecordBinding; import org.simantics.databoard.binding.VariantBinding; import org.simantics.databoard.binding.error.BindingException; import org.simantics.databoard.type.ByteType; /** * Accessor to a Java Object that contains a Byte Type. * * @author Toni Kalajainen */ public class JavaByte extends JavaObject implements ByteAccessor { public JavaByte(Accessor parent, ByteBinding binding, Object object, AccessorParams params) { super(parent, binding, object, params); } public ByteBinding getBinding() { return (ByteBinding) binding; } @Override public ByteType type() { return getBinding().type(); } @Override public byte getValue() throws AccessorException { readLock(); try { return getBinding().getValue_(object); } catch (BindingException e) { throw new AccessorException(e); } finally { readUnlock(); } } @Override public void setValue(byte newValue) throws AccessorException { if (newValue == getValue()) return; writeLock(); try { if (binding.isImmutable() && parent!=null && parent instanceof JavaArray) { JavaObject jo = (JavaObject) parent; ArrayBinding ab = (ArrayBinding) jo.binding; Object nv = getBinding().create(newValue); ab.set(jo.object, (Integer)keyInParent, nv); this.object = nv; } else if (binding.isImmutable() && parent!=null && parent instanceof JavaRecord) { JavaObject jo = (JavaObject) parent; RecordBinding rb = (RecordBinding) jo.binding; Object nv = getBinding().create(newValue); rb.setComponent(jo.object, (Integer)keyInParent, nv); this.object = nv; } else if (binding.isImmutable() && parent!=null && parent instanceof JavaVariant) { JavaObject jo = (JavaObject) parent; VariantBinding vb = (VariantBinding) jo.binding; Object nv = getBinding().create(newValue); vb.setContent(jo.object, getBinding(), nv); this.object = nv; } else { // Set value getBinding().setValue(object, newValue); } // Notify ListenerEntry le = listeners; while (le!=null) { ByteInterestSet is = le.getInterestSet(); if (is.inNotifications()) { Event e = new ValueAssigned( Bindings.BYTE, is.inValues() ? newValue : null ); emitEvent(le, e); } le = le.next; } } catch (BindingException e) { throw new AccessorException(e); } finally { writeUnlock(); } } @Override public void setValue(Binding binding, Object newValue) throws AccessorException { try { byte nv = ((ByteBinding)binding).getValue_(newValue); setValue(nv); } catch (BindingException e) { throw new AccessorException(e); } } @SuppressWarnings("unchecked") @Override public T getComponent(ChildReference reference) throws AccessorConstructionException { if (reference==null) return (T) this; throw new ReferenceException(reference.getClass()+" is not a subreference of BooleanType"); } @Override Event applyLocal(Event e, boolean makeRollback) throws AccessorException { Event rollback = makeRollback ? new ValueAssigned( Bindings.BYTE, getValue() ) : null; if (e instanceof ValueAssigned) { ValueAssigned va = (ValueAssigned) e; if (va.newValue == null) throw new AccessorException("Byte value expected, got null"); setValue(va.newValue.getBinding(), va.newValue.getValue()); return rollback; } else { throw new AccessorException("Cannot apply "+e.getClass().getName()+" to Byte"); } } }