[POLICY-30] optional loadable eelf feature

for backwards compatibility purposes or if desired to
use EELF and common-framework (from policy-common) for
logging purposes in miscellaneous environments.   It supports
EELF/Common Framework style logging at the same time than
traditional logging.

This functionality is an optional loadable module.

policy-docker changes need to be made to optionally
unpack to make it active (in a different submission).

started marking feature projects with feature prefix in
project name to give a clear picture to the community which
modules are features vs. code base.

Change-Id: I5076c462409f03415ce54f0c9b5f50b78abb18f9
Signed-off-by: Jorge Hernandez <jh1730@att.com>
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/controller/internal/MavenDroolsController.java b/policy-management/src/main/java/org/openecomp/policy/drools/controller/internal/MavenDroolsController.java
index 06d2aaf..bc57764 100644
--- a/policy-management/src/main/java/org/openecomp/policy/drools/controller/internal/MavenDroolsController.java
+++ b/policy-management/src/main/java/org/openecomp/policy/drools/controller/internal/MavenDroolsController.java
@@ -521,8 +521,8 @@
 					                                      topic, 
 					                                      event);
 		} catch (UnsupportedOperationException uoe) {
-			logger.info("{}: DECODE FAILED: {} <- {} because of {}", this, topic, 
-					    event, uoe.getMessage(), uoe);
+			logger.debug("{}: DECODE FAILED: {} <- {} because of {}", this, topic, 
+					     event, uoe.getMessage(), uoe);
 			return true;
 		} catch (Exception e) {
 			logger.warn("{}: DECODE FAILED: {} <- {} because of {}", this, topic, 
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/features/PolicyEngineFeatureAPI.java b/policy-management/src/main/java/org/openecomp/policy/drools/features/PolicyEngineFeatureAPI.java
index 30e3a14..df2ddd6 100644
--- a/policy-management/src/main/java/org/openecomp/policy/drools/features/PolicyEngineFeatureAPI.java
+++ b/policy-management/src/main/java/org/openecomp/policy/drools/features/PolicyEngineFeatureAPI.java
@@ -33,6 +33,24 @@
 public interface PolicyEngineFeatureAPI extends OrderedService {
 	
 	  /**
+	   * intercept before the Policy Engine is commanded to boot.
+	   * 
+	   * @return true if this feature intercepts and takes ownership
+	   * of the operation preventing the invocation of 
+	   * lower priority features.   False, otherwise.
+	   */
+	  public default boolean beforeBoot(PolicyEngine engine, String cliArgs[]) {return false;};
+	  
+	  /**
+	   * intercept after the Policy Engine is booted.
+	   * 
+	   * @return true if this feature intercepts and takes ownership
+	   * of the operation preventing the invocation of 
+	   * lower priority features.   False, otherwise.
+	   */
+	  public default boolean afterBoot(PolicyEngine engine) {return false;};
+	
+	  /**
 	   * intercept before the Policy Engine is configured.
 	   * 
 	   * @return true if this feature intercepts and takes ownership
@@ -180,5 +198,5 @@
 	   * Feature providers implementing this interface
 	   */
 	  public static final OrderedServiceImpl<PolicyEngineFeatureAPI> providers = 
-			  						new OrderedServiceImpl<PolicyEngineFeatureAPI>(PolicyEngineFeatureAPI.class);
+			  						new OrderedServiceImpl<>(PolicyEngineFeatureAPI.class);
 }
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/EventProtocolCoder.java b/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/EventProtocolCoder.java
index 1030186..819ee81 100644
--- a/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/EventProtocolCoder.java
+++ b/policy-management/src/main/java/org/openecomp/policy/drools/protocol/coders/EventProtocolCoder.java
@@ -937,7 +937,7 @@
 			if (event != null)
 				return event;
 		} catch (Exception e) {
-			logger.info("{}, cannot decode {}", this, json, e);
+			logger.debug("{}, cannot decode {}", this, json, e);
 		}
 		
 		if (multipleToolsetRetries) {
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/system/Main.java b/policy-management/src/main/java/org/openecomp/policy/drools/system/Main.java
index 3b12514..1bb9a32 100644
--- a/policy-management/src/main/java/org/openecomp/policy/drools/system/Main.java
+++ b/policy-management/src/main/java/org/openecomp/policy/drools/system/Main.java
@@ -25,11 +25,10 @@
 import java.nio.file.Paths;
 import java.util.Properties;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.openecomp.policy.drools.core.PolicyContainer;
 import org.openecomp.policy.drools.persistence.SystemPersistence;
 import org.openecomp.policy.drools.utils.PropertyUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Programmatic entry point to the management layer
@@ -47,25 +46,9 @@
 	public static final String LOGBACK_CONFIGURATION_FILE_DEFAULT = "config/logback.xml";
 	
 	/**
-	 * EELF logback configuration path system property
+	 * constructor (hides public default one)
 	 */
-	public static final String EELF_LOGBACK_PATH_SYSTEM_PROPERTY = "com.att.eelf.logging.file";
-	
-	/**
-	 * EELF logback configuration path value
-	 */
-	public static final String EELF_LOGBACK_PATH_DEFAULT = "config";
-	
-	/**
-	 * EELF logback configuration file system property
-	 */
-	public static final String EELF_LOGBACK_FILE_SYSTEM_PROPERTY = "com.att.eelf.logging.path";
-	
-	/**
-	 * EELF logback configuration file default value
-	 */
-	public static final String EELF_LOGBACK_FILE_DEFAULT = "logback.xml";
-	
+	private Main() {}	
 	
 	/**
 	 * main
@@ -79,11 +62,9 @@
 		if (System.getProperty(LOGBACK_CONFIGURATION_FILE_SYSTEM_PROPERTY) == null)
 			System.setProperty(LOGBACK_CONFIGURATION_FILE_SYSTEM_PROPERTY, LOGBACK_CONFIGURATION_FILE_DEFAULT);
 		
-		if (System.getProperty(EELF_LOGBACK_PATH_SYSTEM_PROPERTY) == null)
-			System.setProperty(EELF_LOGBACK_PATH_SYSTEM_PROPERTY, EELF_LOGBACK_PATH_DEFAULT);
+		/* 0. boot */
 		
-		if (System.getProperty(EELF_LOGBACK_FILE_SYSTEM_PROPERTY) == null)
-			System.setProperty(EELF_LOGBACK_FILE_SYSTEM_PROPERTY, EELF_LOGBACK_FILE_DEFAULT);
+		PolicyEngine.manager.boot(args);
 		
 		Logger logger = LoggerFactory.getLogger(Main.class);
 		
@@ -95,15 +76,6 @@
 						 " not found");
 		}
 		
