Author: manik.surtani(a)jboss.com
Date: 2008-12-12 07:39:13 -0500 (Fri, 12 Dec 2008)
New Revision: 7317
Added:
core/branches/flat/src/main/java/org/jboss/starobrno/config/NonOverridable.java
Modified:
core/branches/flat/src/main/java/org/jboss/starobrno/config/Configuration.java
core/branches/flat/src/main/java/org/jboss/starobrno/config/ConfigurationComponent.java
core/branches/flat/src/main/java/org/jboss/starobrno/util/ReflectionUtil.java
Log:
Override application code in place
Modified: core/branches/flat/src/main/java/org/jboss/starobrno/config/Configuration.java
===================================================================
---
core/branches/flat/src/main/java/org/jboss/starobrno/config/Configuration.java 2008-12-12
12:17:09 UTC (rev 7316)
+++
core/branches/flat/src/main/java/org/jboss/starobrno/config/Configuration.java 2008-12-12
12:39:13 UTC (rev 7317)
@@ -24,10 +24,12 @@
import org.jboss.cache.Version;
import org.jboss.cache.buddyreplication.BuddyManager;
import org.jboss.cache.lock.IsolationLevel;
+import org.jboss.starobrno.CacheException;
import org.jboss.starobrno.config.parsing.JGroupsStackParser;
import org.jboss.starobrno.factories.annotations.NonVolatile;
import org.jboss.starobrno.factories.annotations.Start;
import org.jboss.starobrno.marshall.ExtendedMarshaller;
+import org.jboss.starobrno.util.ReflectionUtil;
import org.w3c.dom.Element;
import java.net.URL;
@@ -153,7 +155,9 @@
// CONFIGURATION OPTIONS
//
------------------------------------------------------------------------------------------------------------
+ @NonOverridable
private String clusterName = "JBossCache-Cluster";
+ @NonOverridable
private String clusterConfig = null;
private boolean useReplQueue = false;
@Dynamic
@@ -201,6 +205,7 @@
private int listenerAsyncQueueSize = 50000;
private int serializationExecutorPoolSize = 0;
private int serializationExecutorQueueSize = 50000;
+ @NonOverridable
private URL jgroupsConfigFile;
@Start(priority = 1)
@@ -225,6 +230,7 @@
public void setCacheMarshaller(ExtendedMarshaller instance)
{
+ testImmutability("marshaller");
marshaller = instance;
}
@@ -1038,6 +1044,24 @@
public void applyOverrides(Configuration overrides)
{
- // TODO: Manik: Implement me
+ // loop through all overridden elements in the incoming configuration and apply
+ for (String overriddenField : overrides.overriddenConfigurationElements)
+ {
+ assertAllowedToOverride(overriddenField);
+ ReflectionUtil.setValue(this, overriddenField,
ReflectionUtil.getValue(overrides, overriddenField));
+ }
}
+
+ private void assertAllowedToOverride(String fieldname)
+ {
+ try
+ {
+ if
(getClass().getDeclaredField(fieldname).isAnnotationPresent(NonOverridable.class))
+ throw new ConfigurationException("Configuration field " + fieldname
+ " cannot be overridden!");
+ }
+ catch (NoSuchFieldException e)
+ {
+ throw new CacheException("Field " + fieldname + " does not exist
on Configuration!");
+ }
+ }
}
Modified:
core/branches/flat/src/main/java/org/jboss/starobrno/config/ConfigurationComponent.java
===================================================================
---
core/branches/flat/src/main/java/org/jboss/starobrno/config/ConfigurationComponent.java 2008-12-12
12:17:09 UTC (rev 7316)
+++
core/branches/flat/src/main/java/org/jboss/starobrno/config/ConfigurationComponent.java 2008-12-12
12:39:13 UTC (rev 7317)
@@ -29,10 +29,7 @@
import org.jboss.starobrno.factories.annotations.Inject;
import org.jboss.starobrno.factories.annotations.Start;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.*;
/**
* Base superclass of Cache configuration classes that expose some properties
@@ -52,6 +49,7 @@
private transient ComponentRegistry cr;
// a workaround to get over immutability checks
private boolean accessible;
+ protected List<String> overriddenConfigurationElements = new
LinkedList<String>();
protected ConfigurationComponent()
{
@@ -132,6 +130,9 @@
{
accessible = false;
}
+
+ // now mark this as overridden
+ overriddenConfigurationElements.add(fieldName);
}
public void setCache(CacheSPI cache)
Added: core/branches/flat/src/main/java/org/jboss/starobrno/config/NonOverridable.java
===================================================================
--- core/branches/flat/src/main/java/org/jboss/starobrno/config/NonOverridable.java
(rev 0)
+++
core/branches/flat/src/main/java/org/jboss/starobrno/config/NonOverridable.java 2008-12-12
12:39:13 UTC (rev 7317)
@@ -0,0 +1,22 @@
+package org.jboss.starobrno.config;
+
+import java.lang.annotation.*;
+
+/**
+ * This annotation marks configuration attributes as non-overridable by named caches.
+ *
+ * @author Manik Surtani
+ */
+// ensure this annotation is available at runtime.
+(a)Retention(RetentionPolicy.RUNTIME)
+
+// ensure that this annotation is documented on fields in Configuration
+@Documented
+
+// only applies to fields.
+(a)Target(ElementType.FIELD)
+
+public @interface NonOverridable
+{
+
+}
Modified: core/branches/flat/src/main/java/org/jboss/starobrno/util/ReflectionUtil.java
===================================================================
---
core/branches/flat/src/main/java/org/jboss/starobrno/util/ReflectionUtil.java 2008-12-12
12:17:09 UTC (rev 7316)
+++
core/branches/flat/src/main/java/org/jboss/starobrno/util/ReflectionUtil.java 2008-12-12
12:39:13 UTC (rev 7317)
@@ -150,4 +150,24 @@
}
}
+ /**
+ * Retrieves the value of a field of an object instance via reflection
+ *
+ * @param instance to inspect
+ * @param fieldName name of field to retrieve
+ * @return a value
+ */
+ public static Object getValue(Object instance, String fieldName)
+ {
+ Field f = findFieldRecursively(instance.getClass(), fieldName);
+ try
+ {
+ f.setAccessible(true);
+ return f.get(instance);
+ }
+ catch (IllegalAccessException iae)
+ {
+ throw new CacheException("Cannot access field " + f, iae);
+ }
+ }
}
Show replies by date