Add setXxx methods for @Property annotation

We'll be modifying the PropertyConfiguration class so that, instead
of directly setting values in private fields, it will use public
setXxx methods.  Consequently, we have to add the setXxx methods to
the PropertyConfiguration subclasses so that they're available when
the superclass is modified policy/common.

Change-Id: Idff9942eabec182670cbb427b960f6308a2ca30c
Issue-ID: POLICY-906
Signed-off-by: Jim Hahn <jrh3@att.com>
diff --git a/feature-distributed-locking/src/main/java/org/onap/policy/distributed/locking/DistributedLockingProperties.java b/feature-distributed-locking/src/main/java/org/onap/policy/distributed/locking/DistributedLockingProperties.java
index 97ba3b1..b82f4b0 100644
--- a/feature-distributed-locking/src/main/java/org/onap/policy/distributed/locking/DistributedLockingProperties.java
+++ b/feature-distributed-locking/src/main/java/org/onap/policy/distributed/locking/DistributedLockingProperties.java
@@ -20,26 +20,25 @@
 package org.onap.policy.distributed.locking;
 
 import java.util.Properties;
-
 import org.onap.policy.common.utils.properties.PropertyConfiguration;
 import org.onap.policy.common.utils.properties.exception.PropertyException;
 
 
-public class DistributedLockingProperties extends PropertyConfiguration{
-	
-	/**
+public class DistributedLockingProperties extends PropertyConfiguration {
+
+    /**
      * Feature properties all begin with this prefix.
      */
     public static final String PREFIX = "distributed.locking.";
-    
-	public static final String DB_DRIVER = "javax.persistence.jdbc.driver";
-	public static final String DB_URL = "javax.persistence.jdbc.url";
-	public static final String DB_USER = "javax.persistence.jdbc.user";
-	public static final String DB_PWD = "javax.persistence.jdbc.password";
-	public static final String AGING_PROPERTY = PREFIX + "lock.aging";
-	public static final String HEARTBEAT_INTERVAL_PROPERTY = PREFIX + "heartbeat.interval";
-	
-	/**
+
+    public static final String DB_DRIVER = "javax.persistence.jdbc.driver";
+    public static final String DB_URL = "javax.persistence.jdbc.url";
+    public static final String DB_USER = "javax.persistence.jdbc.user";
+    public static final String DB_PWD = "javax.persistence.jdbc.password";
+    public static final String AGING_PROPERTY = PREFIX + "lock.aging";
+    public static final String HEARTBEAT_INTERVAL_PROPERTY = PREFIX + "heartbeat.interval";
+
+    /**
      * Properties from which this was constructed.
      */
     private Properties source;
@@ -49,31 +48,31 @@
      */
     @Property(name = DB_DRIVER)
     private String dbDriver;
-    
+
     /**
      * Database url
      */
     @Property(name = DB_URL)
     private String dbUrl;
-    
+
     /**
      * Database user
      */
     @Property(name = DB_USER)
     private String dbUser;
-    
+
     /**
      * Database password
      */
     @Property(name = DB_PWD)
     private String dbPwd;
-    
+
     /**
      * Used to set expiration time for lock.
      */
     @Property(name = AGING_PROPERTY, defaultValue = "300000")
     private long agingProperty;
-    
+
     /**
      * Indicates intervals at which we refresh locks.
      */
@@ -81,43 +80,73 @@
     private long heartBeatIntervalProperty;
 
     public DistributedLockingProperties(Properties props) throws PropertyException {
-    	super(props);
-    	source = props;
+        super(props);
+        source = props;
     }
 
 
-	public Properties getSource() {
-		return source;
-	}
+    public Properties getSource() {
+        return source;
+    }
 
 
-	public String getDbDriver() {
-		return dbDriver;
-	}
+    public String getDbDriver() {
+        return dbDriver;
+    }
 
 
-	public String getDbUrl() {
-		return dbUrl;
-	}
+    public String getDbUrl() {
+        return dbUrl;
+    }
 
 
-	public String getDbUser() {
-		return dbUser;
-	}
+    public String getDbUser() {
+        return dbUser;
+    }
 
 
-	public String getDbPwd() {
-		return dbPwd;
-	}
+    public String getDbPwd() {
+        return dbPwd;
+    }
 
 
-	public long getAgingProperty() {
-		return agingProperty;
-	}
+    public long getAgingProperty() {
+        return agingProperty;
+    }
 
 
-	public long getHeartBeatIntervalProperty() {
-		return heartBeatIntervalProperty;
-	}
+    public long getHeartBeatIntervalProperty() {
+        return heartBeatIntervalProperty;
+    }
+
+
+    public void setDbDriver(String dbDriver) {
+        this.dbDriver = dbDriver;
+    }
+
+
+    public void setDbUrl(String dbUrl) {
+        this.dbUrl = dbUrl;
+    }
+
+
+    public void setDbUser(String dbUser) {
+        this.dbUser = dbUser;
+    }
+
+
+    public void setDbPwd(String dbPwd) {
+        this.dbPwd = dbPwd;
+    }
+
+
+    public void setAgingProperty(long agingProperty) {
+        this.agingProperty = agingProperty;
+    }
+
+
+    public void setHeartBeatIntervalProperty(long heartBeatIntervalProperty) {
+        this.heartBeatIntervalProperty = heartBeatIntervalProperty;
+    }
 
 }
