2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2017 AT&T Intellectual Property. All rights
 
   7  * ================================================================================
 
   8  * Licensed under the Apache License, Version 2.0 (the "License");
 
   9  * you may not use this file except in compliance with the License.
 
  10  * You may obtain a copy of the License at
 
  12  *      http://www.apache.org/licenses/LICENSE-2.0
 
  14  * Unless required by applicable law or agreed to in writing, software
 
  15  * distributed under the License is distributed on an "AS IS" BASIS,
 
  16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  17  * See the License for the specific language governing permissions and
 
  18  * limitations under the License.
 
  19  * ============LICENSE_END=========================================================
 
  22 package org.openecomp.appc.listener;
 
  24 import java.util.Properties;
 
  27  * A class for instantiating Listener objects. It is primarily used to hold properties that start with the given prefix.
 
  28  * It also holds a class that implements {@see Listener} and will be used by the controller to spawn a new listener
 
  34 public class ListenerProperties {
 
  36     private String prefix;
 
  38     private Class<? extends Listener> listenerClass;
 
  40     private Properties props;
 
  43      * Creates a new listener object with the given prefix and properties. Any property starting with the prefix is
 
  44      * added to the internal properties object with the prefix removed. All other properties are ignored.
 
  45      * ListenerProperties constructor
 
  48      *            The prefix of the properties to load
 
  50      *            The properties object to load from.
 
  52     public ListenerProperties(String prefix, Properties allProps) {
 
  54         props = new Properties();
 
  56         String dottedPrefix = String.format("%s.", prefix);
 
  57         for (String key : allProps.stringPropertyNames()) {
 
  58             if (key.startsWith(dottedPrefix) && key.length() > dottedPrefix.length()) {
 
  59                 props.put(key.substring(dottedPrefix.length()), allProps.get(key));
 
  65      * @return The prefix of these properties
 
  67     public String getPrefix() {
 
  72      * Sets the listener class. Will be used by {@see Controller} to instantiate the Listener thread for this object
 
  75      *            The class to be created. Implements {@see Listener}
 
  77     public void setListenerClass(Class<? extends Listener> cls) {
 
  78         this.listenerClass = cls;
 
  82      * @return The class that will be used by {@see Controller} to instantiate the Listener thread for this object
 
  84     public Class<? extends Listener> getListenerClass() {
 
  89      * Returns a property matching a given KEYS
 
  92      *            The KEYS object who's value to return.
 
  93      * @return The value of the property or null if none exists
 
  95     public String getProperty(KEYS key) {
 
  96         return getProperty(key, null);
 
 100      * Returns a property matching a given string.
 
 103      *            The key who's value to return.
 
 104      * @return The value of the property or null if none exists
 
 106     public String getProperty(String key) {
 
 107         return getProperty(key, null);
 
 111      * Returns a property matching a given KEYS
 
 114      *            The KEYS object who's value to return.
 
 115      * @param defaultValue
 
 116      *            The value to return if the property is not found
 
 117      * @return The value of the property or null if none exists
 
 119     public String getProperty(KEYS key, String defaultValue) {
 
 120         return getProperty(key.getPropertySuffix(), defaultValue);
 
 124      * Returns a property matching a given string.
 
 127      *            The key who's value to return.
 
 128      * @param defaultValue
 
 129      *            The value to return if the property is not found
 
 130      * @return The value of the property or null if none exists
 
 132     public String getProperty(String key, String defaultValue) {
 
 133         return props.getProperty(key, defaultValue);
 
 137      * @return The properties object containing all properties
 
 139     public Properties getProperties() {
 
 144      * Reads the <i>prefix</i>.disabled property to determine if the listener is disabled and should not be run by the
 
 145      * controller. Defaults to false if property not set or value cannot be parsed.
 
 147      * @return true if the listener is disabled and should not be started. false if the listener should be start
 
 148      *         normally (default).
 
 150     public boolean isDisabled() {
 
 151         return Boolean.valueOf(getProperty(KEYS.DISABLED, "false"));
 
 155     public String toString() {
 
 156         return String.format("%s", prefix);
 
 160      * The message service types that are available. Choices are DMaaP and DMaaP.
 
 162      * @since Apr 25, 2016
 
 165     public enum MessageService {
 
 170         private MessageService(String val) {
 
 174         public String getValue() {
 
 179          * Tries to match a string to a MessageService. If no match is found, returns the default (DMaaP)
 
 182          *            the string to try and match
 
 183          * @return A MessasgeService
 
 185         public static MessageService parse(String input) {
 
 187                 for (MessageService ms : MessageService.values()) {
 
 188                     if (ms.getValue().equals(input.toLowerCase())) {
 
 193             return MessageService.DMaaP; // Default
 
 198      * Set of common properties that will be used by most systems. Primarily relating to DMaaP and ThreadPools
 
 200      * @since Apr 25, 2016
 
 205          * Property to determine if the listener should be disabled. If not set, defaults to false
 
 207         DISABLED("disabled"),
 
 210          * Property for the message service type. Should be a lower case string. See MessageService.
 
 212         MESSAGE_SERVICE("service"),
 
 215          * A hostname or comma separated list (no spaces) of hostnames of servers in a cluster. Can have ports included
 
 219          * <li>server1.appc.openecomp.org</li>
 
 220          * <li>server1.appc.openecomp.org:3904</li>
 
 221          * <li>server1.appc.openecomp.org,server2.appc.openecomp.org</li>
 
 224         HOSTS("poolMembers"),
 
 227          * The topic that will be used for DMaaP read operations. Can only support a single topic.
 
 229         TOPIC_READ("topic.read"),
 
 232          * The topic or topics that will be used to write to. If multiple topics are provided, should be in a comma
 
 233          * seperated list with no spaces.<br>
 
 237          * <li>TOPIC-1,TOPIC-2,ANOTHER-TOPIC</li>
 
 240         TOPIC_WRITE("topic.write"),
 
 243          * The highland park filter to use on read requests. If you are reading and writing to the same topic this must
 
 244          * be provided. Filter should be in JSON format (not url escaped).
 
 246         TOPIC_READ_FILTER("topic.read.filter"),
 
 249          * The amount of time in seconds that the DMaaP polling connection should stay open for. Recommended to be set
 
 250          * high (around 60 seconds) as most clients will return immediately and not wait until the timeout is up to
 
 251          * return if they have data.
 
 253         TOPIC_READ_TIMEOUT("topic.read.timeout"),
 
 256          * The name of the client to use. Should be unique to the application.
 
 258         CLIENT_NAME("client.name"),
 
 261          * The id of the client to use. Should be unique for each instance of the application in an environment.
 
 263         CLIENT_ID("client.name.id"),
 
 266          * The User (DMaaP) to use for authentication. If a user is provided, you must include the
 
 267          * domain name (e.g. example<b>@example.com</b>).
 
 269         AUTH_USER_KEY("client.key"),
 
 272          * The password (DMaaP) to use for authentication.
 
 274         AUTH_SECRET_KEY("client.secret"),
 
 277          * The minimum amount of size of the queue. A client should request new messages once the queue has dropped
 
 280         THREADS_MIN_QUEUE("threads.queuesize.min"),
 
 283          * The maximum size of the queue. A client will request no new messages once this maximum size has been reached.
 
 285         THREADS_MAX_QUEUE("threads.queuesize.max"),
 
 288          * The minimum size of the worker threads pool. This is the pool each listener will use to launch longer running
 
 291         THREADS_MIN_POOL("threads.poolsize.min"),
 
 294          * The maximum size of the worker threads pool. This is the pool each listener will use to launch longer running
 
 297         THREADS_MAX_POOL("threads.poolsize.max");
 
 299         private String suffix;
 
 301         private KEYS(String val) {
 
 307          *            The prefix to prepend
 
 308          * @return a fully property name that corroponds to what is used in the properties file. Format is PREFIX.KEY
 
 310         public String getFullProp(String prefix) {
 
 311             return String.format("%s.%s", prefix, suffix);
 
 314         public String getPropertySuffix() {