-		
-		/* 0. Start the CORE layer first */
-
-		try {
-			PolicyContainer.globalInit(args);
-		} catch (Exception e) {
-			logger.warn("Main: cannot init policy-container because of {}", e.getMessage(), e);
-		}
-		
 		/* 1. Configure the Engine */
 
 		try {
diff --git a/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyEngine.java b/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyEngine.java
index 974a726..633d237 100644
--- a/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyEngine.java
+++ b/policy-management/src/main/java/org/openecomp/policy/drools/system/PolicyEngine.java
@@ -27,6 +27,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.openecomp.policy.drools.controller.DroolsController;
+import org.openecomp.policy.drools.core.PolicyContainer;
 import org.openecomp.policy.drools.core.jmx.PdpJmxListener;
 import org.openecomp.policy.drools.event.comm.Topic;
 import org.openecomp.policy.drools.event.comm.Topic.CommInfrastructure;
@@ -83,6 +84,13 @@
 	public static final String CONFIG_SERVER_DEFAULT_HOST = "localhost";
 	
 	/**
+	 * Boot the engine
+	 * 
+	 * @param cliArgs command line arguments
+	 */
+	public void boot(String cliArgs[]);
+	
+	/**
 	 * configure the policy engine according to the given properties
 	 * 
 	 * @param properties Policy Engine properties
@@ -318,7 +326,7 @@
 	/**
 	 * logger
 	 */
-	private static Logger  logger = LoggerFactory.getLogger(PolicyEngineManager.class);  	
+	private static Logger logger = LoggerFactory.getLogger(PolicyEngineManager.class);  	
 	
 	/**
 	 * Is the Policy Engine running?
@@ -355,6 +363,40 @@
 	 */
 	protected Gson decoder = new GsonBuilder().disableHtmlEscaping().create();
 	
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public synchronized void boot(String cliArgs[]) {
+		
+		for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
+			try {
+				if (feature.beforeBoot(this, cliArgs))
+					return;
+			} catch (Exception e) {
+				logger.error("{}: feature {} before-boot failure because of {}",  
+				             this, feature.getClass().getName(), e.getMessage(), e);
+			}
+		}
+		
+		try {
+			PolicyContainer.globalInit(cliArgs);
+		} catch (Exception e) {
+			logger.error("{}: cannot init policy-container because of {}", this, e.getMessage(), e);
+		}
+		
+		for (PolicyEngineFeatureAPI feature : PolicyEngineFeatureAPI.providers.getList()) {
+			try {
+				if (feature.afterBoot(this))
+					return;
+			} catch (Exception e) {
+				logger.error("{}: feature {} after-boot failure because of {}",  
+				             this, feature.getClass().getName(), e.getMessage(), e);
+			}
+		}
+	}
+	
 	/**
 	 * {@inheritDoc}
 	 */
