Javolution 6.0.0 java
Configurable.java
Go to the documentation of this file.
1 /*
2  * Javolution - Java(TM) Solution for Real-Time and Embedded Systems
3  * Copyright (C) 2012 - Javolution (http://javolution.org/)
4  * All rights reserved.
5  *
6  * Permission to use, copy, modify, and distribute this software is
7  * freely granted, provided that this notice is preserved.
8  */
9 package javolution.lang;
10 
11 import java.lang.reflect.Field;
12 
19 
78 public abstract class Configurable<T> {
79 
84  public interface Listener {
85 
92  <T> void configurableInitialized(Configurable<T> configurable, T value);
93 
102  T oldValue, T newValue);
103 
104  }
105 
116  Configurable.class, "reconfigure");
117 
121  private String name;
122 
127 
131  private volatile T value;
132 
142  public Configurable() {
144  Configurable.class, "reconfigure", this);
145  String name = getName();
146  T defaultValue = getDefault();
147  if (name != null) {
148  try { // Checks system properties.
149  String property = System.getProperty(name);
150  if (property != null) {
151  defaultValue = parse(property); // Supersedes.
152  LogContext.debug(name, ", System Properties Value: ",
153  defaultValue);
154  }
155  } catch (SecurityException securityError) {
156  // Ok, current runtime does not allow system properties access.
157  }
158  }
159  this.name = name;
160  this.value = initialized(defaultValue);
161  Object[] listeners = OSGiServices.getConfigurableListeners();
162  for (Object listener : listeners) {
163  ((Listener) listener).configurableInitialized(this, this.value);
164  }
165  }
166 
170  public T get() {
171  return value;
172  }
173 
185  public String getName() {
186  if (name != null)
187  return name; // Already set.
188  Class<?> thisClass = this.getClass();
189  Class<?> enclosingClass = thisClass.getEnclosingClass();
190  String fieldName = null;
191  for (Field field : enclosingClass.getFields()) {
192  if (field.getType().isAssignableFrom(thisClass)) {
193  if (fieldName != null) // Indistinguishable field types.
194  throw new UnsupportedOperationException(
195  "Multiple configurables static fields in the same class" +
196  "requires the Configurable.getName() method to be overriden.");
197  fieldName = field.getName();
198  }
199  }
200  return (fieldName != null) ? enclosingClass.getName() + "#" + fieldName
201  : null;
202  }
203 
208  return reconfigurePermission;
209  }
210 
224  public T reconfigure(T newValue) {
226  synchronized (this) {
227  T oldValue = this.value;
228  this.value = reconfigured(oldValue, newValue);
229  Object[] listeners = OSGiServices.getConfigurableListeners();
230  for (Object listener : listeners) {
231  ((Listener) listener).configurableReconfigured(this, oldValue,
232  this.value);
233  }
234  return this.value;
235  }
236  }
237 
242  protected abstract T getDefault();
243 
252  protected T initialized(T value) {
253  return value;
254  }
255 
263  @SuppressWarnings("unchecked")
264  protected T parse(String str) {
265  Class<? extends T> type = (Class<? extends T>) getDefault().getClass();
266  return TextContext.getFormat(type).parse(str);
267  }
268 
280  protected T reconfigured(T oldValue, T newValue) {
281  return newValue;
282  }
283 }
javolution.text.TextContext.getFormat
static< T > TextFormat< T > getFormat(Class<? extends T > type)
Definition: TextContext.java:69
javolution.context.LogContext
Definition: LogContext.java:56
javolution.osgi.internal.OSGiServices.getConfigurableListeners
static Object[] getConfigurableListeners()
Definition: OSGiServices.java:79
javolution
javolution.lang.Configurable.name
String name
Definition: Configurable.java:121
javolution.lang.Configurable
Definition: Configurable.java:78
javolution.context
Definition: AbstractContext.java:9
javolution.lang.Configurable.parse
T parse(String str)
Definition: Configurable.java:264
javolution.lang.Configurable.Listener.configurableReconfigured
< T > void configurableReconfigured(Configurable< T > configurable, T oldValue, T newValue)
javolution.context.LogContext.debug
static void debug(Object... message)
Definition: LogContext.java:87
javolution.context.SecurityContext.check
static void check(Permission<?> permission)
Definition: SecurityContext.java:195
javolution.lang.Configurable.value
volatile T value
Definition: Configurable.java:131
javolution.text
Definition: CharArray.java:9
javolution.lang.Configurable.getDefault
abstract T getDefault()
javolution.context.SecurityContext
Definition: SecurityContext.java:34
javolution.lang.Configurable.RECONFIGURE_PERMISSION
static Permission< Configurable<?> > RECONFIGURE_PERMISSION
Definition: Configurable.java:115
javolution.lang.Configurable.reconfigure
T reconfigure(T newValue)
Definition: Configurable.java:224
javolution.context.SecurityContext.Permission
Definition: SecurityContext.java:48
javolution.osgi.internal
Definition: ConfigurableListenerImpl.java:9
javolution.text.DefaultTextFormat
Definition: DefaultTextFormat.java:53
javolution.lang.Configurable.Listener.configurableInitialized
< T > void configurableInitialized(Configurable< T > configurable, T value)
javolution.lang.Configurable.initialized
T initialized(T value)
Definition: Configurable.java:252
javolution.osgi.internal.OSGiServices
Definition: OSGiServices.java:50
javolution.lang.Configurable.getName
String getName()
Definition: Configurable.java:185
javolution.lang.Configurable.reconfigured
T reconfigured(T oldValue, T newValue)
Definition: Configurable.java:280
javolution.osgi
javolution.lang.Configurable.getReconfigurePermission
Permission< Configurable< T > > getReconfigurePermission()
Definition: Configurable.java:207
javolution.lang.Configurable.Configurable
Configurable()
Definition: Configurable.java:142
javolution.lang.Configurable.Listener
Definition: Configurable.java:84
javolution.text.TextContext
Definition: TextContext.java:49
javolution.lang.Configurable.reconfigurePermission
final Permission< Configurable< T > > reconfigurePermission
Definition: Configurable.java:126