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 2016/07/07 00:53:31 UTC

[1/6] incubator-eagle git commit: Rebase code base

Repository: incubator-eagle
Updated Branches:
  refs/heads/develop fe5091257 -> 72a1501c3


http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/pom.xml
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/pom.xml b/eagle-core/eagle-alert-parent/eagle-alert/pom.xml
index 906d148..2985600 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/pom.xml
+++ b/eagle-core/eagle-alert-parent/eagle-alert/pom.xml
@@ -10,7 +10,8 @@
 	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ~ See the 
 	License for the specific language governing permissions and ~ limitations 
 	under the License. -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 
 	<parent>
@@ -29,6 +30,7 @@
 		<module>alert-coordinator</module>
 		<module>alert-assembly</module>
 		<module>alert-devtools</module>
+		<module>alert-service</module>
 	</modules>
 
 	<dependencyManagement>
@@ -39,11 +41,6 @@
 				<version>${fasterxml-jackson.version}</version>
 			</dependency>
 			<dependency>
-				<groupId>com.fasterxml.jackson.core</groupId>
-				<artifactId>jackson-databind</artifactId>
-				<version>${fasterxml-jackson.version}</version>
-			</dependency>
-			<dependency>
 				<groupId>javax.mail</groupId>
 				<artifactId>mail</artifactId>
 				<version>${javax.mail.version}</version>
@@ -65,6 +62,11 @@
 			</dependency>
 			<dependency>
 				<groupId>org.apache.curator</groupId>
