You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@eagle.apache.org by ha...@apache.org on 2017/04/03 11:54:27 UTC

[19/84] [partial] eagle git commit: Clean repo for eagle site

http://git-wip-us.apache.org/repos/asf/eagle/blob/6fd95d5c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/SpoutOutputCollectorWrapper.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/SpoutOutputCollectorWrapper.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/SpoutOutputCollectorWrapper.java
deleted file mode 100644
index 1036a36..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/SpoutOutputCollectorWrapper.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- *
- *  * Licensed to the Apache Software Foundation (ASF) under one or more
- *  * contributor license agreements.  See the NOTICE file distributed with
- *  * this work for additional information regarding copyright ownership.
- *  * The ASF licenses this file to You 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.
- *
- */
-package org.apache.eagle.alert.engine.spout;
-
-import backtype.storm.spout.ISpoutOutputCollector;
-import backtype.storm.spout.SpoutOutputCollector;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.eagle.alert.coordination.model.SpoutSpec;
-import org.apache.eagle.alert.coordination.model.StreamRepartitionMetadata;
-import org.apache.eagle.alert.coordination.model.StreamRepartitionStrategy;
-import org.apache.eagle.alert.coordination.model.Tuple2StreamConverter;
-import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
-import org.apache.eagle.alert.engine.coordinator.StreamPartition;
-import org.apache.eagle.alert.engine.model.PartitionedEvent;
-import org.apache.eagle.alert.engine.model.StreamEvent;
-import org.apache.eagle.alert.engine.serialization.PartitionedEventSerializer;
-import org.apache.eagle.alert.engine.serialization.SerializationMetadataProvider;
-import org.apache.eagle.alert.utils.StreamIdConversion;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-/**
- * intercept the message sent from within KafkaSpout and select downstream bolts based on meta-data
- * This is topic based. each topic will have one SpoutOutputCollectorWrapper.
- */
-public class SpoutOutputCollectorWrapper extends SpoutOutputCollector implements ISpoutSpecLCM, SerializationMetadataProvider {
-    private static final Logger LOG = LoggerFactory.getLogger(SpoutOutputCollectorWrapper.class);
-
-    private final ISpoutOutputCollector delegate;
-    private final String topic;
-    private final PartitionedEventSerializer serializer;
-    private int numOfRouterBolts;
-    private boolean logEventEnabled;
-
-    private volatile List<StreamRepartitionMetadata> streamRepartitionMetadataList;
-    private volatile Tuple2StreamConverter converter;
-    private CorrelationSpout spout;
-    private volatile Map<String, StreamDefinition> sds;
-
-    /**
-     * @param delegate        actual SpoutOutputCollector to send data to following bolts
-     * @param topic           topic for this KafkaSpout to handle
-     * @param numGroupbyBolts bolts following this spout.
-     * @param serializer
-     */
-    public SpoutOutputCollectorWrapper(CorrelationSpout spout,
-                                       ISpoutOutputCollector delegate,
-                                       String topic,
-                                       SpoutSpec spoutSpec,
-                                       int numGroupbyBolts,
-                                       Map<String, StreamDefinition> sds, PartitionedEventSerializer serializer, boolean logEventEnabled) {
-        super(delegate);
-        this.spout = spout;
-        this.delegate = delegate;
-        this.topic = topic;
-        this.streamRepartitionMetadataList = spoutSpec.getStreamRepartitionMetadataMap().get(topic);
-        this.converter = new Tuple2StreamConverter(spoutSpec.getTuple2StreamMetadataMap().get(topic));
-        this.numOfRouterBolts = numGroupbyBolts;
-        this.sds = sds;
-        this.serializer = serializer;
-        this.logEventEnabled = logEventEnabled;
-    }
-
-    /**
-     * How to assert that numTotalGroupbyBolts >= numOfRouterBolts, otherwise
-     * there is runtime issue by default, tuple includes 2 fields field 1: topic
-     * name field 2: map of key/value.
-     */
-    @SuppressWarnings("rawtypes")
-    @Override
-    public List<Integer> emit(List<Object> tuple, Object messageId) {
-        if (!sanityCheck()) {
-            LOG.error(
-                "spout collector for topic {} see monitored metadata invalid, is this data source removed! Trigger message id {} ",
-                topic, messageId);
-            return null;
-        }
-
-        KafkaMessageIdWrapper newMessageId = new KafkaMessageIdWrapper(messageId);
-        newMessageId.topic = topic;
-        newMessageId.timestamp = System.currentTimeMillis();
-        /**
-         phase 1: tuple to stream converter
-         if this topic multiplexes multiple streams, then retrieve the individual streams.
-         */
-        List<Object> convertedTuple = converter.convert(tuple);
-        if (convertedTuple == null) {
-            LOG.debug("source data {} can't be converted to a stream, ignore this message", tuple);
-            spout.ack(newMessageId);
-            return null;
-        }
-        Map m = (Map) convertedTuple.get(3);
-        Object streamId = convertedTuple.get(1);
-
-        StreamDefinition sd = sds.get(streamId);
-        if (sd == null) {
-            LOG.warn("StreamDefinition {} is not found within {}, ignore this message", streamId, sds);
-            spout.ack(newMessageId);
-            return null;
-        }
-
-        StreamEvent event = convertToStreamEventByStreamDefinition((Long) convertedTuple.get(2), m, sds.get(streamId));
-        if (logEventEnabled) {
-            LOG.info("Spout from topic {} emit event: {}", topic, event);
-        }
-        
-        /*
-            phase 2: stream repartition
-        */
-        for (StreamRepartitionMetadata md : streamRepartitionMetadataList) {
-            if (!event.getStreamId().equals(md.getStreamId())) {
-                continue;
-            }
-            // one stream may have multiple group-by strategies, each strategy is for a specific group-by
-            for (StreamRepartitionStrategy groupingStrategy : md.groupingStrategies) {
-                int hash = 0;
-                if (groupingStrategy.getPartition().getType().equals(StreamPartition.Type.GROUPBY)) {
-                    hash = getRoutingHashByGroupingStrategy(m, groupingStrategy);
-                } else if (groupingStrategy.getPartition().getType().equals(StreamPartition.Type.SHUFFLE)) {
-                    hash = Math.abs((int) System.currentTimeMillis());
-                }
-                int mod = hash % groupingStrategy.numTotalParticipatingRouterBolts;
-                // filter out message
-                if (mod >= groupingStrategy.startSequence && mod < groupingStrategy.startSequence + numOfRouterBolts) {
-                    // framework takes care of field grouping instead of using storm internal field grouping
-                    String sid = StreamIdConversion.generateStreamIdBetween(spout.getSpoutName(), spout.getRouteBoltName() + (hash % numOfRouterBolts));
-                    if (LOG.isDebugEnabled()) {
-                        LOG.debug("Emitted tuple: {} with message Id: {}, with topic {}, to streamId {}", convertedTuple, messageId, topic, sid);
-                    }
-                    // send message to StreamRouterBolt
-                    PartitionedEvent pEvent = new PartitionedEvent(event, groupingStrategy.partition, hash);
-                    if (this.serializer == null) {
-                        delegate.emit(sid, Collections.singletonList(pEvent), newMessageId);
-                    } else {
-                        try {
-                            delegate.emit(sid, Collections.singletonList(serializer.serialize(pEvent)), newMessageId);
-                        } catch (Exception e) {
-                            LOG.error("Failed to serialize {}, this message would be ignored!", pEvent, e);
-                            spout.ack(newMessageId);
-                        }
-                    }
-                } else {
-                    // ******* short-cut ack ********
-                    // we should simply ack those messages which are not processed in this topology because KafkaSpout implementation requires _pending is empty
-                    // before moving to next offsets.
-                    if (LOG.isDebugEnabled()) {
-                        LOG.debug("Message filtered with mod {} not within range {} and {} for message {}", mod, groupingStrategy.startSequence,
-                            groupingStrategy.startSequence + numOfRouterBolts, tuple);
-                    }
-                    spout.ack(newMessageId);
-                }
-            }
-        }
-
-        return null;
-    }
-
-    @SuppressWarnings("rawtypes")
-    private int getRoutingHashByGroupingStrategy(Map data, StreamRepartitionStrategy gs) {
-        // calculate hash value for values from group-by fields
-        HashCodeBuilder hashCodeBuilder = new HashCodeBuilder();
-        for (String groupingField : gs.partition.getColumns()) {
-            if (data.get(groupingField) != null) {
-                hashCodeBuilder.append(data.get(groupingField));
-            } else {
-                LOG.warn("Required GroupBy fields {} not found: {}", gs.partition.getColumns(), data);
-            }
-        }
-        int hash = hashCodeBuilder.toHashCode();
-        hash = Math.abs(hash);
-        return hash;
-    }
-
-    private boolean sanityCheck() {
-        boolean isOk = true;
-        if (streamRepartitionMetadataList == null) {
-            LOG.error("streamRepartitionMetadataList is null!");
-            isOk = false;
-        }
-        if (converter == null) {
-            LOG.error("tuple2StreamMetadata is null!");
-            isOk = false;
-        }
-        return isOk;
-    }
-
-    @SuppressWarnings( {"rawtypes", "unchecked"})
-    private StreamEvent convertToStreamEventByStreamDefinition(long timestamp, Map m, StreamDefinition sd) {
-        return StreamEvent.builder().timestamep(timestamp).attributes(m, sd).build();
-    }
-
-    /**
-     * SpoutSpec may be changed, this class will respond to changes on tuple2StreamMetadataMap and streamRepartitionMetadataMap.
-     *
-     * @param spoutSpec
-     * @param sds
-     */
-    @Override
-    public void update(SpoutSpec spoutSpec, Map<String, StreamDefinition> sds) {
-        this.streamRepartitionMetadataList = spoutSpec.getStreamRepartitionMetadataMap().get(topic);
-        this.converter = new Tuple2StreamConverter(spoutSpec.getTuple2StreamMetadataMap().get(topic));
-        this.sds = sds;
-    }
-
-    @Override
-    public StreamDefinition getStreamDefinition(String streamId) {
-        return this.sds.get(streamId);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/eagle/blob/6fd95d5c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/AlertStreamUtils.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/AlertStreamUtils.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/AlertStreamUtils.java
deleted file mode 100644
index fc9cc8a..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/AlertStreamUtils.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-package org.apache.eagle.alert.engine.utils;
-
-import org.apache.eagle.alert.engine.coordinator.PolicyDefinition;
-import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
-import org.apache.eagle.alert.engine.evaluator.PolicyHandlerContext;
-import org.apache.eagle.alert.engine.model.AlertStreamEvent;
-import org.apache.eagle.alert.engine.model.StreamEvent;
-
-import java.util.Map;
-
-/**
- * Created on 8/16/16.
- */
-public class AlertStreamUtils {
-
-    /**
-     * Create alert stream event for publisher.
-     */
-    public static AlertStreamEvent createAlertEvent(StreamEvent event,
-                                                    PolicyHandlerContext context,
-                                                    Map<String, StreamDefinition> sds) {
-        PolicyDefinition policyDef = context.getPolicyDefinition();
-        AlertStreamEvent alertStreamEvent = new AlertStreamEvent();
-
-        alertStreamEvent.setTimestamp(event.getTimestamp());
-        alertStreamEvent.setData(event.getData());
-        alertStreamEvent.setStreamId(policyDef.getOutputStreams().get(0));
-        alertStreamEvent.setPolicyId(policyDef.getName());
-
-        if (context.getPolicyEvaluator() != null) {
-            alertStreamEvent.setCreatedBy(context.getPolicyEvaluator().getName());
-        }
-
-        alertStreamEvent.setCreatedTime(System.currentTimeMillis());
-
-        String is = policyDef.getInputStreams().get(0);
-        StreamDefinition sd = sds.get(is);
-        alertStreamEvent.setSchema(sd);
-
-        return alertStreamEvent;
-    }
-}

http://git-wip-us.apache.org/repos/asf/eagle/blob/6fd95d5c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/CompressionUtils.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/CompressionUtils.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/CompressionUtils.java
deleted file mode 100644
index 075d827..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/CompressionUtils.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * 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.
- */
-package org.apache.eagle.alert.engine.utils;
-
-import com.google.common.io.ByteStreams;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.zip.GZIPInputStream;
-import java.util.zip.GZIPOutputStream;
-
-
-public class CompressionUtils {
-    public static byte[] compress(byte[] source) throws IOException {
-        if (source == null || source.length == 0) {
-            return source;
-        }
-        ByteArrayInputStream sourceStream = new ByteArrayInputStream(source);
-        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(source.length / 2);
-        try (OutputStream compressor = new GZIPOutputStream(outputStream)) {
-            ByteStreams.copy(sourceStream, compressor);
-            compressor.close();
-        }
-        try {
-            return outputStream.toByteArray();
-        } finally {
-            sourceStream.close();
-            outputStream.close();
-        }
-    }
-
-    public static byte[] decompress(byte[] compressed) throws IOException {
-        if (compressed == null || compressed.length == 0) {
-            return compressed;
-        }
-        ByteArrayInputStream sourceStream = new ByteArrayInputStream(compressed);
-        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(compressed.length * 2);
-        try (GZIPInputStream compressor = new GZIPInputStream(sourceStream)) {
-            ByteStreams.copy(compressor, outputStream);
-            compressor.close();
-        }
-        try {
-            return outputStream.toByteArray();
-        } finally {
-            sourceStream.close();
-            outputStream.close();
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/eagle/blob/6fd95d5c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/MetadataSerDeser.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/MetadataSerDeser.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/MetadataSerDeser.java
deleted file mode 100644
index 2229219..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/MetadataSerDeser.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *
- *  * Licensed to the Apache Software Foundation (ASF) under one or more
- *  * contributor license agreements.  See the NOTICE file distributed with
- *  * this work for additional information regarding copyright ownership.
- *  * The ASF licenses this file to You 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.
- *
- */
-
-package org.apache.eagle.alert.engine.utils;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.InputStream;
-
-/**
- * Since 5/6/16.
- */
-public class MetadataSerDeser {
-    private static final Logger LOG = LoggerFactory.getLogger(MetadataSerDeser.class);
-
-    @SuppressWarnings("rawtypes")
-    public static <K> K deserialize(InputStream is, TypeReference typeRef) {
-        ObjectMapper mapper = new ObjectMapper();
-        try {
-            K spec = mapper.readValue(is, typeRef);
-            return spec;
-        } catch (Exception ex) {
-            LOG.error("error in deserializing metadata of type {} from input stream",
-                new TypeReference<K>() {
-                }.getType().getClass().getCanonicalName(), ex);
-        }
-        return null;
-    }
-
-    public static <K> K deserialize(InputStream is, Class<K> cls) {
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
-        try {
-            K spec = mapper.readValue(is, cls);
-            return spec;
-        } catch (Exception ex) {
-            LOG.error("Got error to deserialize metadata of type {} from input stream",
-                new TypeReference<K>() {
-                }.getType().getClass().getCanonicalName(), ex);
-        }
-        return null;
-    }
-
-    @SuppressWarnings("rawtypes")
-    public static <K> K deserialize(String json, TypeReference typeRef) {
-        ObjectMapper mapper = new ObjectMapper();
-        try {
-            K spec = mapper.readValue(json, typeRef);
-            return spec;
-        } catch (Exception ex) {
-            LOG.error("error in deserializing metadata of type {} from {}",
-                new TypeReference<K>() {
-                }.getType().getClass().getCanonicalName(), json, ex);
-        }
-        return null;
-    }
-
-    public static <K> K deserialize(String json, Class<K> cls) {
-        ObjectMapper mapper = new ObjectMapper();
-        try {
-            K spec = mapper.readValue(json, cls);
-            return spec;
-        } catch (Exception ex) {
-            LOG.error("error in deserializing metadata of type {} from {}",
-                new TypeReference<K>() {
-                }.getType().getClass().getCanonicalName(), json, ex);
-        }
-        return null;
-    }
-
-    public static <K> String serialize(K spec) {
-        ObjectMapper mapper = new ObjectMapper();
-        try {
-            String json = mapper.writeValueAsString(spec);
-            return json;
-        } catch (Exception ex) {
-            LOG.error("error in serializing object {} with type {}", spec,
-                new TypeReference<K>() {
-                }.getType().getClass().getCanonicalName(), ex);
-        }
-        return null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/eagle/blob/6fd95d5c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/SerializableUtils.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/SerializableUtils.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/SerializableUtils.java
deleted file mode 100644
index 509cbf4..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/SerializableUtils.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-package org.apache.eagle.alert.engine.utils;
-
-import org.xerial.snappy.SnappyInputStream;
-import org.xerial.snappy.SnappyOutputStream;
-
-import java.io.*;
-
-
-/**
- * Utilities for working with Serializables.
- * Derived from "com.google.cloud.dataflow.sdk.util.SerializableUtils"
- */
-public class SerializableUtils {
-    /**
-     * Serializes the argument into an array of bytes, and returns it.
-     *
-     * @throws IllegalArgumentException if there are errors when serializing
-     */
-    public static byte[] serializeToCompressedByteArray(Object value) {
-        try {
-            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
-            try (ObjectOutputStream oos = new ObjectOutputStream(new SnappyOutputStream(buffer))) {
-                oos.writeObject(value);
-            }
-            return buffer.toByteArray();
-        } catch (IOException exn) {
-            throw new IllegalArgumentException(
-                "unable to serialize " + value,
-                exn);
-        }
-    }
-
-    /**
-     * Serializes the argument into an array of bytes, and returns it.
-     *
-     * @throws IllegalArgumentException if there are errors when serializing
-     */
-    public static byte[] serializeToByteArray(Object value) {
-        try {
-            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
-            try (ObjectOutputStream oos = new ObjectOutputStream(buffer)) {
-                oos.writeObject(value);
-            }
-            return buffer.toByteArray();
-        } catch (IOException exn) {
-            throw new IllegalArgumentException("unable to serialize " + value, exn);
-        }
-    }
-
-    /**
-     * Deserializes an object from the given array of bytes, e.g., as
-     * serialized using {@link #serializeToCompressedByteArray}, and returns it.
-     *
-     * @throws IllegalArgumentException if there are errors when
-     *                                  deserializing, using the provided description to identify what
-     *                                  was being deserialized
-     */
-    public static Object deserializeFromByteArray(byte[] encodedValue,
-                                                  String description) {
-        try {
-            try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(encodedValue))) {
-                return ois.readObject();
-            }
-        } catch (IOException | ClassNotFoundException exn) {
-            throw new IllegalArgumentException(
-                "unable to deserialize " + description,
-                exn);
-        }
-    }
-
-    /**
-     * Deserializes an object from the given array of bytes, e.g., as
-     * serialized using {@link #serializeToCompressedByteArray}, and returns it.
-     *
-     * @throws IllegalArgumentException if there are errors when
-     *                                  deserializing, using the provided description to identify what
-     *                                  was being deserialized
-     */
-    public static Object deserializeFromCompressedByteArray(byte[] encodedValue,
-                                                            String description) {
-        try {
-            try (ObjectInputStream ois = new ObjectInputStream(
-                new SnappyInputStream(new ByteArrayInputStream(encodedValue)))) {
-                return ois.readObject();
-            }
-        } catch (IOException | ClassNotFoundException exn) {
-            throw new IllegalArgumentException(
-                "unable to deserialize " + description,
-                exn);
-        }
-    }
-
-    public static <T extends Serializable> T ensureSerializable(T value) {
-        @SuppressWarnings("unchecked")
-        T copy = (T) deserializeFromCompressedByteArray(serializeToCompressedByteArray(value),
-            value.toString());
-        return copy;
-    }
-
-    public static <T extends Serializable> T clone(T value) {
-        @SuppressWarnings("unchecked")
-        T copy = (T) deserializeFromCompressedByteArray(serializeToCompressedByteArray(value),
-            value.toString());
-        return copy;
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/eagle/blob/6fd95d5c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/SingletonExecutor.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/SingletonExecutor.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/SingletonExecutor.java
deleted file mode 100644
index fdb9ed8..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/utils/SingletonExecutor.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *
- *  * Licensed to the Apache Software Foundation (ASF) under one or more
- *  * contributor license agreements.  See the NOTICE file distributed with
- *  * this work for additional information regarding copyright ownership.
- *  * The ASF licenses this file to You 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.
- *
- */
-
-package org.apache.eagle.alert.engine.utils;
-
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-public class SingletonExecutor {
-
-    public static synchronized ExecutorService getExecutorService() {
-        return executorService;
-    }
-
-    private static ExecutorService executorService;
-
-    private static SingletonExecutor executor = new SingletonExecutor();
-
-    public SingletonExecutor() {
-        executorService = Executors.newFixedThreadPool(5);
-    }
-
-    public static void main(String[] args) {
-        System.out.println(SingletonExecutor.getExecutorService());
-        System.out.println(SingletonExecutor.getExecutorService());
-
-    }
-}

http://git-wip-us.apache.org/repos/asf/eagle/blob/6fd95d5c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/storm/kafka/KafkaSpoutMetric.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/storm/kafka/KafkaSpoutMetric.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/storm/kafka/KafkaSpoutMetric.java
deleted file mode 100644
index 935742f..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/storm/kafka/KafkaSpoutMetric.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-package storm.kafka;
-
-import backtype.storm.metric.api.IMetric;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Since 5/18/16.
- * The original storm.kafka.KafkaSpout has some issues like the following
- * 1) can only support one single topic
- * 2) can only be initialized at open(), can't dynamically support another topic.
- */
-public class KafkaSpoutMetric implements IMetric {
-    @SuppressWarnings("unused")
-    private static final Logger LOG = LoggerFactory.getLogger(KafkaSpoutMetric.class);
-    private Map<String, KafkaSpoutMetricContext> metricContextMap = new ConcurrentHashMap<>();
-    private Map<String, KafkaUtils.KafkaOffsetMetric> offsetMetricMap = new ConcurrentHashMap<>();
-
-    public static class KafkaSpoutMetricContext {
-        SpoutConfig spoutConfig;
-        DynamicPartitionConnections connections;
-        PartitionCoordinator coordinator;
-    }
-
-    public void addTopic(String topic, KafkaSpoutMetricContext context) {
-        // construct KafkaOffsetMetric
-        KafkaUtils.KafkaOffsetMetric kafkaOffsetMetric = new KafkaUtils.KafkaOffsetMetric(context.spoutConfig.topic, context.connections);
-        metricContextMap.put(topic, context);
-        offsetMetricMap.put(topic, kafkaOffsetMetric);
-    }
-
-    public void removeTopic(String topic) {
-        metricContextMap.remove(topic);
-        offsetMetricMap.remove(topic);
-    }
-
-    @SuppressWarnings( {"unchecked", "rawtypes"})
-    @Override
-    public Object getValueAndReset() {
-        HashMap spoutMetric = new HashMap();
-        for (Map.Entry<String, KafkaSpoutMetricContext> entry : metricContextMap.entrySet()) {
-            // construct offset metric
-            List<PartitionManager> pms = entry.getValue().coordinator.getMyManagedPartitions();
-            Set<Partition> latestPartitions = new HashSet();
-            for (PartitionManager pm : pms) {
-                latestPartitions.add(pm.getPartition());
-            }
-
-            KafkaUtils.KafkaOffsetMetric offsetMetric = offsetMetricMap.get(entry.getKey());
-            offsetMetric.refreshPartitions(latestPartitions);
-            for (PartitionManager pm : pms) {
-                offsetMetric.setLatestEmittedOffset(pm.getPartition(), pm.lastCompletedOffset());
-            }
-            Object o = offsetMetric.getValueAndReset();
-            if (o != null) {
-                ((HashMap) o).forEach(
-                    (k, v) -> spoutMetric.put(k + "_" + entry.getKey(), v)
-                );
-            }
-
-            // construct partition metric
-            for (PartitionManager pm : pms) {
-                pm.getMetricsDataMap().forEach(
-                    (k, v) -> spoutMetric.put(k + "_" + entry.getKey(), v)
-                );
-            }
-        }
-        return spoutMetric;
-    }
-}

http://git-wip-us.apache.org/repos/asf/eagle/blob/6fd95d5c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/storm/kafka/KafkaSpoutWrapper.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/storm/kafka/KafkaSpoutWrapper.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/storm/kafka/KafkaSpoutWrapper.java
deleted file mode 100644
index 2bdbd3c..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/storm/kafka/KafkaSpoutWrapper.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *
- *  * Licensed to the Apache Software Foundation (ASF) under one or more
- *  * contributor license agreements.  See the NOTICE file distributed with
- *  * this work for additional information regarding copyright ownership.
- *  * The ASF licenses this file to You 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.
- *
- */
-package storm.kafka;
-
-import org.apache.eagle.alert.coordination.model.SpoutSpec;
-import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
-import org.apache.eagle.alert.engine.spout.ISpoutSpecLCM;
-import org.apache.eagle.alert.engine.spout.SpoutOutputCollectorWrapper;
-import backtype.storm.Config;
-import backtype.storm.spout.SpoutOutputCollector;
-import backtype.storm.task.TopologyContext;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * NOTE!!!!! This class copy/paste some code from storm.kafka.KafkaSpout to make sure it can support one process to hold multiple
- * KafkaSpout
- *
- * <p>this collectorWrapper provides the following capabilities:
- * 1. inject customized collector collectorWrapper, so framework can control traffic routing
- * 2. listen to topic to stream metadata change and pass that to customized collector collectorWrapper
- * 3. return current streams for this topic</p>
- */
-public class KafkaSpoutWrapper extends KafkaSpout implements ISpoutSpecLCM {
-    private static final long serialVersionUID = 5507693757424351306L;
-    @SuppressWarnings("unused")
-    private static final Logger LOG = LoggerFactory.getLogger(KafkaSpoutWrapper.class);
-    private KafkaSpoutMetric kafkaSpoutMetric;
-
-    public KafkaSpoutWrapper(SpoutConfig spoutConf, KafkaSpoutMetric kafkaSpoutMetric) {
-        super(spoutConf);
-        this.kafkaSpoutMetric = kafkaSpoutMetric;
-    }
-
-    private SpoutOutputCollectorWrapper collectorWrapper;
-
-    @SuppressWarnings( {"unchecked", "rawtypes"})
-    @Override
-    public void open(Map conf, final TopologyContext context, final SpoutOutputCollector collector) {
-        String topologyInstanceId = context.getStormId();
-        ////// !!!! begin copying code from storm.kafka.KafkaSpout to here
-        _collector = collector;
-
-        Map stateConf = new HashMap(conf);
-        List<String> zkServers = _spoutConfig.zkServers;
-        if (zkServers == null) {
-            zkServers = (List<String>) conf.get(Config.STORM_ZOOKEEPER_SERVERS);
-        }
-        Integer zkPort = _spoutConfig.zkPort;
-        if (zkPort == null) {
-            zkPort = ((Number) conf.get(Config.STORM_ZOOKEEPER_PORT)).intValue();
-        }
-        stateConf.put(Config.TRANSACTIONAL_ZOOKEEPER_SERVERS, zkServers);
-        stateConf.put(Config.TRANSACTIONAL_ZOOKEEPER_PORT, zkPort);
-        stateConf.put(Config.TRANSACTIONAL_ZOOKEEPER_ROOT, _spoutConfig.zkRoot);
-        _state = new ZkState(stateConf);
-
-        _connections = new DynamicPartitionConnections(_spoutConfig, KafkaUtils.makeBrokerReader(conf, _spoutConfig));
-
-        // using TransactionalState like this is a hack
-        int totalTasks = context.getComponentTasks(context.getThisComponentId()).size();
-        if (_spoutConfig.hosts instanceof StaticHosts) {
-            _coordinator = new StaticCoordinator(_connections, conf, _spoutConfig, _state, context.getThisTaskIndex(), totalTasks, topologyInstanceId);
-        } else {
-            _coordinator = new ZkCoordinator(_connections, conf, _spoutConfig, _state, context.getThisTaskIndex(), totalTasks, topologyInstanceId);
-        }
-
-        ////// !!!! end copying code from storm.kafka.KafkaSpout to here
-
-        // add new topic to metric
-        KafkaSpoutMetric.KafkaSpoutMetricContext metricContext = new KafkaSpoutMetric.KafkaSpoutMetricContext();
-        metricContext.connections = _connections;
-        metricContext.coordinator = _coordinator;
-        metricContext.spoutConfig = _spoutConfig;
-        kafkaSpoutMetric.addTopic(_spoutConfig.topic, metricContext);
-
-        this.collectorWrapper = (SpoutOutputCollectorWrapper) collector;
-    }
-
-    @Override
-    public void update(SpoutSpec metadata, Map<String, StreamDefinition> sds) {
-        collectorWrapper.update(metadata, sds);
-    }
-
-    @Override
-    public void close() {
-        super.close();
-        kafkaSpoutMetric.removeTopic(_spoutConfig.topic);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/eagle/blob/6fd95d5c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/ALERT_DEFAULT_TEMPLATE.vm
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/ALERT_DEFAULT_TEMPLATE.vm b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/ALERT_DEFAULT_TEMPLATE.vm
deleted file mode 100644
index 3926cc8..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/ALERT_DEFAULT_TEMPLATE.vm
+++ /dev/null
@@ -1,301 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You 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.
-  -->
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-    #set ( $alert = $alertList[0] )
-<head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-    <meta name="viewport" content="width=device-width"/>
-    <title>$alert["alertSubject"]</title>
-    <style>
-        body {
-            width: 100% !important;
-            min-width: 100%;
-            -webkit-text-size-adjust: 100%;
-            -ms-text-size-adjust: 100%;
-            margin: 0;
-            padding: 0;
-        }
-
-        table {
-            border-spacing: 0;
-            border-collapse: collapse;
-        }
-
-        table th,
-        table td {
-            padding: 3px 0 3px 0;
-        }
-
-        .body {
-            width: 100%;
-        }
-
-        p, a, h1, h2, h3, ul, ol, li {
-            font-family: Helvetica, Arial, sans-serif;
-            font-weight: normal;
-            margin: 0;
-            padding: 0;
-        }
-
-        p {
-            font-size: 14px;
-            line-height: 19px;
-        }
-
-        a {
-            color: #3294b1;
-        }
-
-        h1 {
-            font-size: 36px;
-            margin: 15px 0 5px 0;
-        }
-
-        h2 {
-            font-size: 32px;
-        }
-
-        h3 {
-            font-size: 28px;
-        }
-
-        ul, ol {
-            margin: 0 0 0 25px;
-            padding: 0;
-        }
-
-        .btn {
-            background: #2ba6cb !important;
-            border: 1px solid #2284a1;
-            padding: 10px 20px 10px 20px;
-            text-align: center;
-        }
-
-        .btn:hover {
-            background: #2795b6 !important;
-        }
-
-        .btn a {
-            color: #FFFFFF;
-            text-decoration: none;
-            font-weight: bold;
-            padding: 10px 20px 10px 20px;
-        }
-
-        .tableBordered {
-            border-top: 1px solid #b9e5ff;
-        }
-
-        .tableBordered th {
-            background: #ECF8FF;
-        }
-
-        .tableBordered th p {
-            font-weight: bold;
-            color: #3294b1;
-        }
-
-        .tableBordered th,
-        .tableBordered td {
-            color: #333333;
-            border-bottom: 1px solid #b9e5ff;
-            text-align: center;
-            padding-bottom: 5px;
-        }
-
-        .panel {
-            height: 100px;
-        }
-    </style>
-</head>
-<body>
-<table class="body">
-    <tr>
-        <td align="center" valign="top" style="background: #999999; padding: 0 0 0 0;">
-            <!-- Header -->
-            <table width="580">
-                <tr>
-                    <td style="padding: 0 0 0 0;" align="left">
-                        <p style="color:#FFFFFF;font-weight: bold; font-size: 22px">Eagle Alert Notification</p>
-                    </td>
-                </tr>
-            </table>
-        </td>
-    </tr>
-    <tr>
-        <td align="center" valign="top">
-            <!-- Eagle Body -->
-            <table width="580">
-                <tr>
-                    <!-- Title -->
-                    <td align="center">
-                        <h2>Warning: $alert["alertSubject"]</h2>
-                    </td>
-                </tr>
-                <tr>
-                    <!-- Time -->
-                    <td>
-                        <table width="580">
-                            <tr>
-                                <td>
-                                    <p><b>Detected Time: $alert["alertTime"]</b></p>
-                                </td>
-                                #set ( $alertSeverity = $alert["alertSeverity"] )
-                                #if (!$alertSeverity || ("$alertSeverity" == ""))
-                                    #set ( $alert["alertSeverity"] = "WARNING")
-                                #end
-                                <td align="right">
-                                    <p><b>
-                                        Severity:
-                                        #if ($alert["alertSeverity"] == "WARNING")
-                                            <span>$alert["alertSeverity"]</span>
-                                        #else
-                                            <span style="color: #FF0000;">$alert["alertSeverity"]</span>
-                                        #end
-                                    </b></p>
-                                </td>
-                            </tr>
-                        </table>
-                    </td>
-                </tr>
-
-                <tr>
-                    <!-- Basic Information -->
-                    <td style="padding: 20px 0 10px 0;">
-                        <p><b>Alert Message </b></p>
-                    </td>
-                </tr>
-                <tr>
-                    <!-- Description -->
-                    <td valign="top"
-                        style="background: #ECF8FF; border: 1px solid #b9e5ff; padding: 10px 10px 12px 20px;">
-                        <p>$alert["alertBody"]</p>
-                    </td>
-                </tr>
-                <tr>
-                    <!-- Basic Information -->
-                    <td style="padding: 20px 0 10px 0;">
-                        <p><b>Alert Detail</b></p>
-                    </td>
-                </tr>
-                <tr>
-                    <!-- Basic Information Content -->
-                    <td>
-                        <table class="tableBordered" width="580">
-                            <tr>
-                                <th>
-                                    <p>Policy Name</p>
-                                </th>
-                                <td>
-                                    <p><a href="$alert["policyDetailUrl"]">$alert["policyId"]</a></p>
-                                </td>
-                            </tr>
-                            <tr>
-                                <th>
-                                    <p>Severity Level</p>
-                                </th>
-                                <td>
-                                    <p>$alert["alertSeverity"]</p>
-                                </td>
-                            </tr>
-                            <tr>
-                                <th>
-                                    <p>Alert Stream</p>
-                                </th>
-                                <td>
-                                    <p>$alert["streamId"]</p>
-                                </td>
-                            </tr>
-                            <tr>
-                                <th>
-                                    <p>Created Time</p>
-                                </th>
-                                <td>
-                                    <p>$alert["alertTime"]</p>
-                                </td>
-                            </tr>
-                            <tr>
-                                <th>
-                                    <p>Created By</p>
-                                </th>
-                                <td>
-                                    <p>$alert["creator"]</p>
-                                </td>
-                            </tr>
-                        </table>
-                    </td>
-                </tr>
-##                <tr>
-##                    <!-- View Detail -->
-##                    <td align="center" style="padding: 10px 0 0 0;">
-##                        <table width="580">
-##                            <tr>
-##                                <td class="btn">
-##                                    <a href="$alert["policyDetailUrl"]">View Policy Details</a>
-##                                </td>
-##                            </tr>
-##                        </table>
-##                    </td>
-##                </tr>
-
-                <tr>
-                    <!-- View Detail -->
-                    <td align="center" style="padding: 10px 0 0 0;">
-                        <table width="580">
-                            <tr>
-                                <td class="btn">
-                                    <a href="$alert["alertDetailUrl"]">View Alert on Eagle</a>
-                                </td>
-                            </tr>
-                        </table>
-                    </td>
-                </tr>
-                <tr>
-                    <!-- Actions Required -->
-                    <td style="padding: 20px 0 10px 0;">
-                        <p><b>Actions Required</b></p>
-                    </td>
-                </tr>
-                <tr>
-                    <!-- Possible Root Causes Content -->
-                    <td class="panel" valign="top"
-                        style="background: #F4F4F4; border: 1px solid #AAAAAA; padding: 10px 10px 12px 10px;">
-                        <p>
-                            The alert notification was automatically detected and sent by Eagle according to policy: $alert["policyId"].
-                            To follow-up on this, please verify the alert and diagnose the root cause with Eagle:
-                        </p>
-                        <p></p>
-                        <ul>
-                            <li><p><a href="$alert["alertDetailUrl"]">View alert detail</a></p></li>
-                            <li><p><a href="$alert["policyDetailUrl"]">View policy detail</a></p></li>
-                            <li><p><a href="$alert["homeUrl"]">View eagle home</a></p></li>
-                        </ul>
-                    </td>
-                </tr>
-                <tr>
-                    <!-- Copyright -->
-                    <td align="center">
-                        <p><i>Powered by <a href="http://eagle.incubator.apache.org">Apache Eagle</a> (version: $alert["version"])</i></p>
-                    </td>
-                </tr>
-            </table>
-        </td>
-    </tr>
-</table>
-</body>
-</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/eagle/blob/6fd95d5c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/ALERT_INLINED_TEMPLATE.vm
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/ALERT_INLINED_TEMPLATE.vm b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/ALERT_INLINED_TEMPLATE.vm
deleted file mode 100644
index 0e3d5fe..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/ALERT_INLINED_TEMPLATE.vm
+++ /dev/null
@@ -1,259 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You 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.
-  -->
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-#set ( $alert = $alertList[0] )
-
-## Generate Alert Color
-#set($alertColor = "#337ab7")
-#if($alert["alertSeverity"] == "WARNING")
-    #set($alertColor = "#FF9F00")
-#elseif($alert["alertSeverity"] == "CRITICAL" || $alert["alertSeverity"] == "FETAL")
-    #set($alertColor = "#d43f3a")
-#elseif ($alert["alertSeverity"] == "OK")
-    #set($alertColor = "#68B90F")
-#end
-
-<html xmlns="http://www.w3.org/1999/xhtml"
-      style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
-<head>
-    <meta name="viewport" content="width=device-width"/>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-    <title>[$alert["alertSeverity"] $alert["alertSubject"]</title>
-    <style type="text/css">
-        img {
-            max-width: 100%;
-        }
-
-        body {
-            -webkit-font-smoothing: antialiased;
-            -webkit-text-size-adjust: none;
-            width: 100% !important;
-            height: 100%;
-            line-height: 1.6em;
-        }
-
-        body {
-            background-color: #f6f6f6;
-        }
-
-        @media only screen and (max-width: 640px) {
-            body {
-                padding: 0 !important;
-            }
-
-            h1 {
-                font-weight: 800 !important;
-                margin: 20px 0 5px !important;
-            }
-
-            h2 {
-                font-weight: 800 !important;
-                margin: 20px 0 5px !important;
-            }
-
-            h3 {
-                font-weight: 800 !important;
-                margin: 20px 0 5px !important;
-            }
-
-            h4 {
-                font-weight: 800 !important;
-                margin: 20px 0 5px !important;
-            }
-
-            h1 {
-                font-size: 22px !important;
-            }
-
-            h2 {
-                font-size: 18px !important;
-            }
-
-            h3 {
-                font-size: 16px !important;
-            }
-
-            .container {
-                padding: 0 !important;
-                width: 100% !important;
-            }
-
-            .content {
-                padding: 0 !important;
-            }
-
-            .content-wrap {
-                padding: 10px !important;
-            }
-
-            .invoice {
-                width: 100% !important;
-            }
-        }
-    </style>
-</head>
-
-<body itemscope itemtype="http://schema.org/EmailMessage"
-      style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; width: 100% !important; height: 100%; line-height: 1.6em; background-color: #f6f6f6; margin: 0;"
-      bgcolor="#f6f6f6">
-
-<table class="body-wrap"
-       style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; background-color: #f6f6f6; margin: 0;"
-       bgcolor="#f6f6f6">
-    <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
-        <td style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;"
-            valign="top"></td>
-        <td class="container" width="600"
-            style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; display: block !important; max-width: 600px !important; clear: both !important; margin: 0 auto;"
-            valign="top">
-            <div class="content"
-                 style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; max-width: 600px; display: block; margin: 0 auto; padding: 20px;">
-                <table class="main" width="100%" cellpadding="0" cellspacing="0"
-                       style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; border-radius: 3px; background-color: #fff; margin: 0; border: 1px solid #e9e9e9;"
-                       bgcolor="#fff">
-                    <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
-                        <td class="alert alert-warning"
-                            style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 16px; vertical-align: top; color: #fff; font-weight: 500; text-align: center; border-radius: 3px 3px 0 0; background-color: $alertColor; margin: 0; padding: 20px;"
-                            align="center" bgcolor="$alertColor" valign="top">
-                            <strong >$alert["alertSeverity"]: </strong>
-                            $alert["alertSubject"]
-                        </td>
-                    </tr>
-                    <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
-                        <td class="content-wrap"
-                            style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 20px;"
-                            valign="top">
-                            <table width="100%" cellpadding="0" cellspacing="0"
-                                   style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
-                            <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
-                                <td class="content-block"
-                                    style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;"
-                                    valign="top">
-                                    <small>CATEGORY:</small> <strong style="color: $alertColor">#if($alert["alertCategory"]) $alert["alertCategory"] #else N/A #end</strong> <small>TIME:</small> <strong>$alert["alertTime"]</strong>
-                                </td>
-                            </tr>
-                                <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
-                                    <td class="content-block"
-                                        style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0 4px; padding: 10px 10px; background-color: #eee;"
-                                        valign="top">
-                                        <div style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif;  box-sizing: border-box; font-size: 14px; vertical-align: top;">
-                                            $alert["alertBody"]
-                                        </div>
-                                    </td>
-                                </tr>
-
-                                <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
-                                    <td class="content-block aligncenter"
-                                        style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; text-align: center; margin: 0; padding: 0 0 10px;"
-                                        align="center" valign="top">
-                                        <table class="invoice"
-                                               style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; text-align: left; width: 90%; margin: 10px auto;">
-                                            <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
-                                                <td style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 5px 0;"
-                                                    valign="top">
-                                                    <table class="invoice-items" cellpadding="0" cellspacing="0"
-                                                           style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; margin: 0;">
-                                                        <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
-                                                            <td style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 5px 0;"
-                                                                valign="top">
-                                                                Severity
-                                                            </td>
-                                                            <td style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 5px 0;"
-                                                                valign="top"> $alert["alertSeverity"]
-                                                            </td>
-                                                        </tr>
-                                                        <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
-                                                            <td style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; border-top-width: 1px; border-top-color: #eee; border-top-style: solid; margin: 0; padding: 5px 0;"
-                                                                valign="top">Category
-                                                            </td>
-                                                            <td class="alignright"
-                                                                style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; text-align: left; border-top-width: 1px; border-top-color: #eee; border-top-style: solid; margin: 0; padding: 5px 0;"
-                                                                align="right" valign="top">
-                                                                #if($alert["alertCategory"])
-                                                                    $alert["alertCategory"]
-                                                                #else
-                                                                    N/A
-                                                                #end
-                                                            </td>
-                                                        </tr>
-                                                        <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
-                                                            <td style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; border-top-width: 1px; border-top-color: #eee; border-top-style: solid; margin: 0; padding: 5px 0;"
-                                                                valign="top">Cluster
-                                                            </td>
-                                                            <td class="alignright"
-                                                                style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; text-align: left; border-top-width: 1px; border-top-color: #eee; border-top-style: solid; margin: 0; padding: 5px 0;"
-                                                                align="right" valign="top">$alert["siteId"]
-                                                            </td>
-                                                        </tr>
-                                                        <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
-                                                            <td style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; border-top-width: 1px; border-top-color: #eee; border-top-style: solid; margin: 0; padding: 5px 0;"
-                                                                valign="top">Policy
-                                                            </td>
-                                                            <td class="alignright"
-                                                                style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; text-align: left; border-top-width: 1px; border-top-color: #eee; border-top-style: solid; margin: 0; padding: 5px 0;"
-                                                                align="right" valign="top"><a
-                                                                    href="$alert["policyDetailUrl"]"
-                                                                    style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; color: #999; text-decoration: underline; margin: 0;">$alert[
-                                                                "policyId"]</a>
-                                                            </td>
-                                                        </tr>
-                                                    </table>
-                                                </td>
-                                            </tr>
-                                        </table>
-                                    </td>
-                                </tr>
-
-                                <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
-                                    <td class="content-block"
-                                        style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;"
-                                        valign="top">
-                                        <a href="$alert["alertDetailUrl"]" class="btn-primary"
-                                           style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; color: #FFF; text-decoration: none; line-height: 2em; font-weight: bold; text-align: center; cursor: pointer; display: inline-block; border-radius: 5px; text-transform: capitalize; background-color: $alertColor; margin: 0; border-color: $alertColor; border-style: solid; border-width: 10px 20px;">
-                                            View Alert Details
-                                        </a>
-                                    </td>
-                                </tr>
-                            </table>
-                        </td>
-                    </tr>
-                </table>
-                <div class="footer"
-                     style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; clear: both; color: #999; margin: 0; padding: 20px;">
-                    <table width="100%"
-                           style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
-                        <tr style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
-                            <td class="aligncenter content-block"
-                                style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 12px; vertical-align: top; color: #999; text-align: center; margin: 0; padding: 0 0 20px;"
-                                align="center" valign="top">
-                                Powered by <a href="http://eagle.incubator.apache.org"
-                                              style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 12px; color: #999; text-decoration: underline; margin: 0;">Apache
-                                Eagle</a> (version: $alert["version"])
-                            </td>
-                        </tr>
-                    </table>
-                </div>
-            </div>
-        </td>
-        <td style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;"
-            valign="top"></td>
-    </tr>
-</table>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/eagle/blob/6fd95d5c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/ALERT_LIGHT_TEMPLATE.vm
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/ALERT_LIGHT_TEMPLATE.vm b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/ALERT_LIGHT_TEMPLATE.vm
deleted file mode 100644
index f273917..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/ALERT_LIGHT_TEMPLATE.vm
+++ /dev/null
@@ -1,495 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You 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.
-  -->
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-
-    #set ( $alert = $alertList[0] )
-<head>
-    <meta name="viewport" content="width=device-width" />
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-    <title>[$alert["alertSeverity"]$alert["alertSubject"]</title>
-    <style rel="stylesheet" type="text/css">
-        /* -------------------------------------
-            GLOBAL
-            A very basic CSS reset
-        ------------------------------------- */
-        * {
-            margin: 0;
-            font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-            box-sizing: border-box;
-            font-size: 14px;
-        }
-
-        img {
-            max-width: 100%;
-        }
-
-        body {
-            -webkit-font-smoothing: antialiased;
-            -webkit-text-size-adjust: none;
-            width: 100% !important;
-            height: 100%;
-            line-height: 1.6em;
-            /* 1.6em * 14px = 22.4px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
-            /*line-height: 22px;*/
-        }
-
-        /* Let's make sure all tables have defaults */
-        table td {
-            vertical-align: top;
-        }
-
-        /* -------------------------------------
-            BODY & CONTAINER
-        ------------------------------------- */
-        body {
-            background-color: #f6f6f6;
-        }
-
-        .body-wrap {
-            background-color: #f6f6f6;
-            width: 100%;
-        }
-
-        .container {
-            display: block !important;
-            max-width: 600px !important;
-            margin: 0 auto !important;
-            /* makes it centered */
-            clear: both !important;
-        }
-
-        .content {
-            max-width: 600px;
-            margin: 0 auto;
-            display: block;
-            padding: 20px;
-        }
-
-        /* -------------------------------------
-            HEADER, FOOTER, MAIN
-        ------------------------------------- */
-        .main {
-            background-color: #fff;
-            border: 1px solid #e9e9e9;
-            border-radius: 3px;
-        }
-
-        .content-wrap {
-            padding: 20px;
-        }
-
-        .content-block {
-            padding: 0 0 20px;
-        }
-
-        .header {
-            width: 100%;
-            margin-bottom: 20px;
-        }
-
-        .footer {
-            width: 100%;
-            clear: both;
-            color: #999;
-            padding: 20px;
-        }
-        .footer p, .footer a, .footer td {
-            color: #999;
-            font-size: 12px;
-        }
-
-        /* -------------------------------------
-            TYPOGRAPHY
-        ------------------------------------- */
-        h1, h2, h3 {
-            font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
-            color: #000;
-            margin: 40px 0 0;
-            line-height: 1.2em;
-            font-weight: 400;
-        }
-
-        h1 {
-            font-size: 32px;
-            font-weight: 500;
-            /* 1.2em * 32px = 38.4px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
-            /*line-height: 38px;*/
-        }
-
-        h2 {
-            font-size: 24px;
-            /* 1.2em * 24px = 28.8px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
-            /*line-height: 29px;*/
-        }
-
-        h3 {
-            font-size: 18px;
-            /* 1.2em * 18px = 21.6px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
-            /*line-height: 22px;*/
-        }
-
-        h4 {
-            font-size: 14px;
-            font-weight: 600;
-        }
-
-        p, ul, ol {
-            margin-bottom: 10px;
-            font-weight: normal;
-        }
-        p li, ul li, ol li {
-            margin-left: 5px;
-            list-style-position: inside;
-        }
-
-
-        /* -------------------------------------
-            LINKS & BUTTONS
-        ------------------------------------- */
-        a {
-            color: #348eda;
-            text-decoration: underline;
-        }
-
-        .btn-primary {
-            text-decoration: none;
-            color: #FFF;
-            background-color: #348eda;
-            border: solid #348eda;
-            border-width: 10px 20px;
-            line-height: 2em;
-            /* 2em * 14px = 28px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
-            /*line-height: 28px;*/
-            font-weight: bold;
-            text-align: center;
-            cursor: pointer;
-            display: inline-block;
-            border-radius: 5px;
-            text-transform: capitalize;
-        }
-
-        .btn-warning {
-            text-decoration: none;
-            color: #FFF;
-            background-color: #f0ad4e;
-            border-color: solid #eea236;
-            /*background-color: #348eda;*/
-            /*border: solid #348eda;*/
-            border-width: 10px 20px;
-            line-height: 2em;
-            /* 2em * 14px = 28px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
-            /*line-height: 28px;*/
-            font-weight: bold;
-            text-align: center;
-            cursor: pointer;
-            display: inline-block;
-            border-radius: 5px;
-            text-transform: capitalize;
-        }
-
-        .btn-danger {
-            text-decoration: none;
-            color: #fff;
-            background-color: #d9534f;
-            border-color: solid #d43f3a;
-            /*color: #FFF;*/
-            /*background-color: #348eda;*/
-            /*border: solid #348eda;*/
-            border-width: 10px 20px;
-            line-height: 2em;
-            /* 2em * 14px = 28px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
-            /*line-height: 28px;*/
-            font-weight: bold;
-            text-align: center;
-            cursor: pointer;
-            display: inline-block;
-            border-radius: 5px;
-            text-transform: capitalize;
-        }
-
-        .text-light {
-            color: #eee;
-        }
-
-        .text-primary {
-            color: #348eda;
-        }
-
-        .text-warning {
-            color: #eea236
-        }
-
-        .text-danger {
-            color: #d43f3a;
-        }
-
-        .label {
-            display: inline;
-            padding: .2em .6em .3em;
-            font-size: 75%;
-            font-weight: 700;
-            line-height: 1;
-            color: #fff;
-            text-align: center;
-            white-space: nowrap;
-            vertical-align: baseline;
-            border-radius: .25em;
-        }
-
-        .label-ok {
-            background-color: #777;
-        }
-        .label-default {
-            background-color: #777;
-        }
-        .label-primary {
-            background-color: #337ab7;
-        }
-        .label-critical {
-            background-color: #d9534f;
-        }
-        .label-warning {
-            background-color: #f0ad4e;
-        }
-
-        /* -------------------------------------
-            OTHER STYLES THAT MIGHT BE USEFUL
-        ------------------------------------- */
-        .last {
-            margin-bottom: 0;
-        }
-
-        .first {
-            margin-top: 0;
-        }
-
-        .aligncenter {
-            text-align: center;
-        }
-
-        .alignright {
-            text-align: right;
-        }
-
-        .alignleft {
-            text-align: left;
-        }
-
-        .clear {
-            clear: both;
-        }
-
-        /* -------------------------------------
-            ALERTS
-            Change the class depending on warning email, good email or bad email
-        ------------------------------------- */
-        .alert {
-            font-size: 16px;
-            color: #fff;
-            font-weight: 500;
-            padding: 20px;
-            text-align: center;
-            border-radius: 3px 3px 0 0;
-        }
-        .alert a {
-            color: #fff;
-            text-decoration: none;
-            font-weight: 500;
-            font-size: 16px;
-        }
-        .alert.alert-warning {
-            background-color: #FF9F00;
-        }
-        .alert.alert-bad {
-            background-color: #D0021B;
-        }
-        .alert.alert-critical {
-            background-color: #D0021B;
-        }
-        .alert.alert-fetal {
-            background-color: #D0021B;
-        }
-        .alert.alert-ok {
-            background-color: #68B90F;
-        }
-
-        .alert-body {
-            margin-bottom: 10px;
-            padding: 8px;
-            background-color: #fff;
-            border: 1px solid transparent;
-            border-radius: 4px;
-            -webkit-box-shadow: 0 1px 1px rgba(0,0,0,.05);
-            box-shadow: 0 1px 1px rgba(0,0,0,.05);
-        }
-        .alert-body-default {
-            border-color: #eee;
-        }
-        .alert-body-primary {
-            border-color: #337ab7;
-        }
-        .alert-body-warning {
-            border-color: #faebcc;
-        }
-        .alert-body-danger {
-            border-color: #ebccd1;
-        }
-        /* -------------------------------------
-            INVOICE
-            Styles for the billing table
-        ------------------------------------- */
-        .invoice {
-            margin: 40px auto;
-            text-align: left;
-            width: 80%;
-        }
-        .invoice td {
-            padding: 5px 0;
-        }
-        .invoice .invoice-items {
-            width: 100%;
-        }
-        .invoice .invoice-items td {
-            border-bottom: #eee 1px solid;
-        }
-        .invoice .invoice-items .total td {
-            border-top: 2px solid #333;
-            border-bottom: 2px solid #333;
-            font-weight: 700;
-        }
-
-        /* -------------------------------------
-            RESPONSIVE AND MOBILE FRIENDLY STYLES
-        ------------------------------------- */
-        @media only screen and (max-width: 640px) {
-            body {
-                padding: 0 !important;
-            }
-            h1, h2, h3, h4 {
-                font-weight: 800 !important;
-                margin: 20px 0 5px !important;
-            }
-            h1 {
-                font-size: 22px !important;
-            }
-
-            h2 {
-                font-size: 18px !important;
-            }
-            h3 {
-                font-size: 16px !important;
-            }
-            .container {
-                padding: 0 !important;
-                width: 100% !important;
-            }
-            .content {
-                padding: 0 !important;
-            }
-            .content-wrap {
-                padding: 10px !important;
-            }
-            .invoice {
-                width: 100% !important;
-            }
-        }
-        /*# sourceMappingURL=styles.css.map */
-    </style>
-</head>
-
-<body itemscope itemtype="http://schema.org/EmailMessage">
-
-<table class="body-wrap">
-    <tr>
-        <td></td>
-        <td class="container" width="600">
-            <div class="content">
-                <table class="main" width="100%" cellpadding="0" cellspacing="0">
-                    <tr>
-                        <td class="alert alert-$alert["alertSeverity"].toLowerCase()">
-                            <strong>$alert["alertSeverity"]</strong> $alert["alertSubject"]
-                        </td>
-                    </tr>
-                    <tr>
-                        <td class="content-wrap">
-                            <table width="100%" cellpadding="0" cellspacing="0">
-                                <tr>
-                                    <td class="content-block">
-                                        <table>
-                                            <tbody>
-                                                <tr>
-                                                    <td>Category:</td>
-                                                    <td><strong>$alert["alertCategory"]</strong></td>
-                                                    <td>Time:</td>
-                                                    <td><strong>$alert["alertTime"]</strong></td>
-                                                </tr>
-                                            </tbody>
-                                        </table>
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="content-block">
-                                        <div class="alert-body alert-body-default">
-                                        $alert["alertBody"]
-                                        </div>
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="content-block invoice">
-                                        <table class="invoice-items" cellpadding="0" cellspacing="0">
-                                            <tbody>
-                                                <tr>
-                                                    <td>Cluster</td>
-                                                    <td>$alert["siteId"]</td>
-                                                </tr>
-                                                <tr>
-                                                    <td>Policy</td>
-                                                    <td><a href="$alert["policyDetailUrl"]">$alert["policyId"]</a></td>
-                                                </tr>
-                                            </tbody>
-                                        </table>
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="content-block">
-                                        <a href="$alert["alertDetailUrl"]" class="btn-primary">View Alert Details</a>
-                                    </td>
-                                </tr>
-                                <tr>
-                                    <td class="content-block">
-                                        <i>Note: The alert was automatically detected by <a href="#">Eagle</a>.</i>
-                                    </td>
-                                </tr>
-                            </table>
-                        </td>
-                    </tr>
-                </table>
-                <div class="footer">
-                    <table width="100%">
-                        <tr>
-                            <td class="aligncenter content-block">Powered by <a href="http://eagle.apache.org">Apache Eagle</a> (version: $alert["version"])</td>
-                        </tr>
-                    </table>
-                </div>
-            </div>
-        </td>
-        <td></td>
-    </tr>
-</table>
-</body>
-</html>