From a69e3a9565186ae06c96215f9c73198d0651b529 Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Thu, 5 Apr 2018 13:27:38 -0400 Subject: Sonar fixes to pooling Made various changes to the pooling feature to address some of the sonar issues. Remove duplicate classes, Pair & Triple. Fix sonar issue about duplicate process(xxx) methods. Remove extra items from pom.xml and add assembly builder. Fix license text in pom.xml, inadvertently reformatted. Fix a few typos in comments and change LinkedList to Queue. Move assembly.xml to correct source directory. Replace ScheduledFuture with CancellableScheduledTask, to satisfy sonar. Eliminate "TODO" items: add logging, delay after sending Offline message. Add more logging in process(Message) methods. Begin creating end-to-end junit test, fixed bugs found as a result. Restore logback-test.xml to WARN. Fix merge conflict - restored test properties file. Change-Id: Ic70a8cee49678ea0fc3da309699aec1f6088fe70 Issue-ID: POLICY-728 Signed-off-by: Jim Hahn --- policy-core/pom.xml | 5 + .../policy/drools/util/FeatureEnabledChecker.java | 142 +++++++++++++++++++++ .../drools/util/FeatureEnabledCheckerTest.java | 85 ++++++++++++ 3 files changed, 232 insertions(+) create mode 100644 policy-core/src/main/java/org/onap/policy/drools/util/FeatureEnabledChecker.java create mode 100644 policy-core/src/test/java/org/onap/policy/drools/util/FeatureEnabledCheckerTest.java (limited to 'policy-core') diff --git a/policy-core/pom.xml b/policy-core/pom.xml index ecd5b19e..78f9c737 100644 --- a/policy-core/pom.xml +++ b/policy-core/pom.xml @@ -84,6 +84,11 @@ drools-persistence-jpa 6.5.0.Final + + org.onap.policy.common + utils + ${project.version} + org.onap.policy.drools-pdp policy-utils 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 new file mode 100644 index 00000000..800b6e89 --- /dev/null +++ b/policy-core/src/main/java/org/onap/policy/drools/util/FeatureEnabledChecker.java @@ -0,0 +1,142 @@ +/* + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +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. + */ +public class FeatureEnabledChecker { + + /** + * + */ + private FeatureEnabledChecker() { + super(); + } + + /** + * Determines if a feature is enabled for a particular specializer. + * + * @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 + */ + 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); + } + } + + + /** + * 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 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 new file mode 100644 index 00000000..3bb135fe --- /dev/null +++ b/policy-core/src/test/java/org/onap/policy/drools/util/FeatureEnabledCheckerTest.java @@ -0,0 +1,85 @@ +/* + * ============LICENSE_START======================================================= + * ONAP + * ================================================================================ + * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.drools.util; + +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"; + + @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)); + } + + /** + * 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 + * {@code null} to leave it unset + * @return {@code true} if the feature is enabled, {@code false} otherwise + */ + public boolean check(Boolean wantGen, Boolean wantSpec) { + Properties props = new Properties(); + + if (wantGen != null) { + props.setProperty(generalize(PROP_NAME), wantGen.toString()); + } + + if (wantSpec != null) { + props.setProperty(specialize(PROP_NAME, SPEC), wantSpec.toString()); + } + + return FeatureEnabledChecker.isFeatureEnabled(props, SPEC, PROP_NAME); + } + +} -- cgit 1.2.3-korg