/* * libbrlapi - A library providing access to braille terminals for applications. * * Copyright (C) 2006-2021 by * Samuel Thibault * Sébastien Hinderer * * libbrlapi comes with ABSOLUTELY NO WARRANTY. * * This is free software, placed under the terms of the * GNU Lesser General Public License, as published by the Free Software * Foundation; either version 2.1 of the License, or (at your option) any * later version. Please see the file LICENSE-LGPL for details. * * Web Page: http://brltty.app/ * * This software is maintained by Dave Mielke . */ package org.a11y.brlapi; public abstract class Parameter extends ParameterComponent { private final ConnectionBase clientConnection; protected Parameter (ConnectionBase connection) { super(); clientConnection = connection; } private String parameterLabel = null; public String getLabel () { synchronized (this) { if (parameterLabel == null) { parameterLabel = Strings.wordify( Strings.replaceAll(getClass().getSimpleName(), "Parameter$", "") ); } } return parameterLabel; } private String parameterName = null; public String getName () { synchronized (this) { if (parameterName == null) { parameterName = toOperandName(getLabel()); } } return parameterName; } public abstract int getParameter (); public abstract boolean isGlobal (); public boolean isHidable () { return false; } protected final Object getValue (long subparam) { return clientConnection.getParameter(getParameter(), subparam, isGlobal()); } protected final Object getValue () { return getValue(0); } protected final void setValue (long subparam, Object value) { clientConnection.setParameter(getParameter(), subparam, isGlobal(), value); } protected final void setValue (Object value) { setValue(0, value); } public Object get (long subparam) { return null; } public String toString (long subparam) { return toString(get(subparam)); } public Object get () { return null; } @Override public String toString () { return toString(get()); } public interface Settable { } public final boolean isSettable () { return this instanceof Settable; } public interface StringSettable extends Settable { public void set (String value) throws SyntaxException; } public interface BooleanSettable extends Settable { public void set (boolean value); } public interface ByteSettable extends Settable { public void set (byte value); public default byte getMinimum () { return 0; } public default byte getMaximum () { return Byte.MAX_VALUE; } } public interface ShortSettable extends Settable { public void set (short value); public default short getMinimum () { return 0; } public default short getMaximum () { return Short.MAX_VALUE; } } public interface IntSettable extends Settable { public void set (int value); public default int getMinimum () { return 0; } public default int getMaximum () { return Integer.MAX_VALUE; } } public interface LongSettable extends Settable { public void set (long value); public default long getMinimum () { return 0; } public default long getMaximum () { return Long.MAX_VALUE; } } protected final String getParseDescription () { return getName() + " value"; } public void set (String value) throws OperandException { if (!isSettable()) { throw new SemanticException("parameter is not settable: %s", getName()); } if (this instanceof StringSettable) { StringSettable settable = (StringSettable)this; settable.set(value); return; } if (this instanceof BooleanSettable) { BooleanSettable settable = (BooleanSettable)this; settable.set(Parse.asBoolean(getParseDescription(), value)); return; } if (this instanceof ByteSettable) { ByteSettable settable = (ByteSettable)this; settable.set(Parse.asByte(getParseDescription(), value, settable.getMinimum(), settable.getMaximum())); return; } if (this instanceof ShortSettable) { ShortSettable settable = (ShortSettable)this; settable.set(Parse.asShort(getParseDescription(), value, settable.getMinimum(), settable.getMaximum())); return; } if (this instanceof IntSettable) { IntSettable settable = (IntSettable)this; settable.set(Parse.asInt(getParseDescription(), value, settable.getMinimum(), settable.getMaximum())); return; } if (this instanceof LongSettable) { LongSettable settable = (LongSettable)this; settable.set(Parse.asLong(getParseDescription(), value, settable.getMinimum(), settable.getMaximum())); return; } { Class type = Settable.class; for (Class i : getClass().getInterfaces()) { if (type.isAssignableFrom(i)) { type = i; break; } } throw new UnsupportedOperationException( String.format( "set not supported: %s: %s", getName(), type.getSimpleName() ) ); } } public final static class WatcherHandle implements AutoCloseable { private long watchIdentifier; private WatcherHandle (long identifier) { watchIdentifier = identifier; } @Override public void close () { synchronized (this) { if (watchIdentifier != 0) { ConnectionBase.unwatchParameter(watchIdentifier); watchIdentifier = 0; } } } } public final WatcherHandle watch (long subparam, ParameterWatcher watcher) { return new WatcherHandle( clientConnection.watchParameter( getParameter(), subparam, isGlobal(), watcher ) ); } public final WatcherHandle watch (ParameterWatcher watcher) { return watch(0, watcher); } }