diff --git a/feature-pooling-dmaap/src/main/java/org/onap/policy/drools/pooling/PoolingFeature.java b/feature-pooling-dmaap/src/main/java/org/onap/policy/drools/pooling/PoolingFeature.java
index 67cb21e..d42b8de 100644
--- a/feature-pooling-dmaap/src/main/java/org/onap/policy/drools/pooling/PoolingFeature.java
+++ b/feature-pooling-dmaap/src/main/java/org/onap/policy/drools/pooling/PoolingFeature.java
@@ -149,7 +149,9 @@
 
         String name = controller.getName();
 
-        if (FeatureEnabledChecker.isFeatureEnabled(featProps, name, PoolingProperties.FEATURE_ENABLED)) {
+        SpecProperties specProps = new SpecProperties(PoolingProperties.PREFIX, name, featProps);
+        
+        if (FeatureEnabledChecker.isFeatureEnabled(specProps, PoolingProperties.FEATURE_ENABLED)) {
             try {
                 // get & validate the properties
                 PoolingProperties props = new PoolingProperties(name, featProps);
diff --git a/feature-pooling-dmaap/src/main/java/org/onap/policy/drools/pooling/PoolingProperties.java b/feature-pooling-dmaap/src/main/java/org/onap/policy/drools/pooling/PoolingProperties.java
index 5431942..ad11872 100644
--- a/feature-pooling-dmaap/src/main/java/org/onap/policy/drools/pooling/PoolingProperties.java
+++ b/feature-pooling-dmaap/src/main/java/org/onap/policy/drools/pooling/PoolingProperties.java
@@ -38,6 +38,12 @@
      * Feature properties all begin with this prefix.
      */
     public static final String PREFIX = "pooling.";
+    
+    /*
+     * These properties are not used by a SpecPropertyConfiguration, thus
+     * they do not use any of the "{xxx}" forms.
+     */
+    public static final String FEATURE_ENABLED = PREFIX + "enabled";
 
     /*
      * These properties REQUIRE a controller name, thus they use the "{$}" form.
@@ -48,7 +54,6 @@
      * These properties allow the controller name to be left out, thus they use
      * the "{prefix?suffix}" form.
      */
-    public static final String FEATURE_ENABLED = PREFIX + "{?.}enabled";
     public static final String OFFLINE_LIMIT = PREFIX + "{?.}offline.queue.limit";
     public static final String OFFLINE_AGE_MS = PREFIX + "{?.}offline.queue.age.milliseconds";
     public static final String OFFLINE_PUB_WAIT_MS = PREFIX + "{?.}offline.publish.wait.milliseconds";
@@ -186,4 +191,40 @@
     public long getInterHeartbeatMs() {
         return interHeartbeatMs;
     }
+
+    public void setPoolingTopic(String poolingTopic) {
+        this.poolingTopic = poolingTopic;
+    }
+
+    public void setOfflineLimit(int offlineLimit) {
+        this.offlineLimit = offlineLimit;
+    }
+
+    public void setOfflineAgeMs(long offlineAgeMs) {
+        this.offlineAgeMs = offlineAgeMs;
+    }
+
+    public void setOfflinePubWaitMs(long offlinePubWaitMs) {
+        this.offlinePubWaitMs = offlinePubWaitMs;
+    }
+
+    public void setStartHeartbeatMs(long startHeartbeatMs) {
+        this.startHeartbeatMs = startHeartbeatMs;
+    }
+
+    public void setReactivateMs(long reactivateMs) {
+        this.reactivateMs = reactivateMs;
+    }
+
+    public void setIdentificationMs(long identificationMs) {
+        this.identificationMs = identificationMs;
+    }
+
+    public void setActiveHeartbeatMs(long activeHeartbeatMs) {
+        this.activeHeartbeatMs = activeHeartbeatMs;
+    }
+
+    public void setInterHeartbeatMs(long interHeartbeatMs) {
+        this.interHeartbeatMs = interHeartbeatMs;
+    }
 }
diff --git a/policy-core/src/main/java/org/onap/policy/drools/util/FeatureEnabledChecker.java b/policy-core/src/main/java/org/onap/policy/drools/util/FeatureEnabledChecker.java
index 800b6e8..e604c30 100644
--- a/policy-core/src/main/java/org/onap/policy/drools/util/FeatureEnabledChecker.java
+++ b/policy-core/src/main/java/org/onap/policy/drools/util/FeatureEnabledChecker.java
@@ -20,17 +20,10 @@
 
 package org.onap.policy.drools.util;
 
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
 import java.util.Properties;
-import org.onap.policy.common.utils.properties.SpecPropertyConfiguration;
-import org.onap.policy.common.utils.properties.exception.PropertyException;
 
 /**
- * Checks whether or not a feature is enabled. The name of the "enable" property
- * is assumed to be of the form accepted by a {@link SpecPropertyConfiguration},
- * which contains a substitution place-holder into which a "specializer" (e.g.,
- * controller or session name) is substituted.
+ * Checks whether or not a feature is enabled.
  */
 public class FeatureEnabledChecker {
 
@@ -42,101 +35,15 @@
     }
 
     /**
-     * Determines if a feature is enabled for a particular specializer.
+     * Determines if a feature is enabled.
      * 
      * @param props properties from which to extract the "enabled" flag
-     * @param specializer specializer to be substituted into the property name
-     *        when extracting
      * @param propName the name of the "enabled" property
-     * @return {@code true} if the feature is enabled, or {@code false} if it is
-     *         not enabled (or if the property doesn't exist)
-     * @throws IllegalArgumentException if the "enabled" property is not a
-     *         boolean value
+     * @return {@code true} if the feature is enabled, or {@code false} if it is not
+     *         enabled (or if the property doesn't exist)
      */
-    public static boolean isFeatureEnabled(Properties props, String specializer, String propName) {
-
-        try {
-            return new Config(specializer, props, propName).isEnabled();
-
-        } catch (PropertyException e) {
-            throw new IllegalArgumentException("cannot check property " + propName, e);
-        }
+    public static boolean isFeatureEnabled(Properties props, String propName) {
+        String val = props.getProperty(propName);
+        return (val != null ? Boolean.valueOf(val) : false);
     }
-
-
-    /**
-     * Configuration used to extract the value.
-     */
-    private static class Config extends SpecPropertyConfiguration {
-
-        /**
-         * There is a bit of trickery here. This annotation is just a
-         * place-holder to get the superclass to invoke the
-         * {@link #setValue(java.lang.reflect.Field, Properties, Property)
-         * setValue()} method. When that's invoked, we'll substitute
-         * {@link #propOverride} instead of this annotation.
-         */
-        @Property(name = "feature-enabled-property-place-holder")
-        private boolean enabled;
-
-        /**
-         * Annotation that will actually be used to set the field.
-         */
-        private Property propOverride;
-
-        /**
-         * 
-         * @param specializer specializer to be substituted into the property
-         *        name when extracting
-         * @param props properties from which to extract the "enabled" flag
-         * @param propName the name of the "enabled" property
-         * @throws PropertyException if an error occurs
-         */
-        public Config(String specializer, Properties props, String propName) throws PropertyException {
-            super(specializer);
-
-            propOverride = new Property() {
-
-                @Override
-                public String name() {
-                    return propName;
-                }
-
-                @Override
-                public String defaultValue() {
-                    // feature is disabled by default
-                    return "false";
-                }
-
-                @Override
-                public String accept() {
-                    return "";
-                }
-
-                @Override
-                public Class<? extends Annotation> annotationType() {
-                    return Property.class;
-                }
-            };
-
-            setAllFields(props);
-        }
-
-        /**
-         * Substitutes {@link #propOverride} for "prop".
-         */
-        @Override
-        protected boolean setValue(Field field, Properties props, Property prop) throws PropertyException {
-            return super.setValue(field, props, propOverride);
-        }
-
-        /**
-         * 
-         * @return {@code true} if the feature is enabled, {@code false}
-         *         otherwise
-         */
-        public boolean isEnabled() {
-            return enabled;
-        }
-    };
 }
diff --git a/policy-core/src/test/java/org/onap/policy/drools/util/FeatureEnabledCheckerTest.java b/policy-core/src/test/java/org/onap/policy/drools/util/FeatureEnabledCheckerTest.java
index 3bb135f..cd79592 100644
--- a/policy-core/src/test/java/org/onap/policy/drools/util/FeatureEnabledCheckerTest.java
+++ b/policy-core/src/test/java/org/onap/policy/drools/util/FeatureEnabledCheckerTest.java
@@ -22,64 +22,35 @@
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
-import static org.onap.policy.common.utils.properties.SpecPropertyConfiguration.generalize;
-import static org.onap.policy.common.utils.properties.SpecPropertyConfiguration.specialize;
 import java.util.Properties;
 import org.junit.Test;
-import org.onap.policy.drools.util.FeatureEnabledChecker;
 
 public class FeatureEnabledCheckerTest {
 
-    private static final String PROP_NAME = "enable.{?.}it";
-
-    private static final String SPEC = "my.specializer";
+    private static final String PROP_NAME = "enable.it";
 
     @Test
     public void test() {
-        assertFalse(check(null, null));
-        assertTrue(check(null, true));
-        assertFalse(check(null, false));
-
-        assertTrue(check(true, null));
-        assertTrue(check(true, true));
-        assertFalse(check(true, false));
-
-        assertFalse(check(false, null));
-        assertTrue(check(false, true));
-        assertFalse(check(false, false));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void test_ArgEx() {
-        
-        // check case where there's an exception in the property
-        Properties props = new Properties();
-        props.setProperty(generalize(PROP_NAME), "invalid-boolean");
-        
-        assertFalse(FeatureEnabledChecker.isFeatureEnabled(props, SPEC, PROP_NAME));        
+        assertFalse(check(null));
+        assertTrue(check(true));
+        assertFalse(check(false));
     }
 
     /**
      * Adds properties, as specified, and checks if the feature is enabled.
      * 
-     * @param wantGen value to assign to the generalized property, or
-     *        {@code null} to leave it unset
-     * @param wantSpec value to assign to the specialized property, or
+     * @param want value to assign to the specialized property, or
      *        {@code null} to leave it unset
      * @return {@code true} if the feature is enabled, {@code false} otherwise
      */
-    public boolean check(Boolean wantGen, Boolean wantSpec) {
+    public boolean check(Boolean want) {
         Properties props = new Properties();
 
-        if (wantGen != null) {
-            props.setProperty(generalize(PROP_NAME), wantGen.toString());
+        if (want != null) {
+            props.setProperty(PROP_NAME, want.toString());
         }
 
-        if (wantSpec != null) {
-            props.setProperty(specialize(PROP_NAME, SPEC), wantSpec.toString());
-        }
-
-        return FeatureEnabledChecker.isFeatureEnabled(props, SPEC, PROP_NAME);
+        return FeatureEnabledChecker.isFeatureEnabled(props, PROP_NAME);
     }
 
 }