Merge "Add setXxx methods for @Property annotation"
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);
     }
 
 }