diff --git a/policy-management/src/main/server-gen/bin/telemetry.sh b/policy-management/src/main/server-gen/bin/telemetry.sh
new file mode 100644
index 0000000..397c250
--- /dev/null
+++ b/policy-management/src/main/server-gen/bin/telemetry.sh
@@ -0,0 +1,44 @@
+#! /bin/bash
+
+###
+# ============LICENSE_START=======================================================
+# ONAP POLICY
+# ================================================================================
+# Copyright (C) 2017 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=========================================================
+##
+
+REST_TOOL="http-prompt"
+TELEMETRY_SPEC="${POLICY_HOME}/config/telemetry-spec.json"
+
+if ! type -p "${REST_TOOL}" > /dev/null 2>&1; then
+	echo "error: prerequisite software not found: http-prompt"
+	exit 1
+fi
+
+if ! "${POLICY_HOME}"/bin/policy-management-controller status > /dev/null 2>&1; then
+	echo "error: pdp-d is not running"
+	exit 2
+fi
+
+if [[ ! -r ${TELEMETRY_SPEC} ]]; then
+	echo "generating new spec .."
+	if ! http -a "${ENGINE_MANAGEMENT_USER}:${ENGINE_MANAGEMENT_PASSWORD}" :9696/swagger.json > ${TELEMETRY_SPEC} 2> /dev/null; then
+		echo "error: cannot generate telemetry spec"
+		exit 3
+	fi
+fi
+
+exec http-prompt http://localhost:9696/policy/pdp/engine --auth "${ENGINE_MANAGEMENT_USER}:${ENGINE_MANAGEMENT_PASSWORD}" --spec ${TELEMETRY_SPEC}
diff --git a/policy-management/src/main/server/config/logback.xml b/policy-management/src/main/server/config/logback.xml
index 58092cc..53d7343 100644
--- a/policy-management/src/main/server/config/logback.xml
+++ b/policy-management/src/main/server/config/logback.xml
@@ -23,65 +23,19 @@
 	<property name="logDir" value="logs" />
 
 	<property name="errorLog" value="error" />
-	<property name="metricLog" value="metric" />
-	<property name="auditLog" value="audit" />
 	<property name="debugLog" value="debug" />
 	<property name="networkLog" value="network" />
 
-	<property name="metricPattern"
-		value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
-	<property name="auditPattern"
-		value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}||%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}|%msg%n" />
-	<property name="errorPattern"
-		value="%d{yyyy-MM-dd'T'HH:mm:ss.SSS+00:00, UTC}|%X{RequestId}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{ErrorCategory}|%X{ErrorCode}|%X{ErrorDesciption}|%msg%n" />
-
 	<property name="debugPattern" value="[%date|%level|%logger{0}|%thread] %msg%n" />
+	<property name="errorPattern" value="${debugPattern}" />
 	<property name="networkPattern" value="[%d|%t]%m%n" />
 
-	<appender name="AuditOut" class="ch.qos.logback.core.rolling.RollingFileAppender">
-		<file>${logDir}/${auditLog}.log</file>
-		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-			<fileNamePattern>${logDir}/${auditLog}.%i.log.zip</fileNamePattern>
-			<minIndex>1</minIndex>
-			<maxIndex>9</maxIndex>
-		</rollingPolicy>
-		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-			<maxFileSize>5MB</maxFileSize>
-		</triggeringPolicy>
-		<encoder>
-			<pattern>${auditPattern}</pattern>
-		</encoder>
-	</appender>
-	
-	<appender name="AsyncAuditOut" class="ch.qos.logback.classic.AsyncAppender">
-		<appender-ref ref="AuditOut" />
-	</appender>
-
-	<appender name="MetricOut" class="ch.qos.logback.core.rolling.RollingFileAppender">
-		<file>${logDir}/${metricLog}.log</file>
-		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
-			<fileNamePattern>${logDir}/${metricLog}.%i.log.zip</fileNamePattern>
-			<minIndex>1</minIndex>
-			<maxIndex>9</maxIndex>
-		</rollingPolicy>
-		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
-			<maxFileSize>5MB</maxFileSize>
-		</triggeringPolicy>
-		<encoder>
-			<pattern>${metricPattern}</pattern>
-		</encoder>
-	</appender>
-	
-	<appender name="AsyncMetricOut" class="ch.qos.logback.classic.AsyncAppender">
-		<appender-ref ref="MetricOut" />
-	</appender>
-
 	<appender name="ErrorOut" class="ch.qos.logback.core.rolling.RollingFileAppender">
 		<file>${logDir}/${errorLog}.log</file>
 		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
 			<fileNamePattern>${logDir}/${errorLog}.%i.log.zip</fileNamePattern>
 			<minIndex>1</minIndex>
-			<maxIndex>9</maxIndex>
+			<maxIndex>5</maxIndex>
 		</rollingPolicy>
 		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
 			<level>WARN</level>
@@ -136,14 +90,6 @@
 	<appender name="AsyncNetworkOut" class="ch.qos.logback.classic.AsyncAppender">
 		<appender-ref ref="NetworkOut" />
 	</appender>
-	
- 	<logger name="com.att.eelf.audit" level="INFO">
-		<appender-ref ref="AsyncAuditOut" />
-	</logger>
-
-	<logger name="com.att.eelf.metrics" level="INFO">
-		<appender-ref ref="AsyncMetricOut" />
-	</logger>
 
 	<logger name="network" level="INFO" additivity="false">
 		<appender-ref ref="AsyncNetworkOut" />