TCA: Support for VES/A&AI enrichment
[dcaegen2/analytics/tca.git] / dcae-analytics-cdap-common / src / main / java / org / openecomp / dcae / apod / analytics / cdap / common / persistance / tca / TCAMessageStatusPersister.java
index cb63ffb..6bfc657 100644 (file)
-/*
- * ===============================LICENSE_START======================================
- *  dcae-analytics
- * ================================================================================
- *    Copyright © 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===========================================
- */
-
-package org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca;
-
-import co.cask.cdap.api.data.schema.Schema;
-import co.cask.cdap.api.data.schema.UnsupportedTypeException;
-import co.cask.cdap.api.dataset.DatasetProperties;
-import co.cask.cdap.api.dataset.lib.IndexedTable;
-import co.cask.cdap.api.dataset.lib.ObjectMappedTable;
-import co.cask.cdap.api.dataset.lib.ObjectMappedTableProperties;
-import com.google.common.base.Joiner;
-import org.apache.commons.lang3.StringEscapeUtils;
-import org.apache.commons.lang3.tuple.Pair;
-import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants;
-import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException;
-import org.openecomp.dcae.apod.analytics.common.service.processor.MessageProcessor;
-import org.openecomp.dcae.apod.analytics.common.service.processor.ProcessorContext;
-import org.openecomp.dcae.apod.analytics.common.utils.PersistenceUtils;
-import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName;
-import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Threshold;
-import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFJsonProcessor;
-import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFPolicyDomainFilter;
-import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFPolicyEventNameFilter;
-import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFPolicyThresholdsProcessor;
-import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFProcessorContext;
-import org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.annotation.Nullable;
-
-import static org.openecomp.dcae.apod.analytics.common.utils.PersistenceUtils.TABLE_ROW_KEY_COLUMN_NAME;
-
-/**
- *
- *
- * @author Rajiv Singla . Creation Date: 11/15/2016.
- */
-public abstract class TCAMessageStatusPersister {
-
-    private static final Logger LOG = LoggerFactory.getLogger(TCAMessageStatusPersister.class);
-
-    private TCAMessageStatusPersister() {
-
-    }
-
-    /**
-     * Saves Message Status in Table. Assumes no alert was generated
-     *
-     * @param processorContext processor Context
-     * @param instanceId Instance Id
-     * @param calculatorMessageType Calculation Message Type
-     * @param messageStatusTable Message Status Table
-     */
-    public static void persist(final TCACEFProcessorContext processorContext,
-                               final int instanceId,
-                               final TCACalculatorMessageType calculatorMessageType,
-                               final ObjectMappedTable<TCAMessageStatusEntity> messageStatusTable) {
-        persist(processorContext, instanceId, calculatorMessageType, messageStatusTable, null);
-    }
-
-    /**
-     * Saves Message Status in Table. Sets up alert message aslo
-     *
-     * @param processorContext processor Context
-     * @param instanceId Instance Id
-     * @param calculatorMessageType Calculation Message Type
-     * @param messageStatusTable Message Status Table
-     * @param alertMessage Alert message
-     */
-    public static void persist(final TCACEFProcessorContext processorContext,
-                               final int instanceId,
-                               final TCACalculatorMessageType calculatorMessageType,
-                               final ObjectMappedTable<TCAMessageStatusEntity> messageStatusTable,
-                               @Nullable final String alertMessage) {
-
-        final String rowKey = createKey(calculatorMessageType);
-
-        final Long currentTS = new Date().getTime();
-        final String vesMessage = StringEscapeUtils.unescapeJson(processorContext.getMessage());
-
-        // Find Functional Role and domain
-        final Pair<String, String> domainAndEventName = TCAUtils.getDomainAndEventName(processorContext);
-        final String domain = domainAndEventName.getLeft();
-        final String eventName = domainAndEventName.getRight();
-
-        final TCAMessageStatusEntity tcaMessageStatusEntity = new TCAMessageStatusEntity(currentTS,
-                instanceId, calculatorMessageType.name(), vesMessage, domain, eventName);
-
-        // add threshold violation fields
-        addViolatedThreshold(tcaMessageStatusEntity, processorContext);
-        // add processor status and messages
-        addMessageProcessorMessages(tcaMessageStatusEntity, processorContext);
-        // add Alert message
-        tcaMessageStatusEntity.setAlertMessage(
-                alertMessage == null ? null : StringEscapeUtils.unescapeJson(alertMessage)
-        );
-
-        messageStatusTable.write(rowKey, tcaMessageStatusEntity);
-
-        LOG.debug("Finished persisting VES Status Message with rowKey: {} in Message Status Table.", rowKey);
-
-    }
-
-
-    /**
-     * Create TCA VES Message Status Table Properties
-     *
-     * @param timeToLiveSeconds Message Status Table time to live in seconds
-     *
-     * @return Message Status table properties
-     */
-    public static DatasetProperties getDatasetProperties(final int timeToLiveSeconds) {
-
-        try {
-            return ObjectMappedTableProperties.builder()
-                    .setType(TCAMessageStatusEntity.class)
-                    .setRowKeyExploreName(TABLE_ROW_KEY_COLUMN_NAME)
-                    .setRowKeyExploreType(Schema.Type.STRING)
-                    .add(IndexedTable.PROPERTY_TTL, timeToLiveSeconds)
-                    .setDescription(CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_STATUS_DESCRIPTION_TABLE)
-                    .build();
-        } catch (UnsupportedTypeException e) {
-            final String errorMessage = "Unable to convert TCAMessageStatusEntity class to Schema";
-            throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e);
-        }
-
-    }
-
-
-    /**
-     * Adds Violated Threshold Parameter values to {@link TCAMessageStatusEntity}
-     *
-     * @param tcaMessageStatusEntity message entity that needs to be populated with threshold fields
-     * @param processorContext processor context
-     *
-     * @return entity with populated threshold field values if present
-     */
-    public static TCAMessageStatusEntity addViolatedThreshold(final TCAMessageStatusEntity tcaMessageStatusEntity,
-                                                               final TCACEFProcessorContext processorContext) {
-
-        final MetricsPerEventName metricsPerEventName = processorContext.getMetricsPerEventName();
-
-        if (metricsPerEventName != null
-                && metricsPerEventName.getThresholds() != null
-                && metricsPerEventName.getThresholds().get(0) != null) {
-
-            final Threshold threshold = metricsPerEventName.getThresholds().get(0);
-            tcaMessageStatusEntity.setThresholdPath(threshold.getFieldPath());
-            tcaMessageStatusEntity.setThresholdSeverity(threshold.getSeverity().name());
-            tcaMessageStatusEntity.setThresholdDirection(threshold.getDirection().name());
-            tcaMessageStatusEntity.setThresholdValue(threshold.getThresholdValue());
-        }
-
-        return tcaMessageStatusEntity;
-    }
-
-
-    /**
-     * Add TCA CEF Message Processor status information
-     *
-     * @param tcaMessageStatusEntity message entity that needs to be populated with message processor fields
-     * @param processorContext processor context
-     *
-     * @return entity with populated message process status information
-     */
-    public static TCAMessageStatusEntity addMessageProcessorMessages(
-            final TCAMessageStatusEntity tcaMessageStatusEntity, final TCACEFProcessorContext processorContext) {
-        final List<? super MessageProcessor<? extends ProcessorContext>> messageProcessors = processorContext
-                .getMessageProcessors();
-
-        if (messageProcessors != null && !messageProcessors.isEmpty()) {
-            for (Object messageProcessor : messageProcessors) {
-                final MessageProcessor<TCACEFProcessorContext> tcaMessageProcessor =
-                        (MessageProcessor<TCACEFProcessorContext>) messageProcessor;
-
-                final String processingState = tcaMessageProcessor.getProcessingState().name();
-                final String processingMessage = tcaMessageProcessor.getProcessingMessage().orNull();
-
-                if (messageProcessor.getClass().equals(TCACEFJsonProcessor.class)) {
-                    tcaMessageStatusEntity.setJsonProcessorStatus(processingState);
-                    tcaMessageStatusEntity.setJsonProcessorMessage(processingMessage);
-                }
-
-                if (messageProcessor.getClass().equals(TCACEFPolicyDomainFilter.class)) {
-                    tcaMessageStatusEntity.setDomainFilterStatus(processingState);
-                    tcaMessageStatusEntity.setDomainFilterMessage(processingMessage);
-                }
-
-                if (messageProcessor.getClass().equals(TCACEFPolicyEventNameFilter.class)) {
-                    tcaMessageStatusEntity.setEventNameFilterStatus(processingState);
-                    tcaMessageStatusEntity.setEventNameFilterMessage(processingMessage);
-                }
-
-                if (messageProcessor.getClass().equals(TCACEFPolicyThresholdsProcessor.class)) {
-                    tcaMessageStatusEntity.setThresholdCalculatorStatus(processingState);
-                    tcaMessageStatusEntity.setThresholdCalculatorMessage(processingMessage);
-                }
-
-            }
-        }
-        return tcaMessageStatusEntity;
-    }
-
-    /**
-     * Creates Row Key for TCA VES Message Status table
-     *
-     * Row Key = (Message Type + Decreasing Value)
-     *
-     * @param calculatorMessageType calculator message type
-     *
-     * @return row key string
-     */
-    public static String createKey(final TCACalculatorMessageType calculatorMessageType) {
-
-        final List<String> keyList = new LinkedList<>();
-        keyList.add(calculatorMessageType.name());
-        keyList.add(PersistenceUtils.getCurrentTimeReverseSubKey());
-        return Joiner.on(PersistenceUtils.ROW_KEY_DELIMITER).join(keyList);
-    }
-
-}
+/*\r
+ * ===============================LICENSE_START======================================\r
+ *  dcae-analytics\r
+ * ================================================================================\r
+ *    Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
+ * ================================================================================\r
+ *  Licensed under the Apache License, Version 2.0 (the "License");\r
+ *  you may not use this file except in compliance with the License.\r
+ *   You may obtain a copy of the License at\r
+ *\r
+ *          http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *  Unless required by applicable law or agreed to in writing, software\r
+ *  distributed under the License is distributed on an "AS IS" BASIS,\r
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *  See the License for the specific language governing permissions and\r
+ *  limitations under the License.\r
+ *  ============================LICENSE_END===========================================\r
+ */\r
+\r
+package org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca;\r
+\r
+import co.cask.cdap.api.data.schema.Schema;\r
+import co.cask.cdap.api.data.schema.UnsupportedTypeException;\r
+import co.cask.cdap.api.dataset.DatasetProperties;\r
+import co.cask.cdap.api.dataset.lib.IndexedTable;\r
+import co.cask.cdap.api.dataset.lib.ObjectMappedTable;\r
+import co.cask.cdap.api.dataset.lib.ObjectMappedTableProperties;\r
+import com.google.common.base.Joiner;\r
+import org.apache.commons.lang3.StringEscapeUtils;\r
+import org.apache.commons.lang3.tuple.Pair;\r
+import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants;\r
+import org.openecomp.dcae.apod.analytics.common.exception.DCAEAnalyticsRuntimeException;\r
+import org.openecomp.dcae.apod.analytics.common.service.processor.MessageProcessor;\r
+import org.openecomp.dcae.apod.analytics.common.service.processor.ProcessorContext;\r
+import org.openecomp.dcae.apod.analytics.common.utils.PersistenceUtils;\r
+import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName;\r
+import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Threshold;\r
+import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFJsonProcessor;\r
+import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFPolicyDomainFilter;\r
+import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFPolicyEventNameFilter;\r
+import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFPolicyThresholdsProcessor;\r
+import org.openecomp.dcae.apod.analytics.tca.processor.TCACEFProcessorContext;\r
+import org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import java.util.Date;\r
+import java.util.LinkedList;\r
+import java.util.List;\r
+\r
+import javax.annotation.Nullable;\r
+\r
+import static org.openecomp.dcae.apod.analytics.common.utils.PersistenceUtils.TABLE_ROW_KEY_COLUMN_NAME;\r
+\r
+/**\r
+ *\r
+ *\r
+ * @author Rajiv Singla . Creation Date: 11/15/2016.\r
+ */\r
+public abstract class TCAMessageStatusPersister {\r
+\r
+    private static final Logger LOG = LoggerFactory.getLogger(TCAMessageStatusPersister.class);\r
+\r
+    private TCAMessageStatusPersister() {\r
+\r
+    }\r
+\r
+    /**\r
+     * Saves Message Status in Table. Assumes no alert was generated\r
+     *\r
+     * @param processorContext processor Context\r
+     * @param instanceId Instance Id\r
+     * @param calculatorMessageType Calculation Message Type\r
+     * @param messageStatusTable Message Status Table\r
+     */\r
+    public static void persist(final TCACEFProcessorContext processorContext,\r
+                               final int instanceId,\r
+                               final TCACalculatorMessageType calculatorMessageType,\r
+                               final ObjectMappedTable<TCAMessageStatusEntity> messageStatusTable) {\r
+        persist(processorContext, instanceId, calculatorMessageType, messageStatusTable, null);\r
+    }\r
+\r
+    /**\r
+     * Saves Message Status in Table. Sets up alert message aslo\r
+     *\r
+     * @param processorContext processor Context\r
+     * @param instanceId Instance Id\r
+     * @param calculatorMessageType Calculation Message Type\r
+     * @param messageStatusTable Message Status Table\r
+     * @param alertMessage Alert message\r
+     */\r
+    public static void persist(final TCACEFProcessorContext processorContext,\r
+                               final int instanceId,\r
+                               final TCACalculatorMessageType calculatorMessageType,\r
+                               final ObjectMappedTable<TCAMessageStatusEntity> messageStatusTable,\r
+                               @Nullable final String alertMessage) {\r
+\r
+        final String rowKey = createKey(calculatorMessageType);\r
+\r
+        final Long currentTS = new Date().getTime();\r
+        final String vesMessage = StringEscapeUtils.unescapeJson(processorContext.getMessage());\r
+\r
+        // Find Functional Role and domain\r
+        final Pair<String, String> domainAndEventName = TCAUtils.getDomainAndEventName(processorContext);\r
+        final String domain = domainAndEventName.getLeft();\r
+        final String eventName = domainAndEventName.getRight();\r
+\r
+        final TCAMessageStatusEntity tcaMessageStatusEntity = new TCAMessageStatusEntity(currentTS,\r
+                instanceId, calculatorMessageType.name(), vesMessage, domain, eventName);\r
+\r
+        // add threshold violation fields\r
+        addViolatedThreshold(tcaMessageStatusEntity, processorContext);\r
+        // add processor status and messages\r
+        addMessageProcessorMessages(tcaMessageStatusEntity, processorContext);\r
+        // add Alert message\r
+        tcaMessageStatusEntity.setAlertMessage(\r
+                alertMessage == null ? null : StringEscapeUtils.unescapeJson(alertMessage)\r
+        );\r
+\r
+        messageStatusTable.write(rowKey, tcaMessageStatusEntity);\r
+\r
+        LOG.debug("Finished persisting VES Status Message with rowKey: {} in Message Status Table.", rowKey);\r
+\r
+    }\r
+\r
+\r
+    /**\r
+     * Create TCA VES Message Status Table Properties\r
+     *\r
+     * @param timeToLiveSeconds Message Status Table time to live in seconds\r
+     *\r
+     * @return Message Status table properties\r
+     */\r
+    public static DatasetProperties getDatasetProperties(final int timeToLiveSeconds) {\r
+\r
+        try {\r
+            return ObjectMappedTableProperties.builder()\r
+                    .setType(TCAMessageStatusEntity.class)\r
+                    .setRowKeyExploreName(TABLE_ROW_KEY_COLUMN_NAME)\r
+                    .setRowKeyExploreType(Schema.Type.STRING)\r
+                    .add(IndexedTable.PROPERTY_TTL, timeToLiveSeconds)\r
+                    .setDescription(CDAPComponentsConstants.TCA_FIXED_VES_MESSAGE_STATUS_DESCRIPTION_TABLE)\r
+                    .build();\r
+        } catch (UnsupportedTypeException e) {\r
+            final String errorMessage = "Unable to convert TCAMessageStatusEntity class to Schema";\r
+            throw new DCAEAnalyticsRuntimeException(errorMessage, LOG, e);\r
+        }\r
+\r
+    }\r
+\r
+\r
+    /**\r
+     * Adds Violated Threshold Parameter values to {@link TCAMessageStatusEntity}\r
+     *\r
+     * @param tcaMessageStatusEntity message entity that needs to be populated with threshold fields\r
+     * @param processorContext processor context\r
+     *\r
+     */\r
+    private static void addViolatedThreshold(final TCAMessageStatusEntity tcaMessageStatusEntity,\r
+                                                               final TCACEFProcessorContext processorContext) {\r
+\r
+        final MetricsPerEventName metricsPerEventName = processorContext.getMetricsPerEventName();\r
+\r
+        if (metricsPerEventName != null\r
+                && metricsPerEventName.getThresholds() != null\r
+                && metricsPerEventName.getThresholds().get(0) != null) {\r
+\r
+            final Threshold threshold = metricsPerEventName.getThresholds().get(0);\r
+            tcaMessageStatusEntity.setThresholdPath(threshold.getFieldPath());\r
+            tcaMessageStatusEntity.setThresholdSeverity(threshold.getSeverity().name());\r
+            tcaMessageStatusEntity.setThresholdDirection(threshold.getDirection().name());\r
+            tcaMessageStatusEntity.setThresholdValue(threshold.getThresholdValue());\r
+        }\r
+\r
+    }\r
+\r
+\r
+    /**\r
+     * Add TCA CEF Message Processor status information\r
+     *\r
+     * @param tcaMessageStatusEntity message entity that needs to be populated with message processor fields\r
+     * @param processorContext processor context\r
+     *\r
+     */\r
+    @SuppressWarnings("unchecked")\r
+    private static void addMessageProcessorMessages(\r
+            final TCAMessageStatusEntity tcaMessageStatusEntity, final TCACEFProcessorContext processorContext) {\r
+        final List<? super MessageProcessor<? extends ProcessorContext>> messageProcessors = processorContext\r
+                .getMessageProcessors();\r
+\r
+        if (messageProcessors != null && !messageProcessors.isEmpty()) {\r
+            for (Object messageProcessor : messageProcessors) {\r
+                final MessageProcessor<TCACEFProcessorContext> tcaMessageProcessor =\r
+                        (MessageProcessor<TCACEFProcessorContext>) messageProcessor;\r
+\r
+                final String processingState = tcaMessageProcessor.getProcessingState().name();\r
+                final String processingMessage = tcaMessageProcessor.getProcessingMessage().orNull();\r
+\r
+                if (messageProcessor.getClass().equals(TCACEFJsonProcessor.class)) {\r
+                    tcaMessageStatusEntity.setJsonProcessorStatus(processingState);\r
+                    tcaMessageStatusEntity.setJsonProcessorMessage(processingMessage);\r
+                }\r
+\r
+                if (messageProcessor.getClass().equals(TCACEFPolicyDomainFilter.class)) {\r
+                    tcaMessageStatusEntity.setDomainFilterStatus(processingState);\r
+                    tcaMessageStatusEntity.setDomainFilterMessage(processingMessage);\r
+                }\r
+\r
+                if (messageProcessor.getClass().equals(TCACEFPolicyEventNameFilter.class)) {\r
+                    tcaMessageStatusEntity.setEventNameFilterStatus(processingState);\r
+                    tcaMessageStatusEntity.setEventNameFilterMessage(processingMessage);\r
+                }\r
+\r
+                if (messageProcessor.getClass().equals(TCACEFPolicyThresholdsProcessor.class)) {\r
+                    tcaMessageStatusEntity.setThresholdCalculatorStatus(processingState);\r
+                    tcaMessageStatusEntity.setThresholdCalculatorMessage(processingMessage);\r
+                }\r
+\r
+            }\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Creates Row Key for TCA VES Message Status table\r
+     *\r
+     * Row Key = (Message Type + Decreasing Value)\r
+     *\r
+     * @param calculatorMessageType calculator message type\r
+     *\r
+     * @return row key string\r
+     */\r
+    private static String createKey(final TCACalculatorMessageType calculatorMessageType) {\r
+\r
+        final List<String> keyList = new LinkedList<>();\r
+        keyList.add(calculatorMessageType.name());\r
+        keyList.add(PersistenceUtils.getCurrentTimeReverseSubKey());\r
+        return Joiner.on(PersistenceUtils.ROW_KEY_DELIMITER).join(keyList);\r
+    }\r
+\r
+}\r