+				<artifactId>curator-test</artifactId>
+				<version>${curator.test.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.curator</groupId>
 				<artifactId>curator-recipes</artifactId>
 				<version>${curator.version}</version>
 			</dependency>
@@ -140,11 +142,6 @@
 				</exclusions>
 			</dependency>
 			<dependency>
-				<groupId>com.sun.jersey</groupId>
-				<artifactId>jersey-client</artifactId>
-				<version>${jersey.version}</version>
-			</dependency>
-			<dependency>
 				<groupId>org.codehaus.jackson</groupId>
 				<artifactId>jackson-jaxrs</artifactId>
 				<version>${codehaus-jackson.version}</version>
@@ -227,6 +224,12 @@
 				<artifactId>zkclient</artifactId>
 				<version>${zkclient.version}</version>
 			</dependency>
+	
+			<dependency>
+				<groupId>com.sun.jersey</groupId>
+				<artifactId>jersey-client</artifactId>
+				<version>${jersey.version}</version>
+			</dependency>
 			<dependency>
 				<groupId>com.sun.jersey</groupId>
 				<artifactId>jersey-server</artifactId>
@@ -234,6 +237,11 @@
 			</dependency>
 			<dependency>
 				<groupId>com.sun.jersey</groupId>
+				<artifactId>jersey-json</artifactId>
+				<version>${jersey.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>com.sun.jersey</groupId>
 				<artifactId>jersey-servlet</artifactId>
 				<version>${jersey.version}</version>
 			</dependency>
@@ -242,6 +250,7 @@
 				<artifactId>jersey-multipart</artifactId>
 				<version>${jersey.version}</version>
 			</dependency>
+
 			<dependency>
 				<groupId>org.apache.tomcat.embed</groupId>
 				<artifactId>tomcat-embed-core</artifactId>
@@ -277,13 +286,92 @@
 				<artifactId>metrics-elasticsearch-reporter</artifactId>
 				<version>${metrics-elasticsearch-reporter.version}</version>
 			</dependency>
+			<dependency>
+				<groupId>commons-cli</groupId>
+				<artifactId>commons-cli</artifactId>
+				<version>${common.cli.version}</version>
+			</dependency>
+
+			<!-- dropwizard -->
+		    <dependency>
+		        <groupId>io.dropwizard</groupId>
+		        <artifactId>dropwizard-core</artifactId>
+		        <version>${dropwizard.version}</version>
+		        <exclusions>
+			        <exclusion>
+						<groupId>org.slf4j</groupId>
+						<artifactId>slf4j-log4j12</artifactId>
+					</exclusion>
+		        </exclusions>
+		    </dependency>
+		    <dependency>
+		        <groupId>io.dropwizard</groupId>
+		        <artifactId>dropwizard-jersey</artifactId>
+		        <version>${dropwizard.version}</version>
+		        <exclusions>
+			        <exclusion>
+						<groupId>org.slf4j</groupId>
+						<artifactId>slf4j-log4j12</artifactId>
+					</exclusion>
+		        </exclusions>
+		    </dependency>
+		    <dependency>
+				<groupId>io.swagger</groupId>
+				<artifactId>swagger-jersey-jaxrs</artifactId>
+				<version>${swagger.version}</version>
+				<scope>compile</scope>
+				<exclusions>
+					<exclusion>
+						<groupId>com.sun.jersey</groupId>
+						<artifactId>*</artifactId>
+					</exclusion>
+				</exclusions>
+			</dependency>
 		</dependencies>
 	</dependencyManagement>
 
 	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.rat</groupId>
+				<artifactId>apache-rat-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>header-check</id>
+						<phase>verify</phase>
+						<goals>
+							<goal>check</goal>
+						</goals>
+						<configuration>
+							<useDefaultExcludes>true</useDefaultExcludes>
+							<excludes>
+								<exclude>**/*.out</exclude>
+								<exclude>**/*.log</exclude>
+								<exclude>**/*.json</exclude>
+								<exclude>**/*.classpath</exclude>
+								<exclude>**/*.project</exclude>
+								<exclude>**/*.prefs</exclude>
+								<exclude>**/*.iml</exclude>
+								<exclude>**/MANIFEST.MF</exclude>
+								<exclude>**/dependency-reduced-pom.xml</exclude>
+                                                                <exclude>**/target/**</exclude>`
+							</excludes>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
 		<pluginManagement>
 			<plugins>
 				<plugin>
+					<groupId>org.apache.rat</groupId>
+					<artifactId>apache-rat-plugin</artifactId>
+					<version>${maven-apache-rat.version}</version>
+					<configuration>
+						<useDefaultExcludes>true</useDefaultExcludes>
+					</configuration>
+				</plugin>
+				<plugin>
 					<artifactId>maven-compiler-plugin</artifactId>
 					<version>${maven-compiler.version}</version>
 					<configuration>

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-data-process/eagle-stream-process-api/src/main/java/org/apache/eagle/dataproc/impl/storm/kafka/KafkaSourcedSpoutProvider.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-data-process/eagle-stream-process-api/src/main/java/org/apache/eagle/dataproc/impl/storm/kafka/KafkaSourcedSpoutProvider.java b/eagle-core/eagle-data-process/eagle-stream-process-api/src/main/java/org/apache/eagle/dataproc/impl/storm/kafka/KafkaSourcedSpoutProvider.java
index 0107a9b..c6a4983 100644
--- a/eagle-core/eagle-data-process/eagle-stream-process-api/src/main/java/org/apache/eagle/dataproc/impl/storm/kafka/KafkaSourcedSpoutProvider.java
+++ b/eagle-core/eagle-data-process/eagle-stream-process-api/src/main/java/org/apache/eagle/dataproc/impl/storm/kafka/KafkaSourcedSpoutProvider.java
@@ -95,7 +95,7 @@ public class KafkaSourcedSpoutProvider implements StormSpoutProvider {
 		}		
 		// "forceFromStart" is for test usage, prod should not use this 
 		if (context.hasPath("forceFromStart")) {
-			spoutConfig.forceFromStart = context.getBoolean("forceFromStart");
+			spoutConfig.startOffsetTime = kafka.api.OffsetRequest.EarliestTime();
 		}
 		
 		spoutConfig.scheme = getStreamScheme(deserClsName, context);

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-security/eagle-security-common/src/main/java/org/apache/eagle/security/topo/NewKafkaSourcedSpoutProvider.java
----------------------------------------------------------------------
diff --git a/eagle-security/eagle-security-common/src/main/java/org/apache/eagle/security/topo/NewKafkaSourcedSpoutProvider.java b/eagle-security/eagle-security-common/src/main/java/org/apache/eagle/security/topo/NewKafkaSourcedSpoutProvider.java
index 47d3b21..e60e59e 100644
--- a/eagle-security/eagle-security-common/src/main/java/org/apache/eagle/security/topo/NewKafkaSourcedSpoutProvider.java
+++ b/eagle-security/eagle-security-common/src/main/java/org/apache/eagle/security/topo/NewKafkaSourcedSpoutProvider.java
@@ -96,7 +96,7 @@ public class NewKafkaSourcedSpoutProvider implements StormSpoutProvider {
         }
         // "forceFromStart" is for test usage, prod should not use this
         if (context.hasPath("forceFromStart")) {
-            spoutConfig.forceFromStart = context.getBoolean("forceFromStart");
+            spoutConfig.startOffsetTime = kafka.api.OffsetRequest.EarliestTime();
         }
 
         if (context.hasPath("schemeCls")) {

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-security/eagle-security-hdfs-auditlog/src/main/java/org/apache/eagle/security/auditlog/kafka/UserPartitioner.java
----------------------------------------------------------------------
diff --git a/eagle-security/eagle-security-hdfs-auditlog/src/main/java/org/apache/eagle/security/auditlog/kafka/UserPartitioner.java b/eagle-security/eagle-security-hdfs-auditlog/src/main/java/org/apache/eagle/security/auditlog/kafka/UserPartitioner.java
index 447c7ef..9948670 100644
--- a/eagle-security/eagle-security-hdfs-auditlog/src/main/java/org/apache/eagle/security/auditlog/kafka/UserPartitioner.java
+++ b/eagle-security/eagle-security-hdfs-auditlog/src/main/java/org/apache/eagle/security/auditlog/kafka/UserPartitioner.java
@@ -17,7 +17,6 @@
 package org.apache.eagle.security.auditlog.kafka;
 
 import kafka.utils.VerifiableProperties;
-import kafka.utils.Utils;
 
 public class UserPartitioner implements kafka.producer.Partitioner{
 	private VerifiableProperties prop;
@@ -28,6 +27,6 @@ public class UserPartitioner implements kafka.producer.Partitioner{
 	@Override
 	public int partition(Object arg0, int arg1) {
 		String user = (String)arg0;
-		return  Utils.abs(user.hashCode()) % arg1;
+		return  Math.abs(user.hashCode()) % arg1;
 	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index adb6227..e240c8a 100755
--- a/pom.xml
+++ b/pom.xml
@@ -197,8 +197,8 @@
 
         <!-- Serialization -->
         <gson.version>2.2.2</gson.version>
-        <guava.version>14.0.1</guava.version>
-        <fasterxml-jackson.version>2.4.5</fasterxml-jackson.version>
+        <guava.version>19.0</guava.version>
+        <fasterxml-jackson.version>2.5.4</fasterxml-jackson.version>
         <codehaus-jackson.version>1.9.13</codehaus-jackson.version>
         <jsoup.version>1.7.3</jsoup.version>
         <io.netty.version>3.6.7.Final</io.netty.version>
@@ -223,11 +223,11 @@
         <asm.version>5.0</asm.version>
 
         <!-- Streaming -->
-        <kafka.version>0.8.2.2</kafka.version>
+        <kafka.version>0.10.0.0</kafka.version>
         <kafka-clients.version>0.8.2.0</kafka-clients.version>
-        <kafka.artifact.id>kafka_2.10</kafka.artifact.id>
+        <kafka.artifact.id>kafka_2.11</kafka.artifact.id>
         <jgrapht.version>0.9.0</jgrapht.version>
-        <storm-kafka.version>0.9.3.2.2.0.0-2041</storm-kafka.version>
+        <storm-kafka.version>0.10.0</storm-kafka.version>
         <storm.version>0.9.3</storm.version>
 
         <mapr-kafka.version>0.8.1.1</mapr-kafka.version>
@@ -236,6 +236,7 @@
         <mapr-storm.version>0.9.3-mapr-1509</mapr-storm.version>
 
         <curator.version>2.8.0</curator.version>
+        <curator.test.version>2.5.0</curator.test.version>
         <zkclient.version>0.3</zkclient.version>
 
         <!-- Query -->
@@ -292,8 +293,17 @@
         <mockito.version>1.10.19</mockito.version>
         <joda.version>2.2</joda.version>
         <metrics-elasticsearch-reporter.version>2.2.0</metrics-elasticsearch-reporter.version>
+
+        <common.cli.version>1.3.1</common.cli.version>
+
+        <!-- dropwizard -->
+        <dropwizard.version>0.7.1</dropwizard.version>
+
     </properties>
 
+
+
+
     <dependencyManagement>
         <dependencies>
             <!-- Commons Dependencies-->
@@ -1147,6 +1157,18 @@
                 <updatePolicy>never</updatePolicy>
             </releases>
         </repository>
+        <repository>
+            <id>HDP Release Repository</id>
+            <url>http://repo.hortonworks.com/content/repositories/releases/</url>
+        </repository>
+        <repository>
+            <id>HDP Central Repository</id>
+            <url>http://repo.hortonworks.com/content/repositories/central/</url>
+        </repository>
+        <repository>
+            <id>WSO2 Public</id>
+            <url>http://maven.wso2.org/nexus/content/groups/wso2-public</url>
+        </repository>
     </repositories>
     <pluginRepositories>
         <pluginRepository>


[3/6] incubator-eagle git commit: Rebase code base

Posted by ha...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/siddhi/SiddhiPolicyTest.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/siddhi/SiddhiPolicyTest.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/siddhi/SiddhiPolicyTest.java
new file mode 100644
index 0000000..f4e82bc
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/siddhi/SiddhiPolicyTest.java
@@ -0,0 +1,247 @@
+/*
+ * 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.siddhi;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.wso2.siddhi.core.ExecutionPlanRuntime;
+import org.wso2.siddhi.core.SiddhiManager;
+import org.wso2.siddhi.core.event.Event;
+import org.wso2.siddhi.core.stream.input.InputHandler;
+import org.wso2.siddhi.core.stream.output.StreamCallback;
+
+/**
+ * @since Jun 21, 2016
+ *
+ */
+public class SiddhiPolicyTest {
+    
+    private static final Logger LOG = LoggerFactory.getLogger(SiddhiPolicyTest.class);
+
+    private String streams = " define stream syslog_stream("
+            + "dims_facility string, "
+            + "dims_severity string, "
+            + "dims_hostname string, "
+            + "dims_msgid string, "
+            + "timestamp string, "
+            + "conn string, "
+            + "op string, "
+            + "msgId string, "
+            + "command string, "
+            + "name string, "
+            + "namespace string, "
+            + "epochMillis long); ";
+    private SiddhiManager sm;
+    
+    @Before
+    public void setup() {
+        sm = new SiddhiManager();
+    }
+    
+    @After
+    public void shutdown() {
+        sm.shutdown();
+    }
+
+    @Test
+    public void testPolicy_grpby() {
+        String ql = " from syslog_stream#window.time(1min) select name, namespace, timestamp, dims_hostname, count(*) as abortCount group by dims_hostname insert into syslog_severity_check_output; ";
+        StreamCallback sc = new StreamCallback() {
+            @Override
+            public void receive(Event[] arg0) {
+
+            };
+        };
+
+        String executionPlan = streams + ql;
+        ExecutionPlanRuntime runtime = sm.createExecutionPlanRuntime(executionPlan);
+        runtime.addCallback("syslog_severity_check_output", sc);
+        runtime.start();
+    }
+
+    @Ignore
+    @Test
+    public void testPolicy_agg() throws Exception {
+        String sql = " from syslog_stream#window.time(1min) select "
+                + "name, "
+                + "namespace, "
+                + "timestamp, "
+                + "dims_hostname, "
+                + "count(*) as abortCount "
+                + "group by dims_hostname "
+                + "having abortCount > 3 insert into syslog_severity_check_output; ";
+
+        final AtomicBoolean checked = new AtomicBoolean(false);
+        StreamCallback sc = new StreamCallback() {
+            @Override
+            public void receive(Event[] arg0) {
+                checked.set(true);
+                LOG.info("event array size: " + arg0.length);
+                Set<String> hosts = new HashSet<String>();
+                for (Event e : arg0) {
+                    hosts.add((String) e.getData()[3]);
+                }
+
+                LOG.info(" grouped hosts : " + hosts);
+                Assert.assertTrue(hosts.contains("HOSTNAME-" + 0));
+                Assert.assertTrue(hosts.contains("HOSTNAME-" + 1));
+                Assert.assertTrue(hosts.contains("HOSTNAME-" + 2));
+                Assert.assertFalse(hosts.contains("HOSTNAME-" + 3));
+            };
+        };
+
+        String executionPlan = streams + sql;
+        ExecutionPlanRuntime runtime = sm.createExecutionPlanRuntime(executionPlan);
+        runtime.addCallback("syslog_severity_check_output", sc);
+        runtime.start();
+        InputHandler handler = runtime.getInputHandler("syslog_stream");
+
+        sendInput(handler);
+
+        Thread.sleep(1000);
+
+        Assert.assertTrue(checked.get());
+
+        runtime.shutdown();
+    }
+    
+    /*
+        + "dims_facility string, "
+        + "dims_severity string, "
+        + "dims_hostname string, "
+        + "dims_msgid string, "
+        + "timestamp string, "
+        + "conn string, "
+        + "op string, "
+        + "msgId string, "
+        + "command string, "
+        + "name string, "
+        + "namespace string, "
+        + "epochMillis long)
+     */
+    private void sendInput(InputHandler handler) throws Exception {
+        int length = 15;
+        Event[] events = new Event[length];
+        for (int i = 0; i < length; i++) {
+            Event e = new Event(12);
+            e.setTimestamp(System.currentTimeMillis());
+            e.setData(new Object[] {"facitliy", "SEVERITY_EMERG", "HOSTNAME-" + i%4 , "MSGID-...", "Timestamp", "conn-sss", "op-msg-Abort", "msgId..", "command-...", "name-", "namespace", System.currentTimeMillis()});
+            
+            events[i] = e;
+        }
+
+        handler.send(events);
+
+        Thread.sleep(61 * 1000);
+
+        Event e = new Event(12);
+        e.setTimestamp(System.currentTimeMillis());
+        e.setData(new Object[] {"facitliy", "SEVERITY_EMERG", "HOSTNAME-" + 11 , "MSGID-...", "Timestamp", "conn-sss", "op-msg", "msgId..", "command-...", "name-", "namespace", System.currentTimeMillis()});
+        handler.send(e);
+    }
+
+    @Ignore
+    @Test
+    public void testPolicy_regex() throws Exception {
+        String sql = " from syslog_stream[regex:find(\"Abort\", op)]#window.time(1min) select timestamp, dims_hostname, count(*) as abortCount group by dims_hostname insert into syslog_severity_check_output; ";
+        
+        AtomicBoolean checked = new AtomicBoolean();
+        StreamCallback sc = new StreamCallback() {
+            @Override
+            public void receive(Event[] arg0) {
+                checked.set(true);
+            };
+        };
+
+        String executionPlan = streams + sql;
+        ExecutionPlanRuntime runtime = sm.createExecutionPlanRuntime(executionPlan);
+        runtime.addCallback("syslog_severity_check_output", sc); 
+        runtime.start();
+        
+        InputHandler handler = runtime.getInputHandler("syslog_stream");
+        
+        sendInput(handler);
+        
+        Thread.sleep(1000);
+        
+        Assert.assertTrue(checked.get());
+        
+        runtime.shutdown();
+    }
+
+    @Ignore
+    @Test
+    public void testPolicy_seq() throws Exception {
+        String sql = ""
+                + " from every e1=syslog_stream[regex:find(\"UPDOWN\", op)] -> "
+                + " e2=syslog_stream[dims_hostname == e1.dims_hostname and regex:find(\"Abort\", op)] within 1 min "
+                + " select e1.timestamp as timestamp, e1.op as a_op, e2.op as b_op "
+                + " insert into syslog_severity_check_output; ";
+
+        AtomicBoolean checked = new AtomicBoolean();
+        StreamCallback sc = new StreamCallback() {
+            @Override
+            public void receive(Event[] arg0) {
+                checked.set(true);
+            };
+        };
+
+        String executionPlan = streams + sql;
+        ExecutionPlanRuntime runtime = sm.createExecutionPlanRuntime(executionPlan);
+        runtime.addCallback("syslog_severity_check_output", sc);
+        runtime.start();
+        InputHandler handler = runtime.getInputHandler("syslog_stream");
+
+        sendPatternInput(handler);
+
+        Thread.sleep(1000);
+        Assert.assertTrue(checked.get());
+
+        runtime.shutdown();
+    }
+
+    private void sendPatternInput(InputHandler handler) throws Exception {
+        // validate one
+        Event e = new Event(12);
+        e.setTimestamp(System.currentTimeMillis());
+        e.setData(new Object[] {"facitliy", "SEVERITY_EMERG", "HOSTNAME-" + 0 , "MSGID-...", "Timestamp", "conn-sss", "op-msg-UPDOWN", "msgId..", "command-...", "name-", "namespace", System.currentTimeMillis()});
+            
+        e = new Event(12);
+        e.setTimestamp(System.currentTimeMillis());
+        e.setData(new Object[] {"facitliy", "SEVERITY_EMERG", "HOSTNAME-" + 0 , "MSGID-...", "Timestamp", "conn-sss", "op-msg-nothing", "msgId..", "command-...", "name-", "namespace", System.currentTimeMillis()});
+        
+        e = new Event(12);
+        e.setTimestamp(System.currentTimeMillis());
+        e.setData(new Object[] {"facitliy", "SEVERITY_EMERG", "HOSTNAME-" + 0 , "MSGID-...", "Timestamp", "conn-sss", "op-msg-Abort", "msgId..", "command-...", "name-", "namespace", System.currentTimeMillis()});
+
+        Thread.sleep(61 * 1000);
+
+        e = new Event(12);
+        e.setTimestamp(System.currentTimeMillis());
+        e.setData(new Object[] {"facitliy", "SEVERITY_EMERG", "HOSTNAME-" + 11 , "MSGID-...", "Timestamp", "conn-sss", "op-msg", "msgId..", "command-...", "name-", "namespace", System.currentTimeMillis()});
+        handler.send(e);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/topology/AlertTopologyTest.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/topology/AlertTopologyTest.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/topology/AlertTopologyTest.java
index 62427e0..30a0ef9 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/topology/AlertTopologyTest.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/topology/AlertTopologyTest.java
@@ -99,8 +99,8 @@ public class AlertTopologyTest implements Serializable{
         String topic = "testTopic3";
         int max = 1000;
         Properties configMap = new Properties();
-        configMap.put("bootstrap.servers", "sandbox.hortonworks.com:6667");
-        configMap.put("metadata.broker.list", "sandbox.hortonworks.com:6667");
+        configMap.put("bootstrap.servers", "localhost:6667");
+        configMap.put("metadata.broker.list", "localhost:6667");
         configMap.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
         configMap.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
         configMap.put("request.required.acks", "1");

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/topology/CorrelationSpoutTest.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/topology/CorrelationSpoutTest.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/topology/CorrelationSpoutTest.java
index 6960537..5c5a37f 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/topology/CorrelationSpoutTest.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/topology/CorrelationSpoutTest.java
@@ -181,4 +181,50 @@ public class CorrelationSpoutTest {
         }
         Assert.assertTrue(verified.get());
     }
+
+//    @Ignore
+//    @SuppressWarnings("rawtypes")
+//    @Test
+//    public void testSpout() {
+//        String topoId = "testMetadataInjection";
+//        final AtomicBoolean verified = new AtomicBoolean(false);
+//        Config config = ConfigFactory.load();
+//        CorrelationSpout spout = new CorrelationSpout(config, topoId, null, 1);
+//
+//        TopologyBuilder builder = new TopologyBuilder();
+//        // only one spout
+//        builder.setSpout("cc-spout", spout);
+//        builder.setBolt("recv-bolt", new RecvBolt()).globalGrouping("cc-spout");
+//
+//        StormTopology topology = builder.createTopology();
+//        LocalCluster cluster = new LocalCluster();
+//        cluster.submitTopology(topoId, new HashMap(), topology);
+//
+//        while (true) {
+//            try {
+//                Thread.sleep(1000);
+//            } catch (Exception e) {
+//                e.printStackTrace();
+//            }
+//        }
+//    }
+//    
+//    @SuppressWarnings("serial")
+//    private static class RecvBolt extends BaseRichBolt {
+//
+//        @Override
+//        public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
+//        }
+//
+//        @Override
+//        public void execute(Tuple input) {
+//            
+//        }
+//
+//        @Override
+//        public void declareOutputFields(OutputFieldsDeclarer declarer) {
+//        }
+//        
+//    }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/topology/TestBolt.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/topology/TestBolt.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/topology/TestBolt.java
index 846c118..2dc37df 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/topology/TestBolt.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/topology/TestBolt.java
@@ -20,31 +20,26 @@
 package org.apache.eagle.alert.engine.topology;
 
 
-import java.util.Map;
-
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import backtype.storm.task.OutputCollector;
 import backtype.storm.task.TopologyContext;
 import backtype.storm.topology.OutputFieldsDeclarer;
 import backtype.storm.topology.base.BaseRichBolt;
 import backtype.storm.tuple.Tuple;
+import org.junit.Ignore;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
 
 /**
  * Created by yonzhang on 4/7/16.
  */
+@Ignore
 @SuppressWarnings({"rawtypes", "serial"})
 public class TestBolt extends BaseRichBolt {
     private static final Logger LOG = LoggerFactory.getLogger(TestBolt.class);
     private OutputCollector collector;
     private long count;
-
-    @Test
-    public void test(){
-
-    }
     @Override
     public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
         this.collector = collector;

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/utils/CompressionUtilsTest.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/utils/CompressionUtilsTest.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/utils/CompressionUtilsTest.java
index 0861597..8317943 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/utils/CompressionUtilsTest.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/utils/CompressionUtilsTest.java
@@ -16,13 +16,13 @@
  */
 package org.apache.eagle.alert.engine.utils;
 
+import java.io.IOException;
+
 import org.junit.Assert;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-
 public class CompressionUtilsTest {
     private final static Logger LOG = LoggerFactory.getLogger(CompressionUtilsTest.class);
 

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/application-integration.conf
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/application-integration.conf b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/application-integration.conf
deleted file mode 100644
index 4192715..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/application-integration.conf
+++ /dev/null
@@ -1,57 +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.
-{
-  "topology" : {
-    "name" : "alertUnitTopology_1",
-    "numOfTotalWorkers": 20,
-    "numOfSpoutTasks" : 1,
-    "numOfRouterBolts" : 4,
-    "numOfAlertBolts" : 10,
-    "numOfPublishTasks" : 1,
-    "localMode" : "true"
-  },
-  "spout" : {
-    "kafkaBrokerZkQuorum": "localhost:2181",
-    "kafkaBrokerZkBasePath": "/brokers",
-    "stormKafkaUseSameZkQuorumWithKafkaBroker": true,
-    "stormKafkaTransactionZkQuorum": "",
-    "stormKafkaTransactionZkPath": "/consumers",
-    "stormKafkaEagleConsumer": "eagle_consumer",
-    "stormKafkaStateUpdateIntervalMs": 2000,
-    "stormKafkaFetchSizeBytes": 1048586,
-  },
-  "zkConfig" : {
-    "zkQuorum" : "localhost:2181",
-    "zkRoot" : "/alert",
-    "zkSessionTimeoutMs" : 10000,
-    "connectionTimeoutMs" : 10000,
-    "zkRetryTimes" : 3,
-    "zkRetryInterval" : 3000
-  },
-  "dynamicConfigSource" : {
-    "initDelayMillis": 3000,
-    "delayMillis" : 10000
-  },
-  "metadataService": {
-	"context" : "/rest",
-	"host" : "localhost",
-	"port" : 8080
-  },
-  "coordinatorService": {
-  	"host": "localhost",
-  	"port": "9090",
-  	"context" : "/api"
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/application-test-backup.conf
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/application-test-backup.conf b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/application-test-backup.conf
index 2c99a68..4cfcc75 100755
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/application-test-backup.conf
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/application-test-backup.conf
@@ -24,7 +24,7 @@
     "localMode" : true
   },
   "spout" : {
-    "kafkaBrokerZkQuorum": "10.64.243.71:2181",
+    "kafkaBrokerZkQuorum": "localhost:2181",
     "kafkaBrokerZkBasePath": "/brokers",
     "stormKafkaUseSameZkQuorumWithKafkaBroker": true,
     "stormKafkaTransactionZkQuorum": "",
@@ -34,7 +34,7 @@
     "stormKafkaFetchSizeBytes": 1048586,
   },
   "zkConfig" : {
-    "zkQuorum" : "10.64.243.71:2181",
+    "zkQuorum" : "localhost:2181",
     "zkRoot" : "/alert",
     "zkSessionTimeoutMs" : 10000,
     "connectionTimeoutMs" : 10000,
@@ -63,7 +63,7 @@
         "level":"DEBUG"
       }
       "elasticsearch": {
-        "hosts": ["10.64.223.222:9200"]
+        "hosts": ["localhost:9200"]
         "index": "alert_metric_test"
       }
     }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/application-test.conf
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/application-test.conf b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/application-test.conf
index f4a797e..4cd932f 100755
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/application-test.conf
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/application-test.conf
@@ -60,7 +60,7 @@
         "level":"INFO"
       }
       "elasticsearch": {
-        "hosts": ["10.64.223.222:9200"]
+        "hosts": ["localhost:9200"]
         "index": "alert_metric_test"
       }
     }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/correlation/application-integration-2.conf
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/correlation/application-integration-2.conf b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/correlation/application-integration-2.conf
index bb998cd..80522fb 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/correlation/application-integration-2.conf
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/correlation/application-integration-2.conf
@@ -45,13 +45,16 @@
     "delayMillis" : 10000
   },
   "metadataService": {
-	"context" : "/api",
+	"context" : "/rest",
 	"host" : "localhost",
 	"port" : 8080
   },
   "coordinatorService": {
   	"host": "localhost",
-  	"port": "9090",
-  	"context" : "/api"
+  	"port": "8080",
+  	"context" : "/rest"
+  },
+  "kafkaProducer": {
+  	"bootstrapServers": "localhost:9092"
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/correlation/publishments.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/correlation/publishments.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/correlation/publishments.json
index 7b531fc..6e1c136 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/correlation/publishments.json
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/correlation/publishments.json
@@ -6,12 +6,13 @@
 		"log_stream_join_output"
 	],
 	"properties": {
-		"subject":"UMP Test Alert",
+		"subject":"Eagle Test Alert",
         "template":"",
 	  "sender": "sender@corp.com",
 	  "recipients": "receiver@corp.com",
 	  "smtp.server":"mailhost.com"
 	},
-	"dedupIntervalMin" : "1"
+	"dedupIntervalMin" : "PT1M",
+	"serializer" : "org.apache.eagle.alert.engine.publisher.impl.StringEventSerializer"
 }
 ]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/correlation_spouttest.conf
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/correlation_spouttest.conf b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/correlation_spouttest.conf
new file mode 100644
index 0000000..2b6f767
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/correlation_spouttest.conf
@@ -0,0 +1,53 @@
+# 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.
+{
+  "topology" : {
+    "name" : "alertUnitTopology_1_test",
+    "numOfSpoutTasks" : 3,
+    "numOfRouterBolts" : 6,
+    "numOfAlertBolts" : 6,
+    "numOfPublishTasks" : 1,
+    "numOfTotalWorkers":1,
+    "messageTimeoutSecs": 30,     // topology.message.timeout.secs: 30 by default
+    "localMode" : true
+  },
+  "spout" : {
+    "kafkaBrokerZkQuorum": "localhost:2181",
+    "kafkaBrokerZkBasePath": "/brokers",
+    "stormKafkaUseSameZkQuorumWithKafkaBroker": true,
+    "stormKafkaTransactionZkQuorum": "",
+    "stormKafkaTransactionZkPath": "/consumers",
+    "stormKafkaEagleConsumer": "eagle_consumer",
+    "stormKafkaStateUpdateIntervalMs": 2000,
+    "stormKafkaFetchSizeBytes": 1048586,
+  },
+  "zkConfig" : {
+    "zkQuorum" : "localhost:2181",
+    "zkRoot" : "/alert",
+    "zkSessionTimeoutMs" : 10000,
+    "connectionTimeoutMs" : 10000,
+    "zkRetryTimes" : 3,
+    "zkRetryInterval" : 3000
+  },
+  "dynamicConfigSource" : {
+    "initDelayMillis": 3000,
+    "delayMillis" : 10000
+  },
+  "metadataService": {
+    "context" : "/rest",
+    "host" : "localhost",
+    "port" : 8080
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/datasources.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/datasources.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/datasources.json
deleted file mode 100644
index 77a280c..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/datasources.json
+++ /dev/null
@@ -1,19 +0,0 @@
-[
-{
-	"name": "perfmon_datasource",
-	"type": "KAFKA",
-	"properties": {
-	},
-	"topic": "perfmon_metrics",
-	"schemeCls": "org.apache.eagle.alert.engine.scheme.JsonScheme",
-	"codec": {
-		"streamNameSelectorProp": {
-			"fieldNamesToInferStreamName" : "metric",
-			"streamNameFormat":"%s"
-		},
-		"streamNameSelectorCls":"org.apache.eagle.alert.engine.scheme.JsonStringStreamNameSelector",
-		"timestampColumn": "timestamp",
-		"timestampFormat":""
-	}
-}
-]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/log4j.properties b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/log4j.properties
index 3ba587d..8025654 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/log4j.properties
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/log4j.properties
@@ -20,4 +20,4 @@ log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %p [%t] %c{2}[%L]: %m%n
 
-#log4j.logger.org.apache.eagle.alert.metric=DEBUG
\ No newline at end of file
+log4j.logger.org.apache.eagle.alert.engine.evaluator.nodata=DEBUG
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/application-nodata.conf
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/application-nodata.conf b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/application-nodata.conf
new file mode 100644
index 0000000..7094820
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/application-nodata.conf
@@ -0,0 +1,60 @@
+# 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.
+{
+  "topology" : {
+    "name" : "alertUnitTopology_1",
+    "numOfTotalWorkers": 20,
+    "numOfSpoutTasks" : 1,
+    "numOfRouterBolts" : 4,
+    "numOfAlertBolts" : 10,
+    "numOfPublishTasks" : 1,
+    "localMode" : "true"
+  },
+  "spout" : {
+    "kafkaBrokerZkQuorum": "sandbox.hortonworks.com:2181",
+    "kafkaBrokerZkBasePath": "/brokers",
+    "stormKafkaUseSameZkQuorumWithKafkaBroker": true,
+    "stormKafkaTransactionZkQuorum": "",
+    "stormKafkaTransactionZkPath": "/consumers",
+    "stormKafkaEagleConsumer": "eagle_consumer",
+    "stormKafkaStateUpdateIntervalMs": 2000,
+    "stormKafkaFetchSizeBytes": 1048586,
+  },
+  "zkConfig" : {
+    "zkQuorum" : "sandbox.hortonworks.com:2181",
+    "zkRoot" : "/alert",
+    "zkSessionTimeoutMs" : 10000,
+    "connectionTimeoutMs" : 10000,
+    "zkRetryTimes" : 3,
+    "zkRetryInterval" : 3000
+  },
+  "dynamicConfigSource" : {
+    "initDelayMillis": 3000,
+    "delayMillis" : 10000
+  },
+  "metadataService": {
+	"context" : "/rest",
+	"host" : "localhost",
+	"port" : 8080
+  },
+  "coordinatorService": {
+  	"host": "localhost",
+  	"port": "8080",
+  	"context" : "/rest"
+  },
+  "kafkaProducer": {
+  	"bootstrapServers": "sandbox.hortonworks.com:6667"
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/datasources.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/datasources.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/datasources.json
new file mode 100644
index 0000000..988318e
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/datasources.json
@@ -0,0 +1,17 @@
+[
+	{
+		"name": "noDataAlertDataSource",
+		"type": "KAFKA",
+		"properties": {},
+		"topic": "noDataAlertTopic",
+		"schemeCls": "org.apache.eagle.alert.engine.scheme.JsonScheme",
+		"codec": {
+			"streamNameSelectorProp": {
+				"userProvidedStreamName": "noDataAlertStream"
+			},
+			"streamNameSelectorCls": "org.apache.eagle.alert.engine.scheme.JsonStringStreamNameSelector",
+			"timestampColumn": "timestamp",
+			"timestampFormat": ""
+		}
+	}
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/policies-provided-wisb.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/policies-provided-wisb.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/policies-provided-wisb.json
new file mode 100644
index 0000000..012fd9f
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/policies-provided-wisb.json
@@ -0,0 +1,23 @@
+[
+	{
+		"name": "noDataAlertPolicy",
+		"description": "noDataAlertPolicy",
+		"inputStreams": [
+			"noDataAlertStream"
+		],
+		"outputStreams": [
+			"noDataAlertStream_out"
+		],
+		"definition": {
+			"type": "nodataalert",
+			"value": "PT1M,plain,1,host,host1,host2,host3"
+		},
+		"partitionSpec": [
+			{
+				"streamId": "noDataAlertStream",
+				"type": "GROUPBY"
+			}
+		],
+		"parallelismHint": 2
+	}
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/policies.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/policies.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/policies.json
new file mode 100644
index 0000000..74f3016
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/policies.json
@@ -0,0 +1,23 @@
+[
+	{
+		"name": "noDataAlertPolicy",
+		"description": "noDataAlertPolicy",
+		"inputStreams": [
+			"noDataAlertStream"
+		],
+		"outputStreams": [
+			"noDataAlertStream_out"
+		],
+		"definition": {
+			"type": "nodataalert",
+			"value": "PT1M,dynamic,1,host"
+		},
+		"partitionSpec": [
+			{
+				"streamId": "noDataAlertStream",
+				"type": "GROUPBY"
+			}
+		],
+		"parallelismHint": 2
+	}
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/publishments.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/publishments.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/publishments.json
new file mode 100644
index 0000000..52208ee
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/publishments.json
@@ -0,0 +1,20 @@
+[
+	{
+		"name":"test-stream-output",
+		"type":"org.apache.eagle.alert.engine.publisher.impl.AlertEmailPublisher",
+		"policyIds": [
+			"noDataAlertPolicy"
+		],
+		"properties": {
+			"subject":"Eagle Test Alert",
+			"template":"",
+			"sender": "sender@corp.com",
+			"recipients": "services@corp.com",
+			"smtp.server":"smtp.mailhost.com",
+			"connection": "plaintext",
+			"smtp.port": "25"
+		},
+		"dedupIntervalMin" : "PT5M",
+		"serializer" : "org.apache.eagle.alert.engine.publisher.impl.StringEventSerializer"
+	}
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/streamdefinitions.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/streamdefinitions.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/streamdefinitions.json
new file mode 100644
index 0000000..45b6241
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/streamdefinitions.json
@@ -0,0 +1,29 @@
+[
+	{
+		"streamId": "noDataAlertStream",
+		"dataSource": "noDataAlertDataSource",
+		"description": "the data stream for testing no data alert",
+		"validate": false,
+		"timeseries": false,
+		"columns": [
+			{
+				"name": "host",
+				"type": "STRING",
+				"defaultValue": "",
+				"required": true
+			},
+			{
+				"name": "timestamp",
+				"type": "LONG",
+				"defaultValue": 0,
+				"required": true
+			},
+			{
+				"name": "value",
+				"type": "DOUBLE",
+				"defaultValue": "0.0",
+				"required": true
+			}
+		]
+	}
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/topologies.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/topologies.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/topologies.json
new file mode 100644
index 0000000..411cc48
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/nodata/topologies.json
@@ -0,0 +1,31 @@
+[
+{
+	"name": "alertUnitTopology_1",
+	"numOfSpout":1,
+	"numOfAlertBolt": 10,
+	"numOfGroupBolt": 4,
+	"spoutId": "alertEngineSpout",
+	"groupNodeIds" : [
+		"streamRouterBolt0",
+		"streamRouterBolt1",
+		"streamRouterBolt2",
+		"streamRouterBolt3"
+	],
+	"alertBoltIds": [
+		"alertBolt0",
+		"alertBolt1",
+		"alertBolt2",
+		"alertBolt3",
+		"alertBolt4",
+		"alertBolt5",
+		"alertBolt6",
+		"alertBolt7",
+		"alertBolt8",
+		"alertBolt9"
+	],
+	"pubBoltId" : "alertPublishBolt",
+	"spoutParallelism": 1,
+	"groupParallelism": 1,
+	"alertParallelism": 1
+}
+]

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/policies.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/policies.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/policies.json
deleted file mode 100644
index 5edece9..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/policies.json
+++ /dev/null
@@ -1,54 +0,0 @@
-[
-{
-	"name": "perfmon_cpu_host_check",
-	"description" : "policy to check host perfmon_cpu",
-	"inputStreams": [
-		"perfmon_cpu_stream"
-	],
-	"outputStreams": [
-		"perfmon_cpu_check_output"
-	],
-	"definition": {
-		"type": "siddhi",
-		"value": "from perfmon_cpu_stream[value > 90.0] select * group by host insert into perfmon_cpu_check_output;"
-	},
-	"partitionSpec": [
-		{
-			"streamId" : "perfmon_cpu_stream",
-			"type" : "GROUPBY",
-			"columns" : [
-				"host"
-			],
-			"sortSpec": {
-				"windowPeriod" : "PT1M"
-			}
-		}
-	]
-},
-{
-	"name": "perfmon_cpu_pool_check",
-	"description" : "policy to check pool perfmon_cpu",
-	"inputStreams": [
-		"perfmon_cpu_stream"
-	],
-	"outputStreams": [
-		"perfmon_cpu_check_output"
-	],
-	"definition": {
-		"type": "siddhi",
-		"value": "from perfmon_cpu_stream[value > 75.0] select * group by pool insert into perfmon_cpu_check_output;"
-	},
-	"partitionSpec": [
-		{
-			"streamId" : "perfmon_cpu_stream",
-			"type" : "GROUPBY",
-			"columns" : [
-				"pool"
-			],
-			"sortSpec": {
-				"windowPeriod" : "PT1M"
-			}
-		}
-	]
-}
-]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/publishments.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/publishments.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/publishments.json
deleted file mode 100644
index 7b9c593..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/publishments.json
+++ /dev/null
@@ -1,29 +0,0 @@
-[
-{
-	"name":"test-stream-output",
-	"type":"org.apache.eagle.alert.engine.publisher.impl.AlertEmailPublisher",
-	"policyIds": [
-		"perfmon_cpu_host_check", "perfmon_cpu_pool_check"
-	],
-	"properties": {
-	  "subject":"UMP Test Alert",
-	  "template":"",
-	  "sender": "sender@corp.com",
-	  "recipients": "receiver@corp.com",
-	  "smtp.server":"mailhost.com",
-	  "connection": "plaintext",
-	  "smtp.port": "25"
-	},
-	"dedupIntervalMin" : "PT0M"
-},
-{
-  "type": "org.apache.eagle.alert.engine.publisher.impl.AlertKafkaPublisher",
-  "name":"kafka-testAlertStream",
-  "policyIds": ["perfmon_cpu_host_check"],
-  "dedupIntervalMin": "PT1M",
-  "properties":{
-    "kafka_broker":"sandbox.hortonworks.com:6667",
-    "topic":"test_kafka"
-  }
-}
-]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/publishments1.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/publishments1.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/publishments1.json
new file mode 100644
index 0000000..2e04e78
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/publishments1.json
@@ -0,0 +1,20 @@
+[
+{
+	"name":"test-stream-output",
+	"type":"org.apache.eagle.alert.engine.publisher.impl.AlertEmailPublisher",
+	"policyIds": [
+		"perfmon_cpu_host_check", "perfmon_cpu_pool_check"
+	],
+	"properties": {
+	  "subject":"UMP Test Alert",
+	  "template":"",
+	  "sender": "sender@corp.com",
+	  "recipients": "services@corp.com",
+	  "smtp.server":"sender.mailhost.com",
+	  "connection": "plaintext",
+	  "smtp.port": "25"
+	},
+	"dedupIntervalMin" : "PT1M",
+	"serializer" : "org.apache.eagle.alert.engine.publisher.impl.StringEventSerializer"
+}
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/application-integration.conf
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/application-integration.conf b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/application-integration.conf
new file mode 100644
index 0000000..09db673
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/application-integration.conf
@@ -0,0 +1,60 @@
+# 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.
+{
+  "topology" : {
+    "name" : "alertUnitTopology_1",
+    "numOfTotalWorkers": 20,
+    "numOfSpoutTasks" : 1,
+    "numOfRouterBolts" : 4,
+    "numOfAlertBolts" : 10,
+    "numOfPublishTasks" : 1,
+    "localMode" : "true"
+  },
+  "spout" : {
+    "kafkaBrokerZkQuorum": "localhost:2181",
+    "kafkaBrokerZkBasePath": "/brokers",
+    "stormKafkaUseSameZkQuorumWithKafkaBroker": true,
+    "stormKafkaTransactionZkQuorum": "",
+    "stormKafkaTransactionZkPath": "/consumers",
+    "stormKafkaEagleConsumer": "eagle_consumer",
+    "stormKafkaStateUpdateIntervalMs": 2000,
+    "stormKafkaFetchSizeBytes": 1048586,
+  },
+  "zkConfig" : {
+    "zkQuorum" : "localhost:2181",
+    "zkRoot" : "/alert",
+    "zkSessionTimeoutMs" : 10000,
+    "connectionTimeoutMs" : 10000,
+    "zkRetryTimes" : 3,
+    "zkRetryInterval" : 3000
+  },
+  "dynamicConfigSource" : {
+    "initDelayMillis": 3000,
+    "delayMillis" : 10000
+  },
+  "metadataService": {
+	"context" : "/rest",
+	"host" : "localhost",
+	"port" : 8080
+  },
+  "coordinatorService": {
+  	"host": "localhost",
+  	"port": "8080",
+  	"context" : "/rest"
+  },
+  "kafkaProducer": {
+  	"bootstrapServers": "localhost:9092"
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/datasources.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/datasources.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/datasources.json
new file mode 100644
index 0000000..77a280c
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/datasources.json
@@ -0,0 +1,19 @@
+[
+{
+	"name": "perfmon_datasource",
+	"type": "KAFKA",
+	"properties": {
+	},
+	"topic": "perfmon_metrics",
+	"schemeCls": "org.apache.eagle.alert.engine.scheme.JsonScheme",
+	"codec": {
+		"streamNameSelectorProp": {
+			"fieldNamesToInferStreamName" : "metric",
+			"streamNameFormat":"%s"
+		},
+		"streamNameSelectorCls":"org.apache.eagle.alert.engine.scheme.JsonStringStreamNameSelector",
+		"timestampColumn": "timestamp",
+		"timestampFormat":""
+	}
+}
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/policies.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/policies.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/policies.json
new file mode 100644
index 0000000..5edece9
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/policies.json
@@ -0,0 +1,54 @@
+[
+{
+	"name": "perfmon_cpu_host_check",
+	"description" : "policy to check host perfmon_cpu",
+	"inputStreams": [
+		"perfmon_cpu_stream"
+	],
+	"outputStreams": [
+		"perfmon_cpu_check_output"
+	],
+	"definition": {
+		"type": "siddhi",
+		"value": "from perfmon_cpu_stream[value > 90.0] select * group by host insert into perfmon_cpu_check_output;"
+	},
+	"partitionSpec": [
+		{
+			"streamId" : "perfmon_cpu_stream",
+			"type" : "GROUPBY",
+			"columns" : [
+				"host"
+			],
+			"sortSpec": {
+				"windowPeriod" : "PT1M"
+			}
+		}
+	]
+},
+{
+	"name": "perfmon_cpu_pool_check",
+	"description" : "policy to check pool perfmon_cpu",
+	"inputStreams": [
+		"perfmon_cpu_stream"
+	],
+	"outputStreams": [
+		"perfmon_cpu_check_output"
+	],
+	"definition": {
+		"type": "siddhi",
+		"value": "from perfmon_cpu_stream[value > 75.0] select * group by pool insert into perfmon_cpu_check_output;"
+	},
+	"partitionSpec": [
+		{
+			"streamId" : "perfmon_cpu_stream",
+			"type" : "GROUPBY",
+			"columns" : [
+				"pool"
+			],
+			"sortSpec": {
+				"windowPeriod" : "PT1M"
+			}
+		}
+	]
+}
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/publishments.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/publishments.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/publishments.json
new file mode 100644
index 0000000..ab9a98e
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/publishments.json
@@ -0,0 +1,31 @@
+[
+{
+	"name":"test-stream-output",
+	"type":"org.apache.eagle.alert.engine.publisher.impl.AlertEmailPublisher",
+	"policyIds": [
+		"perfmon_cpu_host_check", "perfmon_cpu_pool_check"
+	],
+	"properties": {
+	  "subject":"Eagle Test Alert",
+	  "template":"",
+	  "sender": "sender@corp.com",
+	  "recipients": "services@corp.com",
+	  "smtp.server":"smtp.mailhost.com",
+	  "connection": "plaintext",
+	  "smtp.port": "25"
+	},
+	"dedupIntervalMin" : "PT1M",
+	"serializer" : "org.apache.eagle.alert.engine.publisher.impl.StringEventSerializer"
+},
+{
+  "type": "org.apache.eagle.alert.engine.publisher.impl.AlertKafkaPublisher",
+  "name":"kafka-testAlertStream",
+  "policyIds": ["perfmon_cpu_host_check"],
+  "dedupIntervalMin": "PT1M",
+  "properties":{
+    "kafka_broker":"localhost:9092",
+    "topic":"test_kafka"
+  },
+  "serializer" : "org.apache.eagle.alert.engine.publisher.impl.StringEventSerializer"
+}
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/streamdefinitions.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/streamdefinitions.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/streamdefinitions.json
new file mode 100644
index 0000000..d93822e
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/streamdefinitions.json
@@ -0,0 +1,44 @@
+[
+{
+	"streamId": "perfmon_cpu_stream",
+	"dataSource" : "perfmon_datasource",
+	"description":"the data stream for perfmon cpu metrics",
+	"validate": false,
+	"timeseries":false,
+	"columns": [
+		{
+			"name": "host",
+			"type" : "STRING",
+			"defaultValue": "",
+			"required":true
+		},
+		{
+			"name": "timestamp",
+			"type" : "LONG",
+			"defaultValue": 0,
+			"required":true
+		},{
+			"name": "metric",
+			"type" : "STRING",
+			"defaultValue": "perfmon_cpu",
+			"required": true
+		},{
+			"name": "pool",
+			"type" : "STRING",
+			"defaultValue": "raptor_general",
+			"required":true
+		},{
+			"name": "value",
+			"type" : "DOUBLE",
+			"defaultValue": 0.0,
+			"required":true
+		},
+		{
+			"name": "colo",
+			"type" : "STRING",
+			"defaultValue": "",
+			"required":true
+		}
+	]
+}
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/topologies.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/topologies.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/topologies.json
new file mode 100644
index 0000000..411cc48
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/simple/topologies.json
@@ -0,0 +1,31 @@
+[
+{
+	"name": "alertUnitTopology_1",
+	"numOfSpout":1,
+	"numOfAlertBolt": 10,
+	"numOfGroupBolt": 4,
+	"spoutId": "alertEngineSpout",
+	"groupNodeIds" : [
+		"streamRouterBolt0",
+		"streamRouterBolt1",
+		"streamRouterBolt2",
+		"streamRouterBolt3"
+	],
+	"alertBoltIds": [
+		"alertBolt0",
+		"alertBolt1",
+		"alertBolt2",
+		"alertBolt3",
+		"alertBolt4",
+		"alertBolt5",
+		"alertBolt6",
+		"alertBolt7",
+		"alertBolt8",
+		"alertBolt9"
+	],
+	"pubBoltId" : "alertPublishBolt",
+	"spoutParallelism": 1,
+	"groupParallelism": 1,
+	"alertParallelism": 1
+}
+]

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/streamdefinitions.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/streamdefinitions.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/streamdefinitions.json
deleted file mode 100644
index cbeae19..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/streamdefinitions.json
+++ /dev/null
@@ -1,44 +0,0 @@
-[
-{
-	"streamId": "perfmon_cpu_stream",
-	"dataSource" : "perfmon_datasource",
-	"description":"the data stream for perfmon cpu metrics",
-	"validate": false,
-	"timeseries":false,
-	"columns": [
-		{
-			"name": "host",
-			"type" : "string",
-			"defaultValue": "",
-			"required":true
-		},
-		{
-			"name": "timestamp",
-			"type" : "long",
-			"defaultValue": 0,
-			"required":true
-		},{
-			"name": "metric",
-			"type" : "string",
-			"defaultValue": "perfmon_cpu",
-			"required": true
-		},{
-			"name": "pool",
-			"type" : "string",
-			"defaultValue": "raptor_general",
-			"required":true
-		},{
-			"name": "value",
-			"type" : "double",
-			"defaultValue": 0.0,
-			"required":true
-		},
-		{
-			"name": "colo",
-			"type" : "string",
-			"defaultValue": "",
-			"required":true
-		}
-	]
-}
-]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/topologies.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/topologies.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/topologies.json
deleted file mode 100644
index 411cc48..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/resources/topologies.json
+++ /dev/null
@@ -1,31 +0,0 @@
-[
-{
-	"name": "alertUnitTopology_1",
-	"numOfSpout":1,
-	"numOfAlertBolt": 10,
-	"numOfGroupBolt": 4,
-	"spoutId": "alertEngineSpout",
-	"groupNodeIds" : [
-		"streamRouterBolt0",
-		"streamRouterBolt1",
-		"streamRouterBolt2",
-		"streamRouterBolt3"
-	],
-	"alertBoltIds": [
-		"alertBolt0",
-		"alertBolt1",
-		"alertBolt2",
-		"alertBolt3",
-		"alertBolt4",
-		"alertBolt5",
-		"alertBolt6",
-		"alertBolt7",
-		"alertBolt8",
-		"alertBolt9"
-	],
-	"pubBoltId" : "alertPublishBolt",
-	"spoutParallelism": 1,
-	"groupParallelism": 1,
-	"alertParallelism": 1
-}
-]

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/pom.xml
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/pom.xml b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/pom.xml
index 1318a31..2ce2a15 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/pom.xml
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/pom.xml
@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- ~ /* ~ * 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 ~
+<!-- ~ /* ~ * 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. ~ */ -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
@@ -17,15 +17,12 @@
 		<groupId>org.apache.eagle</groupId>
 		<artifactId>alert-metadata-parent</artifactId>
 		<version>0.5.0-incubating-SNAPSHOT</version>
-		<relativePath>../pom.xml</relativePath>
 	</parent>
 
 	<artifactId>alert-metadata-service</artifactId>
 	<packaging>jar</packaging>
 
 	<dependencies>
-		<!-- Storm depends on org.ow2.asm:asm:4.0 -->
-		<!-- Jersey depends on asm:asm:3.0 -->
 		<dependency>
 			<groupId>org.apache.eagle</groupId>
 			<artifactId>alert-engine</artifactId>
@@ -48,21 +45,25 @@
 			<artifactId>junit</artifactId>
 			<scope>test</scope>
 		</dependency>
+
 		<dependency>
 			<groupId>com.sun.jersey</groupId>
 			<artifactId>jersey-server</artifactId>
-			<!--<exclusions> -->
-			<!--<exclusion> -->
-			<!--<groupId>asm</groupId> -->
-			<!--<artifactId>asm</artifactId> -->
-			<!--</exclusion> -->
-			<!--</exclusions> -->
 		</dependency>
 		<dependency>
 			<groupId>com.sun.jersey.contribs</groupId>
 			<artifactId>jersey-multipart</artifactId>
 		</dependency>
 		<dependency>
+			<groupId>com.sun.jersey</groupId>
+			<artifactId>jersey-servlet</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>com.sun.jersey</groupId>
+			<artifactId>jersey-client</artifactId>
+		</dependency>
+
+		<dependency>
 			<groupId>org.codehaus.jackson</groupId>
 			<artifactId>jackson-mapper-asl</artifactId>
 		</dependency>
@@ -94,10 +95,7 @@
 			<groupId>io.swagger</groupId>
 			<artifactId>swagger-jaxrs</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>com.sun.jersey</groupId>
-			<artifactId>jersey-servlet</artifactId>
-		</dependency>
+
 	</dependencies>
 
 	<build>

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/java/org/apache/eagle/service/metadata/resource/MetadataResource.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/java/org/apache/eagle/service/metadata/resource/MetadataResource.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/java/org/apache/eagle/service/metadata/resource/MetadataResource.java
index 12e4f5a..7e4dea7 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/java/org/apache/eagle/service/metadata/resource/MetadataResource.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/java/org/apache/eagle/service/metadata/resource/MetadataResource.java
@@ -37,7 +37,7 @@ import org.apache.eagle.alert.engine.coordinator.PublishmentType;
 import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
 import org.apache.eagle.alert.engine.coordinator.StreamingCluster;
 import org.apache.eagle.alert.metadata.impl.MetadataDaoFactory;
-import org.apache.eagle.alert.metadata.resource.IMetadataDao;
+import org.apache.eagle.alert.metadata.IMetadataDao;
 import org.apache.eagle.alert.metadata.resource.Models;
 import org.apache.eagle.alert.metadata.resource.OpResult;
 
@@ -57,7 +57,7 @@ public class MetadataResource {
     public List<StreamingCluster> listClusters() {
         return dao.listClusters();
     }
-
+    
     @Path("/clear")
     @POST
     public OpResult clear() {

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/java/org/apache/eagle/service/topology/resource/impl/TopologyMgmtResourceImpl.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/java/org/apache/eagle/service/topology/resource/impl/TopologyMgmtResourceImpl.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/java/org/apache/eagle/service/topology/resource/impl/TopologyMgmtResourceImpl.java
index ff9a65a..f9a6450 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/java/org/apache/eagle/service/topology/resource/impl/TopologyMgmtResourceImpl.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/java/org/apache/eagle/service/topology/resource/impl/TopologyMgmtResourceImpl.java
@@ -28,7 +28,7 @@ import org.apache.eagle.alert.engine.UnitTopologyMain;
 import org.apache.eagle.alert.engine.runner.UnitTopologyRunner;
 import org.apache.eagle.alert.engine.coordinator.StreamingCluster;
 import org.apache.eagle.alert.metadata.impl.MetadataDaoFactory;
-import org.apache.eagle.alert.metadata.resource.IMetadataDao;
+import org.apache.eagle.alert.metadata.IMetadataDao;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/resources/application.conf
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/resources/application.conf b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/resources/application.conf
deleted file mode 100644
index ada6a4d..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/resources/application.conf
+++ /dev/null
@@ -1,21 +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.
-
-{
-	"datastore": {
-		"metadataDao": "org.apache.eagle.alert.metadata.impl.InMemMetadataDaoImpl",
-		"connection": "localhost:27017"
-	}
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/webapp/WEB-INF/web.xml b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 10e9504..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- ~ 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. -->
-<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
-		  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
-	version="3.0">
-	<welcome-file-list>
-		<welcome-file>index.html</welcome-file>
-	</welcome-file-list>
-	<servlet>
-		<servlet-name>Jersey Web Application</servlet-name>
-		<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
-		<init-param>
-			<param-name>com.sun.jersey.config.property.packages</param-name>
-			<param-value>io.swagger.jaxrs.json,io.swagger.jaxrs.listing,org.apache.eagle.service,org.codehaus.jackson.jaxrs</param-value>
-		</init-param>
-		<init-param>
-			<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
-			<param-value>com.sun.jersey.api.container.filter.GZIPContentEncodingFilter;com.sun.jersey.api.container.filter.PostReplaceFilter</param-value>
-		</init-param>
-		<init-param>
-			<param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
-			<param-value>com.sun.jersey.api.container.filter.GZIPContentEncodingFilter</param-value>
-		</init-param>
-		<load-on-startup>1</load-on-startup>
-	</servlet>
-	<!-- Servlet for swagger initialization only, no URL mapping. -->
-	<servlet>
-		<servlet-name>swaggerConfig</servlet-name>
-		<servlet-class>io.swagger.jaxrs.config.DefaultJaxrsConfig</servlet-class>
-		<init-param>
-			<param-name>api.version</param-name>
-			<param-value>1.0.0</param-value>
-		</init-param>
-		<init-param>
-			<param-name>swagger.api.basepath</param-name>
-			<param-value>/rest</param-value>
-		</init-param>
-		<load-on-startup>2</load-on-startup>
-	</servlet>
-
-	<servlet-mapping>
-		<servlet-name>Jersey Web Application</servlet-name>
-		<url-pattern>/rest/*</url-pattern>
-	</servlet-mapping>
-	<filter>
-		<filter-name>CorsFilter</filter-name>
-		<!-- Ideally, should be tomcat embed core's CORSFilter. See @SimpleCORSFiler comments. -->
-		<filter-class>org.apache.eagle.alert.resource.SimpleCORSFiler</filter-class>
-		<init-param>
-			<param-name>cors.allowed.origins</param-name>
-			<param-value>*</param-value>
-		</init-param>
-		<init-param>
-			<param-name>cors.allowed.headers</param-name>
-			<param-value>Authorization,Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With, Accept</param-value>
-		</init-param>
-		<init-param>
-			<param-name>cors.allowed.methods</param-name>
-			<param-value>GET,POST,HEAD,OPTIONS,PUT,DELETE</param-value>
-		</init-param>
-		<init-param>
-			<param-name>cors.support.credentials</param-name>
-			<param-value>true</param-value>
-		</init-param>
-	</filter>
-	<filter-mapping>
-		<filter-name>CorsFilter</filter-name>
-		<url-pattern>/*</url-pattern>
-	</filter-mapping>
-</web-app>

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/webapp/index.html
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/webapp/index.html b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/webapp/index.html
deleted file mode 100644
index 5da5b32..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/main/webapp/index.html
+++ /dev/null
@@ -1,18 +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.
-  -->
-Hello, this is UMP alert metadata service. You are welcome!
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/test/resources/application.conf
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/test/resources/application.conf b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/test/resources/application.conf
new file mode 100644
index 0000000..63e649c
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata-service/src/test/resources/application.conf
@@ -0,0 +1,20 @@
+# 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.
+
+{
+	"datastore": {
+		"metadataDao": "org.apache.eagle.alert.metadata.impl.InMemMetadataDaoImpl"
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/pom.xml
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/pom.xml b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/pom.xml
index 5380963..7b789ab 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/pom.xml
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/pom.xml
@@ -10,18 +10,23 @@
 	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. ~ */ -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 
 	<parent>
 		<groupId>org.apache.eagle</groupId>
 		<artifactId>alert-metadata-parent</artifactId>
 		<version>0.5.0-incubating-SNAPSHOT</version>
-		<relativePath>../pom.xml</relativePath>
 	</parent>
+
 	<artifactId>alert-metadata</artifactId>
 	<packaging>jar</packaging>
+
 	<dependencies>
+		<!-- Storm depends on org.ow2.asm:asm:4.0 -->
+		<!-- Jersey depends on asm:asm:3.0 -->
+
 		<dependency>
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>
@@ -38,10 +43,20 @@
 			<version>${mongodb.version}</version>
 		</dependency>
 		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<version>${mysql-connector-java.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.ddlutils</groupId>
+			<artifactId>ddlutils</artifactId>
+			<version>${ddlutils.version}</version>
+		</dependency>
+		<dependency>
 			<groupId>de.flapdoodle.embed</groupId>
 			<artifactId>de.flapdoodle.embed.mongo</artifactId>
 			<version>1.50.5</version>
 			<scope>test</scope>
 		</dependency>
 	</dependencies>
-</project>
\ No newline at end of file
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/IMetadataDao.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/IMetadataDao.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/IMetadataDao.java
new file mode 100644
index 0000000..59bd4bf
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/IMetadataDao.java
@@ -0,0 +1,89 @@
+/*
+ * 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.metadata;
+
+import java.io.Closeable;
+import java.util.List;
+
+import org.apache.eagle.alert.coordination.model.Kafka2TupleMetadata;
+import org.apache.eagle.alert.coordination.model.ScheduleState;
+import org.apache.eagle.alert.coordination.model.internal.PolicyAssignment;
+import org.apache.eagle.alert.coordination.model.internal.Topology;
+import org.apache.eagle.alert.engine.coordinator.*;
+import org.apache.eagle.alert.metadata.resource.Models;
+import org.apache.eagle.alert.metadata.resource.OpResult;
+
+public interface IMetadataDao extends Closeable {
+
+    List<Topology> listTopologies();
+
+    OpResult addTopology(Topology t);
+
+    OpResult removeTopology(String topologyName);
+
+    List<StreamingCluster> listClusters();
+
+    OpResult addCluster(StreamingCluster cluster);
+
+    OpResult removeCluster(String clusterId);
+
+    List<StreamDefinition> listStreams();
+
+    OpResult createStream(StreamDefinition stream);
+
+    OpResult removeStream(String streamId);
+
+    List<Kafka2TupleMetadata> listDataSources();
+
+    OpResult addDataSource(Kafka2TupleMetadata dataSource);
+
+    OpResult removeDataSource(String datasourceId);
+
+    List<PolicyDefinition> listPolicies();
+
+    OpResult addPolicy(PolicyDefinition policy);
+
+    OpResult removePolicy(String policyId);
+
+    List<Publishment> listPublishment();
+
+    OpResult addPublishment(Publishment publishment);
+
+    OpResult removePublishment(String pubId);
+
+    List<PublishmentType> listPublishmentType();
+
+    OpResult addPublishmentType(PublishmentType publishmentType);
+
+    OpResult removePublishmentType(String pubType);
+
+    ScheduleState getScheduleState(String versionId);
+
+    ScheduleState getScheduleState();
+
+    OpResult addScheduleState(ScheduleState state);
+
+    List<PolicyAssignment> listAssignments();
+
+    OpResult addAssignment(PolicyAssignment assignment);
+
+    // APIs for test friendly
+    OpResult clear();
+    Models export();
+    OpResult importModels(Models models);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/MetadataUtils.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/MetadataUtils.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/MetadataUtils.java
new file mode 100644
index 0000000..1210861
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/MetadataUtils.java
@@ -0,0 +1,74 @@
+/*
+ * 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.metadata;
+
+import com.typesafe.config.Config;
+import org.apache.eagle.alert.coordination.model.ScheduleState;
+import org.apache.eagle.alert.coordination.model.internal.PolicyAssignment;
+import org.apache.eagle.alert.engine.coordinator.PublishmentType;
+import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+public class MetadataUtils {
+
+    private final static Logger LOG = LoggerFactory.getLogger(MetadataUtils.class);
+
+    public static <T> String getKey(T t) {
+        if (t instanceof StreamDefinition) {
+            return ((StreamDefinition) t).getStreamId();
+        }
+        if (t instanceof PublishmentType) {
+            return ((PublishmentType) t).getType();
+        }
+        if (t instanceof PolicyAssignment) {
+            return ((PolicyAssignment) t).getPolicyName();
+        }
+        if (t instanceof ScheduleState) {
+            return ((ScheduleState) t).getVersion();
+        }
+
+        try {
+            Method m = t.getClass().getMethod("getName");
+            return (String) m.invoke(t);
+        } catch (NoSuchMethodException | SecurityException | InvocationTargetException | IllegalAccessException
+                | IllegalArgumentException e) {
+            LOG.error(" getName not found on given class :" + t.getClass().getName());
+        }
+        throw new RuntimeException(String.format("no getName() found on target class %s for matching", t.getClass()
+                .getName()));
+    }
+
+    public static Connection getJdbcConnection(Config config) {
+        Connection connection = null;
+        String conn = config.getString("connection");
+        try {
+            connection = DriverManager.getConnection(conn);
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+        return connection;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/InMemMetadataDaoImpl.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/InMemMetadataDaoImpl.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/InMemMetadataDaoImpl.java
index 218ea6b..fc1bbaa 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/InMemMetadataDaoImpl.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/InMemMetadataDaoImpl.java
@@ -16,8 +16,7 @@
  */
 package org.apache.eagle.alert.metadata.impl;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -35,7 +34,8 @@ import org.apache.eagle.alert.engine.coordinator.Publishment;
 import org.apache.eagle.alert.engine.coordinator.PublishmentType;
 import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
 import org.apache.eagle.alert.engine.coordinator.StreamingCluster;
-import org.apache.eagle.alert.metadata.resource.IMetadataDao;
+import org.apache.eagle.alert.metadata.IMetadataDao;
+import org.apache.eagle.alert.metadata.MetadataUtils;
 import org.apache.eagle.alert.metadata.resource.Models;
 import org.apache.eagle.alert.metadata.resource.OpResult;
 import org.slf4j.Logger;
@@ -82,7 +82,7 @@ public class InMemMetadataDaoImpl implements IMetadataDao {
         Optional<T> scOp = clusters.stream().filter(new Predicate<T>() {
             @Override
             public boolean test(T t) {
-                if (getKey(t).equalsIgnoreCase(getKey(paramT))) {
+                if (MetadataUtils.getKey(t).equalsIgnoreCase(MetadataUtils.getKey(paramT))) {
                     return true;
                 }
                 return false;
@@ -102,32 +102,13 @@ public class InMemMetadataDaoImpl implements IMetadataDao {
         return result;
     }
 
-    public static <T> String getKey(T t) {
-        if (t instanceof StreamDefinition) {
-            return ((StreamDefinition) t).getStreamId();
-        }
-        if (t instanceof PublishmentType) {
-            return ((PublishmentType) t).getType();
-        }
-
-        try {
-            Method m = t.getClass().getMethod("getName");
-            return (String) m.invoke(t);
-        } catch (NoSuchMethodException | SecurityException | InvocationTargetException | IllegalAccessException
-                | IllegalArgumentException e) {
-            LOG.error(" getName not found on given class :" + t.getClass().getName());
-        }
-        throw new RuntimeException(String.format("no getName() found on target class %s for matching", t.getClass()
-                .getName()));
-    }
-
     @SuppressWarnings("unchecked")
     private synchronized <T> OpResult remove(List<T> clusters, String id) {
         T[] matched = (T[]) clusters.stream().filter(new Predicate<T>() {
 
             @Override
             public boolean test(T t) {
-                if (getKey(t).equalsIgnoreCase(id)) {
+                if (MetadataUtils.getKey(t).equalsIgnoreCase(id)) {
                     return true;
                 }
                 return false;
@@ -230,7 +211,7 @@ public class InMemMetadataDaoImpl implements IMetadataDao {
     }
 
     @Override
-    public OpResult addScheduleState(ScheduleState state) {
+    public synchronized OpResult addScheduleState(ScheduleState state) {
         // FIXME : might concurrent issue
         String toRemove = null;
         if (scheduleStates.size() > maxScheduleState) {
@@ -248,7 +229,7 @@ public class InMemMetadataDaoImpl implements IMetadataDao {
     }
 
     @Override
-    public ScheduleState getScheduleState() {
+    public synchronized ScheduleState getScheduleState() {
         if (scheduleStates.size() > 0) {
             return scheduleStates.get(scheduleStates.lastKey());
         }
@@ -286,6 +267,7 @@ public class InMemMetadataDaoImpl implements IMetadataDao {
 
     @Override
     public OpResult clear() {
+        LOG.info("clear models...");
         this.assignments.clear();
         this.clusters.clear();
         this.datasources.clear();
@@ -316,6 +298,7 @@ public class InMemMetadataDaoImpl implements IMetadataDao {
 
     @Override
     public OpResult importModels(Models models) {
+        LOG.info("clear and import models...");
         clear();
         this.assignments.addAll(models.assignments);
         this.clusters.addAll(models.clusters);
@@ -331,4 +314,8 @@ public class InMemMetadataDaoImpl implements IMetadataDao {
         return result;
     }
 
+    @Override
+    public void close() throws IOException {
+
+    }
 }


[2/6] incubator-eagle git commit: Rebase code base

Posted by ha...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/JdbcDatabaseHandler.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/JdbcDatabaseHandler.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/JdbcDatabaseHandler.java
new file mode 100644
index 0000000..a5448a4
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/JdbcDatabaseHandler.java
@@ -0,0 +1,277 @@
+/*
+ * 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.metadata.impl;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.typesafe.config.Config;
+import org.apache.eagle.alert.metadata.MetadataUtils;
+import org.apache.eagle.alert.metadata.resource.OpResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.sql.*;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+public class JdbcDatabaseHandler {
+
+    private static final Logger LOG = LoggerFactory.getLogger(JdbcDatabaseHandler.class);
+
+    private final String INSERT_STATEMENT = "INSERT INTO %s VALUES (?, ?)";
+    private final String DELETE_STATEMENT = "DELETE FROM %s WHERE id=?";
+    private final String UPDATE_STATEMENT = "UPDATE %s set value=? WHERE id=?";
+    private final String QUERY_ALL_STATEMENT = "SELECT value FROM %s";
+    private final String QUERY_CONDITION_STATEMENT = "SELECT value FROM %s WHERE id=?";
+    private final String QUERY_ORDERBY_STATEMENT = "SELECT value FROM %s ORDER BY id %s";
+
+    private Map<String, String> tblNameMap = new HashMap<>();
+
+    private static final ObjectMapper mapper = new ObjectMapper();
+    private Connection connection = null;
+
+    static {
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+    }
+
+    public JdbcDatabaseHandler(Config config) {
+        // "jdbc:mysql://dbhost/database?" + "user=sqluser&password=sqluserpw"
+        this.tblNameMap = JdbcSchemaManager.tblNameMap;
+        try {
+            Class.forName("com.mysql.jdbc.Driver");
+            JdbcSchemaManager.getInstance().init(config);
+            connection = MetadataUtils.getJdbcConnection(config);
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private String getTableName(String clzName) {
+        String tbl = tblNameMap.get(clzName);
+        if (tbl != null) {
+            return tbl;
+        } else {
+            return clzName;
+        }
+    }
+
+    public <T> OpResult addOrReplace(String clzName, T t) {
+        String tb = getTableName(clzName);
+        OpResult result = new OpResult();
+        PreparedStatement statement = null;
+        Savepoint savepoint = null;
+        String key = null;
+        String value = null;
+        try {
+            statement = connection.prepareStatement(String.format(INSERT_STATEMENT, tb));
+            key = MetadataUtils.getKey(t);
+            value = mapper.writeValueAsString(t);
+
+            statement.setString(1, key);
+            Clob clob = connection.createClob();
+            clob.setString(1, value);
+            statement.setClob(2, clob);
+
+            connection.setAutoCommit(false);
+            savepoint = connection.setSavepoint("insertEntity");
+            int status = statement.executeUpdate();
+            LOG.info("update {} entities", status);
+            connection.commit();
+        } catch (SQLException e) {
+            //e.printStackTrace();
+            if(e.getMessage().toLowerCase().contains("duplicate")){
+                try {
+                    connection.rollback(savepoint);
+                    update(tb, key, value);
+                } catch (SQLException e1) {
+                    //e1.printStackTrace();
+                    LOG.warn("Rollback failed");
+                }
+            }
+        } catch (JsonProcessingException e) {
+            result.code = OpResult.FAILURE;
+            result.message = e.getMessage();
+        } finally {
+            if (statement != null) {
+                try {
+                    statement.close();
+                } catch (SQLException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return result;
+    }
+
+    private <T> OpResult update(String tb, String key, String value) throws SQLException {
+        OpResult result = new OpResult();
+        PreparedStatement statement = null;
+        try {
+            statement = connection.prepareStatement(String.format(UPDATE_STATEMENT, tb));
+            Clob clob = connection.createClob();
+            clob.setString(1, value);
+            statement.setClob(1, clob);
+            statement.setString(2, key);
+
+            int status = statement.executeUpdate();
+            LOG.info("update {} entities from table {}", status, tb);
+        } catch (SQLException e) {
+            e.printStackTrace();
+            result.code = OpResult.FAILURE;
+            result.message = e.getMessage();
+        } finally {
+            if (statement != null) {
+                statement.close();
+            }
+        }
+        return result;
+    }
+
+    public <T> List<T> list(Class<T> clz) {
+        String tb = getTableName(clz.getSimpleName());
+        List<T> result = new LinkedList<>();
+        try {
+            Statement statement = connection.createStatement();
+            ResultSet rs = statement.executeQuery(String.format(QUERY_ALL_STATEMENT, tb));
+            while (rs.next()) {
+                //String key = rs.getString(1);
+                String json= rs.getString(1);
+                try {
+                    T obj = mapper.readValue(json, clz);
+                    result.add(obj);
+                } catch (IOException e) {
+                    LOG.error("deserialize config item failed!", e);
+                }
+            }
+            rs.close();
+            statement.close();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    public <T> T listWithFilter(String key, Class<T> clz) {
+        String tb = getTableName(clz.getSimpleName());
+        List<T> result = new LinkedList<>();
+        PreparedStatement statement = null;
+        try {
+            statement = connection.prepareStatement(String.format(QUERY_CONDITION_STATEMENT, tb));
+            statement.setString(1, key);
+            ResultSet rs = statement.executeQuery();
+            while (rs.next()) {
+                //String key = rs.getString(1);
+                String json= rs.getString(1);
+                try {
+                    T obj = mapper.readValue(json, clz);
+                    result.add(obj);
+                } catch (IOException e) {
+                    LOG.error("deserialize config item failed!", e);
+                }
+            }
+            rs.close();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (statement != null) {
+                try {
+                    statement.close();
+                } catch (SQLException e) {
+                    LOG.warn("Close statement failed");
+                }
+            }
+        }
+        if (result.isEmpty()) {
+            return null;
+        } else {
+            return result.get(0);
+        }
+    }
+
+    public <T> T listTop(Class<T> clz, String sortType) {
+        String tb = getTableName(clz.getSimpleName());
+        List<T> result = new LinkedList<>();
+        PreparedStatement statement = null;
+        try {
+            statement = connection.prepareStatement(String.format(QUERY_ORDERBY_STATEMENT, tb, sortType));
+            ResultSet rs = statement.executeQuery();
+            while (rs.next()) {
+                //String key = rs.getString(1);
+                String json= rs.getString(1);
+                try {
+                    T obj = mapper.readValue(json, clz);
+                    result.add(obj);
+                } catch (IOException e) {
+                    LOG.error("deserialize config item failed!", e);
+                }
+            }
+            rs.close();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } finally {
+            if (statement != null) {
+                try {
+                    statement.close();
+                } catch (SQLException e) {
+                    LOG.warn("Close statement failed");
+                }
+            }
+        }
+        if (result.isEmpty()) {
+            return null;
+        } else {
+            return result.get(0);
+        }
+    }
+
+    public <T> OpResult remove(String clzName, String key) {
+        String tb = getTableName(clzName);
+        OpResult result = new OpResult();
+        try {
+            PreparedStatement statement = connection.prepareStatement(String.format(DELETE_STATEMENT, tb, key));
+            statement.setString(1, key);
+            int status = statement.executeUpdate();
+            String msg = String.format("delete %s entities from table %s", status, tb);
+            result.code = OpResult.SUCCESS;
+            result.message = msg;
+            statement.close();
+        } catch (SQLException e) {
+            result.code = OpResult.FAILURE;
+            result.message = e.getMessage();
+            //e.printStackTrace();
+        }
+        return result;
+    }
+
+    public void close() throws IOException {
+        //JdbcSchemaManager.getInstance().shutdown();
+        try {
+            if (this.connection != null) {
+                this.connection.close();
+            }
+        } catch (SQLException e) {
+            LOG.warn(e.getMessage());
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/JdbcMetadataDaoImpl.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/JdbcMetadataDaoImpl.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/JdbcMetadataDaoImpl.java
new file mode 100644
index 0000000..6233938
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/JdbcMetadataDaoImpl.java
@@ -0,0 +1,176 @@
+/*
+ * 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.metadata.impl;
+
+import java.io.IOException;
+import java.util.List;
+
+import com.typesafe.config.Config;
+import org.apache.eagle.alert.coordination.model.Kafka2TupleMetadata;
+import org.apache.eagle.alert.coordination.model.ScheduleState;
+import org.apache.eagle.alert.coordination.model.internal.PolicyAssignment;
+import org.apache.eagle.alert.coordination.model.internal.Topology;
+import org.apache.eagle.alert.engine.coordinator.PolicyDefinition;
+import org.apache.eagle.alert.engine.coordinator.Publishment;
+import org.apache.eagle.alert.engine.coordinator.PublishmentType;
+import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
+import org.apache.eagle.alert.engine.coordinator.StreamingCluster;
+import org.apache.eagle.alert.metadata.resource.OpResult;
+import org.apache.eagle.alert.metadata.IMetadataDao;
+import org.apache.eagle.alert.metadata.resource.Models;
+
+/**
+ * @since May 26, 2016
+ *
+ */
+public class JdbcMetadataDaoImpl implements IMetadataDao {
+    private JdbcDatabaseHandler handler;
+
+    public JdbcMetadataDaoImpl(Config config) {
+        handler = new JdbcDatabaseHandler(config);
+    }
+
+    @Override
+    public List<Topology> listTopologies() {
+        return handler.list(Topology.class);
+    }
+    @Override
+    public List<StreamingCluster> listClusters() {
+        return handler.list(StreamingCluster.class);
+    }
+    @Override
+    public List<StreamDefinition> listStreams() {
+        return handler.list(StreamDefinition.class);
+    }
+    @Override
+    public List<Kafka2TupleMetadata> listDataSources() {
+        return handler.list(Kafka2TupleMetadata.class);
+    }
+    @Override
+    public List<PolicyDefinition> listPolicies() {
+        return handler.list(PolicyDefinition.class);
+    }
+    @Override
+    public List<Publishment> listPublishment() {
+        return handler.list(Publishment.class);
+    }
+    @Override
+    public ScheduleState getScheduleState(String versionId) {
+        return handler.listWithFilter(versionId, ScheduleState.class);
+        //return null;
+    }
+    @Override
+    public ScheduleState getScheduleState() {
+        return handler.listTop(ScheduleState.class, "DESC");
+    }
+    @Override
+    public List<PolicyAssignment> listAssignments() {
+        return handler.list(PolicyAssignment.class);
+    }
+    @Override
+    public List<PublishmentType> listPublishmentType() {
+        return handler.list(PublishmentType.class);
+    }
+
+    @Override
+    public OpResult addTopology(Topology t) {
+        return handler.addOrReplace(Topology.class.getSimpleName(), t);
+    }
+    @Override
+    public OpResult addCluster(StreamingCluster cluster) {
+        return handler.addOrReplace(StreamingCluster.class.getSimpleName(), cluster);
+    }
+    @Override
+    public OpResult createStream(StreamDefinition stream) {
+        return handler.addOrReplace(StreamDefinition.class.getSimpleName(), stream);
+    }
+    @Override
+    public OpResult addDataSource(Kafka2TupleMetadata dataSource) {
+        return handler.addOrReplace(Kafka2TupleMetadata.class.getSimpleName(), dataSource);
+    }
+    @Override
+    public OpResult addPolicy(PolicyDefinition policy) {
+        return handler.addOrReplace(PolicyDefinition.class.getSimpleName(), policy);
+    }
+    @Override
+    public OpResult addPublishment(Publishment publishment) {
+        return handler.addOrReplace(Publishment.class.getSimpleName(), publishment);
+    }
+    @Override
+    public OpResult addScheduleState(ScheduleState state) {
+        return handler.addOrReplace(ScheduleState.class.getSimpleName(), state);
+    }
+    @Override
+    public OpResult addAssignment(PolicyAssignment assignment) {
+        return handler.addOrReplace(PolicyAssignment.class.getSimpleName(), assignment);
+    }
+    @Override
+    public OpResult addPublishmentType(PublishmentType publishmentType) {
+        return handler.addOrReplace(PublishmentType.class.getSimpleName(), publishmentType);
+    }
+
+    @Override
+    public OpResult removeTopology(String topologyName) {
+        return handler.remove(Topology.class.getSimpleName(), topologyName);
+    }
+    @Override
+    public OpResult removeCluster(String clusterId) {
+        return handler.remove(StreamingCluster.class.getSimpleName(), clusterId);
+    }
+    @Override
+    public OpResult removeStream(String streamId) {
+        return handler.remove(StreamDefinition.class.getSimpleName(), streamId);
+    }
+    @Override
+    public OpResult removeDataSource(String datasourceId) {
+        return handler.remove(Kafka2TupleMetadata.class.getSimpleName(), datasourceId);
+    }
+    @Override
+    public OpResult removePolicy(String policyId) {
+        return handler.remove(PolicyDefinition.class.getSimpleName(), policyId);
+    }
+    @Override
+    public OpResult removePublishment(String pubId) {
+        return handler.remove(Publishment.class.getSimpleName(), pubId);
+    }
+    @Override
+    public OpResult removePublishmentType(String pubType) {
+        return handler.remove(PublishmentType.class.getSimpleName(), pubType);
+    }
+
+    @Override
+    public OpResult clear() {
+        throw new UnsupportedOperationException("clear not support!");
+    }
+
+    @Override
+    public Models export() {
+        throw new UnsupportedOperationException("clear not support!");
+    }
+
+    @Override
+    public OpResult importModels(Models models) {
+        throw new UnsupportedOperationException("clear not support!");
+    }
+
+    @Override
+    public void close() throws IOException {
+        if (handler != null) {
+            handler.close();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/JdbcSchemaManager.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/JdbcSchemaManager.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/JdbcSchemaManager.java
new file mode 100644
index 0000000..d9df055
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/JdbcSchemaManager.java
@@ -0,0 +1,151 @@
+/*
+ * 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.metadata.impl;
+
+import com.typesafe.config.Config;
+import org.apache.ddlutils.Platform;
+import org.apache.ddlutils.PlatformFactory;
+import org.apache.ddlutils.model.*;
+import org.apache.eagle.alert.coordination.model.Kafka2TupleMetadata;
+import org.apache.eagle.alert.coordination.model.ScheduleState;
+import org.apache.eagle.alert.coordination.model.internal.PolicyAssignment;
+import org.apache.eagle.alert.coordination.model.internal.Topology;
+import org.apache.eagle.alert.engine.coordinator.*;
+import org.apache.eagle.alert.metadata.MetadataUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+public class JdbcSchemaManager {
+
+    private final static Logger LOG = LoggerFactory.getLogger(JdbcSchemaManager.class);
+    private Database database;
+    private Platform platform;
+
+    private static JdbcSchemaManager instance;
+
+    public static Map<String, String> tblNameMap = new HashMap<>();
+
+    private JdbcSchemaManager(){}
+
+    private static void registerTableName(String clzName, String tblName){
+        tblNameMap.put(clzName, tblName);
+    }
+
+    static {
+        registerTableName(StreamingCluster.class.getSimpleName(), "cluster");
+        registerTableName(StreamDefinition.class.getSimpleName(), "stream_schema");
+        registerTableName(Kafka2TupleMetadata.class.getSimpleName(), "datasource");
+        registerTableName(PolicyDefinition.class.getSimpleName(), "policy");
+        registerTableName(Publishment.class.getSimpleName(), "publishment");
+        registerTableName(PublishmentType.class.getSimpleName(), "publishment_type");
+        registerTableName(ScheduleState.class.getSimpleName(), "schedule_state");
+        registerTableName(PolicyAssignment.class.getSimpleName(), "assignment");
+        registerTableName(Topology.class.getSimpleName(), "topology");
+    }
+
+    public static JdbcSchemaManager getInstance(){
+        if(instance == null) {
+            instance = new JdbcSchemaManager();
+        }
+        return instance;
+    }
+
+    public void init(Config config) {
+        Connection connection = null;
+        try {
+            this.platform = PlatformFactory.createNewPlatformInstance("mysql");
+
+            connection = MetadataUtils.getJdbcConnection(config);
+            String dbName = config.getString("database");
+            this.database = platform.readModelFromDatabase(connection, dbName);
+            LOG.info("Loaded " + database);
+
+            Database _database = identifyNewTables();
+            if(_database.getTableCount() > 0) {
+                LOG.info("Creating {} new tables (totally {} tables)", _database.getTableCount(), database.getTableCount());
+                this.platform.createTables(connection, _database, false, true);
+                LOG.info("Created {} new tables: ",_database.getTableCount(), _database.getTables());
+            } else {
+                LOG.debug("All the {} tables have already been created, no new tables", database.getTableCount());
+            }
+        } catch (Exception e) {
+            LOG.error(e.getMessage(),e);
+            throw new IllegalStateException(e);
+        } finally {
+            if (connection != null){
+                try {
+                    connection.close();
+                } catch (SQLException e) {
+                    LOG.warn(e.getMessage(),e);
+                }
+            }
+        }
+    }
+
+    private Database identifyNewTables(){
+        Database _database = new Database();
+        _database.setName(database.getName());
+        Collection<String> tableNames = tblNameMap.values();
+        LOG.info("Initializing database and creating tables");
+        for (String tableName : tableNames) {
+            if (database.findTable(tableName) == null) {
+                Table table = createTable(tableName);
+                LOG.info("Creating {}", table.toVerboseString());
+                _database.addTable(table);
+                database.addTable(table);
+            } else {
+                LOG.debug("Table {} already exists", tableName);
+            }
+        }
+        return _database;
+    }
+
+    public void shutdown() {
+        this.platform.shutdownDatabase();
+    }
+
+    private Table createTable(String tableName){
+        Table table = new Table();
+        table.setName(tableName);
+        buildTable(table);
+        return table;
+    }
+
+    private void buildTable(Table table) {
+        Column id = new Column();
+        id.setName("id");
+        id.setPrimaryKey(true);
+        id.setRequired(true);
+        id.setTypeCode(Types.VARCHAR);
+        id.setSize("50");
+        table.addColumn(id);
+
+        Column value = new Column();
+        value.setName("value");
+        value.setTypeCode(Types.CLOB);
+        table.addColumn(value);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/MetadataDaoFactory.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/MetadataDaoFactory.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/MetadataDaoFactory.java
index 94717ce..0b91277 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/MetadataDaoFactory.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/MetadataDaoFactory.java
@@ -18,7 +18,7 @@ package org.apache.eagle.alert.metadata.impl;
 
 import java.lang.reflect.Constructor;
 
-import org.apache.eagle.alert.metadata.resource.IMetadataDao;
+import org.apache.eagle.alert.metadata.IMetadataDao;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -31,9 +31,10 @@ import com.typesafe.config.ConfigFactory;
  */
 public class MetadataDaoFactory {
 
-    private static final MetadataDaoFactory INSTANCE = new MetadataDaoFactory();
     private static final Logger LOG = LoggerFactory.getLogger(MetadataDaoFactory.class);
 
+    private static final MetadataDaoFactory INSTANCE = new MetadataDaoFactory();
+
     private IMetadataDao dao;
 
     private MetadataDaoFactory() {
@@ -49,6 +50,7 @@ public class MetadataDaoFactory {
                 clz = Thread.currentThread().getContextClassLoader().loadClass(clsName);
                 if (IMetadataDao.class.isAssignableFrom(clz)) {
                     Constructor<?> cotr = clz.getConstructor(Config.class);
+                    LOG.info("metadada DAO loaded: " + clsName);
                     dao = (IMetadataDao) cotr.newInstance(datastoreConfig);
                 } else {
                     throw new Exception("metadataDao configuration need to be implementation of IMetadataDao! ");

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/MongoMetadataDaoImpl.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/MongoMetadataDaoImpl.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/MongoMetadataDaoImpl.java
index 608c707..f5794d4 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/MongoMetadataDaoImpl.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/MongoMetadataDaoImpl.java
@@ -29,7 +29,8 @@ import org.apache.eagle.alert.engine.coordinator.Publishment;
 import org.apache.eagle.alert.engine.coordinator.PublishmentType;
 import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
 import org.apache.eagle.alert.engine.coordinator.StreamingCluster;
-import org.apache.eagle.alert.metadata.resource.IMetadataDao;
+import org.apache.eagle.alert.metadata.IMetadataDao;
+import org.apache.eagle.alert.metadata.MetadataUtils;
 import org.apache.eagle.alert.metadata.resource.Models;
 import org.apache.eagle.alert.metadata.resource.OpResult;
 import org.bson.BsonDocument;
@@ -66,7 +67,7 @@ public class MongoMetadataDaoImpl implements IMetadataDao {
 
     private final String connection;
     private final MongoClient client;
-    
+
     private MongoDatabase db;
     private MongoCollection<Document> cluster;
     private MongoCollection<Document> schema;
@@ -156,11 +157,11 @@ public class MongoMetadataDaoImpl implements IMetadataDao {
     private <T> OpResult addOrReplace(MongoCollection<Document> collection, T t) {
         BsonDocument filter = new BsonDocument();
         if (t instanceof StreamDefinition) {
-            filter.append("streamId", new BsonString(InMemMetadataDaoImpl.getKey(t)));
+            filter.append("streamId", new BsonString(MetadataUtils.getKey(t)));
         } else if (t instanceof PublishmentType) {
-            filter.append("type", new BsonString(InMemMetadataDaoImpl.getKey(t)));
+            filter.append("type", new BsonString(MetadataUtils.getKey(t)));
         } else {
-            filter.append("name", new BsonString(InMemMetadataDaoImpl.getKey(t)));
+            filter.append("name", new BsonString(MetadataUtils.getKey(t)));
         }
 
         String json = "";
@@ -379,4 +380,8 @@ public class MongoMetadataDaoImpl implements IMetadataDao {
         throw new UnsupportedOperationException("importModels not support!");
     }
 
+    @Override
+    public void close() throws IOException {
+        client.close();
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/jdbc/JdbcMetadataDaoImpl.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/jdbc/JdbcMetadataDaoImpl.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/jdbc/JdbcMetadataDaoImpl.java
deleted file mode 100644
index 9ec119a..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/impl/jdbc/JdbcMetadataDaoImpl.java
+++ /dev/null
@@ -1,292 +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.metadata.impl.jdbc;
-
-import java.util.List;
-
-import org.apache.eagle.alert.coordination.model.Kafka2TupleMetadata;
-import org.apache.eagle.alert.coordination.model.ScheduleState;
-import org.apache.eagle.alert.coordination.model.internal.PolicyAssignment;
-import org.apache.eagle.alert.coordination.model.internal.Topology;
-import org.apache.eagle.alert.engine.coordinator.PolicyDefinition;
-import org.apache.eagle.alert.engine.coordinator.Publishment;
-import org.apache.eagle.alert.engine.coordinator.PublishmentType;
-import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
-import org.apache.eagle.alert.engine.coordinator.StreamingCluster;
-import org.apache.eagle.alert.metadata.resource.OpResult;
-import org.apache.eagle.alert.metadata.resource.IMetadataDao;
-import org.apache.eagle.alert.metadata.resource.Models;
-
-/**
- * @since May 26, 2016
- *
- */
-public class JdbcMetadataDaoImpl implements IMetadataDao {
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#listTopologies()
-     */
-    @Override
-    public List<Topology> listTopologies() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#addTopology(org.apache.eagle.alert.coordination.model.internal.Topology)
-     */
-    @Override
-    public OpResult addTopology(Topology t) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#removeTopology(java.lang.String)
-     */
-    @Override
-    public OpResult removeTopology(String topologyName) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#listClusters()
-     */
-    @Override
-    public List<StreamingCluster> listClusters() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#addCluster(org.apache.eagle.alert.engine.coordinator.StreamingCluster)
-     */
-    @Override
-    public OpResult addCluster(StreamingCluster cluster) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#removeCluster(java.lang.String)
-     */
-    @Override
-    public OpResult removeCluster(String clusterId) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#listStreams()
-     */
-    @Override
-    public List<StreamDefinition> listStreams() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#createStream(org.apache.eagle.alert.engine.coordinator.StreamDefinition)
-     */
-    @Override
-    public OpResult createStream(StreamDefinition stream) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#removeStream(java.lang.String)
-     */
-    @Override
-    public OpResult removeStream(String streamId) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#listDataSources()
-     */
-    @Override
-    public List<Kafka2TupleMetadata> listDataSources() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#addDataSource(org.apache.eagle.alert.coordination.model.Kafka2TupleMetadata)
-     */
-    @Override
-    public OpResult addDataSource(Kafka2TupleMetadata dataSource) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#removeDataSource(java.lang.String)
-     */
-    @Override
-    public OpResult removeDataSource(String datasourceId) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#listPolicies()
-     */
-    @Override
-    public List<PolicyDefinition> listPolicies() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#addPolicy(org.apache.eagle.alert.engine.coordinator.PolicyDefinition)
-     */
-    @Override
-    public OpResult addPolicy(PolicyDefinition policy) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#removePolicy(java.lang.String)
-     */
-    @Override
-    public OpResult removePolicy(String policyId) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#listPublishment()
-     */
-    @Override
-    public List<Publishment> listPublishment() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#addPublishment(org.apache.eagle.alert.engine.coordinator.Publishment)
-     */
-    @Override
-    public OpResult addPublishment(Publishment publishment) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#removePublishment(java.lang.String)
-     */
-    @Override
-    public OpResult removePublishment(String pubId) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#getScheduleState(java.lang.String)
-     */
-    @Override
-    public ScheduleState getScheduleState(String versionId) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#getScheduleState()
-     */
-    @Override
-    public ScheduleState getScheduleState() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#addScheduleState(org.apache.eagle.alert.coordination.model.ScheduleState)
-     */
-    @Override
-    public OpResult addScheduleState(ScheduleState state) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#listAssignments()
-     */
-    @Override
-    public List<PolicyAssignment> listAssignments() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#addAssignment(org.apache.eagle.alert.coordination.model.internal.PolicyAssignment)
-     */
-    @Override
-    public OpResult addAssignment(PolicyAssignment assignment) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#clear()
-     */
-    @Override
-    public OpResult clear() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#export()
-     */
-    @Override
-    public Models export() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.eagle.service.alert.resource.IMetadataDao#importModels(org.apache.eagle.service.alert.resource.Models)
-     */
-    @Override
-    public OpResult importModels(Models models) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public List<PublishmentType> listPublishmentType() {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public OpResult addPublishmentType(PublishmentType publishmentType) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public OpResult removePublishmentType(String pubType) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/resource/IMetadataDao.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/resource/IMetadataDao.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/resource/IMetadataDao.java
deleted file mode 100644
index 8eef985..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/resource/IMetadataDao.java
+++ /dev/null
@@ -1,86 +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.metadata.resource;
-
-import java.util.List;
-
-import org.apache.eagle.alert.coordination.model.Kafka2TupleMetadata;
-import org.apache.eagle.alert.coordination.model.ScheduleState;
-import org.apache.eagle.alert.coordination.model.internal.PolicyAssignment;
-import org.apache.eagle.alert.coordination.model.internal.Topology;
-import org.apache.eagle.alert.engine.coordinator.*;
-
-public interface IMetadataDao {
-
-    List<Topology> listTopologies();
-
-    OpResult addTopology(Topology t);
-
-    OpResult removeTopology(String topologyName);
-
-    List<StreamingCluster> listClusters();
-
-    OpResult addCluster(StreamingCluster cluster);
-
-    OpResult removeCluster(String clusterId);
-
-    List<StreamDefinition> listStreams();
-
-    OpResult createStream(StreamDefinition stream);
-
-    OpResult removeStream(String streamId);
-
-    List<Kafka2TupleMetadata> listDataSources();
-
-    OpResult addDataSource(Kafka2TupleMetadata dataSource);
-
-    OpResult removeDataSource(String datasourceId);
-
-    List<PolicyDefinition> listPolicies();
-
-    OpResult addPolicy(PolicyDefinition policy);
-
-    OpResult removePolicy(String policyId);
-
-    List<Publishment> listPublishment();
-
-    OpResult addPublishment(Publishment publishment);
-
-    OpResult removePublishment(String pubId);
-
-    List<PublishmentType> listPublishmentType();
-
-    OpResult addPublishmentType(PublishmentType publishmentType);
-
-    OpResult removePublishmentType(String pubType);
-
-    ScheduleState getScheduleState(String versionId);
-
-    ScheduleState getScheduleState();
-
-    OpResult addScheduleState(ScheduleState state);
-
-    List<PolicyAssignment> listAssignments();
-
-    OpResult addAssignment(PolicyAssignment assignment);
-
-    // APIs for test friendly
-    OpResult clear();
-    Models export();
-    OpResult importModels(Models models);
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/resource/OpResult.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/resource/OpResult.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/resource/OpResult.java
index 44f507d..3115439 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/resource/OpResult.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/java/org/apache/eagle/alert/metadata/resource/OpResult.java
@@ -24,5 +24,7 @@ public class OpResult {
 
     public int code = 200;
     public String message = "";
-    
+
+    public static final int SUCCESS = 200;
+    public static final int FAILURE = 500;
 }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/resources/application.conf
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/resources/application.conf b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/resources/application.conf
deleted file mode 100644
index 7213a9f..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/main/resources/application.conf
+++ /dev/null
@@ -1,24 +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.
-
-
-{
-	"datastore": {
-		"metadataDao": "org.apache.eagle.alert.metadata.impl.InMemMetadataDaoImpl",
-		"connection": "localhost:27017",
-		"properties" : {
-		}
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/java/org/apache/eagle/service/alert/resource/impl/InMemoryTest.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/java/org/apache/eagle/service/alert/resource/impl/InMemoryTest.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/java/org/apache/eagle/service/alert/resource/impl/InMemoryTest.java
index 54a2ffc..645fc2b 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/java/org/apache/eagle/service/alert/resource/impl/InMemoryTest.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/java/org/apache/eagle/service/alert/resource/impl/InMemoryTest.java
@@ -18,9 +18,11 @@ package org.apache.eagle.service.alert.resource.impl;
 
 import org.apache.eagle.alert.engine.coordinator.PolicyDefinition;
 import org.apache.eagle.alert.metadata.impl.InMemMetadataDaoImpl;
-import org.apache.eagle.alert.metadata.resource.IMetadataDao;
+import org.apache.eagle.alert.metadata.impl.MetadataDaoFactory;
+import org.apache.eagle.alert.metadata.IMetadataDao;
 import org.junit.Assert;
 import org.junit.Test;
+import org.slf4j.LoggerFactory;
 
 import com.typesafe.config.ConfigFactory;
 
@@ -34,6 +36,11 @@ public class InMemoryTest {
 
     @Test
     public void test_AddPolicy() {
+        
+        LoggerFactory.getLogger(InMemoryTest.class);
+        
+        MetadataDaoFactory.getInstance().getMetadataDao();
+        
         PolicyDefinition pd = new PolicyDefinition();
         pd.setName("pd1");
         dao.addPolicy(pd);

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/java/org/apache/eagle/service/alert/resource/impl/JdbcImplTest.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/java/org/apache/eagle/service/alert/resource/impl/JdbcImplTest.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/java/org/apache/eagle/service/alert/resource/impl/JdbcImplTest.java
new file mode 100644
index 0000000..1a78109
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/java/org/apache/eagle/service/alert/resource/impl/JdbcImplTest.java
@@ -0,0 +1,167 @@
+/*
+ * 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.service.alert.resource.impl;
+
+import java.io.IOException;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.eagle.alert.coordination.model.Kafka2TupleMetadata;
+import org.apache.eagle.alert.coordination.model.ScheduleState;
+import org.apache.eagle.alert.coordination.model.internal.PolicyAssignment;
+import org.apache.eagle.alert.coordination.model.internal.Topology;
+import org.apache.eagle.alert.engine.coordinator.PolicyDefinition;
+import org.apache.eagle.alert.engine.coordinator.Publishment;
+import org.apache.eagle.alert.engine.coordinator.PublishmentType;
+import org.apache.eagle.alert.engine.coordinator.StreamingCluster;
+import org.apache.eagle.alert.metadata.IMetadataDao;
+import org.apache.eagle.alert.metadata.impl.JdbcMetadataDaoImpl;
+import org.apache.eagle.alert.metadata.resource.OpResult;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.typesafe.config.Config;
+import com.typesafe.config.ConfigFactory;
+
+public class JdbcImplTest {
+    private static Logger LOG = LoggerFactory.getLogger(JdbcImplTest.class);
+    static IMetadataDao dao;
+
+    @BeforeClass
+    public static void setup() {
+        System.setProperty("config.resource", "/application-mysql.conf");
+        ConfigFactory.invalidateCaches();
+        Config config = ConfigFactory.load().getConfig("datastore");
+        dao = new JdbcMetadataDaoImpl(config);
+    }
+
+    @AfterClass
+    public static void teardown() {
+        if (dao != null) {
+            try {
+                dao.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    private String TOPO_NAME = "topoName";
+
+    @Ignore @Test
+    public void test_apis() {
+        // publishment
+        {
+            Publishment publishment = new Publishment();
+            publishment.setName("pub-");
+            OpResult result = dao.addPublishment(publishment);
+            Assert.assertEquals(200, result.code);
+            List<Publishment> assigns = dao.listPublishment();
+            Assert.assertEquals(1, assigns.size());
+            result = dao.removePublishment("pub-");
+            Assert.assertTrue(200 == result.code);
+        }
+        // topology
+        {
+            OpResult result = dao.addTopology(new Topology(TOPO_NAME, 3, 5));
+            System.out.println(result.message);
+            Assert.assertEquals(200, result.code);
+            List<Topology> topos = dao.listTopologies();
+            Assert.assertEquals(1, topos.size());
+            // add again: replace existing one
+            result = dao.addTopology(new Topology(TOPO_NAME, 4, 5));
+            topos = dao.listTopologies();
+            Assert.assertEquals(1, topos.size());
+            Assert.assertEquals(TOPO_NAME, topos.get(0).getName());
+            Assert.assertEquals(4, topos.get(0).getNumOfGroupBolt());
+        }
+        // assignment
+        {
+            PolicyAssignment assignment = new PolicyAssignment();
+            assignment.setPolicyName("policy1");
+            OpResult result = dao.addAssignment(assignment);
+            Assert.assertEquals(200, result.code);
+            List<PolicyAssignment> assigns = dao.listAssignments();
+            Assert.assertEquals(1, assigns.size());
+        }
+        // cluster
+        {
+            StreamingCluster cluster = new StreamingCluster();
+            cluster.setName("dd");
+            OpResult result = dao.addCluster(cluster);
+            Assert.assertEquals(200, result.code);
+            List<StreamingCluster> assigns = dao.listClusters();
+            Assert.assertEquals(1, assigns.size());
+        }
+        // data source
+        {
+            Kafka2TupleMetadata dataSource = new Kafka2TupleMetadata();
+            dataSource.setName("ds");
+            OpResult result = dao.addDataSource(dataSource);
+            Assert.assertEquals(200, result.code);
+            List<Kafka2TupleMetadata> assigns = dao.listDataSources();
+            Assert.assertEquals(1, assigns.size());
+        }
+        // policy
+        {
+            PolicyDefinition policy = new PolicyDefinition();
+            policy.setName("ds");
+            OpResult result = dao.addPolicy(policy);
+            Assert.assertEquals(200, result.code);
+            List<PolicyDefinition> assigns = dao.listPolicies();
+            Assert.assertEquals(1, assigns.size());
+        }
+
+        // publishmentType
+        {
+            PublishmentType publishmentType = new PublishmentType();
+            publishmentType.setType("KAFKA");
+            OpResult result = dao.addPublishmentType(publishmentType);
+            Assert.assertEquals(200, result.code);
+            List<PublishmentType> assigns = dao.listPublishmentType();
+            Assert.assertEquals(1, assigns.size());
+        }
+    }
+
+    private void test_addstate() {
+        ScheduleState state = new ScheduleState();
+        String versionId = "state-" + System.currentTimeMillis();
+        state.setVersion(versionId);
+        state.setGenerateTime(String.valueOf(new Date().getTime()));
+        OpResult result = dao.addScheduleState(state);
+        Assert.assertEquals(200, result.code);
+        state = dao.getScheduleState();
+        Assert.assertEquals(state.getVersion(), versionId);
+    }
+
+    @Ignore @Test
+    public void test_readCurrentState() {
+        test_addstate();
+        ScheduleState state = dao.getScheduleState();
+        Assert.assertNotNull(state);
+
+        LOG.debug(state.getVersion());
+        LOG.debug(state.getGenerateTime());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/java/org/apache/eagle/service/alert/resource/impl/MongoImplTest.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/java/org/apache/eagle/service/alert/resource/impl/MongoImplTest.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/java/org/apache/eagle/service/alert/resource/impl/MongoImplTest.java
index afdd91d..e63353b 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/java/org/apache/eagle/service/alert/resource/impl/MongoImplTest.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/java/org/apache/eagle/service/alert/resource/impl/MongoImplTest.java
@@ -28,7 +28,7 @@ import org.apache.eagle.alert.engine.coordinator.Publishment;
 import org.apache.eagle.alert.engine.coordinator.PublishmentType;
 import org.apache.eagle.alert.engine.coordinator.StreamingCluster;
 import org.apache.eagle.alert.metadata.impl.MongoMetadataDaoImpl;
-import org.apache.eagle.alert.metadata.resource.IMetadataDao;
+import org.apache.eagle.alert.metadata.IMetadataDao;
 import org.apache.eagle.alert.metadata.resource.OpResult;
 import org.junit.AfterClass;
 import org.junit.Assert;

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/resources/application-mysql.conf
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/resources/application-mysql.conf b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/resources/application-mysql.conf
new file mode 100644
index 0000000..55a7121
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/resources/application-mysql.conf
@@ -0,0 +1,22 @@
+# 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.
+
+{
+  "datastore": {
+    "metadataDao": "org.apache.eagle.alert.metadata.impl.JdbcMetadataDaoImpl",
+    "connection": "jdbc:mysql://localhost:3306/alert_metadata?user=root&password=&createDatabaseIfNotExist=true",
+    "database": "alert_metadata"
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/resources/application.conf
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/resources/application.conf b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/resources/application.conf
new file mode 100644
index 0000000..7213a9f
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/alert-metadata/src/test/resources/application.conf
@@ -0,0 +1,24 @@
+# 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.
+
+
+{
+	"datastore": {
+		"metadataDao": "org.apache.eagle.alert.metadata.impl.InMemMetadataDaoImpl",
+		"connection": "localhost:27017",
+		"properties" : {
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/pom.xml
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/pom.xml b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/pom.xml
index c54825c..1d4b33d 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/pom.xml
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-metadata-parent/pom.xml
@@ -10,7 +10,8 @@
 	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ~ See the 
 	License for the specific language governing permissions and ~ limitations 
 	under the License. -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 
 	<parent>

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-service/pom.xml
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-service/pom.xml b/eagle-core/eagle-alert-parent/eagle-alert/alert-service/pom.xml
new file mode 100644
index 0000000..1cab431
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-service/pom.xml
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- ~ 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. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<parent>
+		<artifactId>eagle-alert</artifactId>
+		<groupId>org.apache.eagle</groupId>
+		<version>0.5.0-incubating-SNAPSHOT</version>
+	</parent>
+	<modelVersion>4.0.0</modelVersion>
+
+	<artifactId>alert-service</artifactId>
+	<description>Alert Service: Coordinator + Metadata</description>
+	<packaging>jar</packaging>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.eagle</groupId>
+			<artifactId>alert-coordinator</artifactId>
+			<version>${project.version}</version>
+			<exclusions>
+				<exclusion>
+					<groupId>org.slf4j</groupId>
+					<artifactId>slf4j-log4j12</artifactId>
+				</exclusion>
+				<exclusion>
+					<artifactId>storm-core</artifactId>
+					<groupId>org.apache.storm</groupId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.eagle</groupId>
+			<artifactId>alert-metadata-service</artifactId>
+			<version>${project.version}</version>
+			<exclusions>
+				<exclusion>
+					<groupId>org.slf4j</groupId>
+					<artifactId>slf4j-log4j12</artifactId>
+				</exclusion>
+				<exclusion>
+					<artifactId>storm-core</artifactId>
+					<groupId>org.apache.storm</groupId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+
+		<dependency>
+			<groupId>com.sun.jersey</groupId>
+			<artifactId>jersey-json</artifactId>
+		</dependency>
+		<!-- dropwizard -->
+		<dependency>
+			<groupId>io.dropwizard</groupId>
+			<artifactId>dropwizard-core</artifactId>
+			<exclusions>
+				<exclusion>
+					<groupId>org.slf4j</groupId>
+					<artifactId>slf4j-log4j12</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>io.dropwizard</groupId>
+			<artifactId>dropwizard-jersey</artifactId>
+			<exclusions>
+				<exclusion>
+					<groupId>org.slf4j</groupId>
+					<artifactId>slf4j-log4j12</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>io.swagger</groupId>
+			<artifactId>swagger-jersey-jaxrs</artifactId>
+			<scope>compile</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>com.sun.jersey</groupId>
+					<artifactId>*</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+	</dependencies>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.jetty</groupId>
+				<artifactId>jetty-maven-plugin</artifactId>
+				<version>9.2.11.v20150529</version>
+				<configuration>
+					<scanIntervalSeconds>5</scanIntervalSeconds>
+				</configuration>
+			</plugin>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-shade-plugin</artifactId>
+				<version>1.4</version>
+				<configuration>
+					<filters>
+						<filter>
+							<artifact>*:*</artifact>
+							<excludes>
+								<exclude>META-INF/*.SF</exclude>
+								<exclude>META-INF/*.DSA</exclude>
+								<exclude>META-INF/*.RSA</exclude>
+							</excludes>
+						</filter>
+					</filters>
+				</configuration>
+				<executions>
+					<execution>
+						<phase>package</phase>
+						<goals>
+							<goal>shade</goal>
+						</goals>
+
+						<configuration>
+							<shadedArtifactAttached>true</shadedArtifactAttached>
+							<shadedClassifierName>shaded</shadedClassifierName>
+							<transformers>
+								<transformer
+									implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
+								<transformer
+									implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+									<mainClass>org.apache.eagle.service.app.ServiceApp</mainClass>
+								</transformer>
+							</transformers>
+
+							<artifactSet>
+								<excludes>
+									<exclude>org.slf4j:slf4j-log4j12</exclude>
+								</excludes>
+							</artifactSet>
+
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+
+			<!-- change project to war, and use maven-war-plugin to build the war -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-war-plugin</artifactId>
+				<version>2.6</version>
+				<executions>
+					<execution>
+						<phase>package</phase>
+						<goals>
+							<goal>war</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+
+		</plugins>
+	</build>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/java/org/apache/eagle/service/app/AlertDropWizardConfiguration.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/java/org/apache/eagle/service/app/AlertDropWizardConfiguration.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/java/org/apache/eagle/service/app/AlertDropWizardConfiguration.java
new file mode 100644
index 0000000..1d7a70d
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/java/org/apache/eagle/service/app/AlertDropWizardConfiguration.java
@@ -0,0 +1,27 @@
+/*
+ * 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.service.app;
+
+import io.dropwizard.Configuration;
+
+/**
+ * @since Jun 27, 2016
+ *
+ */
+public class AlertDropWizardConfiguration extends Configuration {
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/java/org/apache/eagle/service/app/ServiceApp.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/java/org/apache/eagle/service/app/ServiceApp.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/java/org/apache/eagle/service/app/ServiceApp.java
new file mode 100644
index 0000000..f89ff68
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/java/org/apache/eagle/service/app/ServiceApp.java
@@ -0,0 +1,84 @@
+/*
+ * 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.service.app;
+
+import io.dropwizard.Application;
+import io.dropwizard.setup.Bootstrap;
+import io.dropwizard.setup.Environment;
+import io.swagger.jaxrs.config.BeanConfig;
+import io.swagger.jaxrs.listing.ApiListingResource;
+
+import java.util.EnumSet;
+
+import javax.servlet.DispatcherType;
+
+import org.apache.eagle.alert.coordinator.CoordinatorListener;
+import org.apache.eagle.alert.coordinator.resource.CoordinatorResource;
+import org.apache.eagle.alert.resource.SimpleCORSFiler;
+import org.apache.eagle.service.metadata.resource.MetadataResource;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+/**
+ * @since Jun 27, 2016
+ *
+ */
+public class ServiceApp extends Application<AlertDropWizardConfiguration> {
+
+    public static void main(String[] args) throws Exception {
+        new ServiceApp().run(args);
+    }
+
+    @Override
+    public String getName() {
+        return "alert-engine metadata server and coordinator server!";
+    }
+
+    @Override
+    public void initialize(Bootstrap<AlertDropWizardConfiguration> bootstrap) {
+    }
+
+    @Override
+    public void run(AlertDropWizardConfiguration configuration, Environment environment) throws Exception {
+        environment.getApplicationContext().setContextPath("/rest");
+        environment.getObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
+
+        MetadataResource resource = new MetadataResource();
+        environment.jersey().register(resource);
+
+        CoordinatorResource coorResource = new CoordinatorResource();
+        environment.jersey().register(coorResource);
+
+        // swagger resources
+        environment.jersey().register(new ApiListingResource());
+        BeanConfig swaggerConfig = new BeanConfig();
+        swaggerConfig.setTitle("Alert engine service: metadata and coordinator");
+        swaggerConfig.setVersion("v1.2");
+        swaggerConfig.setBasePath("/rest");
+        swaggerConfig
+                .setResourcePackage("org.apache.eagle.alert.coordinator.resource,org.apache.eagle.service.metadata.resource");
+        swaggerConfig.setScan(true);
+
+        // simple CORS filter
+        environment.servlets().addFilter("corsFilter", new SimpleCORSFiler())
+                .addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
+
+        // context listener
+        environment.servlets().addServletListeners(new CoordinatorListener());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/resources/application.conf
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/resources/application.conf b/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/resources/application.conf
new file mode 100644
index 0000000..c04a4ab
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/resources/application.conf
@@ -0,0 +1,45 @@
+# 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.
+
+{
+	"coordinator" : {
+		"policiesPerBolt" : 5,
+		"boltParallelism" : 5,
+		"policyDefaultParallelism" : 5,
+		"boltLoadUpbound": 0.8,
+		"topologyLoadUpbound" : 0.8,
+		"numOfAlertBoltsPerTopology" : 5,
+		"zkConfig" : {
+			"zkQuorum" : "127.0.0.1:2181",
+			"zkRoot" : "/alert",
+			"zkSessionTimeoutMs" : 10000,
+			"connectionTimeoutMs" : 10000,
+			"zkRetryTimes" : 3,
+			"zkRetryInterval" : 3000
+		},
+		"metadataService" : {
+			"host" : "localhost",
+			"port" : 8080,
+			"context" : "/rest"
+		},
+		"metadataDynamicCheck" : {
+			"initDelayMillis" : 1000,
+			"delayMillis" : 30000
+		}
+	},
+	"datastore": {
+		"metadataDao": "org.apache.eagle.alert.metadata.impl.InMemMetadataDaoImpl"
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/resources/log4j.properties b/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/resources/log4j.properties
new file mode 100644
index 0000000..d4bc126
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/resources/log4j.properties
@@ -0,0 +1,21 @@
+# 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.
+
+log4j.rootLogger=INFO, stdout
+
+# standard output
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %p [%t] %c{2}[%L]: %m%n

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/webapp/WEB-INF/web.xml b/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..c8c4707
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+<web-app xmlns="http://java.sun.com/xml/ns/javaee"
+           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
+		  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+           version="3.0">
+    <welcome-file-list>
+        <welcome-file>index.html</welcome-file>
+    </welcome-file-list>
+    
+    <listener>
+    	<listener-class>org.apache.eagle.alert.coordinator.CoordinatorListener</listener-class>
+    </listener>
+    
+    <servlet>
+        <servlet-name>Jersey Web Application</servlet-name>
+        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
+        <init-param>
+            <param-name>com.sun.jersey.config.property.packages</param-name>
+            <param-value>io.swagger.jaxrs.json,io.swagger.jaxrs.listing,org.apache.eagle,org.codehaus.jackson.jaxrs</param-value>
+        </init-param>
+        <init-param>
+            <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
+            <param-value>com.sun.jersey.api.container.filter.GZIPContentEncodingFilter;com.sun.jersey.api.container.filter.PostReplaceFilter</param-value>
+        </init-param>
+        <init-param>
+            <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
+            <param-value>com.sun.jersey.api.container.filter.GZIPContentEncodingFilter</param-value>
+        </init-param>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+    <!-- Servlet for swagger initialization only, no URL mapping. -->
+	<servlet>
+		<servlet-name>swaggerConfig</servlet-name>
+		<servlet-class>io.swagger.jaxrs.config.DefaultJaxrsConfig</servlet-class>
+		<init-param>
+			<param-name>api.version</param-name>
+			<param-value>1.0.0</param-value>
+		</init-param>
+		<init-param>
+			<param-name>swagger.api.basepath</param-name>
+			<param-value>/rest</param-value>
+		</init-param>
+		<load-on-startup>2</load-on-startup>
+	</servlet>
+    <servlet-mapping>
+        <servlet-name>Jersey Web Application</servlet-name>
+        <url-pattern>/rest/*</url-pattern>
+    </servlet-mapping>
+    <filter>
+        <filter-name>CorsFilter</filter-name>
+        <!-- this should be replaced by tomcat ones, see also metadata resource -->
+        <filter-class>org.apache.eagle.alert.resource.SimpleCORSFiler</filter-class>
+        <init-param>
+            <param-name>cors.allowed.origins</param-name>
+            <param-value>*</param-value>
+        </init-param>
+        <init-param>
+            <param-name>cors.allowed.headers</param-name>
+            <param-value>Authorization,Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With, Accept</param-value>
+        </init-param>
+        <init-param>
+            <param-name>cors.allowed.methods</param-name>
+            <param-value>GET,POST,HEAD,OPTIONS,PUT,DELETE</param-value>
+        </init-param>
+        <init-param>
+            <param-name>cors.support.credentials</param-name>
+            <param-value>true</param-value>
+        </init-param>
+    </filter>
+    <filter-mapping>
+        <filter-name>CorsFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+</web-app>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/webapp/index.html
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/webapp/index.html b/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/webapp/index.html
new file mode 100644
index 0000000..ef8bf54
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-service/src/main/webapp/index.html
@@ -0,0 +1,19 @@
+<!--
+  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.
+  -->
+
+Alert Services: Coordinator + Metadata Service
\ No newline at end of file


[4/6] incubator-eagle git commit: Rebase code base

Posted by ha...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/FloatSerializer.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/FloatSerializer.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/FloatSerializer.java
index 18089a9..e6b510a 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/FloatSerializer.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/FloatSerializer.java
@@ -1,11 +1,11 @@
 package org.apache.eagle.alert.engine.serialization.impl;
 
-import org.apache.eagle.alert.engine.serialization.Serializer;
-
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
 
+import org.apache.eagle.alert.engine.serialization.Serializer;
+
 /**
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/IntegerSerializer.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/IntegerSerializer.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/IntegerSerializer.java
index d2473a9..f784456 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/IntegerSerializer.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/IntegerSerializer.java
@@ -1,11 +1,11 @@
 package org.apache.eagle.alert.engine.serialization.impl;
 
-import org.apache.eagle.alert.engine.serialization.Serializer;
-
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
 
+import org.apache.eagle.alert.engine.serialization.Serializer;
+
 /**
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/JavaObjectSerializer.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/JavaObjectSerializer.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/JavaObjectSerializer.java
index 76d2294..39baf2b 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/JavaObjectSerializer.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/JavaObjectSerializer.java
@@ -16,14 +16,14 @@
  */
 package org.apache.eagle.alert.engine.serialization.impl;
 
-import org.apache.commons.lang3.SerializationUtils;
-import org.apache.eagle.alert.engine.serialization.Serializer;
-
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
 import java.io.Serializable;
 
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.eagle.alert.engine.serialization.Serializer;
+
 public class JavaObjectSerializer implements Serializer<Object> {
     @Override
     public void serialize(Object value, DataOutput dataOutput) throws IOException {

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/LongSerializer.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/LongSerializer.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/LongSerializer.java
index 8d85c76..116b275 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/LongSerializer.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/LongSerializer.java
@@ -1,11 +1,11 @@
 package org.apache.eagle.alert.engine.serialization.impl;
 
-import org.apache.eagle.alert.engine.serialization.Serializer;
-
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
 
+import org.apache.eagle.alert.engine.serialization.Serializer;
+
 /**
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/PartitionedEventSerializerImpl.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/PartitionedEventSerializerImpl.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/PartitionedEventSerializerImpl.java
index 714920e..5a3d77d 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/PartitionedEventSerializerImpl.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/PartitionedEventSerializerImpl.java
@@ -16,8 +16,10 @@
  */
 package org.apache.eagle.alert.engine.serialization.impl;
 
-import com.google.common.io.ByteArrayDataOutput;
-import com.google.common.io.ByteStreams;
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
 import org.apache.eagle.alert.engine.coordinator.StreamPartition;
 import org.apache.eagle.alert.engine.model.PartitionedEvent;
 import org.apache.eagle.alert.engine.model.StreamEvent;
@@ -26,7 +28,8 @@ import org.apache.eagle.alert.engine.serialization.SerializationMetadataProvider
 import org.apache.eagle.alert.engine.serialization.Serializer;
 import org.apache.eagle.alert.engine.utils.CompressionUtils;
 
-import java.io.*;
+import com.google.common.io.ByteArrayDataOutput;
+import com.google.common.io.ByteStreams;
 
 /**
  * Stream Metadata Cached Serializer

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StreamEventSerializer.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StreamEventSerializer.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StreamEventSerializer.java
index 113816f..0fb686b 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StreamEventSerializer.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StreamEventSerializer.java
@@ -16,6 +16,11 @@
  */
 package org.apache.eagle.alert.engine.serialization.impl;
 
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.BitSet;
+
 import org.apache.eagle.alert.engine.coordinator.StreamColumn;
 import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
 import org.apache.eagle.alert.engine.model.StreamEvent;
@@ -23,11 +28,6 @@ import org.apache.eagle.alert.engine.serialization.SerializationMetadataProvider
 import org.apache.eagle.alert.engine.serialization.Serializer;
 import org.apache.eagle.alert.engine.serialization.Serializers;
 
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.util.BitSet;
-
 /**
  * @see StreamEvent
  */

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StreamPartitionDigestSerializer.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StreamPartitionDigestSerializer.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StreamPartitionDigestSerializer.java
index 1268cb8..f35da39 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StreamPartitionDigestSerializer.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StreamPartitionDigestSerializer.java
@@ -16,13 +16,19 @@
  */
 package org.apache.eagle.alert.engine.serialization.impl;
 
-import org.apache.eagle.alert.engine.coordinator.StreamPartition;
-import org.apache.eagle.alert.engine.serialization.Serializer;
-
-import java.io.*;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
-import java.util.*;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.eagle.alert.engine.coordinator.StreamPartition;
+import org.apache.eagle.alert.engine.serialization.Serializer;
 
 /**
  * Don't serialize streamId

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StreamPartitionSerializer.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StreamPartitionSerializer.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StreamPartitionSerializer.java
index 67de517..4105277 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StreamPartitionSerializer.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StreamPartitionSerializer.java
@@ -16,16 +16,16 @@
  */
 package org.apache.eagle.alert.engine.serialization.impl;
 
-import org.apache.eagle.alert.engine.coordinator.StreamPartition;
-import org.apache.eagle.alert.engine.coordinator.StreamSortSpec;
-import org.apache.eagle.alert.engine.serialization.Serializer;
-
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.eagle.alert.engine.coordinator.StreamPartition;
+import org.apache.eagle.alert.engine.coordinator.StreamSortSpec;
+import org.apache.eagle.alert.engine.serialization.Serializer;
+
 /**
  * Don't serialize streamId
  *

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StringSerializer.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StringSerializer.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StringSerializer.java
index 2a1541a..940024d 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StringSerializer.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/StringSerializer.java
@@ -1,11 +1,11 @@
 package org.apache.eagle.alert.engine.serialization.impl;
 
-import org.apache.eagle.alert.engine.serialization.Serializer;
-
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
 
+import org.apache.eagle.alert.engine.serialization.Serializer;
+
 /**
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/CorrelationSpout.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/CorrelationSpout.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/CorrelationSpout.java
index cd23405..f54d5cd 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/CorrelationSpout.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/CorrelationSpout.java
@@ -304,7 +304,12 @@ public class CorrelationSpout extends BaseRichSpout implements SpoutSpecListener
     protected KafkaSpoutWrapper createKafkaSpout(Map conf, TopologyContext context, SpoutOutputCollector collector, final String topic,
                                                  String schemeClsName, SpoutSpec spoutSpec, Map<String, StreamDefinition> sds) throws Exception{
         String kafkaBrokerZkQuorum = config.getString("spout.kafkaBrokerZkQuorum");
-        BrokerHosts hosts = new ZkHosts(kafkaBrokerZkQuorum);
+        BrokerHosts hosts = null;
+        if (config.hasPath("spout.kafkaBrokerZkBasePath")) {
+            hosts = new ZkHosts(kafkaBrokerZkQuorum, config.getString("spout.kafkaBrokerZkBasePath"));
+        } else {
+            hosts = new ZkHosts(kafkaBrokerZkQuorum);
+        }
         String transactionZkRoot = DEFAULT_STORM_KAFKA_TRANSACTION_ZK_ROOT;
         if(config.hasPath("spout.stormKafkaTransactionZkPath")) {
             transactionZkRoot = config.getString("spout.stormKafkaTransactionZkPath");
@@ -335,10 +340,14 @@ public class CorrelationSpout extends BaseRichSpout implements SpoutSpecListener
             spoutConfig.startOffsetTime = config.getInt("spout.stormKafkaStartOffsetTime");
         }
 
-        spoutConfig.scheme = new SchemeAsMultiScheme(SchemeBuilder.buildFromClsName(schemeClsName, topic));
+        spoutConfig.scheme = new SchemeAsMultiScheme(SchemeBuilder.buildFromClsName(schemeClsName, topic, conf));
         KafkaSpoutWrapper wrapper = new KafkaSpoutWrapper(spoutConfig, kafkaSpoutMetric);
         SpoutOutputCollectorWrapper collectorWrapper = new SpoutOutputCollectorWrapper(this, collector, topic, spoutSpec, numOfRouterBolts, sds,this.serializer);
         wrapper.open(conf, context, collectorWrapper);
+        
+        if (LOG.isInfoEnabled()) {
+            LOG.info("create and open kafka wrapper: topic {}, scheme class{} ", topic, schemeClsName);
+        }
         return wrapper;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/CreateTopicUtils.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/CreateTopicUtils.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/CreateTopicUtils.java
index a2c9219..7e0dd3f 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/CreateTopicUtils.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/CreateTopicUtils.java
@@ -21,23 +21,34 @@ package org.apache.eagle.alert.engine.spout;
 import java.util.Properties;
 
 import kafka.admin.AdminUtils;
+import kafka.admin.RackAwareMode;
 import kafka.utils.ZKStringSerializer$;
+import kafka.utils.ZkUtils;
 
 import org.I0Itec.zkclient.ZkClient;
+import org.I0Itec.zkclient.ZkConnection;
 import org.slf4j.Logger;
 
 /**
  * normally this is used in unit test for convenience
  */
 public class CreateTopicUtils {
+
     private static final Logger LOG = org.slf4j.LoggerFactory.getLogger(CreateTopicUtils.class);
+
     private static final int partitions = 2;
     private static final int replicationFactor = 1;
-    public static void ensureTopicReady(String zkQuorum, String topic){
+
+    public static void ensureTopicReady(String zkQuorum, String topic) {
+        ZkConnection zkConnection = new ZkConnection(zkQuorum);
         ZkClient zkClient = new ZkClient(zkQuorum, 10000, 10000, ZKStringSerializer$.MODULE$);
-        if(!AdminUtils.topicExists(zkClient, topic)) {
-            LOG.info("create topic " + topic + " with partitions " + partitions + ", and replicationFactor " + replicationFactor);
-            AdminUtils.createTopic(zkClient, topic, partitions, replicationFactor, new Properties());
+        ZkUtils zkUtils = new ZkUtils(zkClient, zkConnection, false);
+        if (!AdminUtils.topicExists(zkUtils, topic)) {
+            LOG.info("create topic " + topic + " with partitions " + partitions + ", and replicationFactor "
+                    + replicationFactor);
+            AdminUtils.createTopic(zkUtils, topic, partitions, replicationFactor, new Properties(),
+                    RackAwareMode.Disabled$.MODULE$);
         }
     }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/SchemeBuilder.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/SchemeBuilder.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/SchemeBuilder.java
index 223f1b5..bfd5da7 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/SchemeBuilder.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/spout/SchemeBuilder.java
@@ -19,6 +19,8 @@
 
 package org.apache.eagle.alert.engine.spout;
 
+import java.util.Map;
+
 import backtype.storm.spout.Scheme;
 
 
@@ -28,8 +30,10 @@ import backtype.storm.spout.Scheme;
  * 2) has one constructor with topic name as parameter
  */
 public class SchemeBuilder {
-    public static Scheme buildFromClsName(String clsName, String topic) throws Exception{
-        Object o = Class.forName(clsName).getConstructor(String.class).newInstance(topic);
+
+    @SuppressWarnings("rawtypes")
+    public static Scheme buildFromClsName(String clsName, String topic, Map conf) throws Exception{
+        Object o = Class.forName(clsName).getConstructor(String.class, Map.class).newInstance(topic, conf);
         return (Scheme)o;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/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
index b37f7b3..2f7cc68 100644
--- 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
@@ -18,7 +18,6 @@
  */
 package org.apache.eagle.alert.engine.spout;
 
-import java.io.IOException;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -112,7 +111,7 @@ public class SpoutOutputCollectorWrapper extends SpoutOutputCollector implements
         Object streamId = convertedTuple.get(1);
 
         StreamDefinition sd = sds.get(streamId);
-        if(sd == null){
+        if (sd == null) {
             LOG.warn("StreamDefinition {} is not found within {}, ignore this message", streamId, sds);
             spout.ack(newMessageId);
             return null;
@@ -141,17 +140,17 @@ public class SpoutOutputCollectorWrapper extends SpoutOutputCollector implements
                     }
                     // send message to StreamRouterBolt
                     PartitionedEvent pEvent = new PartitionedEvent(event, groupingStrategy.partition, hash);
-                    if(this.serializer == null){
-                         delegate.emit(sid, Collections.singletonList(pEvent), newMessageId);
-                    }else {
+                    if (this.serializer == null) {
+                        delegate.emit(sid, Collections.singletonList(pEvent), newMessageId);
+                    } else {
                         try {
                             delegate.emit(sid, Collections.singletonList(serializer.serialize(pEvent)), newMessageId);
-                        } catch (IOException e) {
-                            LOG.error("Failed to serialize {}", pEvent, e);
-                            throw new RuntimeException(e);
+                        } catch (Exception e) {
+                            LOG.error("Failed to serialize {}, this message would be ignored!", pEvent, e);
+                            spout.ack(newMessageId);
                         }
                     }
-                }else{
+                } 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.

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/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
index f526cad..0fbe7b3 100644
--- 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
@@ -16,12 +16,15 @@
  */
 package org.apache.eagle.alert.engine.utils;
 
-import com.google.common.io.ByteStreams;
-
-import java.io.*;
+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;
 
+import com.google.common.io.ByteStreams;
+
 
 public class CompressionUtils {
     public static byte[] compress(byte[] source) throws IOException {

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/application.conf
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/application.conf b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/application.conf
index bfb5f54..e3be1b7 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/application.conf
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/application.conf
@@ -24,7 +24,7 @@
     "localMode" : "true"
   },
   "spout" : {
-    "kafkaBrokerZkQuorum": "sandbox.hortonworks.com:2181",
+    "kafkaBrokerZkQuorum": "10.254.194.245:2181",
     "kafkaBrokerZkBasePath": "/brokers",
     "stormKafkaUseSameZkQuorumWithKafkaBroker": true,
     "stormKafkaTransactionZkQuorum": "",
@@ -34,8 +34,8 @@
     "stormKafkaFetchSizeBytes": 1048586,
   },
   "zkConfig" : {
-    "zkQuorum" : "sandbox.hortonworks.com:2181",
-    "zkRoot" : "/alert",
+    "zkQuorum" : "10.254.194.245:2181",
+    "zkRoot" : "/kafka",
     "zkSessionTimeoutMs" : 10000,
     "connectionTimeoutMs" : 10000,
     "zkRetryTimes" : 3,
@@ -47,21 +47,21 @@
   },
   "metadataService": {
     "context" : "/rest",
-    "host" : "localhost",
-    "port" : 58080
+    "host" : "127.0.0.1",
+    "port" : 8080
   },
   "coordinatorService": {
     "host": "localhost",
-    "port": 58080,
+    "port": 9090,
     "context" : "/rest"
   }
   "metric":{
     "sink": {
-//      "kafka": {
-//        "topic": "alert_metric"
-//        "bootstrap.servers": "localhost:6667"
-//      }
-      "stdout": {}
+      // "kafka": {
+      //  "topic": "alert_metric"
+      //  "bootstrap.servers": "localhost:6667"
+      // }
+      //      "stdout": {}
       //      "elasticsearch": {
       //        "hosts": ["localhost:9200"]
       //        "index": "alert_metric"

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/log4j.properties b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/log4j.properties
index af99e2c..5e3d3b1 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/log4j.properties
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/resources/log4j.properties
@@ -21,6 +21,7 @@ log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %p [%t] %c{2}[%L]: %m%n
 
 ##log4j.logger.org.apache.eagle.alert.engine.spout.CorrelationSpout=DEBUG
+log4j.logger.org.apache.eagle.alert.metric=ERROR
 log4j.logger.org.apache.eagle.alert.engine.spout.SpoutOutputCollectorWrapper=DEBUG
 log4j.logger.org.apache.eagle.alert.engine.router.impl.StreamRouterBoltOutputCollector=DEBUG
 log4j.logger.org.apache.eagle.alert.engine.sorter.impl.StreamSortWindowHandlerImpl=DEBUG
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/Integration1.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/Integration1.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/Integration1.java
index 057aa73..927dfd7 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/Integration1.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/Integration1.java
@@ -17,11 +17,20 @@
 package org.apache.eagle.alert.engine.e2e;
 
 import java.util.List;
-import java.util.concurrent.ExecutionException;
+import java.util.Properties;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
 
+import kafka.admin.AdminUtils;
+import kafka.admin.RackAwareMode;
+import kafka.utils.ZKStringSerializer$;
+import kafka.utils.ZkUtils;
+
+import org.I0Itec.zkclient.ZkClient;
+import org.I0Itec.zkclient.ZkConnection;
+import org.apache.eagle.alert.config.ZKConfig;
+import org.apache.eagle.alert.config.ZKConfigBuilder;
 import org.apache.eagle.alert.coordination.model.Kafka2TupleMetadata;
 import org.apache.eagle.alert.coordination.model.internal.Topology;
 import org.apache.eagle.alert.engine.UnitTopologyMain;
@@ -30,7 +39,10 @@ import org.apache.eagle.alert.engine.coordinator.Publishment;
 import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
 import org.apache.eagle.alert.service.IMetadataServiceClient;
 import org.apache.eagle.alert.service.MetadataServiceClientImpl;
+import org.apache.eagle.alert.utils.KafkaEmbedded;
+import org.junit.AfterClass;
 import org.junit.Assert;
+import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -53,6 +65,7 @@ import com.typesafe.config.ConfigFactory;
  *
  */
 public class Integration1 {
+    private static final String SIMPLE_CONFIG = "/simple/application-integration.conf";
     private static final Logger LOG = LoggerFactory.getLogger(Integration1.class);
     private static final ObjectMapper om = new ObjectMapper();
 
@@ -61,16 +74,36 @@ public class Integration1 {
         inte.args = args;
         inte.test_simple_threshhold();
     }
-    
+
     private String[] args;
-    private ExecutorService executors = Executors.newFixedThreadPool(5);
+    private ExecutorService executors = Executors.newFixedThreadPool(5, new ThreadFactory() {
+        
+        @Override
+        public Thread newThread(Runnable r) {
+            Thread t = new Thread();
+            t.setDaemon(true);
+            return t;
+        }
+    });
+    private static KafkaEmbedded kafka;
+
+    @BeforeClass
+    public static void setup() {
+//        kafka = new KafkaEmbedded(9092, 2181);
+//        makeSureTopic("perfmon_metrics");
+    }
+
+    @AfterClass
+    public static void end() {
+        if (kafka != null) {
+            kafka.shutdown();
+        }
+    }
 
     /**
      * Assumption:
      * <p>
-     * start metadata service 8080, better in docker
-     * <p>
-     * start coordinator service 9090, better in docker
+     * start metadata service 8080 /rest
      * <p>
      * datasources : perfmon_datasource
      * <p>
@@ -84,20 +117,29 @@ public class Integration1 {
      * 
      * @throws InterruptedException
      */
-    @Ignore
     @Test
     public void test_simple_threshhold() throws Exception {
-        System.setProperty("config.resource", "/application-integration.conf");
+        System.setProperty("config.resource", SIMPLE_CONFIG);
         ConfigFactory.invalidateCaches();
         Config config = ConfigFactory.load();
 
         System.out.println("loading metadatas...");
-        loadMetadatas("/", config);
+        loadMetadatas("/simple/", config);
         System.out.println("loading metadatas done!");
 
+        if (args == null) {
+            args = new String[] { "-f", "simple/application-integration.conf" };
+        }
+
         executors.submit(() -> SampleClient1.main(args));
 
-        executors.submit(() -> UnitTopologyMain.main(args));
+        executors.submit(() -> { 
+            try {
+                UnitTopologyMain.main(args);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        });
 
         Utils.sleep(1000 * 5l);
         while (true) {
@@ -107,40 +149,20 @@ public class Integration1 {
         }
     }
 
-    /**
-     * Test only run expected when there is a missed config in the config file. mark as ignored
-     * @throws InterruptedException
-     * @throws ExecutionException
-     */
-    @Ignore
-    @Test(expected = ExecutionException.class)
-    public void test_typesafe_config() throws InterruptedException, ExecutionException {
-        System.setProperty("config.resource", "/application-integration.conf");
+    public static void makeSureTopic(String topic) {
+        System.setProperty("config.resource", SIMPLE_CONFIG);
         ConfigFactory.invalidateCaches();
-        Future<?> f = executors.submit(() -> {
-            UnitTopologyMain.main(null);
-        });
+        Config config = ConfigFactory.load();
+        ZKConfig zkconfig = ZKConfigBuilder.getZKConfig(config);
 
-        f.get();
+        ZkClient zkClient = new ZkClient(zkconfig.zkQuorum, 10000, 10000, ZKStringSerializer$.MODULE$);
+        Properties topicConfiguration = new Properties();
+        ZkConnection zkConnection = new ZkConnection(zkconfig.zkQuorum);
+        ZkUtils zkUtils = new ZkUtils(zkClient, zkConnection, false);
+        AdminUtils.createTopic(zkUtils, topic, 1, 1, topicConfiguration, RackAwareMode.Disabled$.MODULE$);
     }
 
-//    @Test
-//    private void makeSureTopic() {
-//        System.setProperty("config.resource", "/application-integration.conf");
-//        ConfigFactory.invalidateCaches();
-//        Config config = ConfigFactory.load();
-//        ZKConfig zkconfig = ZKConfigBuilder.getZKConfig(config);
-//        
-//        CuratorFramework curator = CuratorFrameworkFactory.newClient(
-//                zkconfig.zkQuorum,
-//                zkconfig.zkSessionTimeoutMs,
-//                zkconfig.connectionTimeoutMs,
-//                new RetryNTimes(zkconfig.zkRetryTimes, zkconfig.zkRetryInterval)
-//        );
-//    }
-
     public static void proactive_schedule(Config config) throws Exception {
-
         try (CoordinatorClient cc = new CoordinatorClient(config)) {
             try {
                 String resp = cc.schedule();
@@ -205,7 +227,7 @@ public class Integration1 {
     public void testJson() throws Exception {
         {
             JavaType type = CollectionType.construct(List.class, SimpleType.construct(Topology.class));
-            List<Topology> l = om.readValue(Integration1.class.getResourceAsStream("/topologies.json"),
+            List<Topology> l = om.readValue(Integration1.class.getResourceAsStream("/simple/topologies.json"),
                     type);
             Topology t = (Topology) l.get(0);
 
@@ -216,16 +238,16 @@ public class Integration1 {
         {
             JavaType type = CollectionType.construct(List.class, SimpleType.construct(Publishment.class));
             // publishment
-            List<Publishment> l = om.readValue(Integration1.class.getResourceAsStream("/publishments.json"), type);
+            List<Publishment> l = om.readValue(Integration1.class.getResourceAsStream("/simple/publishments.json"), type);
             Publishment p = l.get(0);
             Assert.assertEquals("KAFKA", p.getType());
         }
         
-        checkAll("/");
+        checkAll("/simple/");
         checkAll("/correlation/");
     }
 
-    private void checkAll(String base) throws Exception {
+    public static void checkAll(String base) throws Exception {
         loadEntities(base + "datasources.json", Kafka2TupleMetadata.class);
         loadEntities(base + "policies.json", PolicyDefinition.class);
         loadEntities(base + "publishments.json", Publishment.class);

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/Integration2.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/Integration2.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/Integration2.java
index 7ea0e7e..a11cc66 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/Integration2.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/Integration2.java
@@ -67,7 +67,12 @@ public class Integration2 {
         Config config = ConfigFactory.load();
         Integration1.loadMetadatas("/correlation/", config);
 
-        executors.submit(() -> UnitTopologyMain.main(args));
+        executors.submit(() -> {
+            try {
+                UnitTopologyMain.main(args);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }});
 
         executors.submit(() -> SampleClient2.main(args));
 

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/Integration4NoDataAlert.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/Integration4NoDataAlert.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/Integration4NoDataAlert.java
new file mode 100644
index 0000000..667d241
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/Integration4NoDataAlert.java
@@ -0,0 +1,95 @@
+/*
+ * 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.e2e;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import org.apache.eagle.alert.engine.UnitTopologyMain;
+import org.apache.eagle.alert.utils.KafkaEmbedded;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import backtype.storm.utils.Utils;
+
+import com.typesafe.config.Config;
+import com.typesafe.config.ConfigFactory;
+
+/**
+ * Since 6/29/16.
+ */
+public class Integration4NoDataAlert {
+    private String[] args;
+
+    private ExecutorService executors = Executors.newFixedThreadPool(5);
+
+    private static KafkaEmbedded kafka;
+
+    @BeforeClass
+    public static void setup() {
+        // FIXME : start local kafka
+    }
+
+    @AfterClass
+    public static void end() {
+        if (kafka != null) {
+            kafka.shutdown();
+        }
+    }
+    @Test
+    public void testTriggerNoData() throws Exception{
+        System.setProperty("config.resource", "/nodata/application-nodata.conf");
+        ConfigFactory.invalidateCaches();
+        Config config = ConfigFactory.load();
+
+        System.out.println("loading metadatas...");
+        Integration1.loadMetadatas("/nodata/", config);
+        System.out.println("loading metadatas done!");
+
+
+        executors.submit(() -> {
+            try {
+                UnitTopologyMain.main(args);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        });
+
+        // wait 20 seconds for topology to bring up
+        try{
+            Thread.sleep(20000);
+        }catch(Exception ex){}
+
+        // send mock data
+        executors.submit(() -> {
+            try {
+                SampleClient4NoDataAlert.main(args);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        });
+
+
+        Utils.sleep(1000 * 5l);
+        while (true) {
+            Integration1.proactive_schedule(config);
+
+            Utils.sleep(1000 * 60l * 5);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/MetadataServiceClientImpTest.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/MetadataServiceClientImpTest.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/MetadataServiceClientImpTest.java
new file mode 100644
index 0000000..c044da0
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/MetadataServiceClientImpTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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.e2e;
+
+import java.util.List;
+
+import org.apache.eagle.alert.coordination.model.Kafka2TupleMetadata;
+import org.apache.eagle.alert.coordination.model.internal.Topology;
+import org.apache.eagle.alert.engine.coordinator.PolicyDefinition;
+import org.apache.eagle.alert.engine.coordinator.Publishment;
+import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
+import org.apache.eagle.alert.service.IMetadataServiceClient;
+import org.apache.eagle.alert.service.MetadataServiceClientImpl;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import com.typesafe.config.Config;
+import com.typesafe.config.ConfigFactory;
+
+public class MetadataServiceClientImpTest {
+
+    @Test @Ignore
+    public void test() {
+        System.out.println("loading metadatas...");
+        try {
+            System.setProperty("config.resource", "/application-integration.conf");
+            ConfigFactory.invalidateCaches();
+            Config config = ConfigFactory.load();
+            loadMetadatas("/", config);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        System.out.println("loading metadatas done!");
+    }
+
+    private void loadMetadatas(String base, Config config) throws Exception {
+        IMetadataServiceClient client = new MetadataServiceClientImpl(config);
+        client.clear();
+
+        List<Kafka2TupleMetadata> metadata = Integration1.loadEntities(base + "datasources.json", Kafka2TupleMetadata.class);
+        client.addDataSources(metadata);
+
+        List<PolicyDefinition> policies = Integration1.loadEntities(base + "policies.json", PolicyDefinition.class);
+        client.addPolicies(policies);
+
+        List<Publishment> pubs = Integration1.loadEntities(base + "publishments.json", Publishment.class);
+        client.addPublishments(pubs);
+
+        List<StreamDefinition> defs = Integration1.loadEntities(base + "streamdefinitions.json", StreamDefinition.class);
+        client.addStreamDefinitions(defs);
+
+        List<Topology> topos = Integration1.loadEntities(base + "topologies.json", Topology.class);
+        client.addTopologies(topos);
+
+        client.close();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/MetadataServiceTest.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/MetadataServiceTest.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/MetadataServiceTest.java
deleted file mode 100644
index 12fbfea..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/MetadataServiceTest.java
+++ /dev/null
@@ -1,85 +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.e2e;
-
-import com.fasterxml.jackson.databind.JavaType;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.type.CollectionType;
-import com.fasterxml.jackson.databind.type.SimpleType;
-import com.typesafe.config.Config;
-import com.typesafe.config.ConfigFactory;
-import org.apache.eagle.alert.coordination.model.Kafka2TupleMetadata;
-import org.apache.eagle.alert.coordination.model.internal.Topology;
-import org.apache.eagle.alert.engine.coordinator.PolicyDefinition;
-import org.apache.eagle.alert.engine.coordinator.Publishment;
-import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
-import org.apache.eagle.alert.service.IMetadataServiceClient;
-import org.apache.eagle.alert.service.MetadataServiceClientImpl;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import java.util.List;
-
-public class MetadataServiceTest {
-
-    @Ignore
-    @Test
-    public void test() {
-        System.out.println("loading metadatas...");
-        try {
-            System.setProperty("config.resource", "/application-integration.conf");
-            ConfigFactory.invalidateCaches();
-            Config config = ConfigFactory.load();
-            loadMetadatas("/", config);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        System.out.println("loading metadatas done!");
-    }
-
-    private void loadMetadatas(String base, Config config) throws Exception {
-        IMetadataServiceClient client = new MetadataServiceClientImpl(config);
-        client.clear();
-
-        List<Kafka2TupleMetadata> metadata = loadEntities(base + "datasources.json", Kafka2TupleMetadata.class);
-        client.addDataSources(metadata);
-
-        List<PolicyDefinition> policies = loadEntities(base + "policies.json", PolicyDefinition.class);
-        client.addPolicies(policies);
-
-        List<Publishment> pubs = loadEntities(base + "publishments.json", Publishment.class);
-        client.addPublishments(pubs);
-
-        List<StreamDefinition> defs = loadEntities(base + "streamdefinitions.json", StreamDefinition.class);
-        client.addStreamDefinitions(defs);
-
-        List<Topology> topos = loadEntities(base + "topologies.json", Topology.class);
-        client.addTopologies(topos);
-
-        client.close();
-    }
-
-    private  <T> List<T> loadEntities(String path, Class<T> tClz) throws Exception {
-        ObjectMapper om = new ObjectMapper();
-        JavaType type = CollectionType.construct(List.class, SimpleType.construct(tClz));
-        List<T> l = om.readValue(Integration1.class.getResourceAsStream(path), type);
-        return l;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/SampleClient1.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/SampleClient1.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/SampleClient1.java
index 348bf78..6bff94b 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/SampleClient1.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/SampleClient1.java
@@ -28,6 +28,9 @@ import org.slf4j.LoggerFactory;
 
 import backtype.storm.utils.Utils;
 
+import com.typesafe.config.Config;
+import com.typesafe.config.ConfigFactory;
+
 /**
  * @since May 9, 2016
  *
@@ -60,7 +63,8 @@ public class SampleClient1 {
         long base = System.currentTimeMillis();
         AtomicLong msgCount = new AtomicLong();
 
-        try (KafkaProducer<String, String> proceduer = createProceduer()) {
+        Config config = ConfigFactory.load();
+        try (KafkaProducer<String, String> proceduer = createProceduer(config)) {
             while (true) {
                 int hostIndex = 6;
                 for (int i = 0; i < hostIndex; i++) {
@@ -108,12 +112,10 @@ public class SampleClient1 {
         return Pair.of(base, JsonUtils.writeValueAsString(e));
     }
 
-    public static KafkaProducer<String, String> createProceduer() {
-
+    public static KafkaProducer<String, String> createProceduer(Config config) {
+        String servers = config.getString("kafkaProducer.bootstrapServers");
         Properties configMap = new Properties();
-        // String broker_list = zkconfig.zkQuorum;
-        // TODO: replace boot strap servers with new workable server
-        configMap.put("bootstrap.servers", "localhost:9092");
+        configMap.put("bootstrap.servers", servers);
         // configMap.put("metadata.broker.list", broker_list);
         configMap.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
         configMap.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/SampleClient2.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/SampleClient2.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/SampleClient2.java
index 06148cc..ad0079c 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/SampleClient2.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/SampleClient2.java
@@ -26,6 +26,9 @@ import org.apache.kafka.clients.producer.ProducerRecord;
 
 import backtype.storm.utils.Utils;
 
+import com.typesafe.config.Config;
+import com.typesafe.config.ConfigFactory;
+
 /**
  * @since May 10, 2016
  *
@@ -51,7 +54,6 @@ public class SampleClient2 {
         public String message;
         public String host;
     }
-    
 
     /**
      * @param args
@@ -60,8 +62,10 @@ public class SampleClient2 {
         AtomicLong base1 = new AtomicLong(System.currentTimeMillis());
         AtomicLong base2 = new AtomicLong(System.currentTimeMillis());
         AtomicLong count = new AtomicLong();
+        
+        Config config = ConfigFactory.load();
 
-        try (KafkaProducer<String, String> proceduer = SampleClient1.createProceduer()) {
+        try (KafkaProducer<String, String> proceduer = SampleClient1.createProceduer(config)) {
             while (true) {
                 nextUuid = String.format(instanceUuidTemp, UUID.randomUUID().toString());
                 nextReqId = String.format(reqIdTemp, UUID.randomUUID().toString());

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/SampleClient4NoDataAlert.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/SampleClient4NoDataAlert.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/SampleClient4NoDataAlert.java
new file mode 100644
index 0000000..f0e0d80
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/e2e/SampleClient4NoDataAlert.java
@@ -0,0 +1,138 @@
+/*
+ * 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.e2e;
+
+import java.util.Properties;
+
+import org.apache.kafka.clients.producer.KafkaProducer;
+import org.apache.kafka.clients.producer.ProducerRecord;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import backtype.storm.utils.Utils;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.typesafe.config.Config;
+import com.typesafe.config.ConfigFactory;
+
+/**
+ * Since 6/29/16.
+ */
+@SuppressWarnings({ "rawtypes", "unchecked"})
+public class SampleClient4NoDataAlert {
+    private static final Logger LOG = LoggerFactory.getLogger(SampleClient4NoDataAlert.class);
+    private static long currentTimestamp = 1467240000000L;
+    private static long interval = 3000L;
+    private static volatile boolean host1Muted = false;
+    private static volatile boolean host2Muted = false;
+    public static void main(String[] args) throws Exception {
+        System.setProperty("config.resource", "/nodata/application-nodata.conf");
+        ConfigFactory.invalidateCaches();
+
+        Config config = ConfigFactory.load();
+        KafkaProducer producer = createProducer(config);
+        ProducerRecord record = null;
+        Thread x = new MuteThread();
+        x.start();
+        while(true) {
+            if(!host1Muted) {
+                record = new ProducerRecord("noDataAlertTopic", createEvent("host1"));
+                producer.send(record);
+            }
+            if(!host2Muted) {
+                record = new ProducerRecord("noDataAlertTopic", createEvent("host2"));
+                producer.send(record);
+            }
+            record = new ProducerRecord("noDataAlertTopic", createEvent("host3"));
+            producer.send(record);
+            Utils.sleep(interval);
+            currentTimestamp += interval;
+        }
+    }
+
+    private static class MuteThread extends Thread{
+        @Override
+        public void run(){
+            try {
+                // sleep 10 seconds
+                Thread.sleep(10000);
+                // mute host1
+                LOG.info("mute host1");
+                host1Muted = true;
+                // sleep 70 seconds for triggering no data alert
+                LOG.info("try to sleep 70 seconds for triggering no data alert");
+                Thread.sleep(70000);
+                // unmute host1
+                LOG.info("unmute host1");
+                host1Muted = false;
+                Thread.sleep(10000);
+                // mute host2
+                LOG.info("mute host2");
+                host2Muted = true;
+                // sleep 70 seconds for triggering no data alert
+                LOG.info("try to sleep 70 seconds for triggering no data alert");
+                Thread.sleep(70000);
+                LOG.info("unmute host2");
+                host2Muted = false;
+            }catch(Exception ex){
+                ex.printStackTrace();
+            }
+        }
+    }
+
+    private static class NoDataEvent{
+        @JsonProperty
+        long timestamp;
+        @JsonProperty
+        String host;
+        @JsonProperty
+        double value;
+
+        public String toString(){
+            return "timestamp=" + timestamp + ",host=" + host + ",value=" + value;
+        }
+    }
+
+    private static String createEvent(String host) throws Exception{
+        NoDataEvent e = new NoDataEvent();
+        long expectTS = currentTimestamp + interval;
+        // adjust back 1 second random
+        long adjust = Math.round(2*Math.random());
+        e.timestamp = expectTS-adjust;
+        e.host = host;
+        e.value = 25.6;
+        LOG.info("sending event {} ",  e);
+        ObjectMapper mapper = new ObjectMapper();
+        String value = mapper.writeValueAsString(e);
+        return value;
+    }
+
+
+    public static KafkaProducer<String, String> createProducer(Config config) {
+        String servers = config.getString("kafkaProducer.bootstrapServers");
+        Properties configMap = new Properties();
+        configMap.put("bootstrap.servers", servers);
+        configMap.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
+        configMap.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
+        configMap.put("request.required.acks", "1");
+        configMap.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
+        configMap.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
+        KafkaProducer<String, String> proceduer = new KafkaProducer<String, String>(configMap);
+        return proceduer;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/nodata/TestDistinctValuesInTimeWindow.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/nodata/TestDistinctValuesInTimeWindow.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/nodata/TestDistinctValuesInTimeWindow.java
new file mode 100644
index 0000000..f97b1a8
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/nodata/TestDistinctValuesInTimeWindow.java
@@ -0,0 +1,71 @@
+/**
+ * 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.nodata;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import org.apache.eagle.alert.engine.evaluator.impl.DistinctValuesInTimeWindow;
+import org.junit.Test;
+
+/**
+ * Since 6/28/16.
+ */
+public class TestDistinctValuesInTimeWindow {
+    @Test
+    public void test(){
+        DistinctValuesInTimeWindow window = new DistinctValuesInTimeWindow(60*1000);
+        window.send("1", 0);
+        window.send("2", 1000);
+        window.send("3", 1000);
+        window.send("1", 30000);
+        window.send("2", 50000);
+        window.send("1", 62000);
+        Map<Object, Long> values = window.distinctValues();
+        System.out.println(values);
+    }
+
+    @Test
+    public void testSort(){
+        SortedMap<DistinctValuesInTimeWindow.ValueAndTime, DistinctValuesInTimeWindow.ValueAndTime> timeSortedMap =
+                new TreeMap<>(new DistinctValuesInTimeWindow.ValueAndTimeComparator());
+        DistinctValuesInTimeWindow.ValueAndTime vt1 = new DistinctValuesInTimeWindow.ValueAndTime("1", 0);
+        timeSortedMap.put(vt1, vt1);
+        DistinctValuesInTimeWindow.ValueAndTime vt2 = new DistinctValuesInTimeWindow.ValueAndTime("2", 1000);
+        timeSortedMap.put(vt2, vt2);
+        DistinctValuesInTimeWindow.ValueAndTime vt3 = new DistinctValuesInTimeWindow.ValueAndTime("3", 1000);
+        timeSortedMap.put(vt3, vt3);
+        timeSortedMap.remove(new DistinctValuesInTimeWindow.ValueAndTime("1", 0));
+        DistinctValuesInTimeWindow.ValueAndTime vt4 = new DistinctValuesInTimeWindow.ValueAndTime("1", 30000);
+        timeSortedMap.put(vt4, vt4);
+        Iterator<?> it = timeSortedMap.entrySet().iterator();
+        while(it.hasNext()){
+            System.out.println(it.next());
+        }
+        timeSortedMap.remove(new DistinctValuesInTimeWindow.ValueAndTime("2", 1000));
+        DistinctValuesInTimeWindow.ValueAndTime vt5 = new DistinctValuesInTimeWindow.ValueAndTime("2", 50000);
+        timeSortedMap.put(vt5, vt5);
+        DistinctValuesInTimeWindow.ValueAndTime vt6 = new DistinctValuesInTimeWindow.ValueAndTime("1", 62000);
+        timeSortedMap.put(vt6, vt6);
+         it = timeSortedMap.entrySet().iterator();
+        while(it.hasNext()){
+            System.out.println(it.next());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/nodata/TestEventTable.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/nodata/TestEventTable.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/nodata/TestEventTable.java
new file mode 100644
index 0000000..4149e17
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/nodata/TestEventTable.java
@@ -0,0 +1,53 @@
+/**
+ * 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.nodata;
+
+import org.junit.Test;
+import org.wso2.siddhi.core.ExecutionPlanRuntime;
+import org.wso2.siddhi.core.SiddhiManager;
+import org.wso2.siddhi.core.event.Event;
+import org.wso2.siddhi.core.stream.output.StreamCallback;
+import org.wso2.siddhi.core.util.EventPrinter;
+
+/**
+ * Since 6/27/16.
+ */
+public class TestEventTable {
+    @Test
+    public void test() throws Exception{
+        ExecutionPlanRuntime runtime = new SiddhiManager().createExecutionPlanRuntime(
+                        "define stream expectStream (key string, src string);"+
+                                "define stream appearStream (key string, src string);"+
+                                "define table expectTable (key string, src string);"+
+                        "from expectStream insert into expectTable;" +
+                                "from appearStream[(expectTable.key==key) in expectTable] insert into outputStream;"
+        );
+
+        runtime.addCallback("outputStream", new StreamCallback() {
+            @Override
+            public void receive(Event[] events) {
+                EventPrinter.print(events);
+            }
+        });
+
+        runtime.start();
+        runtime.getInputHandler("expectStream").send(System.currentTimeMillis(), new Object[]{"host1","expectStream"});
+        Thread.sleep(2000);
+        runtime.getInputHandler("appearStream").send(System.currentTimeMillis(), new Object[]{"host2","expectStream"});
+        Thread.sleep(2000);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/nodata/TestNoDataAlert.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/nodata/TestNoDataAlert.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/nodata/TestNoDataAlert.java
new file mode 100644
index 0000000..569a3b0
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/nodata/TestNoDataAlert.java
@@ -0,0 +1,83 @@
+/**
+ * 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.nodata;
+
+import org.junit.Test;
+import org.wso2.siddhi.core.ExecutionPlanRuntime;
+import org.wso2.siddhi.core.SiddhiManager;
+import org.wso2.siddhi.core.event.Event;
+import org.wso2.siddhi.core.stream.output.StreamCallback;
+import org.wso2.siddhi.core.util.EventPrinter;
+
+/**
+ * Since 6/27/16.
+ */
+public class TestNoDataAlert {
+    @Test
+    public void test() throws Exception{
+        String[] expectHosts = new String[]{"host_1","host_2","host_3","host_4","host_5","host_6","host_7","host_8"};
+//        String[] appearHosts = new String[]{"host_6","host_7","host_8"};
+//        String[] noDataHosts = new String[]{"host_1","host_2","host_3","host_4","host_5"};
+
+        ExecutionPlanRuntime runtime = new SiddhiManager().createExecutionPlanRuntime(
+                "define stream appearStream (key string, src string);"+
+                        "define stream expectStream (key string, src string);"+
+                        "define table expectTable (key string, src string);"+
+                        "define trigger fiveSecTriggerStream at every 1 sec;"+
+                        "define trigger initAppearTriggerStream at 'start';"+
+                        "from expectStream insert into expectTable;"+
+                        "from fiveSecTriggerStream join expectTable insert into triggerExpectStream;"+
+                        "from initAppearTriggerStream join expectTable insert into initAppearStream;"
+//                        "from triggerExpectStream as l left outer join appearStream#window.time(5 sec) as r on l.key == r.key select l.key as k1,r.key as k2 insert current events into joinStream;" +
+//                        "from joinStream[k2 is null] select k1 insert current events into missingStream;"
+        );
+
+//        ExecutionPlanRuntime runtime = new SiddhiManager().createExecutionPlanRuntime(
+//                "define stream appearStream (key string, src string);"+
+//                        "define stream expectStream (key string, src string);"+
+//                        "define table expectTable (key string, src string);"+
+//                        "from expectStream insert into expectTable;"+
+//                        "from appearStream#window.time(10 sec)  as l right outer join expectTable as r on l.key == r.key select r.key as k2, l.key as k1 insert current events into joinStream;" +
+//                        "from joinStream[k1 is null] select k2 insert current events into missingStream;"
+////                "from joinStream insert into missingStream;"
+//
+//        );
+
+        runtime.addCallback("initAppearStream", new StreamCallback() {
+            @Override
+            public void receive(Event[] events) {
+                EventPrinter.print(events);
+            }
+        });
+
+        runtime.start();
+        for(String host: expectHosts) {
+            runtime.getInputHandler("expectStream").send(System.currentTimeMillis(), new Object[]{host,"expectStream"});
+        }
+
+//        for(String host:appearHosts) {
+//            runtime.getInputHandler("appearStream").send(System.currentTimeMillis(), new Object[]{host,"inStream"});
+//        }
+
+        Thread.sleep(5000);
+
+//        for(String host:appearHosts) {
+//            runtime.getInputHandler("appearStream").send(System.currentTimeMillis(), new Object[]{host,"inStream"});
+//        }
+//        Thread.sleep(10000);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/nodata/TestNoDataPolicyHandler.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/nodata/TestNoDataPolicyHandler.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/nodata/TestNoDataPolicyHandler.java
new file mode 100644
index 0000000..6c48def
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/nodata/TestNoDataPolicyHandler.java
@@ -0,0 +1,134 @@
+/**
+ * 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.nodata;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.eagle.alert.engine.Collector;
+import org.apache.eagle.alert.engine.coordinator.PolicyDefinition;
+import org.apache.eagle.alert.engine.coordinator.StreamColumn;
+import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
+import org.apache.eagle.alert.engine.evaluator.PolicyHandlerContext;
+import org.apache.eagle.alert.engine.evaluator.nodata.NoDataPolicyHandler;
+import org.apache.eagle.alert.engine.model.AlertStreamEvent;
+import org.apache.eagle.alert.engine.model.StreamEvent;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Since 6/29/16.
+ */
+public class TestNoDataPolicyHandler {
+    private static final Logger LOG = LoggerFactory.getLogger(TestNoDataPolicyHandler.class);
+    private static final String inputStream = "testInputStream";
+    private static final String outputStream = "testOutputStream";
+
+    @Test
+    public void test() throws Exception{
+        test(buildPolicyDef_provided());
+        test(buildPolicyDef_dynamic());
+    }
+
+    @SuppressWarnings("unchecked")
+    public void test(PolicyDefinition pd) throws Exception{
+        Map<String, StreamDefinition> sds = new HashMap<>();
+        StreamDefinition sd = buildStreamDef();
+        sds.put("testInputStream", sd);
+        NoDataPolicyHandler handler = new NoDataPolicyHandler(sds);
+
+        PolicyHandlerContext context = new PolicyHandlerContext();
+        context.setPolicyDefinition(pd);
+        handler.prepare(new TestCollector(), context);
+
+        handler.send(buildStreamEvt(0, "host1", 12.5));
+        handler.send(buildStreamEvt(0, "host2", 12.6));
+        handler.send(buildStreamEvt(100, "host1", 20.9));
+        handler.send(buildStreamEvt(120, "host2", 22.1));
+        handler.send(buildStreamEvt(4000, "host2", 22.1));
+        handler.send(buildStreamEvt(50000, "host2", 22.1));
+        handler.send(buildStreamEvt(60150, "host2", 22.3));
+        handler.send(buildStreamEvt(60450, "host2", 22.9));
+        handler.send(buildStreamEvt(75000, "host1", 41.6));
+        handler.send(buildStreamEvt(85000, "host2", 45.6));
+    }
+
+    @SuppressWarnings("rawtypes")
+    private static class TestCollector implements Collector{
+        @Override
+        public void emit(Object o) {
+            AlertStreamEvent e = (AlertStreamEvent)o;
+            Object[] data = e.getData();
+            Assert.assertEquals("host2", data[1]);
+            LOG.info(e.toString());
+        }
+    }
+
+    private PolicyDefinition buildPolicyDef_provided(){
+        PolicyDefinition pd = new PolicyDefinition();
+        PolicyDefinition.Definition def = new PolicyDefinition.Definition();
+        def.setValue("PT1M,provided,1,host,host1,host2");
+        def.setType("string");
+        pd.setDefinition(def);
+        pd.setInputStreams(Arrays.asList(inputStream));
+        pd.setOutputStreams(Arrays.asList(outputStream));
+        pd.setName("nodataalert-test");
+        return pd;
+    }
+
+    private PolicyDefinition buildPolicyDef_dynamic(){
+        PolicyDefinition pd = new PolicyDefinition();
+        PolicyDefinition.Definition def = new PolicyDefinition.Definition();
+        def.setValue("PT1M,dynamic,1,host");
+        def.setType("string");
+        pd.setDefinition(def);
+        pd.setInputStreams(Arrays.asList(inputStream));
+        pd.setOutputStreams(Arrays.asList(outputStream));
+        pd.setName("nodataalert-test");
+        return pd;
+    }
+    private StreamDefinition buildStreamDef(){
+        StreamDefinition sd = new StreamDefinition();
+        StreamColumn tsColumn = new StreamColumn();
+        tsColumn.setName("timestamp");
+        tsColumn.setType(StreamColumn.Type.LONG);
+
+        StreamColumn hostColumn = new StreamColumn();
+        hostColumn.setName("host");
+        hostColumn.setType(StreamColumn.Type.STRING);
+
+        StreamColumn valueColumn = new StreamColumn();
+        valueColumn.setName("value");
+        valueColumn.setType(StreamColumn.Type.DOUBLE);
+
+        sd.setColumns(Arrays.asList(tsColumn, hostColumn, valueColumn));
+        sd.setDataSource("testDataSource");
+        sd.setStreamId("testStreamId");
+        return sd;
+    }
+
+    private StreamEvent buildStreamEvt(long ts, String host, double value){
+        StreamEvent e = new StreamEvent();
+        e.setData(new Object[]{ts, host, value});
+        e.setStreamId(inputStream);
+        e.setTimestamp(ts);
+        return e;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/router/TestAlertPublisherBolt.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/router/TestAlertPublisherBolt.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/router/TestAlertPublisherBolt.java
index af79f96..23ddd69 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/router/TestAlertPublisherBolt.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/router/TestAlertPublisherBolt.java
@@ -18,10 +18,10 @@
 
 package org.apache.eagle.alert.engine.router;
 
-import com.fasterxml.jackson.databind.JavaType;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.type.CollectionType;
-import com.fasterxml.jackson.databind.type.SimpleType;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.eagle.alert.coordination.model.PublishSpec;
 import org.apache.eagle.alert.engine.coordinator.PolicyDefinition;
 import org.apache.eagle.alert.engine.coordinator.Publishment;
@@ -35,24 +35,25 @@ import org.junit.Assert;
 import org.junit.Ignore;
 import org.junit.Test;
 
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.CollectionType;
+import com.fasterxml.jackson.databind.type.SimpleType;
 import com.typesafe.config.Config;
 import com.typesafe.config.ConfigFactory;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 /**
  * @Since 5/14/16.
  */
 public class TestAlertPublisherBolt {
 
+    @SuppressWarnings("rawtypes")
     @Ignore
     @Test
     public void test() {
         Config config = ConfigFactory.load("application-test.conf");
         AlertPublisher publisher = new AlertPublisherImpl("alertPublishBolt");
-        publisher.init(config);
+        publisher.init(config, new HashMap());
         PublishSpec spec = MetadataSerDeser.deserialize(getClass().getResourceAsStream("/testPublishSpec.json"), PublishSpec.class);
         publisher.onPublishChange(spec.getPublishments(), null, null, null);
         AlertStreamEvent event = create("testAlertStream");
@@ -95,7 +96,7 @@ public class TestAlertPublisherBolt {
     @Test
     public void testAlertPublisher() throws Exception {
         AlertPublisher alertPublisher = new AlertPublisherImpl("alert-publisher-test");
-        List<Publishment> oldPubs = loadEntities("/publishments.json", Publishment.class);
+        List<Publishment> oldPubs = loadEntities("/publishments1.json", Publishment.class);
         List<Publishment> newPubs = loadEntities("/publishments2.json", Publishment.class);
         alertPublisher.onPublishChange(oldPubs, null, null, null);
         alertPublisher.onPublishChange(null, null, newPubs, oldPubs);

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/runner/TestStreamRouterBolt.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/runner/TestStreamRouterBolt.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/runner/TestStreamRouterBolt.java
index 8c048cb..2de2073 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/runner/TestStreamRouterBolt.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/runner/TestStreamRouterBolt.java
@@ -16,16 +16,19 @@
  */
 package org.apache.eagle.alert.engine.runner;
 
-import backtype.storm.metric.api.MultiCountMetric;
-import backtype.storm.task.GeneralTopologyContext;
-import backtype.storm.task.IOutputCollector;
-import backtype.storm.task.OutputCollector;
-import backtype.storm.task.TopologyContext;
-import backtype.storm.tuple.Fields;
-import backtype.storm.tuple.Tuple;
-import backtype.storm.tuple.TupleImpl;
-import com.typesafe.config.Config;
-import com.typesafe.config.ConfigFactory;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.eagle.alert.coordination.model.PolicyWorkerQueue;
 import org.apache.eagle.alert.coordination.model.RouterSpec;
 import org.apache.eagle.alert.coordination.model.StreamRouterSpec;
@@ -45,12 +48,17 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.util.*;
+import backtype.storm.metric.api.MultiCountMetric;
+import backtype.storm.task.GeneralTopologyContext;
+import backtype.storm.task.IOutputCollector;
+import backtype.storm.task.OutputCollector;
+import backtype.storm.task.TopologyContext;
+import backtype.storm.tuple.Fields;
+import backtype.storm.tuple.Tuple;
+import backtype.storm.tuple.TupleImpl;
 
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
+import com.typesafe.config.Config;
+import com.typesafe.config.ConfigFactory;
 
 public class TestStreamRouterBolt {
     private final static Logger LOG = LoggerFactory.getLogger(TestStreamRouterBolt.class);

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/serialization/PartitionedEventSerializerTest.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/serialization/PartitionedEventSerializerTest.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/serialization/PartitionedEventSerializerTest.java
index 0347d50..a756ebe 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/serialization/PartitionedEventSerializerTest.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/test/java/org/apache/eagle/alert/engine/serialization/PartitionedEventSerializerTest.java
@@ -16,14 +16,9 @@
  */
 package org.apache.eagle.alert.engine.serialization;
 
-import backtype.storm.serialization.DefaultKryoFactory;
-import backtype.storm.serialization.DefaultSerializationDelegate;
-import com.esotericsoftware.kryo.*;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
-import com.google.common.io.ByteArrayDataInput;
-import com.google.common.io.ByteArrayDataOutput;
-import com.google.common.io.ByteStreams;
+import java.io.IOException;
+import java.util.BitSet;
+
 import org.apache.commons.lang.time.StopWatch;
 import org.apache.eagle.alert.engine.mock.MockSampleMetadataFactory;
 import org.apache.eagle.alert.engine.model.PartitionedEvent;
@@ -35,12 +30,20 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.util.BitSet;
+import backtype.storm.serialization.DefaultKryoFactory;
+import backtype.storm.serialization.DefaultSerializationDelegate;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import com.google.common.io.ByteArrayDataInput;
+import com.google.common.io.ByteArrayDataOutput;
+import com.google.common.io.ByteStreams;
 
 
 public class PartitionedEventSerializerTest {
     private final static Logger LOG = LoggerFactory.getLogger(PartitionedEventSerializerTest.class);
+    @SuppressWarnings("deprecation")
     @Test
     public void testPartitionEventSerialization() throws IOException {
         PartitionedEvent partitionedEvent = MockSampleMetadataFactory.createPartitionedEventGroupedByName("sampleStream",System.currentTimeMillis());;
@@ -76,6 +79,7 @@ public class PartitionedEventSerializerTest {
         Assert.assertEquals(partitionedEvent,kryoDeserializedEvent);
         LOG.info("\nCached Stream:{}\nCompressed Cached Stream :{}\nCached Stream + Cached Partition: {}\nJava Native: {}\nKryo: {}\nKryo + Cached Stream: {}\nKryo + Cached Stream + Cached Partition: {}",serializedBytes.length,serializedBytesCompressed.length,serializedBytes2.length,javaSerialization.length,kryoBytes.length,kryoSerialize(serializedBytes).length,kryoSerialize(serializedBytes2).length);
     }
+    @SuppressWarnings("deprecation")
     @Test
     public void testPartitionEventSerializationEfficiency() throws IOException {
         PartitionedEvent partitionedEvent = MockSampleMetadataFactory.createPartitionedEventGroupedByName("sampleStream",System.currentTimeMillis());;


[5/6] incubator-eagle git commit: Rebase code base

Posted by ha...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/UnitTopologyMain.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/UnitTopologyMain.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/UnitTopologyMain.java
index 2bca329..57529b6 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/UnitTopologyMain.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/UnitTopologyMain.java
@@ -19,6 +19,10 @@
 
 package org.apache.eagle.alert.engine;
 
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.Options;
 import org.apache.eagle.alert.config.ZKConfig;
 import org.apache.eagle.alert.config.ZKConfigBuilder;
 import org.apache.eagle.alert.engine.coordinator.impl.ZKMetadataChangeNotifyService;
@@ -40,19 +44,43 @@ import com.typesafe.config.ConfigFactory;
  */
 public class UnitTopologyMain {
 
-    public static void main(String[] args) {
+    public static void main(String[] args) throws Exception {
+        // command line parse
+        Options options = new Options();
+        options.addOption("c", true,
+                "config URL (valid file name) - defaults application.conf according to typesafe config default behavior.");
+        CommandLineParser parser = new DefaultParser();
+        CommandLine cmd = parser.parse(options, args);
+
+        if (cmd.hasOption("c")) {
+            String fileName = cmd.getOptionValue("c", "application.conf");
+            System.setProperty("config.resource", fileName.startsWith("/") ? fileName : "/" + fileName);
+            ConfigFactory.invalidateCaches();
+        }
         Config config = ConfigFactory.load();
-        ZKConfig zkConfig = ZKConfigBuilder.getZKConfig(config);
-        String topologyId = config.getString("topology.name");
-        ZKMetadataChangeNotifyService changeNotifyService = new ZKMetadataChangeNotifyService(zkConfig, topologyId);
 
+        // load config and start
+        String topologyId = config.getString("topology.name");
+        ZKMetadataChangeNotifyService changeNotifyService = createZKNotifyService(config, topologyId);
         new UnitTopologyRunner(changeNotifyService).run(topologyId, config);
     }
+    
+    public static void runTopology(Config config, backtype.storm.Config stormConfig) {
+        // load config and start
+        String topologyId = config.getString("topology.name");
+        ZKMetadataChangeNotifyService changeNotifyService = createZKNotifyService(config, topologyId);
+        new UnitTopologyRunner(changeNotifyService, stormConfig).run(topologyId, config);
+    }
 
-    public static StormTopology createTopology(Config config) {
+    private static ZKMetadataChangeNotifyService createZKNotifyService(Config config, String topologyId) {
         ZKConfig zkConfig = ZKConfigBuilder.getZKConfig(config);
-        String topologyId = config.getString("topology.name");
         ZKMetadataChangeNotifyService changeNotifyService = new ZKMetadataChangeNotifyService(zkConfig, topologyId);
+        return changeNotifyService;
+    }
+    
+    public static StormTopology createTopology(Config config) {
+        String topologyId = config.getString("topology.name");
+        ZKMetadataChangeNotifyService changeNotifyService = createZKNotifyService(config, topologyId);
 
         return new UnitTopologyRunner(changeNotifyService).buildTopology(topologyId, config);
     }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/PolicyStreamHandlers.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/PolicyStreamHandlers.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/PolicyStreamHandlers.java
index 2aa70e8..e8f736c 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/PolicyStreamHandlers.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/PolicyStreamHandlers.java
@@ -20,13 +20,17 @@ import java.util.Map;
 
 import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
 import org.apache.eagle.alert.engine.evaluator.impl.SiddhiPolicyHandler;
+import org.apache.eagle.alert.engine.evaluator.nodata.NoDataPolicyHandler;
 
 public class PolicyStreamHandlers {
     public static final String SIDDHI_ENGINE ="siddhi";
+    public static final String NO_DATA_ALERT_ENGINE ="nodataalert";
 
     public static PolicyStreamHandler createHandler(String type, Map<String, StreamDefinition> sds){
         if(SIDDHI_ENGINE.equals(type)) {
             return new SiddhiPolicyHandler(sds);
+        }else if(NO_DATA_ALERT_ENGINE.equals(type)){
+            return new NoDataPolicyHandler(sds);
         }
         throw new IllegalArgumentException("Illegal policy stream handler type: "+type);
     }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/impl/DistinctValuesInTimeWindow.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/impl/DistinctValuesInTimeWindow.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/impl/DistinctValuesInTimeWindow.java
new file mode 100644
index 0000000..8a681da
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/impl/DistinctValuesInTimeWindow.java
@@ -0,0 +1,141 @@
+/**
+ * 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.evaluator.impl;
+
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+/**
+ * Since 6/28/16.
+ * to get distinct values within a specified time window
+ * valueMaxTimeMap : each distinct value is associated with max timestamp it ever had
+ * timeSortedMap : map sorted by timestamp first and then value
+ * With the above 2 data structure, we can get distinct values in LOG(N)
+ */
+public class DistinctValuesInTimeWindow {
+    public static class ValueAndTime{
+        Object value;
+        long timestamp;
+        public ValueAndTime(Object value, long timestamp){
+            this.value = value;
+            this.timestamp = timestamp;
+        }
+
+        public String toString(){
+            return "[" + value + "," + timestamp + "]";
+        }
+
+        public int hashCode(){
+            return new HashCodeBuilder().append(value).append(timestamp).toHashCode();
+        }
+
+        public boolean equals(Object that){
+            if(!(that instanceof ValueAndTime))
+                return false;
+            ValueAndTime another = (ValueAndTime)that;
+            return another.timestamp == this.timestamp && another.value.equals(this.value);
+        }
+    }
+
+    public static class ValueAndTimeComparator implements Comparator<ValueAndTime>{
+        @Override
+        public int compare(ValueAndTime o1, ValueAndTime o2) {
+            if(o1.timestamp != o2.timestamp)
+                return (o1.timestamp > o2.timestamp) ? 1 : -1;
+            if(o1.value.equals(o2.value))
+                return 0;
+            else {
+                // this is not strictly correct, but I don't want to write too many comparators here :-)
+                if(o1.hashCode() > o2.hashCode())
+                    return 1;
+                else
+                    return -1;
+            }
+        }
+    }
+
+    /**
+     * map from value to max timestamp for this value
+     */
+    private Map<Object, Long> valueMaxTimeMap = new HashMap<>();
+    /**
+     * map sorted by time(max timestamp for the value) and then value
+     */
+    private SortedMap<ValueAndTime, ValueAndTime> timeSortedMap = new TreeMap<>(new ValueAndTimeComparator());
+    private long maxTimestamp = 0L;
+    private long window;
+    private boolean windowSlided;
+
+    /**
+     * @param window - milliseconds
+     */
+    public DistinctValuesInTimeWindow(long window){
+        this.window = window;
+    }
+
+    public void send(Object value, long timestamp){
+        ValueAndTime vt = new ValueAndTime(value, timestamp);
+
+        // todo think of time out of order
+        if(valueMaxTimeMap.containsKey(value)){
+            // remove that entry with old timestamp in timeSortedMap
+            long oldTime = valueMaxTimeMap.get(value);
+            if(oldTime >= timestamp){
+                // no any effect as the new timestamp is equal or even less than old timestamp
+                return;
+            }
+            timeSortedMap.remove(new ValueAndTime(value, oldTime));
+        }
+        // insert entry with new timestamp in timeSortedMap
+        timeSortedMap.put(vt, vt);
+        // update new timestamp in valueMaxTimeMap
+        valueMaxTimeMap.put(value, timestamp);
+
+        // evict old entries
+        // store max timestamp if possible
+        maxTimestamp = Math.max(maxTimestamp, timestamp);
+
+        // check if some values should be evicted because of time window
+        Iterator<Map.Entry<ValueAndTime, ValueAndTime>> it = timeSortedMap.entrySet().iterator();
+        while(it.hasNext()){
+            Map.Entry<ValueAndTime, ValueAndTime> entry = it.next();
+            if(entry.getKey().timestamp < maxTimestamp - window){
+                // should remove the entry in valueMaxTimeMap and timeSortedMap
+                valueMaxTimeMap.remove(entry.getKey().value);
+                windowSlided = true;
+
+                it.remove();
+            }else {
+                break;
+            }
+        }
+    }
+
+    public Map<Object, Long> distinctValues(){
+        return valueMaxTimeMap;
+    }
+
+    public boolean windowSlided(){
+        return windowSlided;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/impl/PolicyGroupEvaluatorImpl.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/impl/PolicyGroupEvaluatorImpl.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/impl/PolicyGroupEvaluatorImpl.java
index f063618..8a1f04a 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/impl/PolicyGroupEvaluatorImpl.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/impl/PolicyGroupEvaluatorImpl.java
@@ -90,7 +90,7 @@ public class PolicyGroupEvaluatorImpl implements PolicyGroupEvaluator {
                     policyStreamHandler.getValue().send(partitionedEvent.getEvent());
                 } catch (Exception e) {
                     this.context.counter().scope("fail_count").incr();
-                    LOG.error("{} failed to handle {}",policyStreamHandler.getValue(), partitionedEvent.getEvent());
+                    LOG.error("{} failed to handle {}",policyStreamHandler.getValue(), partitionedEvent.getEvent(), e);
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/impl/SiddhiPolicyHandler.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/impl/SiddhiPolicyHandler.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/impl/SiddhiPolicyHandler.java
index dfa5612..ed26408 100755
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/impl/SiddhiPolicyHandler.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/impl/SiddhiPolicyHandler.java
@@ -76,7 +76,9 @@ public class SiddhiPolicyHandler implements PolicyStreamHandler {
          */
         @Override
         public void receive(Event[] events) {
-            LOG.info("Generated {} alerts from policy '{}' in {}", events.length,context.getPolicyDefinition().getName(), context.getPolicyEvaluatorId());
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Generated {} alerts from policy '{}' in {}", events.length,context.getPolicyDefinition().getName(), context.getPolicyEvaluatorId());
+            }
             for(Event e : events) {
                 AlertStreamEvent event = new AlertStreamEvent();
                 event.setTimestamp(e.getTimestamp());
@@ -131,6 +133,10 @@ public class SiddhiPolicyHandler implements PolicyStreamHandler {
         if(inputHandler != null){
             context.getPolicyCounter().scope(String.format("%s.%s",this.context.getPolicyDefinition().getName(),"eval_count")).incr();
             inputHandler.send(event.getTimestamp(),event.getData());
+            
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("sent event to siddhi stream {} ", streamId);
+            }
         }else{
             context.getPolicyCounter().scope(String.format("%s.%s",this.context.getPolicyDefinition().getName(),"drop_count")).incr();
             LOG.warn("No input handler found for stream {}",streamId);

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/nodata/NoDataPolicyHandler.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/nodata/NoDataPolicyHandler.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/nodata/NoDataPolicyHandler.java
new file mode 100644
index 0000000..ed13f71
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/nodata/NoDataPolicyHandler.java
@@ -0,0 +1,164 @@
+/**
+ * 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.evaluator.nodata;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.eagle.alert.engine.Collector;
+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.evaluator.PolicyStreamHandler;
+import org.apache.eagle.alert.engine.evaluator.impl.DistinctValuesInTimeWindow;
+import org.apache.eagle.alert.engine.model.AlertStreamEvent;
+import org.apache.eagle.alert.engine.model.StreamEvent;
+import org.apache.eagle.alert.utils.TimePeriodUtils;
+import org.joda.time.Period;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Since 6/28/16.
+ * No Data Policy engine
+ * based on the following information
+ * 1. stream definition: group by columns
+ * 2. timestamp field: timestamp column
+ * 3. wiri safe time window: how long window is good for full set of wiri
+ * 4. wisb: full set
+ *
+ * No data policy definition should include
+ * fixed fields and dynamic fields
+ * fixed fields are leading fields : windowPeriod, type, numOfFields, f1_name, f2_name
+ * dynamic fields depend on wisb type.
+ */
+public class NoDataPolicyHandler implements PolicyStreamHandler{
+    private static final Logger LOG = LoggerFactory.getLogger(NoDataPolicyHandler.class);
+    private Map<String, StreamDefinition> sds;
+
+    // wisb(what is should be) set for expected full set value of multiple columns
+    @SuppressWarnings("rawtypes")
+    private volatile Set wisbValues = null;
+    private volatile List<Integer> wisbFieldIndices = new ArrayList<>();
+    // reuse PolicyDefinition.defintion.value field to store full set of values separated by comma
+    private volatile PolicyDefinition policyDef;
+    private volatile DistinctValuesInTimeWindow distinctWindow;
+    private volatile Collector<AlertStreamEvent> collector;
+    private volatile PolicyHandlerContext context;
+    private volatile NoDataWisbType wisbType;
+
+    public NoDataPolicyHandler(Map<String, StreamDefinition> sds){
+        this.sds = sds;
+    }
+    @Override
+    public void prepare(Collector<AlertStreamEvent> collector, PolicyHandlerContext context) throws Exception {
+        this.collector = collector;
+        this.context = context;
+        this.policyDef = context.getPolicyDefinition();
+        List<String> inputStreams = policyDef.getInputStreams();
+        // validate inputStreams has to contain only one stream
+        if(inputStreams.size() != 1)
+            throw new IllegalArgumentException("policy inputStream size has to be 1 for no data alert");
+        // validate outputStream has to contain only one stream
+        if(policyDef.getOutputStreams().size() != 1)
+            throw new IllegalArgumentException("policy outputStream size has to be 1 for no data alert");
+
+        String is = inputStreams.get(0);
+        StreamDefinition sd = sds.get(is);
+
+        String policyValue = policyDef.getDefinition().getValue();
+        // assume that no data alert policy value consists of "windowPeriod, type, numOfFields, f1_name, f2_name, f1_value, f2_value, f1_value, f2_value}
+        String[] segments = policyValue.split(",");
+        long windowPeriod = TimePeriodUtils.getMillisecondsOfPeriod(Period.parse(segments[0]));
+        distinctWindow = new DistinctValuesInTimeWindow(windowPeriod);
+        this.wisbType = NoDataWisbType.valueOf(segments[1]);
+        // for provided wisb values, need to parse, for dynamic wisb values, it is computed through a window
+        if(wisbType == NoDataWisbType.provided) {
+            wisbValues = new NoDataWisbProvidedParser().parse(segments);
+        }
+        // populate wisb field names
+        int numOfFields = Integer.parseInt(segments[2]);
+        for(int i = 3; i < 3+numOfFields; i++){
+            String fn = segments[i];
+            wisbFieldIndices.add(sd.getColumnIndex(fn));
+        }
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    @Override
+    public void send(StreamEvent event) throws Exception {
+        Object[] data = event.getData();
+        List<Object> columnValues = new ArrayList<>();
+        for(int i=0; i<wisbFieldIndices.size(); i++){
+            Object o = data[wisbFieldIndices.get(i)];
+            // convert value to string
+            columnValues.add(o.toString());
+        }
+        distinctWindow.send(columnValues, event.getTimestamp());
+        Set wiriValues = distinctWindow.distinctValues().keySet();
+
+        LOG.debug("window slided: {}, with wiri: {}", distinctWindow.windowSlided(), distinctWindow.distinctValues());
+
+        if(distinctWindow.windowSlided()) {
+            compareAndEmit(wisbValues, wiriValues, event);
+        }
+
+        if(wisbType == NoDataWisbType.dynamic) {
+            // deep copy
+            wisbValues = new HashSet<>(wiriValues);
+        }
+    }
+
+    @SuppressWarnings("rawtypes")
+    private void compareAndEmit(Set wisb, Set wiri, StreamEvent event){
+        // compare with wisbValues if wisbValues are already there for dynamic type
+        Collection noDataValues = CollectionUtils.subtract(wisb, wiri);
+        LOG.debug("nodatavalues:" + noDataValues + ", wisb: " + wisb + ", wiri: " + wiri);
+        if (noDataValues != null && noDataValues.size() > 0) {
+            LOG.info("No data alert is triggered with no data values {} and wisb {}", noDataValues, wisbValues);
+            AlertStreamEvent alertEvent = createAlertEvent(event.getTimestamp(), event.getData());
+            collector.emit(alertEvent);
+        }
+    }
+
+    private AlertStreamEvent createAlertEvent(long timestamp, Object[] triggerEvent){
+        String is = policyDef.getInputStreams().get(0);
+        StreamDefinition sd = sds.get(is);
+
+        AlertStreamEvent event = new AlertStreamEvent();
+        event.setTimestamp(timestamp);
+        event.setData(triggerEvent);
+        event.setStreamId(policyDef.getOutputStreams().get(0));
+        event.setPolicy(context.getPolicyDefinition());
+        if (this.context.getParentEvaluator() != null) {
+            event.setCreatedBy(context.getParentEvaluator().getName());
+        }
+        event.setCreatedTime(System.currentTimeMillis());
+        event.setSchema(sd);
+        return event;
+    }
+
+    @Override
+    public void close() throws Exception {
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/nodata/NoDataWisbParser.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/nodata/NoDataWisbParser.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/nodata/NoDataWisbParser.java
new file mode 100644
index 0000000..fe06067
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/nodata/NoDataWisbParser.java
@@ -0,0 +1,33 @@
+/**
+ * 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.evaluator.nodata;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Since 6/29/16.
+ */
+public interface NoDataWisbParser {
+    /**
+     * parse policy definition and return WISB values for one or multiple fields
+     * for example host and data center are 2 fields for no data alert, then WISB is a list of two values
+     * @param args some information parsed from policy defintion
+     * @return list of list of field values
+     */
+    Set<List<String>> parse(String[] args);
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/nodata/NoDataWisbProvidedParser.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/nodata/NoDataWisbProvidedParser.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/nodata/NoDataWisbProvidedParser.java
new file mode 100644
index 0000000..e13826a
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/nodata/NoDataWisbProvidedParser.java
@@ -0,0 +1,46 @@
+/**
+ * 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.evaluator.nodata;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Since 6/29/16.
+ */
+public class NoDataWisbProvidedParser implements NoDataWisbParser{
+    @Override
+    /**
+     * policy value consists of "windowPeriod, type, numOfFields, f1_name, f2_name, f1_value, f2_value, f1_value, f2_value"
+     */
+    public Set<List<String>> parse(String[] args) {
+        int numOfFields = Integer.parseInt(args[2]);
+        Set<List<String>> wisbValues = new HashSet<>();
+        int i = 3 + numOfFields;
+        while(i<args.length){
+            List<String> fields = new ArrayList<>();
+            for(int j=0; j<numOfFields; j++){
+                fields.add(args[i+j]);
+            }
+            wisbValues.add(fields);
+            i += numOfFields;
+        }
+        return wisbValues;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/nodata/NoDataWisbType.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/nodata/NoDataWisbType.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/nodata/NoDataWisbType.java
new file mode 100644
index 0000000..887d099
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/evaluator/nodata/NoDataWisbType.java
@@ -0,0 +1,25 @@
+/**
+ * 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.evaluator.nodata;
+
+/**
+ * Since 6/29/16.
+ */
+public enum NoDataWisbType {
+    provided,
+    dynamic
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/AlertPublishPlugin.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/AlertPublishPlugin.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/AlertPublishPlugin.java
index 644fe2b..d24bdb0 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/AlertPublishPlugin.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/AlertPublishPlugin.java
@@ -17,25 +17,29 @@
  */
 package org.apache.eagle.alert.engine.publisher;
 
+import java.io.Closeable;
+import java.util.Map;
+
 import org.apache.eagle.alert.engine.coordinator.Publishment;
 import org.apache.eagle.alert.engine.model.AlertStreamEvent;
 import org.apache.eagle.alert.engine.publisher.impl.PublishStatus;
 
 import com.typesafe.config.Config;
 
-import java.io.Closeable;
-import java.util.Map;
-
 /**
  * Created on 2/10/16.
  * Notification Plug-in interface which provide abstraction layer to notify to different system
  */
 public interface AlertPublishPlugin extends Closeable {
     /**
-     * for initialization
+     * 
+     * @param config
+     * @param publishment
+     * @param configProperties - storm config that would be useful for some implementation
      * @throws Exception
      */
-    void init(Config config, Publishment publishment) throws Exception;
+    @SuppressWarnings("rawtypes")
+    void init(Config config, Publishment publishment, Map configProperties) throws Exception;
 
     void update(String dedupIntervalMin, Map<String, String> pluginProperties);
 

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/AlertPublisher.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/AlertPublisher.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/AlertPublisher.java
index 7a44009..5c0e597 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/AlertPublisher.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/AlertPublisher.java
@@ -2,6 +2,7 @@ package org.apache.eagle.alert.engine.publisher;
 
 
 import java.io.Serializable;
+import java.util.Map;
 
 import org.apache.eagle.alert.engine.model.AlertStreamEvent;
 
@@ -24,7 +25,8 @@ import com.typesafe.config.Config;
  * limitations under the License.
  */
 public interface AlertPublisher extends AlertPublishListener, Serializable {
-    void init(Config config);
+    @SuppressWarnings("rawtypes")
+    void init(Config config, Map stormConfig);
     String getName();
     void nextEvent(AlertStreamEvent event);
     void close();

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AbstractPublishPlugin.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AbstractPublishPlugin.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AbstractPublishPlugin.java
new file mode 100644
index 0000000..bd21415
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AbstractPublishPlugin.java
@@ -0,0 +1,79 @@
+/*
+ * 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.publisher.impl;
+
+import java.util.Map;
+
+import org.apache.eagle.alert.engine.codec.IEventSerializer;
+import org.apache.eagle.alert.engine.coordinator.Publishment;
+import org.apache.eagle.alert.engine.model.AlertStreamEvent;
+import org.apache.eagle.alert.engine.publisher.AlertDeduplicator;
+import org.apache.eagle.alert.engine.publisher.AlertPublishPlugin;
+import org.slf4j.Logger;
+
+import com.typesafe.config.Config;
+
+/**
+ * @since Jun 3, 2016
+ *
+ */
+public abstract class AbstractPublishPlugin implements AlertPublishPlugin {
+
+    protected AlertDeduplicator deduplicator;
+    protected PublishStatus status;
+    protected IEventSerializer serializer;
+    protected String pubName;
+
+    @SuppressWarnings("rawtypes")
+    @Override
+    public void init(Config config, Publishment publishment, Map conf) throws Exception {
+        this.deduplicator = new DefaultDeduplicator(publishment.getDedupIntervalMin());
+        this.pubName = publishment.getName();
+        String serializerClz = publishment.getSerializer();
+        try {
+            Object obj = Class.forName(serializerClz).getConstructor(Map.class).newInstance(conf);
+            if (!(obj instanceof IEventSerializer)) {
+                throw new Exception(String.format("serializer %s of publishement %s is not subclass to %s!",
+                        publishment.getSerializer(),
+                        publishment.getName(),
+                        IEventSerializer.class.getName()));
+            }
+            serializer = (IEventSerializer) obj;
+        } catch (Exception e) {
+            getLogger().error(String.format("initialized failed, use default StringEventSerializer, failure message : {}", e.getMessage()), e);
+            serializer = new StringEventSerializer(conf);
+        }
+    }
+
+    @Override
+    public void update(String dedupIntervalMin, Map<String, String> pluginProperties) {
+        deduplicator.setDedupIntervalMin(dedupIntervalMin);
+    }
+
+    @Override
+    public AlertStreamEvent dedup(AlertStreamEvent event) {
+        return deduplicator.dedup(event);
+    }
+
+    @Override
+    public PublishStatus getStatus() {
+        return status;
+    }
+
+    protected abstract Logger getLogger();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertEagleStorePersister.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertEagleStorePersister.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertEagleStorePersister.java
deleted file mode 100644
index 2a4e332..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertEagleStorePersister.java
+++ /dev/null
@@ -1,60 +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.publisher.impl;
-
-import java.util.List;
-
-import org.apache.eagle.alert.engine.model.StreamEvent;
-import org.apache.eagle.alert.service.IMetadataServiceClient;
-import org.apache.eagle.alert.service.MetadataServiceClientImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.typesafe.config.Config;
-
-/**
- * Alert API entity Persistor
- */
-public class AlertEagleStorePersister {
-	private static Logger LOG = LoggerFactory.getLogger(AlertEagleStorePersister.class);
-	private Config config;
-
-	public AlertEagleStorePersister(Config config) {
-		this.config = config;
-	}
-
-	/**
-	 * Persist passes list of Entities
-	 * @param list
-	 * @return
-     */
-	public boolean doPersist(List<? extends StreamEvent> list) {
-		if (list.isEmpty()) return false;
-		LOG.info("Going to persist entities, type: " + " " + list.get(0).getClass().getSimpleName() + ", list size: " + list.size());
-		try {
-			IMetadataServiceClient client = new MetadataServiceClientImpl(config);
-			// TODO: metadata service support
-		}
-		catch (Exception ex) {
-			LOG.error("Got an exception in persisting entities", ex);
-			return false;
-		}
-		return false;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertEagleStorePublisher.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertEagleStorePublisher.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertEagleStorePublisher.java
deleted file mode 100644
index 807aacc..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertEagleStorePublisher.java
+++ /dev/null
@@ -1,113 +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.publisher.impl;
-
-import java.util.Arrays;
-import java.util.Map;
-
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.apache.eagle.alert.engine.coordinator.Publishment;
-import org.apache.eagle.alert.engine.model.AlertStreamEvent;
-import org.apache.eagle.alert.engine.publisher.AlertDeduplicator;
-import org.apache.eagle.alert.engine.publisher.AlertPublishPlugin;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.typesafe.config.Config;
-
-/**
- * Plugin to persist alerts to Eagle Storage
- */
-public class AlertEagleStorePublisher implements AlertPublishPlugin {
-
-    private static final Logger LOG = LoggerFactory.getLogger(AlertEagleStorePublisher.class);
-    private PublishStatus status;
-    private AlertEagleStorePersister persist;
-    private AlertDeduplicator deduplicator;
-
-    @Override
-    public void init(Config config, Publishment publishment) throws Exception {
-        this.persist = new AlertEagleStorePersister(config);
-        deduplicator = new DefaultDeduplicator(publishment.getDedupIntervalMin());
-        LOG.info("initialized plugin for EagleStorePlugin");
-    }
-
-    @Override
-    public void update(String dedupIntervalMin, Map<String, String> pluginProperties) {
-        deduplicator.setDedupIntervalMin(dedupIntervalMin);
-    }
-
-    @Override
-    public PublishStatus getStatus() {
-        return this.status;
-    }
-
-    @Override
-    public AlertStreamEvent dedup(AlertStreamEvent event) {
-        return deduplicator.dedup(event);
-    }
-
-    /**
-     * Persist AlertEntity to alert_details table
-     * @param event
-     */
-    @Override
-    public void onAlert(AlertStreamEvent event) {
-        LOG.info("write alert to eagle storage " + event);
-        event = dedup(event);
-        if(event == null) {
-            return;
-        }
-        PublishStatus status = new PublishStatus();
-        try{
-            boolean result = persist.doPersist(Arrays.asList(event));
-            if(result) {
-                status.successful = true;
-                status.errorMessage = "";
-            }else{
-                status.successful = false;
-                status.errorMessage = "";
-            }
-        }catch (Exception ex ){
-            status.successful = false;
-            status.errorMessage = ex.getMessage();
-            LOG.error("Fail writing alert entity to Eagle Store", ex);
-        }
-        this.status = status;
-    }
-
-    @Override
-    public void close() {
-
-    }
-
-    @Override
-    public int hashCode(){
-        return new HashCodeBuilder().append(getClass().getCanonicalName()).toHashCode();
-    }
-
-    @Override
-    public boolean equals(Object o){
-        if(o == this)
-            return true;
-        if(!(o instanceof AlertEagleStorePublisher))
-            return false;
-        return true;
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertEmailPublisher.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertEmailPublisher.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertEmailPublisher.java
index efe29bc..9d191c0 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertEmailPublisher.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertEmailPublisher.java
@@ -27,8 +27,6 @@ import java.util.concurrent.TimeUnit;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.eagle.alert.engine.coordinator.Publishment;
 import org.apache.eagle.alert.engine.model.AlertStreamEvent;
-import org.apache.eagle.alert.engine.publisher.AlertDeduplicator;
-import org.apache.eagle.alert.engine.publisher.AlertPublishPlugin;
 import org.apache.eagle.alert.engine.publisher.PublishConstants;
 import org.apache.eagle.alert.engine.publisher.email.AlertEmailGenerator;
 import org.apache.eagle.alert.engine.publisher.email.AlertEmailGeneratorBuilder;
@@ -37,27 +35,28 @@ import org.slf4j.LoggerFactory;
 
 import com.typesafe.config.Config;
 
-public class AlertEmailPublisher implements AlertPublishPlugin {
+public class AlertEmailPublisher extends AbstractPublishPlugin {
 
     private static final Logger LOG = LoggerFactory.getLogger(AlertEmailPublisher.class);
-    private AlertEmailGenerator emailGenerator;
-    private AlertDeduplicator deduplicator;
-    private Map<String, String> emailConfig;
     private final static int DEFAULT_THREAD_POOL_CORE_SIZE = 4;
     private final static int DEFAULT_THREAD_POOL_MAX_SIZE = 8;
     private final static long DEFAULT_THREAD_POOL_SHRINK_TIME = 60000L; // 1 minute
+
+    private AlertEmailGenerator emailGenerator;
+    private Map<String, String> emailConfig;
+
     private transient ThreadPoolExecutor executorPool;
-    private PublishStatus status;
 
     @Override
-    public void init(Config config, Publishment publishment) throws Exception {
+    @SuppressWarnings("rawtypes")
+    public void init(Config config, Publishment publishment, Map conf) throws Exception {
+        super.init(config, publishment, conf);
         executorPool = new ThreadPoolExecutor(DEFAULT_THREAD_POOL_CORE_SIZE, DEFAULT_THREAD_POOL_MAX_SIZE, DEFAULT_THREAD_POOL_SHRINK_TIME, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
         LOG.info(" Creating Email Generator... ");
         if (publishment.getProperties() != null) {
             emailConfig = new HashMap<>(publishment.getProperties());
             emailGenerator = createEmailGenerator(emailConfig);
         }
-        deduplicator = new DefaultDeduplicator(publishment.getDedupIntervalMin());
     }
 
     @Override
@@ -84,7 +83,8 @@ public class AlertEmailPublisher implements AlertPublishPlugin {
 
     @Override
     public void update(String dedupIntervalMin, Map<String, String> pluginProperties) {
-        deduplicator.setDedupIntervalMin(dedupIntervalMin);
+        super.update(dedupIntervalMin, pluginProperties);
+
         if (pluginProperties != null && ! emailConfig.equals(pluginProperties)) {
             emailConfig = new HashMap<>(pluginProperties);
             emailGenerator = createEmailGenerator(pluginProperties);
@@ -96,16 +96,6 @@ public class AlertEmailPublisher implements AlertPublishPlugin {
         this.executorPool.shutdown();
     }
 
-    @Override
-    public PublishStatus getStatus() {
-        return this.status;
-    }
-
-    @Override
-    public AlertStreamEvent dedup(AlertStreamEvent event) {
-        return deduplicator.dedup(event);
-    }
-
     /**
      * @param notificationConfig
      * @return
@@ -148,4 +138,9 @@ public class AlertEmailPublisher implements AlertPublishPlugin {
             return false;
         return true;
     }
+
+    @Override
+    protected Logger getLogger() {
+        return LOG;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertKafkaPublisher.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertKafkaPublisher.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertKafkaPublisher.java
index ea65298..2566f79 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertKafkaPublisher.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertKafkaPublisher.java
@@ -26,8 +26,6 @@ import java.util.concurrent.TimeUnit;
 
 import org.apache.eagle.alert.engine.coordinator.Publishment;
 import org.apache.eagle.alert.engine.model.AlertStreamEvent;
-import org.apache.eagle.alert.engine.publisher.AlertDeduplicator;
-import org.apache.eagle.alert.engine.publisher.AlertPublishPlugin;
 import org.apache.eagle.alert.engine.publisher.PublishConstants;
 import org.apache.kafka.clients.producer.KafkaProducer;
 import org.apache.kafka.clients.producer.ProducerRecord;
@@ -36,30 +34,30 @@ import org.slf4j.LoggerFactory;
 
 import com.typesafe.config.Config;
 
-public class AlertKafkaPublisher implements AlertPublishPlugin {
+public class AlertKafkaPublisher extends AbstractPublishPlugin {
 
     private static final Logger LOG = LoggerFactory.getLogger(AlertKafkaPublisher.class);
-    private AlertDeduplicator deduplicator;
-    private PublishStatus status;
+    private static final long MAX_TIMEOUT_MS = 60000;
+
     @SuppressWarnings("rawtypes")
     private KafkaProducer producer;
     private String brokerList;
     private String topic;
 
-    private final static long MAX_TIMEOUT_MS =60000;
-
     @Override
-    public void init(Config config, Publishment publishment) throws Exception {
-        deduplicator = new DefaultDeduplicator(publishment.getDedupIntervalMin());
+    @SuppressWarnings("rawtypes")
+    public void init(Config config, Publishment publishment, Map conf) throws Exception {
+        super.init(config, publishment, conf);
+
         if (publishment.getProperties() != null) {
             Map<String, String> kafkaConfig = new HashMap<>(publishment.getProperties());
             brokerList = kafkaConfig.get(PublishConstants.BROKER_LIST).trim();
-            producer = KafkaProducerManager.INSTANCE.getProducer(brokerList);
+            producer = KafkaProducerManager.INSTANCE.getProducer(brokerList, kafkaConfig);
             topic = kafkaConfig.get(PublishConstants.TOPIC).trim();
         }
     }
 
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     @Override
     public void onAlert(AlertStreamEvent event) throws Exception {
         if (producer == null) {
@@ -72,7 +70,12 @@ public class AlertKafkaPublisher implements AlertPublishPlugin {
         }
         PublishStatus status = new PublishStatus();
         try {
-            Future<?> future = producer.send(createRecord(event, topic));
+            ProducerRecord record = createRecord(event, topic);
+            if (record == null) {
+                LOG.error(" Alert serialize return null, ignored message! ");
+                return;
+            }
+            Future<?> future = producer.send(record);
             future.get(MAX_TIMEOUT_MS, TimeUnit.MILLISECONDS);
             status.successful = true;
             status.errorMessage = "";
@@ -89,6 +92,7 @@ public class AlertKafkaPublisher implements AlertPublishPlugin {
         this.status = status;
     }
 
+    @SuppressWarnings("rawtypes")
     @Override
     public void update(String dedupIntervalMin, Map<String, String> pluginProperties) {
         deduplicator.setDedupIntervalMin(dedupIntervalMin);
@@ -99,7 +103,7 @@ public class AlertKafkaPublisher implements AlertPublishPlugin {
             brokerList = newBrokerList;
             KafkaProducer newProducer = null;
             try {
-                newProducer = KafkaProducerManager.INSTANCE.getProducer(brokerList);
+                newProducer = KafkaProducerManager.INSTANCE.getProducer(brokerList, pluginProperties);
             } catch (Exception e) {
                 LOG.error("Create KafkaProducer failed with configurations: {}", pluginProperties);
             }
@@ -113,24 +117,22 @@ public class AlertKafkaPublisher implements AlertPublishPlugin {
         producer.close();
     }
 
-    /**
-     * To Create  KafkaProducer Record
-     * @param event
-     * @return ProducerRecord
-     * @throws Exception
-     */
-    private ProducerRecord<String, String> createRecord(AlertStreamEvent event, String topic) throws Exception {
-        ProducerRecord<String, String>  record  = new ProducerRecord<>(topic, event.toString());
-        return record;
+    private ProducerRecord<String, Object> createRecord(AlertStreamEvent event, String topic) throws Exception {
+        Object o = serialzeEvent(event);
+        if (o != null) {
+            ProducerRecord<String, Object> record = new ProducerRecord<>(topic, o);
+            return record;
+        } else {
+            return null;
+        }
     }
 
-    @Override
-    public PublishStatus getStatus() {
-        return this.status;
+    private Object serialzeEvent(AlertStreamEvent event) {
+        return serializer.serialize(event);
     }
 
     @Override
-    public AlertStreamEvent dedup(AlertStreamEvent event) {
-        return this.deduplicator.dedup(event);
+    protected Logger getLogger() {
+        return LOG;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertPublishPluginsFactory.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertPublishPluginsFactory.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertPublishPluginsFactory.java
index f538088..82be5a0 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertPublishPluginsFactory.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertPublishPluginsFactory.java
@@ -18,6 +18,8 @@
 
 package org.apache.eagle.alert.engine.publisher.impl;
 
+import java.util.Map;
+
 import org.apache.eagle.alert.engine.coordinator.Publishment;
 import org.apache.eagle.alert.engine.publisher.AlertPublishPlugin;
 import org.slf4j.Logger;
@@ -32,12 +34,13 @@ public class AlertPublishPluginsFactory {
 
     private static final Logger LOG = LoggerFactory.getLogger(AlertPublishPluginsFactory.class);
 
-    public static AlertPublishPlugin createNotificationPlugin(Publishment publishment, Config config) {
+    @SuppressWarnings("rawtypes")
+    public static AlertPublishPlugin createNotificationPlugin(Publishment publishment, Config config, Map conf) {
         AlertPublishPlugin plugin = null;
         String publisherType = publishment.getType();
         try {
             plugin = (AlertPublishPlugin) Class.forName(publisherType).newInstance();
-            plugin.init(config, publishment);
+            plugin.init(config, publishment, conf);
         } catch (Exception ex) {
             LOG.error("Error in loading AlertPublisherPlugin class: ", ex);
             //throw new IllegalStateException(ex);

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertPublisherImpl.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertPublisherImpl.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertPublisherImpl.java
index fce22f1..6baa616 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertPublisherImpl.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/AlertPublisherImpl.java
@@ -32,6 +32,7 @@ import org.slf4j.LoggerFactory;
 
 import com.typesafe.config.Config;
 
+@SuppressWarnings("rawtypes")
 public class AlertPublisherImpl implements AlertPublisher {
     private static final long serialVersionUID = 4809983246198138865L;
     private final static Logger LOG = LoggerFactory.getLogger(AlertPublisherImpl.class);
@@ -40,14 +41,16 @@ public class AlertPublisherImpl implements AlertPublisher {
     private volatile Map<String, List<String>> policyPublishPluginMapping = new ConcurrentHashMap<>(1);
     private volatile Map<String, AlertPublishPlugin> publishPluginMapping = new ConcurrentHashMap<>(1);
     private Config config;
+    private Map conf;
 
     public AlertPublisherImpl(String name) {
         this.name = name;
     }
 
     @Override
-    public void init(Config config) {
+    public void init(Config config, Map conf) {
         this.config = config;
+        this.conf = conf;
     }
 
     @Override
@@ -84,6 +87,7 @@ public class AlertPublisherImpl implements AlertPublisher {
         publishPluginMapping.values().forEach(plugin -> plugin.close());
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     public void onPublishChange(List<Publishment> added,
                                 List<Publishment> removed,
@@ -100,7 +104,7 @@ public class AlertPublisherImpl implements AlertPublisher {
         }
 
         for (Publishment publishment : added) {
-            AlertPublishPlugin plugin = AlertPublishPluginsFactory.createNotificationPlugin(publishment, config);
+            AlertPublishPlugin plugin = AlertPublishPluginsFactory.createNotificationPlugin(publishment, config, conf);
             if(plugin != null) {
                 publishPluginMapping.put(publishment.getName(), plugin);
                 onPolicyAdded(publishment.getPolicyIds(), publishment.getName());

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/KafkaProducerManager.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/KafkaProducerManager.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/KafkaProducerManager.java
index e8964a8..6b7fc61 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/KafkaProducerManager.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/KafkaProducerManager.java
@@ -17,26 +17,56 @@
  */
 package org.apache.eagle.alert.engine.publisher.impl;
 
+import java.util.Map;
 import java.util.Properties;
 
 import org.apache.kafka.clients.producer.KafkaProducer;
 
 /**
- * The producer is thread safe and sharing a single producer instance across threads will generally be faster than having multiple instances.
+ * The producer is thread safe and sharing a single producer instance across threads will generally be faster than
+ * having multiple instances.
  */
 public class KafkaProducerManager {
-	public static final KafkaProducerManager INSTANCE = new KafkaProducerManager();
-
-	public KafkaProducer<String, Object> getProducer(String brokerList) {
-		Properties configMap = new Properties();
-		configMap.put("bootstrap.servers", brokerList);
-		configMap.put("metadata.broker.list", brokerList);
-		configMap.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
-		configMap.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
-		configMap.put("request.required.acks", "1");	     
-		configMap.put("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
-		configMap.put("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
-		KafkaProducer<String, Object> producer = new KafkaProducer<>(configMap);
-		return producer;
-	}
+
+    private static final String STRING_SERIALIZER = "org.apache.kafka.common.serialization.StringSerializer";
+    private static final String VALUE_DESERIALIZER = "value.deserializer";
+    private static final String KEY_DESERIALIZER = "key.deserializer";
+    private static final String VALUE_SERIALIZER = "value.serializer";
+    private static final String KEY_SERIALIZER = "key.serializer";
+
+    public static final KafkaProducerManager INSTANCE = new KafkaProducerManager();
+
+    public KafkaProducer<String, Object> getProducer(String brokerList, Map<String, String> kafkaConfig) {
+        Properties configMap = new Properties();
+        configMap.put("bootstrap.servers", brokerList);
+        configMap.put("metadata.broker.list", brokerList);
+
+        if (kafkaConfig.containsKey(KEY_SERIALIZER)) {
+            configMap.put(KEY_SERIALIZER, kafkaConfig.get(KEY_SERIALIZER));
+        } else {
+            configMap.put(KEY_SERIALIZER, STRING_SERIALIZER);
+        }
+
+        if (kafkaConfig.containsKey(VALUE_SERIALIZER)) {
+            configMap.put(VALUE_SERIALIZER, kafkaConfig.get(VALUE_SERIALIZER));
+        } else {
+            configMap.put(VALUE_SERIALIZER, STRING_SERIALIZER);
+        }
+        configMap.put("request.required.acks", "1");
+
+        if (kafkaConfig.containsKey(KEY_DESERIALIZER)) {
+            configMap.put(KEY_DESERIALIZER, kafkaConfig.get(KEY_DESERIALIZER));
+        } else {
+            configMap.put(KEY_DESERIALIZER, STRING_SERIALIZER);
+        }
+
+        if (kafkaConfig.containsKey(VALUE_DESERIALIZER)) {
+            configMap.put(VALUE_DESERIALIZER, kafkaConfig.get(VALUE_DESERIALIZER));
+        } else {
+            configMap.put(VALUE_DESERIALIZER, STRING_SERIALIZER);
+        }
+
+        KafkaProducer<String, Object> producer = new KafkaProducer<>(configMap);
+        return producer;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/StringEventSerializer.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/StringEventSerializer.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/StringEventSerializer.java
new file mode 100644
index 0000000..012ebaa
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/publisher/impl/StringEventSerializer.java
@@ -0,0 +1,39 @@
+/*
+ * 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.publisher.impl;
+
+import java.util.Map;
+
+import org.apache.eagle.alert.engine.codec.IEventSerializer;
+import org.apache.eagle.alert.engine.model.AlertStreamEvent;
+
+/**
+ * @since Jun 3, 2016
+ *
+ */
+public class StringEventSerializer implements IEventSerializer {
+    
+    @SuppressWarnings("rawtypes")
+    public StringEventSerializer(Map stormConf) {
+    }
+
+    @Override
+    public Object serialize(AlertStreamEvent event) {
+        return event.toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/router/impl/StreamRouterBoltOutputCollector.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/router/impl/StreamRouterBoltOutputCollector.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/router/impl/StreamRouterBoltOutputCollector.java
index db235a7..28d2d22 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/router/impl/StreamRouterBoltOutputCollector.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/router/impl/StreamRouterBoltOutputCollector.java
@@ -57,7 +57,7 @@ public class StreamRouterBoltOutputCollector implements PartitionedEventCollecto
     private final static Logger LOG = LoggerFactory.getLogger(StreamRouterBoltOutputCollector.class);
     private final OutputCollector outputCollector;
     private final Object outputLock = new Object();
-    private final List<String> outputStreamIds;
+//    private final List<String> outputStreamIds;
     private final StreamContext streamContext;
     private final PartitionedEventSerializer serializer;
     private volatile Map<StreamPartition,StreamRouterSpec> routeSpecMap;
@@ -69,7 +69,7 @@ public class StreamRouterBoltOutputCollector implements PartitionedEventCollecto
         this.outputCollector = outputCollector;
         this.routeSpecMap = new HashMap<>();
         this.routePartitionerMap = new HashMap<>();
-        this.outputStreamIds = outputStreamIds;
+//        this.outputStreamIds = outputStreamIds;
         this.streamContext = streamContext;
         this.serializer = serializer;
     }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/AbstractStreamBolt.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/AbstractStreamBolt.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/AbstractStreamBolt.java
index cc819ba..131d85a 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/AbstractStreamBolt.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/AbstractStreamBolt.java
@@ -40,6 +40,7 @@ public abstract class AbstractStreamBolt extends BaseRichBolt {
     private Config config;
     private List<String> outputStreamIds;
     protected OutputCollector collector;
+    protected Map stormConf;
 
     public AbstractStreamBolt(IMetadataChangeNotifyService changeNotifyService, Config config){
         this.changeNotifyService = changeNotifyService;
@@ -56,6 +57,7 @@ public abstract class AbstractStreamBolt extends BaseRichBolt {
 
     @Override
     public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
+        this.stormConf = stormConf;
         Preconditions.checkNotNull(this.changeNotifyService, "IMetadataChangeNotifyService is not set yet");
         this.collector = collector;
         internalPrepare(collector,this.changeNotifyService,this.config,context);

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/AlertBolt.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/AlertBolt.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/AlertBolt.java
index 30ff5f0..e53b0ba 100755
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/AlertBolt.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/AlertBolt.java
@@ -134,7 +134,7 @@ public class AlertBolt extends AbstractStreamBolt implements AlertBoltSpecListen
     public void onAlertBoltSpecChange(AlertBoltSpec spec, Map<String, StreamDefinition> sds) {
         List<PolicyDefinition> newPolicies = spec.getBoltPoliciesMap().get(boltId);
         if(newPolicies == null) {
-            LOG.info("no policy with AlertBoltSpec {} for this bolt {}", spec, boltId);
+            LOG.info("no new policy with AlertBoltSpec {} for this bolt {}", spec, boltId);
             return;
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/AlertPublisherBolt.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/AlertPublisherBolt.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/AlertPublisherBolt.java
index 0a239e2..768cf48 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/AlertPublisherBolt.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/AlertPublisherBolt.java
@@ -53,13 +53,13 @@ public class AlertPublisherBolt extends AbstractStreamBolt implements AlertPubli
     public AlertPublisherBolt(AlertPublisher alertPublisher, Config config, IMetadataChangeNotifyService coordinatorService){
         super(coordinatorService, config);
         this.alertPublisher = alertPublisher;
-        this.alertPublisher.init(config);
     }
 
     @Override
     public void internalPrepare(OutputCollector collector, IMetadataChangeNotifyService coordinatorService, Config config, TopologyContext context) {
         coordinatorService.registerListener(this);
         coordinatorService.init(config, MetadataType.ALERT_PUBLISH_BOLT);
+        this.alertPublisher.init(config, stormConf);
         streamContext = new StreamContextImpl(config,context.registerMetric("eagle.publisher",new MultiCountMetric(),60),context);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/StreamRouterBolt.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/StreamRouterBolt.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/StreamRouterBolt.java
index 942ef97..85c2f73 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/StreamRouterBolt.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/StreamRouterBolt.java
@@ -16,18 +16,26 @@
  */
 package org.apache.eagle.alert.engine.runner;
 
-import backtype.storm.metric.api.MultiCountMetric;
-import backtype.storm.task.OutputCollector;
-import backtype.storm.task.TopologyContext;
-import backtype.storm.tuple.Tuple;
-import com.typesafe.config.Config;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.eagle.alert.coordination.model.PolicyWorkerQueue;
 import org.apache.eagle.alert.coordination.model.RouterSpec;
 import org.apache.eagle.alert.coordination.model.StreamRouterSpec;
 import org.apache.eagle.alert.engine.StreamContext;
 import org.apache.eagle.alert.engine.StreamContextImpl;
-import org.apache.eagle.alert.engine.coordinator.*;
+import org.apache.eagle.alert.engine.coordinator.IMetadataChangeNotifyService;
+import org.apache.eagle.alert.engine.coordinator.MetadataType;
+import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
+import org.apache.eagle.alert.engine.coordinator.StreamPartition;
+import org.apache.eagle.alert.engine.coordinator.StreamSortSpec;
 import org.apache.eagle.alert.engine.model.PartitionedEvent;
 import org.apache.eagle.alert.engine.router.StreamRouter;
 import org.apache.eagle.alert.engine.router.StreamRouterBoltSpecListener;
@@ -39,8 +47,12 @@ import org.apache.eagle.alert.utils.AlertConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-import java.util.*;
+import backtype.storm.metric.api.MultiCountMetric;
+import backtype.storm.task.OutputCollector;
+import backtype.storm.task.TopologyContext;
+import backtype.storm.tuple.Tuple;
+
+import com.typesafe.config.Config;
 
 public class StreamRouterBolt extends AbstractStreamBolt implements StreamRouterBoltSpecListener, SerializationMetadataProvider{
     private final static Logger LOG = LoggerFactory.getLogger(StreamRouterBolt.class);

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/UnitTopologyRunner.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/UnitTopologyRunner.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/UnitTopologyRunner.java
index cef94c7..5a937f2 100755
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/UnitTopologyRunner.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/runner/UnitTopologyRunner.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.eagle.alert.engine.coordinator.IMetadataChangeNotifyService;
+import org.apache.eagle.alert.engine.coordinator.impl.ZKMetadataChangeNotifyService;
 import org.apache.eagle.alert.engine.evaluator.impl.PolicyGroupEvaluatorImpl;
 import org.apache.eagle.alert.engine.publisher.impl.AlertPublisherImpl;
 import org.apache.eagle.alert.engine.router.impl.StreamRouterImpl;
@@ -67,11 +68,17 @@ public class UnitTopologyRunner {
     public final static int DEFAULT_MESSAGE_TIMEOUT_SECS = 3600;
 
     private final IMetadataChangeNotifyService metadataChangeNotifyService;
+    private backtype.storm.Config givenStormConfig = null;
 
     public UnitTopologyRunner(IMetadataChangeNotifyService metadataChangeNotifyService){
         this.metadataChangeNotifyService = metadataChangeNotifyService;
     }
 
+    public UnitTopologyRunner(ZKMetadataChangeNotifyService changeNotifyService, backtype.storm.Config stormConfig) {
+        this(changeNotifyService);
+        this.givenStormConfig = stormConfig;
+    }
+
     public StormTopology buildTopology(String topologyId,
                               int numOfSpoutTasks,
                               int numOfRouterBolts,
@@ -148,7 +155,7 @@ public class UnitTopologyRunner {
         return builder.createTopology();
     }
 
-    public void run(String topologyId,
+    private void run(String topologyId,
                     int numOfTotalWorkers,
                     int numOfSpoutTasks,
                     int numOfRouterBolts,
@@ -156,7 +163,8 @@ public class UnitTopologyRunner {
                     int numOfPublishTasks,
                     Config config,
                     boolean localMode) {
-        backtype.storm.Config stormConfig = new backtype.storm.Config();
+
+        backtype.storm.Config stormConfig = givenStormConfig == null ? new backtype.storm.Config() : givenStormConfig;
         // TODO: Configurable metric consumer instance number
 
         int messageTimeoutSecs = config.hasPath(MESSAGE_TIMEOUT_SECS)?config.getInt(MESSAGE_TIMEOUT_SECS) : DEFAULT_MESSAGE_TIMEOUT_SECS;
@@ -186,11 +194,6 @@ public class UnitTopologyRunner {
         }
     }
 
-    public void run(Config config) {
-        String topologyId = config.getString("topology.name");
-        run(topologyId,config);
-    }
-
     public void run(String topologyId,Config config) {
         int numOfSpoutTasks = config.getInt(SPOUT_TASK_NUM);
         int numOfRouterBolts = config.getInt(ROUTER_TASK_NUM);

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/scheme/JsonScheme.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/scheme/JsonScheme.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/scheme/JsonScheme.java
index a3487d3..c1da90f 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/scheme/JsonScheme.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/scheme/JsonScheme.java
@@ -40,7 +40,8 @@ public class JsonScheme implements Scheme {
 
     private String topic;
 
-    public JsonScheme(String topic) {
+    @SuppressWarnings("rawtypes")
+    public JsonScheme(String topic, Map conf) {
         this.topic = topic;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/scheme/PlainStringScheme.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/scheme/PlainStringScheme.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/scheme/PlainStringScheme.java
index 89d2e76..194b0c2 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/scheme/PlainStringScheme.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/scheme/PlainStringScheme.java
@@ -41,7 +41,8 @@ public class PlainStringScheme implements Scheme {
     private static final Logger LOG = LoggerFactory.getLogger(PlainStringScheme.class);
     private String topic;
 
-    public PlainStringScheme(String topic){
+    @SuppressWarnings("rawtypes")
+    public PlainStringScheme(String topic, Map conf){
         this.topic = topic;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/PartitionedEventDigestSerializer.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/PartitionedEventDigestSerializer.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/PartitionedEventDigestSerializer.java
index 5ba1080..03c1dfb 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/PartitionedEventDigestSerializer.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/PartitionedEventDigestSerializer.java
@@ -16,16 +16,16 @@
  */
 package org.apache.eagle.alert.engine.serialization;
 
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
 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.impl.StreamEventSerializer;
 import org.apache.eagle.alert.engine.serialization.impl.StreamPartitionDigestSerializer;
 
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-
 /**
  * TODO: Seams the complexity dosen't bring enough performance improve
  *

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/PartitionedEventSerializer.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/PartitionedEventSerializer.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/PartitionedEventSerializer.java
index c518e40..f653361 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/PartitionedEventSerializer.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/PartitionedEventSerializer.java
@@ -16,10 +16,10 @@
  */
 package org.apache.eagle.alert.engine.serialization;
 
-import org.apache.eagle.alert.engine.model.PartitionedEvent;
-
 import java.io.IOException;
 
+import org.apache.eagle.alert.engine.model.PartitionedEvent;
+
 public interface PartitionedEventSerializer {
     /**
      *

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/Serializers.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/Serializers.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/Serializers.java
index a94604c..6be8f1a 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/Serializers.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/Serializers.java
@@ -16,12 +16,19 @@
  */
 package org.apache.eagle.alert.engine.serialization;
 
-import org.apache.eagle.alert.engine.coordinator.StreamColumn;
-import org.apache.eagle.alert.engine.serialization.impl.*;
-
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.eagle.alert.engine.coordinator.StreamColumn;
+import org.apache.eagle.alert.engine.serialization.impl.BooleanSerializer;
+import org.apache.eagle.alert.engine.serialization.impl.DoubleSerializer;
+import org.apache.eagle.alert.engine.serialization.impl.FloatSerializer;
+import org.apache.eagle.alert.engine.serialization.impl.IntegerSerializer;
+import org.apache.eagle.alert.engine.serialization.impl.JavaObjectSerializer;
+import org.apache.eagle.alert.engine.serialization.impl.LongSerializer;
+import org.apache.eagle.alert.engine.serialization.impl.PartitionedEventSerializerImpl;
+import org.apache.eagle.alert.engine.serialization.impl.StringSerializer;
+
 public class Serializers {
     private final static Map<StreamColumn.Type,Serializer<?>> COLUMN_TYPE_SER_MAPPING = new HashMap<>();
 
@@ -32,6 +39,7 @@ public class Serializers {
         COLUMN_TYPE_SER_MAPPING.put(type,serializer);
     }
 
+    @SuppressWarnings("unchecked")
     public static <T> Serializer<T> getColumnSerializer(StreamColumn.Type type){
         if(COLUMN_TYPE_SER_MAPPING.containsKey(type)){
             return (Serializer<T>) COLUMN_TYPE_SER_MAPPING.get(type);

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/BooleanSerializer.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/BooleanSerializer.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/BooleanSerializer.java
index 1e90569..db91a70 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/BooleanSerializer.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/BooleanSerializer.java
@@ -1,11 +1,11 @@
 package org.apache.eagle.alert.engine.serialization.impl;
 
-import org.apache.eagle.alert.engine.serialization.Serializer;
-
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
 
+import org.apache.eagle.alert.engine.serialization.Serializer;
+
 /**
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/DoubleSerializer.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/DoubleSerializer.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/DoubleSerializer.java
index ad5f53c..f2f5359 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/DoubleSerializer.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/src/main/java/org/apache/eagle/alert/engine/serialization/impl/DoubleSerializer.java
@@ -1,11 +1,11 @@
 package org.apache.eagle.alert.engine.serialization.impl;
 
-import org.apache.eagle.alert.engine.serialization.Serializer;
-
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
 
+import org.apache.eagle.alert.engine.serialization.Serializer;
+
 /**
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with



[6/6] incubator-eagle git commit: Rebase code base

Posted by ha...@apache.org.
Rebase code base

Author: Ralph, Su <su...@gmail.com>

Closes #250 from RalphSu/develop.


Project: http://git-wip-us.apache.org/repos/asf/incubator-eagle/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-eagle/commit/72a1501c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-eagle/tree/72a1501c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-eagle/diff/72a1501c

Branch: refs/heads/develop
Commit: 72a1501c3ff645d93067b4fd9907f8183c2763b6
Parents: fe50912
Author: Ralph, Su <su...@gmail.com>
Authored: Thu Jul 7 08:53:16 2016 +0800
Committer: Hao Chen <ha...@apache.org>
Committed: Thu Jul 7 08:53:16 2016 +0800

----------------------------------------------------------------------
 .../eagle-alert-parent/eagle-alert/README.md    |  48 ++-
 .../eagle-alert/alert-assembly/pom.xml          |  37 +--
 .../eagle-alert/alert-common/pom.xml            |  19 +-
 .../model/Tuple2StreamConverter.java            |  19 +-
 .../alert/engine/codec/IEventSerializer.java    |  27 ++
 .../alert/engine/coordinator/Publishment.java   |  31 +-
 .../alert/engine/coordinator/StreamColumn.java  |  36 ++-
 .../alert/service/IMetadataServiceClient.java   |   6 +-
 .../apache/eagle/alert/utils/KafkaEmbedded.java |  94 ++++++
 .../eagle/alert/utils/ZookeeperEmbedded.java    |  71 +++++
 .../apache/eagle/correlation/meta/JsonTest.java |  13 +-
 .../eagle/correlation/meta/LocalKafkaTest.java  |  66 +++++
 .../src/test/resources/streamDef.json           |  42 +++
 .../eagle-alert/alert-coordinator/pom.xml       |   1 -
 .../eagle/alert/coordinator/Coordinator.java    |  61 ++--
 .../alert/coordinator/CoordinatorListener.java  |  44 +++
 .../resource/CoordinatorResource.java           |  19 ++
 .../coordinator/trigger/CoordinatorTrigger.java |  88 ++++++
 .../trigger/DynamicPolicyLoader.java            |   9 +-
 .../src/main/resources/application.conf         |  42 ---
 .../src/main/resources/log4j.properties         |  21 --
 .../src/main/webapp/WEB-INF/web.xml             |  87 ------
 .../src/main/webapp/index.html                  |  18 --
 .../alert/coordinator/CoordinatorTest.java      |  24 +-
 .../coordinator/DynamicPolicyLoaderTest.java    |  29 ++
 .../mock/TestTopologyMgmtService.java           |  11 +-
 .../src/test/resources/application.conf         |  42 +++
 .../src/test/resources/log4j.properties         |  21 ++
 .../eagle-alert/alert-devtools/pom.xml          |   1 -
 .../eagle-alert/alert-engine/pom.xml            |  10 +-
 .../eagle/alert/engine/UnitTopologyMain.java    |  40 ++-
 .../engine/evaluator/PolicyStreamHandlers.java  |   4 +
 .../impl/DistinctValuesInTimeWindow.java        | 141 +++++++++
 .../impl/PolicyGroupEvaluatorImpl.java          |   2 +-
 .../evaluator/impl/SiddhiPolicyHandler.java     |   8 +-
 .../evaluator/nodata/NoDataPolicyHandler.java   | 164 +++++++++++
 .../evaluator/nodata/NoDataWisbParser.java      |  33 +++
 .../nodata/NoDataWisbProvidedParser.java        |  46 +++
 .../engine/evaluator/nodata/NoDataWisbType.java |  25 ++
 .../engine/publisher/AlertPublishPlugin.java    |  14 +-
 .../alert/engine/publisher/AlertPublisher.java  |   4 +-
 .../publisher/impl/AbstractPublishPlugin.java   |  79 +++++
 .../impl/AlertEagleStorePersister.java          |  60 ----
 .../impl/AlertEagleStorePublisher.java          | 113 -------
 .../publisher/impl/AlertEmailPublisher.java     |  35 +--
 .../publisher/impl/AlertKafkaPublisher.java     |  56 ++--
 .../impl/AlertPublishPluginsFactory.java        |   7 +-
 .../publisher/impl/AlertPublisherImpl.java      |   8 +-
 .../publisher/impl/KafkaProducerManager.java    |  60 +++-
 .../publisher/impl/StringEventSerializer.java   |  39 +++
 .../impl/StreamRouterBoltOutputCollector.java   |   4 +-
 .../alert/engine/runner/AbstractStreamBolt.java |   2 +
 .../eagle/alert/engine/runner/AlertBolt.java    |   2 +-
 .../alert/engine/runner/AlertPublisherBolt.java |   2 +-
 .../alert/engine/runner/StreamRouterBolt.java   |  28 +-
 .../alert/engine/runner/UnitTopologyRunner.java |  17 +-
 .../eagle/alert/engine/scheme/JsonScheme.java   |   3 +-
 .../alert/engine/scheme/PlainStringScheme.java  |   3 +-
 .../PartitionedEventDigestSerializer.java       |   8 +-
 .../PartitionedEventSerializer.java             |   4 +-
 .../alert/engine/serialization/Serializers.java |  14 +-
 .../serialization/impl/BooleanSerializer.java   |   4 +-
 .../serialization/impl/DoubleSerializer.java    |   4 +-
 .../serialization/impl/FloatSerializer.java     |   4 +-
 .../serialization/impl/IntegerSerializer.java   |   4 +-
 .../impl/JavaObjectSerializer.java              |   6 +-
 .../serialization/impl/LongSerializer.java      |   4 +-
 .../impl/PartitionedEventSerializerImpl.java    |   9 +-
 .../impl/StreamEventSerializer.java             |  10 +-
 .../impl/StreamPartitionDigestSerializer.java   |  16 +-
 .../impl/StreamPartitionSerializer.java         |   8 +-
 .../serialization/impl/StringSerializer.java    |   4 +-
 .../alert/engine/spout/CorrelationSpout.java    |  13 +-
 .../alert/engine/spout/CreateTopicUtils.java    |  19 +-
 .../eagle/alert/engine/spout/SchemeBuilder.java |   8 +-
 .../spout/SpoutOutputCollectorWrapper.java      |  17 +-
 .../alert/engine/utils/CompressionUtils.java    |   9 +-
 .../src/main/resources/application.conf         |  22 +-
 .../src/main/resources/log4j.properties         |   1 +
 .../eagle/alert/engine/e2e/Integration1.java    | 110 ++++---
 .../eagle/alert/engine/e2e/Integration2.java    |   7 +-
 .../engine/e2e/Integration4NoDataAlert.java     |  95 ++++++
 .../e2e/MetadataServiceClientImpTest.java       |  74 +++++
 .../alert/engine/e2e/MetadataServiceTest.java   |  85 ------
 .../eagle/alert/engine/e2e/SampleClient1.java   |  14 +-
 .../eagle/alert/engine/e2e/SampleClient2.java   |   8 +-
 .../engine/e2e/SampleClient4NoDataAlert.java    | 138 +++++++++
 .../nodata/TestDistinctValuesInTimeWindow.java  |  71 +++++
 .../alert/engine/nodata/TestEventTable.java     |  53 ++++
 .../alert/engine/nodata/TestNoDataAlert.java    |  83 ++++++
 .../engine/nodata/TestNoDataPolicyHandler.java  | 134 +++++++++
 .../engine/router/TestAlertPublisherBolt.java   |  21 +-
 .../engine/runner/TestStreamRouterBolt.java     |  38 ++-
 .../PartitionedEventSerializerTest.java         |  24 +-
 .../alert/engine/siddhi/SiddhiPolicyTest.java   | 247 ++++++++++++++++
 .../engine/topology/AlertTopologyTest.java      |   4 +-
 .../engine/topology/CorrelationSpoutTest.java   |  46 +++
 .../eagle/alert/engine/topology/TestBolt.java   |  17 +-
 .../engine/utils/CompressionUtilsTest.java      |   4 +-
 .../test/resources/application-integration.conf |  57 ----
 .../test/resources/application-test-backup.conf |   6 +-
 .../src/test/resources/application-test.conf    |   2 +-
 .../correlation/application-integration-2.conf  |   9 +-
 .../resources/correlation/publishments.json     |   5 +-
 .../test/resources/correlation_spouttest.conf   |  53 ++++
 .../src/test/resources/datasources.json         |  19 --
 .../src/test/resources/log4j.properties         |   2 +-
 .../resources/nodata/application-nodata.conf    |  60 ++++
 .../src/test/resources/nodata/datasources.json  |  17 ++
 .../nodata/policies-provided-wisb.json          |  23 ++
 .../src/test/resources/nodata/policies.json     |  23 ++
 .../src/test/resources/nodata/publishments.json |  20 ++
 .../resources/nodata/streamdefinitions.json     |  29 ++
 .../src/test/resources/nodata/topologies.json   |  31 ++
 .../src/test/resources/policies.json            |  54 ----
 .../src/test/resources/publishments.json        |  29 --
 .../src/test/resources/publishments1.json       |  20 ++
 .../simple/application-integration.conf         |  60 ++++
 .../src/test/resources/simple/datasources.json  |  19 ++
 .../src/test/resources/simple/policies.json     |  54 ++++
 .../src/test/resources/simple/publishments.json |  31 ++
 .../resources/simple/streamdefinitions.json     |  44 +++
 .../src/test/resources/simple/topologies.json   |  31 ++
 .../src/test/resources/streamdefinitions.json   |  44 ---
 .../src/test/resources/topologies.json          |  31 --
 .../alert-metadata-service/pom.xml              |  44 ++-
 .../metadata/resource/MetadataResource.java     |   4 +-
 .../resource/impl/TopologyMgmtResourceImpl.java |   2 +-
 .../src/main/resources/application.conf         |  21 --
 .../src/main/webapp/WEB-INF/web.xml             |  81 -----
 .../src/main/webapp/index.html                  |  18 --
 .../src/test/resources/application.conf         |  20 ++
 .../alert-metadata/pom.xml                      |  21 +-
 .../eagle/alert/metadata/IMetadataDao.java      |  89 ++++++
 .../eagle/alert/metadata/MetadataUtils.java     |  74 +++++
 .../metadata/impl/InMemMetadataDaoImpl.java     |  39 +--
 .../metadata/impl/JdbcDatabaseHandler.java      | 277 ++++++++++++++++++
 .../metadata/impl/JdbcMetadataDaoImpl.java      | 176 +++++++++++
 .../alert/metadata/impl/JdbcSchemaManager.java  | 151 ++++++++++
 .../alert/metadata/impl/MetadataDaoFactory.java |   6 +-
 .../metadata/impl/MongoMetadataDaoImpl.java     |  15 +-
 .../metadata/impl/jdbc/JdbcMetadataDaoImpl.java | 292 -------------------
 .../alert/metadata/resource/IMetadataDao.java   |  86 ------
 .../eagle/alert/metadata/resource/OpResult.java |   4 +-
 .../src/main/resources/application.conf         |  24 --
 .../alert/resource/impl/InMemoryTest.java       |   9 +-
 .../alert/resource/impl/JdbcImplTest.java       | 167 +++++++++++
 .../alert/resource/impl/MongoImplTest.java      |   2 +-
 .../src/test/resources/application-mysql.conf   |  22 ++
 .../src/test/resources/application.conf         |  24 ++
 .../eagle-alert/alert-metadata-parent/pom.xml   |   3 +-
 .../eagle-alert/alert-service/pom.xml           | 169 +++++++++++
 .../app/AlertDropWizardConfiguration.java       |  27 ++
 .../apache/eagle/service/app/ServiceApp.java    |  84 ++++++
 .../src/main/resources/application.conf         |  45 +++
 .../src/main/resources/log4j.properties         |  21 ++
 .../src/main/webapp/WEB-INF/web.xml             |  91 ++++++
 .../alert-service/src/main/webapp/index.html    |  19 ++
 .../eagle-alert-parent/eagle-alert/pom.xml      | 110 ++++++-
 .../storm/kafka/KafkaSourcedSpoutProvider.java  |   2 +-
 .../topo/NewKafkaSourcedSpoutProvider.java      |   2 +-
 .../auditlog/kafka/UserPartitioner.java         |   3 +-
 pom.xml                                         |  32 +-
 163 files changed, 4864 insertions(+), 1682 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/README.md
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/README.md b/eagle-core/eagle-alert-parent/eagle-alert/README.md
index e23ef68..4fd7622 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/README.md
+++ b/eagle-core/eagle-alert-parent/eagle-alert/README.md
@@ -35,18 +35,13 @@ The alert engine have three dependency module: Coordinator Service, Metadata Ser
 ####0. Dependencies
 > Alert engine need kafka as data source, ZK as coordination. Check alert-devtools/bin to start zk and kafka through start-zk-kafka.sh.
 
-####1. Start metadata service
-> For local dev, project alert-metadata-service packaging as a war, and enabled mvn jetty:run to run it. By default, metadata runs on localhost:8080
+####1. Start metadata service & coordinator service
+> For local dev, project alert-service packaging as a war, and enabled mvn jetty:run to run it. By default, metadata runs on localhost:8080/rest
 
-> For deployment, after mvn install, a war is avaialble in alert-metadata-service/target
+> For deployment, after mvn install, a war is avaialble in alert-service/target
 
-####2. Start coordiantor service
-> For local dev, project alert-coordinator packaing as a war, and enabled mvn jetty:run to run it. By default, it runs in localhost:9090, and have dependency on metadata. See application.conf for coordinator.
-
-> For deployment, find war in alert-coordinator/target after mvn install
-
-####3. Start engine runtime.
-> The engine are the topologies that runs in any storm (local or remote) with configuration to connect to the ZK and metadata service. The alert engine runtime main as in UnitTopologyMain.java. The started storm bolt should have the same name described in alert-metadata. Example of the configuration is /alert-engine-base/src/main/resources/application.conf 
+####2. Start engine runtime.
+> The engine are the topologies that runs in any storm (local or remote) with configuration to connect to the ZK and metadata service. The alert engine runtime main as in UnitTopologyMain.java. The started storm bolt should have the same name(and numbers config) described in alert-metadata. Example of the configuration is /alert-engine/src/main/resources/application.conf 
 
 See below detailed steps.
 
@@ -59,25 +54,15 @@ See below detailed steps.
   * tomcat
   * mongdb
 
-* Run Metadata service
-    1. copy alert-metadata/target/alert-metadata-0.0.1-SNAPSHOT.war into tomcat webapps/alertmetadata.war
-    2. check config under webapps/alertmetadata/WEB-INF/classes/application.conf
+* Run Metadata service & Coordinator service
+    1. copy alert-service/target/alert-service-0.0.1-SNAPSHOT.war into tomcat webapps/alert.war
+    2. check config under webapps/alert/WEB-INF/classes/application.conf
     ```json
     {
 	"datastore": {
 		"metadataDao": "org.apache.eagle.alert.metadata.impl.MongoMetadataDaoImpl",
 		"connection": "localhost:27017"
-	}
-     }
-    ```
-    
-    3. start tomcat
-    
-* Run Coordinator service
-    1. copy alert-coordinator/target/alert-coordinator-0.0.1-SNAPSHOT.war to tomcat webappes/coordinator.war
-    2. check config under webapps/coordinator/WEB-INF/classes/application.conf
-    ```json
-      {
+	},
 	"coordinator" : {
 		"policiesPerBolt" : 5,
 		"boltParallelism" : 5,
@@ -96,17 +81,18 @@ See below detailed steps.
 		"metadataService" : {
 			"host" : "localhost",
 			"port" : 8080,
-			"context" : "/alertmetadata/api"
+			"context" : "/alert/api"
 		},
 		"metadataDynamicCheck" : {
 			"initDelayMillis" : 1000,
 			"delayMillis" : 30000
 		}
 	}
-   }
-   ```
+     }
+    ```
+    
     3. start tomcat
-
+    
 * Run UnitTopologyMain
     1. copy alert-assembly/target/alert-engine-0.0.1-SNAPSHOT-alert-assembly.jar to somewhere close to your storm installation
     2. check config application.conf
@@ -145,15 +131,15 @@ See below detailed steps.
     "delayMillis" : 10000
   },
   "metadataService": {
-    "context" : "/alertmetadata/api",
     "host" : "localhost",
+    "context" : "/alert/rest",
     "port" : 8080
   },
   "coordinatorService": {
     "host": "localhost",
     "port": 8080,
-    "context" : "/coordinator/api"
-  }
+    "context" : "/alert/rest"
+  },
   "metric": {
     "sink": {
       "stdout": {}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-assembly/pom.xml
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-assembly/pom.xml b/eagle-core/eagle-alert-parent/eagle-alert/alert-assembly/pom.xml
index 725d22e..b3f9fea 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-assembly/pom.xml
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-assembly/pom.xml
@@ -1,28 +1,24 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ 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.
-  -->
+<!-- ~ 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. -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
+
     <parent>
         <groupId>org.apache.eagle</groupId>
         <artifactId>eagle-alert</artifactId>
         <version>0.5.0-incubating-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
     </parent>
+
     <artifactId>alert-assembly</artifactId>
     <packaging>jar</packaging>
 
@@ -44,10 +40,17 @@
             <version>${project.version}</version>
             <type>jar</type>
         </dependency>
+
         <dependency>
             <groupId>org.apache.eagle</groupId>
             <artifactId>alert-engine</artifactId>
             <version>${project.version}</version>
+            <exclusions>
+            	<exclusion>
+            		<artifactId>kafka_2.9.2</artifactId>
+            		<groupId>org.apache.kafka</groupId>
+            	</exclusion>
+            </exclusions>
         </dependency>
 
         <!-- package test cases -->

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-common/pom.xml
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/pom.xml b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/pom.xml
index 58c7865..fdb3a1e 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/pom.xml
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/pom.xml
@@ -10,14 +10,14 @@
 	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ~ See the 
 	License for the specific language governing permissions and ~ limitations 
 	under the License. -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 
 	<parent>
 		<groupId>org.apache.eagle</groupId>
 		<artifactId>eagle-alert</artifactId>
 		<version>0.5.0-incubating-SNAPSHOT</version>
-		<relativePath>../pom.xml</relativePath>
 	</parent>
 
 	<artifactId>alert-common</artifactId>
@@ -37,6 +37,10 @@
 			<artifactId>commons-lang3</artifactId>
 		</dependency>
 		<dependency>
+			<groupId>org.apache.curator</groupId>
+			<artifactId>curator-test</artifactId>
+		</dependency>
+		<dependency>
 			<groupId>commons-collections</groupId>
 			<artifactId>commons-collections</artifactId>
 		</dependency>
@@ -73,10 +77,7 @@
 			<groupId>com.fasterxml.jackson.core</groupId>
 			<artifactId>jackson-databind</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>com.sun.jersey</groupId>
-			<artifactId>jersey-client</artifactId>
-		</dependency>
+		
 		<dependency>
 			<groupId>org.codehaus.jackson</groupId>
 			<artifactId>jackson-jaxrs</artifactId>
@@ -109,6 +110,12 @@
 			<groupId>io.dropwizard.metrics</groupId>
 			<artifactId>metrics-jvm</artifactId>
 		</dependency>
+
+		<dependency>
+			<groupId>com.sun.jersey</groupId>
+			<artifactId>jersey-client</artifactId>
+		</dependency>
+
 	</dependencies>
 
 	<build>

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/coordination/model/Tuple2StreamConverter.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/coordination/model/Tuple2StreamConverter.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/coordination/model/Tuple2StreamConverter.java
index dc9d1ba..f152b4c 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/coordination/model/Tuple2StreamConverter.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/coordination/model/Tuple2StreamConverter.java
@@ -25,6 +25,8 @@ import java.util.Properties;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Strings;
+
 /**
  * Convert incoming tuple to stream
  * incoming tuple consists of 2 fields, topic and map of key/value
@@ -64,10 +66,23 @@ public class Tuple2StreamConverter {
 
         Object timeObject = m.get(metadata.getTimestampColumn());
         long timestamp = 0L;
-        if(timeObject instanceof Number){
+        if (timeObject == null) {
+            if (LOG.isWarnEnabled()) {
+                LOG.warn("continue with current timestamp since no timestamp column specified! Metadata : ", metadata);
+            }
+            timestamp = System.currentTimeMillis();
+        } else if (timeObject instanceof Number) {
             timestamp = ((Number) timeObject).longValue();
-        }else{
+        } else {
             String timestampFieldValue = (String) m.get(metadata.getTimestampColumn());
+            String dateFormat = metadata.getTimestampFormat();
+            if (Strings.isNullOrEmpty(dateFormat)) {
+                if (LOG.isWarnEnabled()) {
+                    LOG.warn("continue with current timestamp becuase no data format sepcified! Metadata : ", metadata);
+                }
+                timestamp = System.currentTimeMillis();
+            } else 
+            
             try {
                 SimpleDateFormat sdf = new SimpleDateFormat(metadata.getTimestampFormat());
                 timestamp = sdf.parse(timestampFieldValue).getTime();

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/engine/codec/IEventSerializer.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/engine/codec/IEventSerializer.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/engine/codec/IEventSerializer.java
new file mode 100644
index 0000000..dd26d20
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/engine/codec/IEventSerializer.java
@@ -0,0 +1,27 @@
+/*
+ * 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.codec;
+
+import org.apache.eagle.alert.engine.model.AlertStreamEvent;
+
+/**
+ * @since Jun 3, 2016
+ *
+ */
+public interface IEventSerializer {
+    Object serialize(AlertStreamEvent event);
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/engine/coordinator/Publishment.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/engine/coordinator/Publishment.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/engine/coordinator/Publishment.java
index d8b4f28..b921b79 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/engine/coordinator/Publishment.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/engine/coordinator/Publishment.java
@@ -16,12 +16,12 @@
  */
 package org.apache.eagle.alert.engine.coordinator;
 
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+
 /**
  * @since Apr 11, 2016
  *
@@ -33,6 +33,8 @@ public class Publishment {
     private List<String> policyIds;
     private String dedupIntervalMin;
     private Map<String, String> properties;
+    // the class name to extend the IEventSerializer interface
+    private String serializer;
 
     public String getName() {
         return name;
@@ -42,6 +44,14 @@ public class Publishment {
         this.name = name;
     }
 
+    public String getSerializer() {
+        return serializer;
+    }
+
+    public void setSerializer(String serializer) {
+        this.serializer = serializer;
+    }
+
     public String getType() {
         return type;
     }
@@ -78,24 +88,17 @@ public class Publishment {
     public boolean equals(Object obj) {
         if (obj instanceof Publishment) {
             Publishment p = (Publishment) obj;
-            return (Objects.equals(name, p.getName()) &&
-                    Objects.equals(type, p.getType()) &&
-                    Objects.equals(dedupIntervalMin, p.getDedupIntervalMin()) &&
-                    Objects.equals(policyIds, p.getPolicyIds()) &&
-                    properties.equals(p.getProperties()));
+            return (Objects.equals(name, p.getName()) && Objects.equals(type, p.getType())
+                    && Objects.equals(dedupIntervalMin, p.getDedupIntervalMin())
+                    && Objects.equals(policyIds, p.getPolicyIds()) && properties.equals(p.getProperties()));
         }
         return false;
     }
 
     @Override
     public int hashCode() {
-        return new HashCodeBuilder()
-                .append(name)
-                .append(type)
-                .append(dedupIntervalMin)
-                .append(policyIds)
-                .append(properties)
-                .build();
+        return new HashCodeBuilder().append(name).append(type).append(dedupIntervalMin).append(policyIds)
+                .append(properties).build();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/engine/coordinator/StreamColumn.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/engine/coordinator/StreamColumn.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/engine/coordinator/StreamColumn.java
index dc44571..bbfb942 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/engine/coordinator/StreamColumn.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/engine/coordinator/StreamColumn.java
@@ -18,9 +18,8 @@ package org.apache.eagle.alert.engine.coordinator;
 
 import java.io.Serializable;
 
-import com.fasterxml.jackson.annotation.JsonCreator;
 
-public class StreamColumn implements Serializable{
+public class StreamColumn implements Serializable {
     private static final long serialVersionUID = -5457861313624389106L;
     private String name;
     private Type type;
@@ -28,8 +27,9 @@ public class StreamColumn implements Serializable{
     private boolean required;
     private String description;
 
-    public String toString(){
-        return String.format("StreamColumn=name[%s], type=[%s], defaultValue=[%s], required=[%s]", name, type, defaultValue, required);
+    public String toString() {
+        return String.format("StreamColumn=name[%s], type=[%s], defaultValue=[%s], required=[%s]", name, type,
+                defaultValue, required);
     }
 
     public String getName() {
@@ -63,7 +63,7 @@ public class StreamColumn implements Serializable{
     public void setRequired(boolean required) {
         this.required = required;
     }
-    
+
     public String getDescription() {
         return description;
     }
@@ -72,13 +72,12 @@ public class StreamColumn implements Serializable{
         this.description = description;
     }
 
-
-    public enum Type implements Serializable{
+    public enum Type implements Serializable {
         STRING("string"), INT("int"), LONG("long"), FLOAT("float"), DOUBLE("double"), BOOL("bool"), OBJECT("object");
 
         private final String name;
 
-        Type(String name){
+        Type(String name) {
             this.name = name;
         }
 
@@ -87,10 +86,11 @@ public class StreamColumn implements Serializable{
             return name;
         }
 
-        @JsonCreator
+        @org.codehaus.jackson.annotate.JsonCreator
+        @com.fasterxml.jackson.annotation.JsonCreator
         public static Type getEnumFromValue(String value) {
             for (Type testEnum : values()) {
-                if (testEnum.name.equals(value)) {
+                if (testEnum.name.equalsIgnoreCase(value)) {
                     return testEnum;
                 }
             }
@@ -101,27 +101,31 @@ public class StreamColumn implements Serializable{
     public static class Builder {
         private StreamColumn column;
 
-        public Builder(){
+        public Builder() {
             column = new StreamColumn();
         }
-        public Builder name(String name){
+
+        public Builder name(String name) {
             column.setName(name);
             return this;
         }
-        public Builder type(Type type){
+
+        public Builder type(Type type) {
             column.setType(type);
             return this;
         }
-        public Builder defaultValue(Object defaultValue){
+
+        public Builder defaultValue(Object defaultValue) {
             column.setDefaultValue(defaultValue);
             return this;
         }
-        public Builder required(boolean required){
+
+        public Builder required(boolean required) {
             column.setRequired(required);
             return this;
         }
 
-        public StreamColumn build(){
+        public StreamColumn build() {
             return column;
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/service/IMetadataServiceClient.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/service/IMetadataServiceClient.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/service/IMetadataServiceClient.java
index da5a086..80cb169 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/service/IMetadataServiceClient.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/service/IMetadataServiceClient.java
@@ -41,7 +41,7 @@ public interface IMetadataServiceClient extends Closeable, Serializable {
     void addStreamingCluster(StreamingCluster cluster);
     void addStreamingClusters(List<StreamingCluster> clusters);
     List<StreamingCluster> listClusters();
-
+    
     List<Topology> listTopologies();
     void addTopology(Topology t);
     void addTopologies(List<Topology> topologies);
@@ -68,8 +68,8 @@ public interface IMetadataServiceClient extends Closeable, Serializable {
     ScheduleState getVersionedSpec();
     ScheduleState getVersionedSpec(String version);
     void addScheduleState(ScheduleState state);
-
+    
     void clear();
-
+    
     // for topology mgmt
 }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/utils/KafkaEmbedded.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/utils/KafkaEmbedded.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/utils/KafkaEmbedded.java
new file mode 100644
index 0000000..db4d735
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/utils/KafkaEmbedded.java
@@ -0,0 +1,94 @@
+/*
+ * 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.utils;
+
+import java.io.File;
+import java.util.Properties;
+
+import kafka.server.KafkaConfig;
+import kafka.server.KafkaServerStartable;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.curator.test.InstanceSpec;
+
+public class KafkaEmbedded {
+
+    private int port;
+    private KafkaServerStartable kafka;
+    private ZookeeperEmbedded zk;
+
+    private File logDir;
+
+    public KafkaEmbedded() {
+        this(InstanceSpec.getRandomPort(), InstanceSpec.getRandomPort());
+    }
+
+    public KafkaEmbedded(Integer kafkaPort, Integer zookeeperPort) {
+        try {
+            zk = new ZookeeperEmbedded(zookeeperPort);
+            zk.start();
+
+            this.port = null != kafkaPort ? kafkaPort : InstanceSpec.getRandomPort();
+            logDir = new File(System.getProperty("java.io.tmpdir"), "kafka/logs/kafka-test-" + kafkaPort);
+            FileUtils.deleteQuietly(logDir);
+
+            KafkaConfig config = buildKafkaConfig(zk.getConnectionString());
+            kafka = new KafkaServerStartable(config);
+            kafka.startup();
+        } catch (Exception ex) {
+            throw new RuntimeException("Could not start test broker", ex);
+        }
+    }
+
+    public KafkaEmbedded(String kafka_url, String zk_url) {
+        this(extractKafkaPort(kafka_url), extractKafkaPort(zk_url));
+
+    }
+
+    public static Integer extractKafkaPort(String url) {
+        String portString = url.substring(url.indexOf(":") + 1, url.length());
+        return Integer.valueOf(portString);
+    }
+
+    private KafkaConfig buildKafkaConfig(String zookeeperConnectionString) {
+        Properties p = new Properties();
+        p.setProperty("zookeeper.connect", zookeeperConnectionString);
+        p.setProperty("broker.id", "0");
+        p.setProperty("port", "" + port);
+        p.setProperty("log.dirs", logDir.getAbsolutePath());
+        return new KafkaConfig(p);
+    }
+
+    public String getBrokerConnectionString() {
+        return "localhost:" + port;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public void shutdown() {
+        try {
+            kafka.shutdown();
+        } catch (Throwable t) {
+            t.printStackTrace();
+        } finally {
+            FileUtils.deleteQuietly(logDir);
+        }
+        zk.shutdown();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/utils/ZookeeperEmbedded.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/utils/ZookeeperEmbedded.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/utils/ZookeeperEmbedded.java
new file mode 100644
index 0000000..6140677
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/main/java/org/apache/eagle/alert/utils/ZookeeperEmbedded.java
@@ -0,0 +1,71 @@
+/*
+ * 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.utils;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.imps.CuratorFrameworkState;
+import org.apache.curator.retry.ExponentialBackoffRetry;
+import org.apache.curator.test.TestingServer;
+
+public class ZookeeperEmbedded {
+    private TestingServer server;
+    private CuratorFramework zookeeper;
+    private int port;
+    private File logDir;
+
+    public ZookeeperEmbedded(int port) {
+        this.port = port;
+        this.logDir = new File(System.getProperty("java.io.tmpdir"), "zk/logs/zookeeper-test-" + port);
+    }
+
+    public void start() throws Exception {
+        FileUtils.deleteQuietly(logDir);
+
+        server = new TestingServer(this.port, this.logDir);
+        ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3);
+        zookeeper = CuratorFrameworkFactory.newClient(server.getConnectString(), retryPolicy);
+        zookeeper.start();
+    }
+
+    public String getConnectionString() {
+        return server.getConnectString();
+    }
+
+    public void shutdown() {
+        try {
+            if (!zookeeper.getState().equals(CuratorFrameworkState.STOPPED)) {
+                zookeeper.close();
+            }
+
+        } catch (Throwable e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                server.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            } finally {
+                FileUtils.deleteQuietly(logDir);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/test/java/org/apache/eagle/correlation/meta/JsonTest.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/test/java/org/apache/eagle/correlation/meta/JsonTest.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/test/java/org/apache/eagle/correlation/meta/JsonTest.java
index 71cce51..245b249 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/test/java/org/apache/eagle/correlation/meta/JsonTest.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/test/java/org/apache/eagle/correlation/meta/JsonTest.java
@@ -16,6 +16,8 @@
  */
 package org.apache.eagle.correlation.meta;
 
+import org.apache.eagle.alert.engine.coordinator.StreamDefinition;
+import org.codehaus.jackson.map.ObjectMapper;
 import org.junit.Test;
 
 /**
@@ -24,7 +26,14 @@ import org.junit.Test;
 public class JsonTest {
 
     @Test
-    public void policyDefTest() {
-        // TODO
+    public void streamDefTest() throws Exception {
+
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.readValue(JsonTest.class.getResourceAsStream("/streamDef.json"), StreamDefinition.class);
+
+        com.fasterxml.jackson.databind.ObjectMapper mapper2 = new com.fasterxml.jackson.databind.ObjectMapper();
+        mapper2.readValue(JsonTest.class.getResourceAsStream("/streamDef.json"), StreamDefinition.class);
+
     }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/test/java/org/apache/eagle/correlation/meta/LocalKafkaTest.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/test/java/org/apache/eagle/correlation/meta/LocalKafkaTest.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/test/java/org/apache/eagle/correlation/meta/LocalKafkaTest.java
new file mode 100644
index 0000000..3857649
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/test/java/org/apache/eagle/correlation/meta/LocalKafkaTest.java
@@ -0,0 +1,66 @@
+package org.apache.eagle.correlation.meta;
+
+/*
+ * 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.
+ */
+import java.util.Properties;
+
+import kafka.admin.AdminUtils;
+import kafka.admin.RackAwareMode;
+import kafka.utils.ZKStringSerializer$;
+import kafka.utils.ZkUtils;
+
+import org.I0Itec.zkclient.ZkClient;
+import org.I0Itec.zkclient.ZkConnection;
+import org.apache.eagle.alert.utils.KafkaEmbedded;
+import org.junit.Ignore;
+
+/**
+ * @since Jun 3, 2016
+ *
+ */
+@Ignore
+public class LocalKafkaTest {
+
+    /**
+     * @param args
+     */
+    public static void main(String[] args) {
+        KafkaEmbedded kafka = new KafkaEmbedded(9092, 2181);
+
+        makeSureTopic("local_kafka_topic");
+
+        while (true) {
+            try {
+                Thread.sleep(3000);
+            } catch (Exception e) {
+                break;
+            }
+        }
+
+        kafka.shutdown();
+
+    }
+
+    public static void makeSureTopic(String topic) {
+        ZkClient zkClient = new ZkClient("localhost:2181", 10000, 10000, ZKStringSerializer$.MODULE$);
+        Properties topicConfiguration = new Properties();
+        ZkConnection zkConnection = new ZkConnection("localhost:2181");
+        ZkUtils zkUtils = new ZkUtils(zkClient, zkConnection, false);
+        AdminUtils.createTopic(zkUtils, topic, 1, 1, topicConfiguration, RackAwareMode.Disabled$.MODULE$);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/test/resources/streamDef.json
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/test/resources/streamDef.json b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/test/resources/streamDef.json
new file mode 100644
index 0000000..078cd73
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-common/src/test/resources/streamDef.json
@@ -0,0 +1,42 @@
+{
+	"streamId": "perfmon_cpu_stream",
+	"dataSource" : "perfmon_datasource",
+	"description":"the data stream for perfmon cpu metrics",
+	"validate": false,
+	"timeseries":false,
+	"columns": [
+		{
+			"name": "host",
+			"type" : "string",
+			"defaultValue": "",
+			"required":true
+		},
+		{
+			"name": "timestamp",
+			"type" : "long",
+			"defaultValue": 0,
+			"required":true
+		},{
+			"name": "metric",
+			"type" : "float",
+			"defaultValue": "perfmon_cpu",
+			"required": true
+		},{
+			"name": "pool",
+			"type" : "int",
+			"defaultValue": "raptor_general",
+			"required":true
+		},{
+			"name": "value",
+			"type" : "double",
+			"defaultValue": 0.0,
+			"required":true
+		},
+		{
+			"name": "colo",
+			"type" : "bool",
+			"defaultValue": "",
+			"required":true
+		}
+	]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/pom.xml
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/pom.xml b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/pom.xml
index 92f73e6..3cc6e60 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/pom.xml
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/pom.xml
@@ -17,7 +17,6 @@
 		<groupId>org.apache.eagle</groupId>
 		<artifactId>eagle-alert</artifactId>
 		<version>0.5.0-incubating-SNAPSHOT</version>
-		<relativePath>../pom.xml</relativePath>
 	</parent>
 
 	<artifactId>alert-coordinator</artifactId>

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/Coordinator.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/Coordinator.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/Coordinator.java
index ca8c965..9c97f9f 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/Coordinator.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/Coordinator.java
@@ -22,6 +22,7 @@ import java.util.List;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.eagle.alert.config.ConfigBusProducer;
 import org.apache.eagle.alert.config.ConfigValue;
@@ -29,6 +30,7 @@ import org.apache.eagle.alert.config.ZKConfig;
 import org.apache.eagle.alert.config.ZKConfigBuilder;
 import org.apache.eagle.alert.coordination.model.ScheduleState;
 import org.apache.eagle.alert.coordinator.provider.ScheduleContextBuilder;
+import org.apache.eagle.alert.coordinator.trigger.CoordinatorTrigger;
 import org.apache.eagle.alert.coordinator.trigger.DynamicPolicyLoader;
 import org.apache.eagle.alert.coordinator.trigger.PolicyChangeListener;
 import org.apache.eagle.alert.engine.coordinator.PolicyDefinition;
@@ -47,8 +49,12 @@ import com.typesafe.config.ConfigFactory;
  *        pull policies and figure out if polices are changed
  */
 public class Coordinator {
+
+    private static final Logger LOG = LoggerFactory.getLogger(Coordinator.class);
+
     private static final String COORDINATOR = "coordinator";
     /**
+     * {@link ZKMetadataChangeNotifyService}
      *  /alert/{topologyName}/spout
      *                  /router
      *                  /alert
@@ -59,7 +65,6 @@ public class Coordinator {
     private static final String ZK_ALERT_CONFIG_ALERT = "{0}/alert";
     private static final String ZK_ALERT_CONFIG_PUBLISHER = "{0}/publisher";
 
-    private static final Logger LOG = LoggerFactory.getLogger(Coordinator.class);
 
     private final static String METADATA_SERVICE_HOST = "metadataService.host";
     private final static String METADATA_SERVICE_PORT = "metadataService.port";
@@ -71,7 +76,10 @@ public class Coordinator {
     private final ConfigBusProducer producer;
     private final IMetadataServiceClient client;
     private Config config;
-    
+
+    // FIXME : UGLY global state
+    private static final AtomicBoolean forcePeriodicallyBuild = new AtomicBoolean(true);
+
     public Coordinator() {
         config = ConfigFactory.load().getConfig(COORDINATOR);
         ZKConfig zkConfig = ZKConfigBuilder.getZKConfig(config);
@@ -85,7 +93,7 @@ public class Coordinator {
         this.client = client;
     }
 
-    public ScheduleState schedule(ScheduleOption option) {
+    public synchronized ScheduleState schedule(ScheduleOption option) {
         IScheduleContext context = new ScheduleContextBuilder(client).buildContext();
         TopologyMgmtService mgmtService = new TopologyMgmtService();
         IPolicyScheduler scheduler = PolicySchedulerFactory.createScheduler();
@@ -162,9 +170,9 @@ public class Coordinator {
         private Config config;
         private IMetadataServiceClient client;
 
-        public PolicyChangeHandler(Config config) {
+        public PolicyChangeHandler(Config config, IMetadataServiceClient client) {
             this.config = config;
-            this.client = new MetadataServiceClientImpl(config);
+            this.client = client;
         }
 
         @Override
@@ -173,22 +181,20 @@ public class Coordinator {
             LOG.info("policy changed ... ");
             LOG.info("allPolicies: " + allPolicies + ", addedPolicies: " + addedPolicies + ", removedPolicies: "
                     + removedPolicies + ", modifiedPolicies: " + modifiedPolicies);
+            
+            CoordinatorTrigger trigger = new CoordinatorTrigger(config, client);
+            trigger.run();
 
-            IScheduleContext context = new ScheduleContextBuilder(client).buildContext();
-            TopologyMgmtService mgmtService = new TopologyMgmtService();
-            IPolicyScheduler scheduler = PolicySchedulerFactory.createScheduler();
-
-            scheduler.init(context, mgmtService);
-
-            ScheduleState state = scheduler.schedule(new ScheduleOption());
-
-            ConfigBusProducer producer = new ConfigBusProducer(ZKConfigBuilder.getZKConfig(config));
-            postSchedule(client, state, producer);
-            producer.send("spout", new ConfigValue());
         }
     }
 
     public static void main(String[] args) throws Exception {
+        startSchedule();
+        
+        Thread.currentThread().join();
+    }
+
+    public static void startSchedule() {
         Config config = ConfigFactory.load().getConfig(COORDINATOR);
         // build dynamic policy loader
         String host = config.getString(METADATA_SERVICE_HOST);
@@ -196,16 +202,31 @@ public class Coordinator {
         String context = config.getString(METADATA_SERVICE_CONTEXT);
         IMetadataServiceClient client = new MetadataServiceClientImpl(host, port, context);
         DynamicPolicyLoader loader = new DynamicPolicyLoader(client);
-        loader.addPolicyChangeListener(new PolicyChangeHandler(config));
+        loader.addPolicyChangeListener(new PolicyChangeHandler(config, client));
 
         // schedule dynamic policy loader
         long initDelayMillis = config.getLong(DYNAMIC_POLICY_LOADER_INIT_MILLS);
         long delayMillis = config.getLong(DYNAMIC_POLICY_LOADER_DELAY_MILLS);
-        ScheduledExecutorService scheduleSrv = Executors.newScheduledThreadPool(1);
+        ScheduledExecutorService scheduleSrv = Executors.newScheduledThreadPool(2);
         scheduleSrv.scheduleAtFixedRate(loader, initDelayMillis, delayMillis, TimeUnit.MILLISECONDS);
+        
+        // 
+        scheduleSrv.scheduleAtFixedRate(new CoordinatorTrigger(config, client), CoordinatorTrigger.INIT_PERIODICALLY_TRIGGER_DELAY,
+                CoordinatorTrigger.INIT_PERIODICALLY_TRIGGER_INTERVAL, TimeUnit.MILLISECONDS);
+        
         Runtime.getRuntime().addShutdownHook(new Thread(new CoordinatorShutdownHook(scheduleSrv)));
         LOG.info("Eagle Coordinator started ...");
-        
-        Thread.currentThread().join();
+    }
+
+    public void enforcePeriodicallyBuild() {
+        forcePeriodicallyBuild.set(true);
+    }
+
+    public void disablePeriodicallyBuild() {
+        forcePeriodicallyBuild.set(false);
+    }
+
+    public static boolean isPeriodicallyForceBuildEnable() {
+        return forcePeriodicallyBuild.get();
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/CoordinatorListener.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/CoordinatorListener.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/CoordinatorListener.java
new file mode 100644
index 0000000..1534a6b
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/CoordinatorListener.java
@@ -0,0 +1,44 @@
+/*
+ * 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.coordinator;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @since Jun 16, 2016
+ *
+ */
+public class CoordinatorListener implements ServletContextListener {
+    
+    private static final Logger LOG = LoggerFactory.getLogger(CoordinatorListener.class);
+
+    @Override
+    public void contextInitialized(ServletContextEvent sce) {
+        LOG.info("start coordinator background tasks..");
+        Coordinator.startSchedule();
+    }
+
+    @Override
+    public void contextDestroyed(ServletContextEvent sce) {
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/resource/CoordinatorResource.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/resource/CoordinatorResource.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/resource/CoordinatorResource.java
index 6b8495e..c715bf8 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/resource/CoordinatorResource.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/resource/CoordinatorResource.java
@@ -54,6 +54,25 @@ public class CoordinatorResource {
         return JsonUtils.writeValueAsString(state);
     }
 
+    @POST
+    @Path("/enablePeriodicForceBuild")
+    public void enforcePeriodicallyBuild() {
+        alertCoordinator.enforcePeriodicallyBuild();
+    }
+
+    @POST
+    @Path("/disablePeriodicForceBuild")
+    public void disablePeriodicallyBuild() {
+        alertCoordinator.disablePeriodicallyBuild();
+    }
+    
+    @SuppressWarnings("static-access")
+    @GET
+    @Path("/periodicForceBuildState")
+    public boolean statPeriodicallyBuild() {
+        return alertCoordinator.isPeriodicallyForceBuildEnable();
+    }
+
     /**
      * Manually update the topology usages, for administration
      * 

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/trigger/CoordinatorTrigger.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/trigger/CoordinatorTrigger.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/trigger/CoordinatorTrigger.java
new file mode 100644
index 0000000..c489a0e
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/trigger/CoordinatorTrigger.java
@@ -0,0 +1,88 @@
+/*
+ * 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.coordinator.trigger;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.eagle.alert.config.ConfigBusProducer;
+import org.apache.eagle.alert.config.ZKConfigBuilder;
+import org.apache.eagle.alert.coordination.model.ScheduleState;
+import org.apache.eagle.alert.coordinator.Coordinator;
+import org.apache.eagle.alert.coordinator.IPolicyScheduler;
+import org.apache.eagle.alert.coordinator.IScheduleContext;
+import org.apache.eagle.alert.coordinator.PolicySchedulerFactory;
+import org.apache.eagle.alert.coordinator.ScheduleOption;
+import org.apache.eagle.alert.coordinator.TopologyMgmtService;
+import org.apache.eagle.alert.coordinator.provider.ScheduleContextBuilder;
+import org.apache.eagle.alert.service.IMetadataServiceClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Stopwatch;
+import com.typesafe.config.Config;
+
+/**
+ * @since Jun 27, 2016
+ *
+ */
+public class CoordinatorTrigger implements Runnable {
+    // TODO : support configurable in coordiantor
+    public static final int INIT_PERIODICALLY_TRIGGER_DELAY = 6000;
+    // 30 minutes a trigger by default
+    public static final int INIT_PERIODICALLY_TRIGGER_INTERVAL = 1000 * 60 * 30;
+
+    private static final Logger LOG = LoggerFactory.getLogger(CoordinatorTrigger.class);
+
+    private Config config;
+    private IMetadataServiceClient client;
+
+    public CoordinatorTrigger(Config config, IMetadataServiceClient client) {
+        this.config = config;
+        this.client = client;
+    }
+
+    @Override
+    public void run() {
+        try {
+            if (Coordinator.isPeriodicallyForceBuildEnable()) {
+                LOG.info("CoordinatorTrigger started ... ");
+
+                Stopwatch watch = Stopwatch.createStarted();
+
+                // schedule
+                IScheduleContext context = new ScheduleContextBuilder(client).buildContext();
+                TopologyMgmtService mgmtService = new TopologyMgmtService();
+                IPolicyScheduler scheduler = PolicySchedulerFactory.createScheduler();
+
+                scheduler.init(context, mgmtService);
+
+                ScheduleState state = scheduler.schedule(new ScheduleOption());
+
+                ConfigBusProducer producer = new ConfigBusProducer(ZKConfigBuilder.getZKConfig(config));
+                Coordinator.postSchedule(client, state, producer);
+
+                watch.stop();
+                LOG.info("CoordinatorTrigger ended, used time {} sm.", watch.elapsed(TimeUnit.MILLISECONDS));
+            }  else {
+                LOG.info("CoordinatorTrigger found isPeriodicallyForceBuildEnable = false, skipped build");
+            }
+        } catch (Exception e) {
+            LOG.error("trigger schedule failed!", e);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/trigger/DynamicPolicyLoader.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/trigger/DynamicPolicyLoader.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/trigger/DynamicPolicyLoader.java
index 15333da..df7556d 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/trigger/DynamicPolicyLoader.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/java/org/apache/eagle/alert/coordinator/trigger/DynamicPolicyLoader.java
@@ -21,6 +21,7 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.eagle.alert.engine.coordinator.PolicyDefinition;
@@ -28,6 +29,8 @@ import org.apache.eagle.alert.service.IMetadataServiceClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Stopwatch;
+
 /**
  * Poll policy change and notify listeners
  */
@@ -43,7 +46,7 @@ public class DynamicPolicyLoader implements Runnable{
         this.client = client;
     }
 
-    public synchronized void addPolicyChangeListener(PolicyChangeListener listener){
+    public synchronized void addPolicyChangeListener(PolicyChangeListener listener) {
         listeners.add(listener);
     }
 
@@ -56,6 +59,8 @@ public class DynamicPolicyLoader implements Runnable{
     public void run() {
         // we should catch every exception to avoid zombile thread
         try {
+            Stopwatch watch = Stopwatch.createStarted();
+            LOG.info("policies loader start.");
             List<PolicyDefinition> current = client.listPolicies();
             Map<String, PolicyDefinition> currPolicies = new HashMap<>();
             current.forEach(pe -> currPolicies.put(pe.getName(), pe));
@@ -88,6 +93,8 @@ public class DynamicPolicyLoader implements Runnable{
                 }
             }
 
+            watch.stop();
+            LOG.info("policies loader completed. used time milliseconds: {}", watch.elapsed(TimeUnit.MILLISECONDS));
             // reset cached policies
             cachedPolicies = currPolicies;
         } catch (Throwable t) {

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/resources/application.conf
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/resources/application.conf b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/resources/application.conf
deleted file mode 100644
index c03b624..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/resources/application.conf
+++ /dev/null
@@ -1,42 +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.
-
-{
-	"coordinator" : {
-		"policiesPerBolt" : 5,
-		"boltParallelism" : 5,
-		"policyDefaultParallelism" : 5,
-		"boltLoadUpbound": 0.8,
-		"topologyLoadUpbound" : 0.8,
-		"numOfAlertBoltsPerTopology" : 5,
-		"zkConfig" : {
-			"zkQuorum" : "sandbox.hortonworks.com:2181",
-			"zkRoot" : "/alert",
-			"zkSessionTimeoutMs" : 10000,
-			"connectionTimeoutMs" : 10000,
-			"zkRetryTimes" : 3,
-			"zkRetryInterval" : 3000
-		},
-		"metadataService" : {
-			"host" : "localhost",
-			"port" : 38080,
-			"context" : "/rest"
-		},
-		"metadataDynamicCheck" : {
-			"initDelayMillis" : 1000,
-			"delayMillis" : 30000
-		}
-	}
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/resources/log4j.properties b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/resources/log4j.properties
deleted file mode 100644
index d4bc126..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/resources/log4j.properties
+++ /dev/null
@@ -1,21 +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.
-
-log4j.rootLogger=INFO, stdout
-
-# standard output
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %p [%t] %c{2}[%L]: %m%n

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/webapp/WEB-INF/web.xml
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/webapp/WEB-INF/web.xml b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/webapp/WEB-INF/web.xml
deleted file mode 100644
index 2de0d8b..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ 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.
-  -->
-<web-app xmlns="http://java.sun.com/xml/ns/javaee"
-           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
-		  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
-           version="3.0">
-    <welcome-file-list>
-        <welcome-file>index.html</welcome-file>
-    </welcome-file-list>
-    <servlet>
-        <servlet-name>Jersey Web Application</servlet-name>
-        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
-        <init-param>
-            <param-name>com.sun.jersey.config.property.packages</param-name>
-            <param-value>io.swagger.jaxrs.json,io.swagger.jaxrs.listing,org.apache.eagle.alert.coordinator.resource,org.codehaus.jackson.jaxrs</param-value>
-        </init-param>
-        <init-param>
-            <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
-            <param-value>com.sun.jersey.api.container.filter.GZIPContentEncodingFilter;com.sun.jersey.api.container.filter.PostReplaceFilter</param-value>
-        </init-param>
-        <init-param>
-            <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
-            <param-value>com.sun.jersey.api.container.filter.GZIPContentEncodingFilter</param-value>
-        </init-param>
-        <load-on-startup>1</load-on-startup>
-    </servlet>
-    <!-- Servlet for swagger initialization only, no URL mapping. -->
-	<servlet>
-		<servlet-name>swaggerConfig</servlet-name>
-		<servlet-class>io.swagger.jaxrs.config.DefaultJaxrsConfig</servlet-class>
-		<init-param>
-			<param-name>api.version</param-name>
-			<param-value>1.0.0</param-value>
-		</init-param>
-		<init-param>
-			<param-name>swagger.api.basepath</param-name>
-			<param-value>/rest</param-value>
-		</init-param>
-		<load-on-startup>2</load-on-startup>
-	</servlet>
-
-    <servlet-mapping>
-        <servlet-name>Jersey Web Application</servlet-name>
-        <url-pattern>/rest/*</url-pattern>
-    </servlet-mapping>
-    <filter>
-        <filter-name>CorsFilter</filter-name>
-        <!-- this should be replaced by tomcat ones, see also metadata resource -->
-        <filter-class>org.apache.eagle.alert.resource.SimpleCORSFiler</filter-class>
-        <init-param>
-            <param-name>cors.allowed.origins</param-name>
-            <param-value>*</param-value>
-        </init-param>
-        <init-param>
-            <param-name>cors.allowed.headers</param-name>
-            <param-value>Authorization,Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With, Accept</param-value>
-        </init-param>
-        <init-param>
-            <param-name>cors.allowed.methods</param-name>
-            <param-value>GET,POST,HEAD,OPTIONS,PUT,DELETE</param-value>
-        </init-param>
-        <init-param>
-            <param-name>cors.support.credentials</param-name>
-            <param-value>true</param-value>
-        </init-param>
-    </filter>
-    <filter-mapping>
-        <filter-name>CorsFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-    </filter-mapping>
-</web-app>

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/webapp/index.html
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/webapp/index.html b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/webapp/index.html
deleted file mode 100644
index 1c4ea76..0000000
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/main/webapp/index.html
+++ /dev/null
@@ -1,18 +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.
-  -->
-UMP Coordinator service!

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/java/org/apache/alert/coordinator/CoordinatorTest.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/java/org/apache/alert/coordinator/CoordinatorTest.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/java/org/apache/alert/coordinator/CoordinatorTest.java
index 259fe6c..b618dfc 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/java/org/apache/alert/coordinator/CoordinatorTest.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/java/org/apache/alert/coordinator/CoordinatorTest.java
@@ -31,8 +31,11 @@ import org.apache.eagle.alert.coordinator.Coordinator;
 import org.apache.eagle.alert.coordinator.ScheduleOption;
 import org.apache.eagle.alert.service.IMetadataServiceClient;
 import org.apache.eagle.alert.service.MetadataServiceClientImpl;
+import org.apache.eagle.alert.utils.ZookeeperEmbedded;
+import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
 
@@ -45,6 +48,21 @@ import com.typesafe.config.ConfigFactory;
  */
 public class CoordinatorTest {
 
+    private static ZookeeperEmbedded zkEmbed;
+
+    @BeforeClass
+    public static void setup() throws Exception {
+
+        zkEmbed = new ZookeeperEmbedded(2181);
+        zkEmbed.start();
+
+    }
+
+    @AfterClass
+    public static void teardown() {
+        zkEmbed.shutdown();
+    }
+
     @SuppressWarnings({ "resource", "unused" })
     @Ignore
     @Test
@@ -75,7 +93,6 @@ public class CoordinatorTest {
     }
 
     @SuppressWarnings({ "resource", "unused" })
-    @Ignore
     @Test
     public void test_01() throws Exception {
         before();
@@ -121,5 +138,10 @@ public class CoordinatorTest {
         ConfigFactory.invalidateCaches();
         ConfigFactory.load().getConfig("coordinator");
     }
+    
+    @Test
+    public void test_Schedule() {
+        Coordinator.startSchedule();
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/java/org/apache/alert/coordinator/DynamicPolicyLoaderTest.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/java/org/apache/alert/coordinator/DynamicPolicyLoaderTest.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/java/org/apache/alert/coordinator/DynamicPolicyLoaderTest.java
new file mode 100644
index 0000000..dcb031e
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/java/org/apache/alert/coordinator/DynamicPolicyLoaderTest.java
@@ -0,0 +1,29 @@
+/*
+ *
+ *  * 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.alert.coordinator;
+
+import org.junit.Ignore;
+
+/**
+ * Since 4/28/16.
+ */
+@Ignore
+public class DynamicPolicyLoaderTest {
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/java/org/apache/alert/coordinator/mock/TestTopologyMgmtService.java
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/java/org/apache/alert/coordinator/mock/TestTopologyMgmtService.java b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/java/org/apache/alert/coordinator/mock/TestTopologyMgmtService.java
index 8d04a6e..fe36d18 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/java/org/apache/alert/coordinator/mock/TestTopologyMgmtService.java
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/java/org/apache/alert/coordinator/mock/TestTopologyMgmtService.java
@@ -16,26 +16,23 @@
  */
 package org.apache.alert.coordinator.mock;
 
-import java.util.List;
-
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.eagle.alert.coordination.model.internal.Topology;
 import org.apache.eagle.alert.coordinator.TopologyMgmtService;
 import org.apache.eagle.alert.coordinator.model.AlertBoltUsage;
 import org.apache.eagle.alert.coordinator.model.GroupBoltUsage;
 import org.apache.eagle.alert.coordinator.model.TopologyUsage;
-import org.junit.Test;
+import org.junit.Ignore;
+
+import java.util.List;
 
+@Ignore
 public class TestTopologyMgmtService extends TopologyMgmtService {
 
     public static int BOLT_NUMBER = 5;
     
     private int i = 0;
 
-    @Test
-    public void test(){
-
-    }
     @Override
     public TopologyMeta creatTopology() {
         TopologyMeta tm = new TopologyMeta();

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/resources/application.conf
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/resources/application.conf b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/resources/application.conf
new file mode 100644
index 0000000..363e661
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/resources/application.conf
@@ -0,0 +1,42 @@
+# 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.
+
+{
+	"coordinator" : {
+		"policiesPerBolt" : 5,
+		"boltParallelism" : 5,
+		"policyDefaultParallelism" : 5,
+		"boltLoadUpbound": 0.8,
+		"topologyLoadUpbound" : 0.8,
+		"numOfAlertBoltsPerTopology" : 5,
+		"zkConfig" : {
+			"zkQuorum" : "localhost:2181",
+			"zkRoot" : "/alert",
+			"zkSessionTimeoutMs" : 10000,
+			"connectionTimeoutMs" : 10000,
+			"zkRetryTimes" : 3,
+			"zkRetryInterval" : 3000
+		}
+		"metadataService" : {
+			"host" : "localhost",
+			"port" : 8080,
+			"context" : "/rest"
+		}
+		"metadataDynamicCheck" : {
+			"initDelayMillis" : 1000,
+			"delayMillis" : 30000
+		}
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/resources/log4j.properties b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/resources/log4j.properties
new file mode 100644
index 0000000..d4bc126
--- /dev/null
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-coordinator/src/test/resources/log4j.properties
@@ -0,0 +1,21 @@
+# 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.
+
+log4j.rootLogger=INFO, stdout
+
+# standard output
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %p [%t] %c{2}[%L]: %m%n

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-devtools/pom.xml
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-devtools/pom.xml b/eagle-core/eagle-alert-parent/eagle-alert/alert-devtools/pom.xml
index 53c3743..ee6378f 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-devtools/pom.xml
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-devtools/pom.xml
@@ -17,7 +17,6 @@
         <groupId>org.apache.eagle</groupId>
         <artifactId>eagle-alert</artifactId>
         <version>0.5.0-incubating-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
     </parent>
 
     <artifactId>alert-devtools</artifactId>

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/72a1501c/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/pom.xml
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/pom.xml b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/pom.xml
index a8079d6..4909293 100644
--- a/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/pom.xml
+++ b/eagle-core/eagle-alert-parent/eagle-alert/alert-engine/pom.xml
@@ -24,12 +24,6 @@
 	<packaging>jar</packaging>
 
 	<dependencies>
-		<!-- need investigate why scala here can't be 2.11 -->
-		<dependency>
-			<groupId>org.scala-lang</groupId>
-			<artifactId>scala-library</artifactId>
-			<version>2.10.4</version>
-		</dependency>
 		<dependency>
 			<groupId>org.apache.eagle</groupId>
 			<artifactId>alert-common</artifactId>
@@ -134,6 +128,10 @@
 			<groupId>org.apache.kafka</groupId>
 			<artifactId>kafka-clients</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>commons-cli</groupId>
+			<artifactId>commons-cli</artifactId>
+		</dependency>
 	</dependencies>
 
 	<build>