http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-application-management/eagle-stream-application-manager/src/test/scala/org/apache/eagle/stream/application/scheduler/TestScheduler.scala
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-application-management/eagle-stream-application-manager/src/test/scala/org/apache/eagle/stream/application/scheduler/TestScheduler.scala
 
b/eagle-core/eagle-application-management/eagle-stream-application-manager/src/test/scala/org/apache/eagle/stream/application/scheduler/TestScheduler.scala
deleted file mode 100644
index 3db2d67..0000000
--- 
a/eagle-core/eagle-application-management/eagle-stream-application-manager/src/test/scala/org/apache/eagle/stream/application/scheduler/TestScheduler.scala
+++ /dev/null
@@ -1,61 +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.stream.application.scheduler
-
-import akka.actor.{ActorSystem, Props}
-import akka.testkit.{TestActorRef, TestKit}
-import com.typesafe.config.ConfigFactory
-import org.scalatest.{Ignore, BeforeAndAfterAll, MustMatchers, WordSpecLike}
-
-@Ignore
-class TestSchedulerSpec extends TestKit(ActorSystem("stream-app-scheduler"))
-with WordSpecLike with MustMatchers with BeforeAndAfterAll {
-
-  "A Scheduler actor" must {
-    "Forward a message it receives" in {
-      val coordinator = TestActorRef[StreamAppCoordinator]
-      coordinator ! CommandLoaderEvent
-      expectNoMsg()
-    }
-  }
-
-  "A Integrated test" must {
-    "run end-to-end" in {
-      val coordinator = system.actorOf(Props[StreamAppCoordinator])
-      coordinator ! CommandLoaderEvent
-      expectNoMsg()
-    }
-  }
-
-  override def afterAll(): Unit = {
-    super.afterAll()
-    system.shutdown()
-  }
-}
-
-@Ignore
-object TestStreamAppScheduler extends App {
-  val conf: String = """
-                          akka.loglevel = "DEBUG"
-                          akka.actor.debug {
-                            receive = on
-                            lifecycle = on
-                          }
-                     """
-  new ApplicationScheduler().start(ConfigFactory.parseString(conf))
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-application-management/pom.xml
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-application-management/pom.xml 
b/eagle-core/eagle-application-management/pom.xml
deleted file mode 100644
index 5bb8e72..0000000
--- a/eagle-core/eagle-application-management/pom.xml
+++ /dev/null
@@ -1,38 +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.
-  ~
-  -->
-
-<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-core</artifactId>
-        <groupId>org.apache.eagle</groupId>
-        <version>0.5.0-incubating-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>eagle-application-management</artifactId>
-    <packaging>pom</packaging>
-    <description>Eagle Application Management</description>
-
-    <modules>
-        <module>eagle-stream-application-manager</module>
-        <module>eagle-application-service</module>
-    </modules>
-
-
-</project>

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/pom.xml
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-common/pom.xml b/eagle-core/eagle-common/pom.xml
new file mode 100644
index 0000000..a8b8124
--- /dev/null
+++ b/eagle-core/eagle-common/pom.xml
@@ -0,0 +1,82 @@
+<?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";>
+       <modelVersion>4.0.0</modelVersion>
+
+       <parent>
+               <groupId>org.apache.eagle</groupId>
+               <artifactId>eagle-query-parent</artifactId>
+               <version>0.5.0-incubating-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+       </parent>
+
+       <artifactId>eagle-common</artifactId>
+       <packaging>jar</packaging>
+       <name>eagle-common</name>
+
+       <dependencies>
+               <dependency>
+                       <groupId>commons-configuration</groupId>
+                       <artifactId>commons-configuration</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.hbase</groupId>
+                       <artifactId>hbase-client</artifactId>
+               </dependency>
+
+               <dependency>
+                       <groupId>org.apache.hadoop</groupId>
+                       <artifactId>hadoop-common</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>javax.mail</groupId>
+                       <artifactId>mail</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.velocity</groupId>
+                       <artifactId>velocity</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>com.google.code.gson</groupId>
+                       <artifactId>gson</artifactId>
+                       <scope>compile</scope>
+               </dependency>
+               <dependency>
+                       <groupId>com.google.guava</groupId>
+                       <artifactId>guava</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>com.netflix.archaius</groupId>
+                       <artifactId>archaius-core</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.mortbay.jetty</groupId>
+                       <artifactId>jetty</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.mortbay.jetty</groupId>
+                       <artifactId>jetty-util</artifactId>
+               </dependency>
+        <dependency>
+            <groupId>com.typesafe</groupId>
+            <artifactId>config</artifactId>
+        </dependency>
+       </dependencies>
+</project>
+

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/META-INF/MANIFEST.MF
----------------------------------------------------------------------
diff --git a/eagle-core/eagle-common/src/main/java/META-INF/MANIFEST.MF 
b/eagle-core/eagle-common/src/main/java/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c67816b
--- /dev/null
+++ b/eagle-core/eagle-common/src/main/java/META-INF/MANIFEST.MF
@@ -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.
+ */
+Manifest-Version: 1.0
+Class-Path: 
+

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/Base64.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/Base64.java 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/Base64.java
new file mode 100644
index 0000000..aec84a3
--- /dev/null
+++ b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/Base64.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.common;
+
+import java.io.UnsupportedEncodingException;
+
+import javax.xml.bind.DatatypeConverter;
+
+public class Base64 {
+
+       public static String decode(String salted) {
+               try {
+                       return new 
String(DatatypeConverter.parseBase64Binary(salted), "UTF-8");
+               } catch (UnsupportedEncodingException e) {
+                       throw new RuntimeException("UTF-8 must be supported", 
e);
+               }
+       }
+
+       public static String encode(String plain) {
+               try {
+                       return 
DatatypeConverter.printBase64Binary(plain.getBytes("UTF-8"));
+               } catch (UnsupportedEncodingException e) {
+                       throw new RuntimeException("UTF-8 must be supported", 
e);
+               }
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/ByteUtil.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/ByteUtil.java 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/ByteUtil.java
new file mode 100644
index 0000000..c1d4976
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/ByteUtil.java
@@ -0,0 +1,178 @@
+/*
+ * 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.common;
+
+public class ByteUtil {
+       
+       public static double bytesToDouble(byte[] bytes, int offset){
+               return Double.longBitsToDouble(bytesToLong(bytes, offset));
+       }
+       
+       public static double bytesToDouble(byte[] bytes){
+               return Double.longBitsToDouble(bytesToLong(bytes));
+       }
+       
+       public static void doubleToBytes(double v, byte[] bytes){
+               doubleToBytes(v, bytes, 0);
+       }
+       
+       public static void doubleToBytes(double v, byte[] bytes, int offset){
+               longToBytes(Double.doubleToLongBits(v), bytes, offset);
+       }
+       
+       public static byte[] doubleToBytes(double v){
+               return longToBytes(Double.doubleToLongBits(v));
+       }
+       
+       public static long bytesToLong(byte[] bytes){
+               return bytesToLong(bytes, 0);
+       }
+       
+       public static long bytesToLong(byte[] bytes, int offset){
+               long value = 0;
+               for(int i=0; i<8; i++){
+                       value <<= 8;
+                       value |= (bytes[i+offset] & 0xFF);
+               }
+               return value;
+       }
+       
+       public static void longToBytes(long v, byte[] bytes){
+               longToBytes(v, bytes, 0);
+       }
+       
+       public static void longToBytes(long v, byte[] bytes, int offset){
+               long tmp = v;
+               for(int i=0; i<8; i++){
+                       bytes[offset + 7 - i] = (byte)(tmp & 0xFF);
+                       tmp >>= 8;
+               }
+       }
+       
+       public static byte[] longToBytes(long v){
+               long tmp = v;
+               byte[] b = new byte[8];
+               for(int i=0; i<8; i++){
+                       b[7-i] = (byte)(tmp & 0xFF);
+                       tmp >>= 8;
+               }
+               return b;
+       }
+       
+       public static int bytesToInt(byte[] bytes){
+               return bytesToInt(bytes, 0);
+       }
+       
+       public static int bytesToInt(byte[] bytes, int offset){
+               int value = 0;
+               for(int i=0; i<4; i++){
+                       value <<= 8;
+                       value |= (bytes[i+offset] & 0xFF);
+               }
+               return value;
+       }
+       
+       public static void intToBytes(int v, byte[] bytes){
+               intToBytes(v, bytes, 0);
+       }
+       
+       public static void intToBytes(int v, byte[] bytes, int offset){
+               int tmp = v;
+               for(int i=0; i<4; i++){
+                       bytes[offset + 3 - i] = (byte)(tmp & 0xFF);
+                       tmp >>= 8;
+               }
+       }
+
+       public static byte[] intToBytes(int v){
+               int tmp = v;
+               byte[] b = new byte[4];
+               for(int i=0; i<4; i++){
+                       b[3-i] = (byte)(tmp & 0xFF);
+                       tmp >>= 8;
+               }
+               return b;
+       }
+
+       //////
+       
+       public static short bytesToShort(byte[] bytes){
+               return bytesToShort(bytes, 0);
+       }
+       
+       public static short bytesToShort(byte[] bytes, int offset){
+               short value = 0;
+               for(int i=0; i < 2; i++){
+                       value <<= 8;
+                       value |= (bytes[i+offset] & 0xFF);
+               }
+               return value;
+       }
+       
+       public static void shortToBytes(short v, byte[] bytes){
+               shortToBytes(v, bytes, 0);
+       }
+       
+       public static void shortToBytes(short v, byte[] bytes, int offset){
+               int tmp = v;
+               for(int i=0; i < 2; i++){
+                       bytes[offset + 1 - i] = (byte)(tmp & 0xFF);
+                       tmp >>= 8;
+               }
+       }
+
+       public static byte[] shortToBytes(short v){
+               int tmp = v;
+               byte[] b = new byte[2];
+               for(int i=0; i<2; i++){
+                       b[1-i] = (byte)(tmp & 0xFF);
+                       tmp >>= 8;
+               }
+               return b;
+       }
+
+       public static byte[] concat(byte[]... arrays) {
+        int length = 0;
+        for (byte[] array : arrays) {
+            length += array.length;
+        }
+        byte[] result = new byte[length];
+        int pos = 0;
+        for (byte[] array : arrays) {
+            System.arraycopy(array, 0, result, pos, array.length);
+            pos += array.length;
+        }
+        return result;
+    }
+       
+//    public static void main(String[] args){ 
+//     int a = "ThreadName".hashCode();
+//     byte[] b = intToBytes(a);
+//     byte[] c = intToBytes(1676687583);
+//     String s = new String(b);
+//     System.out.println(s);
+       
+//     byte[] d = intToBytes(8652353);
+//     System.out.println(bytesToInt(d));
+       
+//     byte[] e = longToBytes(12131513513l);
+//     System.out.println(bytesToLong(e));
+//     if(12131513513l == bytesToLong(e)){
+//             System.out.println("yes");
+//     }
+//    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/CircularArrayList.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/CircularArrayList.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/CircularArrayList.java
new file mode 100644
index 0000000..49695e5
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/CircularArrayList.java
@@ -0,0 +1,149 @@
+/*
+ * 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.common;
+
+import java.util.AbstractList;
+import java.util.RandomAccess;
+
+/**
+ * Circular array implementation
+ *
+ * @param <E>
+ */
+public class CircularArrayList<E> extends AbstractList<E> implements 
RandomAccess {
+  
+    private final E[] buf; // a List implementing RandomAccess
+    private int head = 0;
+    private int tail = 0;
+    private boolean full = false;
+  
+    public CircularArrayList(E[] array) {
+        buf = array;
+        full = (buf.length == 0);
+    }
+  
+    public int capacity() {
+        return buf.length;
+    }
+    
+    public int head() {
+       return head;
+    }
+    
+    public int tail() {
+       return tail;
+    }
+    
+    public boolean isFull() {
+       return full;
+    }
+    
+    @Override
+    public void clear() {
+        head = 0;
+        tail = 0;
+        full = false;
+        for (int i = 0; i < buf.length; ++i) {
+               buf[i] = null;
+        }
+    }
+
+    private int wrapIndex(int i) {
+        int m = i % buf.length;
+        if (m < 0) { // java modulus can be negative
+            throw new IndexOutOfBoundsException();
+        }
+        return m;
+    }
+  
+    // This method is O(n) but will never be called if the
+    // CircularArrayList is used in its typical/intended role.
+    private void shiftBlock(int startIndex, int endIndex) {
+        assert (endIndex > startIndex);
+        for (int i = endIndex - 1; i >= startIndex; i--) {
+            set(i + 1, get(i));
+        }
+    }
+    
+    public int find(E e) {
+       final int size = size();
+       for (int i = 0; i < size; ++i) {
+               if (e.equals(get(i))) {
+                       return i;
+               }
+       }
+       return -1;
+    }
+  
+    @Override
+    public int size() {
+       if (full) {
+               return buf.length;
+       }
+        return tail - head + (tail < head ? buf.length : 0);
+    }
+  
+    @Override
+    public E get(int i) {
+        if (i < 0 || i >= size()) {
+            throw new IndexOutOfBoundsException();
+        }
+        return buf[wrapIndex(head + i)];
+    }
+  
+    @Override
+    public E set(int i, E e) {
+        if (i < 0 || i >= size()) {
+            throw new IndexOutOfBoundsException();
+        }
+        return buf[wrapIndex(head + i)] =  e;
+    }
+  
+    @Override
+    public void add(int i, E e) {
+        int s = size();
+        if (s == buf.length) {
+            throw new IllegalStateException("Cannot add element."
+                    + " CircularArrayList is filled to capacity.");
+        }
+        full = (s + 1 == buf.length);
+        if (i < 0 || i > s) {
+            throw new IndexOutOfBoundsException();
+        }
+        tail = wrapIndex(tail + 1);
+        if (i < s) {
+            shiftBlock(i, s);
+        }
+        set(i, e);
+    }
+  
+    @Override
+    public E remove(int i) {
+        int s = size();
+        if (i < 0 || i >= s) {
+            throw new IndexOutOfBoundsException();
+        }
+        final E e = get(i);
+        if (i > 0) {
+            shiftBlock(0, i);
+        }
+       buf[head] = null;
+        head = wrapIndex(head + 1);
+        full = false;
+        return e;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/CircularArrayListSortedSet.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/CircularArrayListSortedSet.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/CircularArrayListSortedSet.java
new file mode 100644
index 0000000..ef47624
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/CircularArrayListSortedSet.java
@@ -0,0 +1,106 @@
+/*
+ * 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.common;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+public class CircularArrayListSortedSet<E> {
+
+       private final CircularArrayList<E> list;
+    private final Comparator<? super E> comparator;
+
+       public CircularArrayListSortedSet(E[] array) {
+               this.list = new CircularArrayList<E>(array);
+               this.comparator = null;
+       }
+       
+       public CircularArrayListSortedSet(E[] array, Comparator<? super E> 
comparator) {
+               this.list = new CircularArrayList<E>(array);
+               this.comparator = comparator;
+       }
+       
+    public int capacity() {
+        return list.capacity();
+    }
+    
+    public int head() {
+       return list.head();
+    }
+    
+    public int tail() {
+       return list.tail();
+    }
+    
+    public boolean isFull() {
+       return list.isFull();
+    }
+  
+    public void clear() {
+       list.clear();
+    }
+    
+    public int size() {
+       return list.size();
+    }
+  
+    public E get(int i) {
+        return list.get(i);
+    }
+    
+    @SuppressWarnings("unchecked")
+       public int binarySearch(E e) {
+       if (comparator != null) {
+               return Collections.binarySearch(list, e, comparator);
+       } else {
+               return Collections.binarySearch((List<? extends Comparable<? 
super E>>)list, e);
+       }
+    }
+    
+    public int replace(E e) {
+       int index = binarySearch(e);
+       if (index < 0) {
+               return -1;
+       }
+       list.set(index, e);
+       return index;
+    }
+  
+    public int insert(E e) {
+       int index = binarySearch(e);
+       if (index > 0) {
+               return -1;
+       }
+       index = 0 - index - 1;
+       list.add(index, e);
+       return index;
+    }
+  
+    public E remove(int i) {
+       return list.remove(i);
+    }
+    
+    public int remove(E e) {
+       final int index = binarySearch(e);
+       if (index > 0) {
+               list.remove(index);
+               return index;
+       }
+       return -1;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/DateTimeUtil.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/DateTimeUtil.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/DateTimeUtil.java
new file mode 100644
index 0000000..0f5b189
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/DateTimeUtil.java
@@ -0,0 +1,150 @@
+/*
+ * 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.common;
+import org.apache.eagle.common.config.EagleConfigFactory;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+/**
+ * be aware that SimpleDateFormat instantiation is expensive, so if that's 
under a tight loop, probably we need
+ * a thread local SimpleDateFormat object
+ */
+public class DateTimeUtil {
+       public static final long ONESECOND = 1L * 1000L;
+       public static final long ONEMINUTE = 1L * 60L * 1000L;
+       public static final long ONEHOUR = 1L * 60L * 60L * 1000L;
+       public static final long ONEDAY = 24L * 60L * 60L * 1000L;
+    private static TimeZone CURRENT_TIME_ZONE = 
EagleConfigFactory.load().getTimeZone();
+       
+       public static Date humanDateToDate(String date) throws ParseException{
+               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 
HH:mm:ss");
+        sdf.setTimeZone(CURRENT_TIME_ZONE);
+               return sdf.parse(date);
+       }
+       
+       public static String secondsToHumanDate(long seconds){
+               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 
HH:mm:ss");
+        sdf.setTimeZone(CURRENT_TIME_ZONE);
+               Date t = new Date();
+               t.setTime(seconds*1000);
+               return sdf.format(t);
+       }
+       
+       public static String millisecondsToHumanDateWithMilliseconds(long 
milliseconds){
+               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 
HH:mm:ss,SSS");
+        sdf.setTimeZone(CURRENT_TIME_ZONE);
+               Date t = new Date();
+               t.setTime(milliseconds);
+               return sdf.format(t);
+       }
+       
+       public static String millisecondsToHumanDateWithSeconds(long 
milliseconds){
+               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 
HH:mm:ss");
+        sdf.setTimeZone(CURRENT_TIME_ZONE);
+               Date t = new Date();
+               t.setTime(milliseconds);
+               return sdf.format(t);
+       }
+       
+       public static long humanDateToSeconds(String date) throws 
ParseException{
+               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 
HH:mm:ss");
+        sdf.setTimeZone(CURRENT_TIME_ZONE);
+               Date d = sdf.parse(date);
+               return d.getTime()/1000;
+       }
+       
+       public static long humanDateToMilliseconds(String date) throws 
ParseException{
+               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 
HH:mm:ss,SSS");
+        sdf.setTimeZone(CURRENT_TIME_ZONE);
+               Date d = sdf.parse(date);
+               return d.getTime();
+       }
+       
+       
+       public static long humanDateToMillisecondsWithoutException(String date){
+               try{
+                       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 
HH:mm:ss,SSS");
+            sdf.setTimeZone(CURRENT_TIME_ZONE);
+                       Date d = sdf.parse(date);
+                       return d.getTime();
+               }catch(ParseException ex){
+                       return 0L;
+               }
+       }
+       
+       public static long humanDateToSecondsWithoutException(String date){
+               try{
+                       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 
HH:mm:ss");
+            sdf.setTimeZone(CURRENT_TIME_ZONE);
+                       Date d = sdf.parse(date);
+                       return (d.getTime() / 1000);
+               }catch(ParseException ex){
+                       return 0L;
+               }
+       }
+
+       //For mapr
+       //exp: 2015-06-06T10:44:22.800Z
+       public static long maprhumanDateToMilliseconds(String date) throws 
ParseException{
+               date = date.replace('T',' ');
+               date = date.replace('Z',' ');
+               date = date.replace('.',',');
+               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 
HH:mm:ss,SSS ");
+               sdf.setTimeZone(CURRENT_TIME_ZONE);
+               Date d = sdf.parse(date);
+               return d.getTime();
+       }
+       /**
+        * this could be accurate only when timezone is UTC
+        * for the timezones other than UTC, there is possibly issue, for 
example
+        * assume timezone is GMT+8 in China
+        * When user time is "2014-07-15 05:00:00", it will be converted to 
timestamp first, internally it would be  "2014-07-14 21:00:00" in UTC timezone. 
When rounded down to day, the internal time would 
+        * be changed to "2014-07-14 00:00:00", and that means the user time is 
"2014-07-14 08:00:00". But originally user wants to round it to "2014-07-15 
00:00:00"
+        * 
+        * @param field
+        * @param timeInMillis the seconds elapsed since 1970-01-01 00:00:00
+        * @return
+        */
+       public static long roundDown(int field, long timeInMillis){
+               switch(field){
+                       case Calendar.DAY_OF_MONTH:
+                       case Calendar.DAY_OF_WEEK:
+                       case Calendar.DAY_OF_YEAR:
+                               return (timeInMillis - timeInMillis % 
(24*60*60*1000));
+                       case Calendar.HOUR:
+                               return (timeInMillis - timeInMillis % 
(60*60*1000));
+                       case Calendar.MINUTE:
+                               return (timeInMillis - timeInMillis % 
(60*1000));
+                       case Calendar.SECOND:
+                               return (timeInMillis - timeInMillis % (1000));
+                       default:
+                               return 0L;
+               }
+       }
+
+       public static String format(long milliseconds, String format) {
+               SimpleDateFormat sdf = new SimpleDateFormat(format);
+        sdf.setTimeZone(CURRENT_TIME_ZONE);
+               Date t = new Date();
+               t.setTime(milliseconds);
+               return sdf.format(t);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/EagleBase64Wrapper.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/EagleBase64Wrapper.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/EagleBase64Wrapper.java
new file mode 100644
index 0000000..e31ef99
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/EagleBase64Wrapper.java
@@ -0,0 +1,32 @@
+/*
+ * 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.common;
+
+import org.apache.commons.net.util.Base64;
+
+/**
+ * wrap base64 encoding and decoding, so reduce the confuse of using many 
Base64 methods. 
+ */
+public class EagleBase64Wrapper {
+       public static String encodeByteArray2URLSafeString(byte[] bytes){
+               return Base64.encodeBase64URLSafeString(bytes);
+       }
+       
+       public static byte[] decode(String input){
+               return Base64.decodeBase64(input);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/EagleExceptionWrapper.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/EagleExceptionWrapper.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/EagleExceptionWrapper.java
new file mode 100644
index 0000000..1fc4e85
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/EagleExceptionWrapper.java
@@ -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.
+ */
+package org.apache.eagle.common;
+
+public class EagleExceptionWrapper {
+       private final static int MAX_DEPTH = 10;
+       
+       public static String wrap(Exception ex){
+               return wrap(ex, EagleExceptionWrapper.MAX_DEPTH);
+       }
+       
+       public static String wrap(Exception ex, int maxdepth){
+               int d = maxdepth;
+               if(d <= 0)
+                       d = EagleExceptionWrapper.MAX_DEPTH;
+               int index = 0;
+               StringBuffer sb = new StringBuffer();
+               sb.append(ex);
+               sb.append(System.getProperty("line.separator"));
+               for(StackTraceElement element : ex.getStackTrace()){
+                       sb.append(element.toString());
+                       sb.append(System.getProperty("line.separator"));
+                       if(++index >= d)
+                               break;
+               }
+               return sb.toString();
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/Environment.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/Environment.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/Environment.java
new file mode 100644
index 0000000..dd69ed5
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/Environment.java
@@ -0,0 +1,23 @@
+/*
+ * 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.common;
+
+public enum Environment {
+       dev,
+       test,
+       prod,
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/OS.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/OS.java 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/OS.java
new file mode 100644
index 0000000..05e8db1
--- /dev/null
+++ b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/OS.java
@@ -0,0 +1,41 @@
+/*
+ * 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.common;
+
+public class OS {
+
+       private final static String os = System.getProperty("os.name")
+                       .toLowerCase();
+
+       public static boolean isWindows() {
+               return (os.indexOf("win") >= 0);
+       }
+
+       public static boolean isMac() {
+               return (os.indexOf("mac") >= 0);
+       }
+
+       public static boolean isUnix() {
+               return (os.indexOf("nix") >= 0 || os.indexOf("nux") >= 0 || os
+                               .indexOf("aix") > 0);
+       }
+
+       public static boolean isSolaris() {
+               return (os.indexOf("sunos") >= 0);
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/SerializableUtils.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/SerializableUtils.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/SerializableUtils.java
new file mode 100644
index 0000000..c5823ea
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/SerializableUtils.java
@@ -0,0 +1,126 @@
+/*
+ *
+ *  * 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.common;
+
+import org.xerial.snappy.SnappyInputStream;
+import org.xerial.snappy.SnappyOutputStream;
+
+import java.io.*;
+
+/**
+ * Utilities for working with Serializables.
+ *
+ * Derived from "com.google.cloud.dataflow.sdk.util.SerializableUtils":
+ * 
https://github.com/apache/incubator-beam/blob/master/sdks/java/core/src/main/java/com/google/cloud/dataflow/sdk/util/SerializableUtils.java
+ */
+public class SerializableUtils {
+  /**
+   * Serializes the argument into an array of bytes, and returns it.
+   *
+   * @throws IllegalArgumentException if there are errors when serializing
+   */
+  public static byte[] serializeToCompressedByteArray(Object value) {
+    try {
+      ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+      try (ObjectOutputStream oos = new ObjectOutputStream(new 
SnappyOutputStream(buffer))) {
+        oos.writeObject(value);
+      }
+      return buffer.toByteArray();
+    } catch (IOException exn) {
+      throw new IllegalArgumentException(
+          "unable to serialize " + value,
+          exn);
+    }
+  }
+
+  /**
+   * Serializes the argument into an array of bytes, and returns it.
+   *
+   * @throws IllegalArgumentException if there are errors when serializing
+   */
+  public static byte[] serializeToByteArray(Object value) {
+    try {
+      ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+      try (ObjectOutputStream oos = new ObjectOutputStream(buffer)) {
+        oos.writeObject(value);
+      }
+      return buffer.toByteArray();
+    } catch (IOException exn) {
+      throw new IllegalArgumentException("unable to serialize " + value, exn);
+    }
+  }
+
+  /**
+   * Deserializes an object from the given array of bytes, e.g., as
+   * serialized using {@link #serializeToCompressedByteArray}, and returns it.
+   *
+   * @throws IllegalArgumentException if there are errors when
+   * deserializing, using the provided description to identify what
+   * was being deserialized
+   */
+  public static Object deserializeFromByteArray(byte[] encodedValue,
+                                                          String description) {
+    try {
+      try (ObjectInputStream ois = new ObjectInputStream(new 
ByteArrayInputStream(encodedValue))) {
+        return ois.readObject();
+      }
+    } catch (IOException | ClassNotFoundException exn) {
+      throw new IllegalArgumentException(
+          "unable to deserialize " + description,
+          exn);
+    }
+  }
+
+  /**
+   * Deserializes an object from the given array of bytes, e.g., as
+   * serialized using {@link #serializeToCompressedByteArray}, and returns it.
+   *
+   * @throws IllegalArgumentException if there are errors when
+   * deserializing, using the provided description to identify what
+   * was being deserialized
+   */
+  public static Object deserializeFromCompressedByteArray(byte[] encodedValue,
+                                                          String description) {
+    try {
+      try (ObjectInputStream ois = new ObjectInputStream(
+          new SnappyInputStream(new ByteArrayInputStream(encodedValue)))) {
+        return ois.readObject();
+      }
+    } catch (IOException | ClassNotFoundException exn) {
+      throw new IllegalArgumentException(
+          "unable to deserialize " + description,
+          exn);
+    }
+  }
+
+  public static <T extends Serializable> T ensureSerializable(T value) {
+    @SuppressWarnings("unchecked")
+    T copy = (T) 
deserializeFromCompressedByteArray(serializeToCompressedByteArray(value),
+        value.toString());
+    return copy;
+  }
+
+  public static <T extends Serializable> T clone(T value) {
+    @SuppressWarnings("unchecked")
+    T copy = (T) 
deserializeFromCompressedByteArray(serializeToCompressedByteArray(value),
+        value.toString());
+    return copy;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/config/EagleConfig.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/config/EagleConfig.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/config/EagleConfig.java
new file mode 100755
index 0000000..6226057
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/config/EagleConfig.java
@@ -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.
+ */
+package org.apache.eagle.common.config;
+
+import com.typesafe.config.Config;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.client.HTableInterface;
+
+import java.util.TimeZone;
+import java.util.concurrent.ThreadPoolExecutor;
+
+public interface EagleConfig {
+
+    boolean isCoprocessorEnabled();
+
+       HTableInterface getHTable(String tableName);
+
+    Configuration getHbaseConf();
+
+    String getStorageType();
+
+    ThreadPoolExecutor getExecutor();
+
+       String getZKQuorum();
+
+       String getZKPort();
+
+       String getServiceHost();
+
+       int getServicePort();
+
+    String getEnv();
+
+    boolean isTableNamePrefixedWithEnvironment();
+       
+    int getHBaseClientScanCacheSize();
+
+    TimeZone getTimeZone();
+    
+    boolean isServiceAuditingEnabled();
+
+    /**
+     * @return root config
+     */
+    Config getConfig();
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/config/EagleConfigConstants.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/config/EagleConfigConstants.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/config/EagleConfigConstants.java
new file mode 100644
index 0000000..26d7b49
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/config/EagleConfigConstants.java
@@ -0,0 +1,65 @@
+/*
+ * 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.common.config;
+
+public final class EagleConfigConstants {
+    public final static String SERVICE_ENV = "eagle.service.env";
+    public final static String SERVICE_HOST = "eagle.service.host";
+    public final static String SERVICE_PORT = "eagle.service.port";
+    public final static String SERVICE_HBASE_ZOOKEEPER_QUORUM = 
"eagle.service.hbase-zookeeper-quorum";
+    public final static String SERVICE_HBASE_ZOOKEEPER_PROPERTY_CLIENTPORT = 
"eagle.service.hbase-zookeeper-property-clientPort";
+    public final static String SERVICE_ZOOKEEPER_ZNODE_PARENT = 
"eagle.service.zookeeper-znode-parent";
+    public final static String SERVICE_HBASE_CLIENT_IPC_POOL_SIZE = 
"eagle.service.hbase-client-ipc-pool-size";
+    public final static String SERVICE_STORAGE_TYPE = 
"eagle.service.storage-type";
+    public final static String SERVICE_COPROCESSOR_ENABLED = 
"eagle.service.coprocessor-enabled";
+    public final static String SERVICE_TABLE_NAME_PREFIXED_WITH_ENVIRONMENT = 
"eagle.service.table-name-prefixed-with-environment";
+    public final static String SERVICE_HBASE_CLIENT_SCAN_CACHE_SIZE = 
"eagle.service.hbase-client-scan-cache-size";
+    public final static String SERVICE_THREADPOOL_CORE_SIZE = 
"eagle.service.threadpool-core-size";
+    public final static String SERVICE_THREADPOOL_MAX_SIZE = 
"eagle.service.threadpool-max-size";
+    public final static String SERVICE_THREADPOOL_SHRINK_SIZE = 
"eagle.service.threadpool-shrink-size";
+    public final static String SERVICE_AUDITING_ENABLED = 
"eagle.service.audit-enabled";
+
+    public final static String EAGLE_TIME_ZONE = "eagle.timezone";
+    public final static String DEFAULT_EAGLE_TIME_ZONE = "UTC";
+
+    public final static int DEFAULT_THREAD_POOL_CORE_SIZE = 10;
+    public final static int DEFAULT_THREAD_POOL_MAX_SIZE = 20;
+    public final static long DEFAULT_THREAD_POOL_SHRINK_TIME = 60000L;
+    public final static String DEFAULT_SERVICE_HOST = "localhost";
+    public final static String DEFAULT_STORAGE_TYPE = "hbase";
+    public final static int DEFAULT_SERVICE_PORT = 8080;
+    public final static String DEFAULT_ZOOKEEPER_ZNODE_PARENT = 
"/hbase-unsecure";
+
+    public final static String EAGLE_PROPS="eagleProps";
+    public final static String EAGLE_SERVICE = "eagleService";
+    public final static String HOST = "host";
+    public final static String PORT = "port";
+    public final static String USERNAME = "username";
+    public final static String PASSWORD = "password";
+
+    public final static String SITE = "site";
+    @Deprecated
+    public final static String DATA_SOURCE = "dataSource";
+    public final static String APPLICATION = "application";
+
+    public final static String WEB_CONFIG = "web";
+    public final static String APP_CONFIG = "app";
+    public final static String CLASSIFICATION_CONFIG = "classification";
+
+    public final static String LOCAL_MODE = "local";
+    public final static String CLUSTER_MODE = "cluster";
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/config/EagleConfigFactory.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/config/EagleConfigFactory.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/config/EagleConfigFactory.java
new file mode 100755
index 0000000..0d73743
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/config/EagleConfigFactory.java
@@ -0,0 +1,198 @@
+/*
+ * 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.common.config;
+
+import com.typesafe.config.Config;
+import com.typesafe.config.ConfigFactory;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.client.HTableInterface;
+import org.apache.hadoop.hbase.client.HTablePool;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.TimeZone;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+public class EagleConfigFactory implements EagleConfig {
+       private static final Logger LOG = 
LoggerFactory.getLogger(EagleConfigFactory.class);
+
+       private String env;
+       private String zkQuorum;
+       private String zkPort;
+
+    private Configuration hbaseConf;
+       private String eagleServiceHost;
+       private int eagleServicePort;
+    private String storageType;
+    private Config config;
+    private TimeZone timeZone;
+
+    public boolean isCoprocessorEnabled() {
+               return isCoprocessorEnabled;
+       }
+
+       private boolean isCoprocessorEnabled;
+
+       private boolean tableNamePrefixedWithEnv;
+
+       private HTablePool pool;
+       private int hbaseClientScanCacheSize = 1000;
+
+       private ThreadPoolExecutor executor = null;
+
+       private static EagleConfigFactory manager = new EagleConfigFactory();
+
+       private EagleConfigFactory(){
+               init();
+               if(this.getStorageType() == null || 
this.getStorageType().equalsIgnoreCase("hbase")) {
+                       this.pool = new HTablePool(this.hbaseConf, 10);
+               }
+       }
+       
+       public static EagleConfig load(){
+               return manager;
+       }
+       
+       public HTableInterface getHTable(String tableName){
+        return pool.getTable(tableName);
+    }
+
+    private String getString(Config config,String path,String defaultValue){
+        if(config.hasPath(path)){
+            return config.getString(path);
+        }else{
+            return defaultValue;
+        }
+    }
+
+    public String getStorageType() {
+        return storageType;
+    }
+
+    public ThreadPoolExecutor getExecutor() {
+        return executor;
+    }
+
+    private void init(){
+        this.config = ConfigFactory.load();
+        this.timeZone = 
TimeZone.getTimeZone((config.hasPath(EagleConfigConstants.EAGLE_TIME_ZONE)? 
config.getString(EagleConfigConstants.EAGLE_TIME_ZONE): 
EagleConfigConstants.DEFAULT_EAGLE_TIME_ZONE));
+        this.env = config.hasPath(EagleConfigConstants.SERVICE_ENV) ? 
config.getString(EagleConfigConstants.SERVICE_ENV):"dev";
+               this.zkQuorum = 
config.hasPath(EagleConfigConstants.SERVICE_HBASE_ZOOKEEPER_QUORUM) ? 
config.getString(EagleConfigConstants.SERVICE_HBASE_ZOOKEEPER_QUORUM):null;
+               this.zkPort = 
config.hasPath(EagleConfigConstants.SERVICE_HBASE_ZOOKEEPER_PROPERTY_CLIENTPORT)
 ? 
config.getString(EagleConfigConstants.SERVICE_HBASE_ZOOKEEPER_PROPERTY_CLIENTPORT):
 null;
+        String zkZnodeParent = 
config.hasPath(EagleConfigConstants.SERVICE_ZOOKEEPER_ZNODE_PARENT)? 
config.getString(EagleConfigConstants.SERVICE_ZOOKEEPER_ZNODE_PARENT): 
EagleConfigConstants.DEFAULT_ZOOKEEPER_ZNODE_PARENT;
+               String clientIPCPoolSize = getString(config, 
EagleConfigConstants.SERVICE_HBASE_CLIENT_IPC_POOL_SIZE, "10");
+               this.hbaseConf = HBaseConfiguration.create();
+
+        if (this.zkQuorum != null)
+            this.hbaseConf.set("hbase.zookeeper.quorum", this.zkQuorum);
+
+               if (this.zkPort != null)
+            this.hbaseConf.set("hbase.zookeeper.property.clientPort", 
this.zkPort);
+
+        if(zkZnodeParent != null)
+            this.hbaseConf.set("zookeeper.znode.parent", zkZnodeParent);
+        else
+            this.hbaseConf.set("zookeeper.znode.parent", 
EagleConfigConstants.DEFAULT_ZOOKEEPER_ZNODE_PARENT);
+
+        this.hbaseConf.set("hbase.client.ipc.pool.size", clientIPCPoolSize);
+
+               this.eagleServiceHost = 
config.hasPath(EagleConfigConstants.SERVICE_HOST) ? 
config.getString(EagleConfigConstants.SERVICE_HOST) : 
EagleConfigConstants.DEFAULT_SERVICE_HOST;
+        this.storageType = 
config.hasPath(EagleConfigConstants.SERVICE_STORAGE_TYPE) ? 
config.getString(EagleConfigConstants.SERVICE_STORAGE_TYPE) : 
EagleConfigConstants.DEFAULT_STORAGE_TYPE;
+        this.isCoprocessorEnabled = 
config.hasPath(EagleConfigConstants.SERVICE_COPROCESSOR_ENABLED) && 
config.getBoolean(EagleConfigConstants.SERVICE_COPROCESSOR_ENABLED);
+               this.eagleServicePort = 
config.hasPath(EagleConfigConstants.SERVICE_PORT) ? 
config.getInt(EagleConfigConstants.SERVICE_PORT) : 
EagleConfigConstants.DEFAULT_SERVICE_PORT;
+        this.tableNamePrefixedWithEnv = 
config.hasPath(EagleConfigConstants.SERVICE_TABLE_NAME_PREFIXED_WITH_ENVIRONMENT)
 && 
config.getBoolean(EagleConfigConstants.SERVICE_TABLE_NAME_PREFIXED_WITH_ENVIRONMENT);
+        this.hbaseClientScanCacheSize = 
config.hasPath(EagleConfigConstants.SERVICE_HBASE_CLIENT_SCAN_CACHE_SIZE)? 
config.getInt(EagleConfigConstants.SERVICE_HBASE_CLIENT_SCAN_CACHE_SIZE) : 
hbaseClientScanCacheSize;
+        // initilize eagle service thread pool for parallel execution of hbase 
scan etc.
+               int threadPoolCoreSize = 
config.hasPath(EagleConfigConstants.SERVICE_THREADPOOL_CORE_SIZE)? 
config.getInt(EagleConfigConstants.SERVICE_THREADPOOL_CORE_SIZE): 
EagleConfigConstants.DEFAULT_THREAD_POOL_CORE_SIZE;
+               int threadPoolMaxSize = 
config.hasPath(EagleConfigConstants.SERVICE_THREADPOOL_MAX_SIZE) ? 
config.getInt(EagleConfigConstants.SERVICE_THREADPOOL_MAX_SIZE) : 
EagleConfigConstants.DEFAULT_THREAD_POOL_MAX_SIZE;
+               long threadPoolShrinkTime = 
config.hasPath(EagleConfigConstants.SERVICE_THREADPOOL_SHRINK_SIZE) ? 
config.getLong(EagleConfigConstants.SERVICE_THREADPOOL_SHRINK_SIZE) : 
EagleConfigConstants.DEFAULT_THREAD_POOL_SHRINK_TIME;
+               this.isServiceAuditingEnabled = 
config.hasPath(EagleConfigConstants.SERVICE_AUDITING_ENABLED) && 
config.getBoolean(EagleConfigConstants.SERVICE_AUDITING_ENABLED);
+               
+               this.executor = new ThreadPoolExecutor(threadPoolCoreSize, 
threadPoolMaxSize, threadPoolShrinkTime, TimeUnit.MILLISECONDS, new 
LinkedBlockingQueue<Runnable>());
+
+               LOG.info("Successfully initialized config");
+
+               if(LOG.isDebugEnabled()) {
+                       if(this.isCoprocessorEnabled){
+                               LOG.debug("Eagle HBase Coprocessor is enabled");
+                       }else{
+                               LOG.debug("Eagle HBase Coprocessor is 
disabled");
+                       }
+               }
+       }
+
+    @Override
+       public Configuration getHbaseConf() {
+               return hbaseConf;
+       }
+
+    @Override
+       public String getZKQuorum(){
+               return this.zkQuorum;
+    }
+
+    @Override
+       public String getZKPort(){
+               return this.zkPort;
+       }
+
+    @Override
+       public String getServiceHost() {
+               return eagleServiceHost;
+       }
+
+    @Override
+       public int getServicePort() {
+               return eagleServicePort;
+       }
+
+    @Override
+       public String getEnv() {
+               return env;
+       }
+
+    @Override
+       public boolean isTableNamePrefixedWithEnvironment(){
+               return this.tableNamePrefixedWithEnv;
+       }
+
+    @Override
+       public int getHBaseClientScanCacheSize(){
+               return this.hbaseClientScanCacheSize;
+       }
+
+    @Override
+    public TimeZone getTimeZone() {
+        return this.timeZone;
+    }
+
+    @Override
+    public Config getConfig() {
+        return this.config;
+    }
+    
+    // added for jira EAGLE-47
+    boolean isServiceAuditingEnabled;
+    
+    @Override
+       public boolean isServiceAuditingEnabled() {
+               return isServiceAuditingEnabled;
+       }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/config/EagleConfigHelper.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/config/EagleConfigHelper.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/config/EagleConfigHelper.java
new file mode 100644
index 0000000..fe3e190
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/config/EagleConfigHelper.java
@@ -0,0 +1,51 @@
+/*
+ *
+ *    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.common.config;
+
+import com.typesafe.config.Config;
+
+public class EagleConfigHelper {
+
+    public static String getServiceHost(Config config) {
+        return config.getString(EagleConfigConstants.EAGLE_PROPS + "." + 
EagleConfigConstants.EAGLE_SERVICE + "." + EagleConfigConstants.HOST);
+    }
+
+    public static int getServicePort(Config config) {
+        return config.getInt(EagleConfigConstants.EAGLE_PROPS + "." + 
EagleConfigConstants.EAGLE_SERVICE + "." + EagleConfigConstants.PORT);
+    }
+
+    public static String getServiceUser(Config config) {
+        return config.hasPath(EagleConfigConstants.EAGLE_PROPS + "." + 
EagleConfigConstants.EAGLE_SERVICE + "." + EagleConfigConstants.USERNAME) ?
+               config.getString(EagleConfigConstants.EAGLE_PROPS + "." + 
EagleConfigConstants.EAGLE_SERVICE + "." + EagleConfigConstants.USERNAME) : 
null;
+    }
+
+    public static String getServicePassword(Config config) {
+        return config.hasPath(EagleConfigConstants.EAGLE_PROPS + "." + 
EagleConfigConstants.EAGLE_SERVICE + "." + EagleConfigConstants.PASSWORD) ?
+                config.getString(EagleConfigConstants.EAGLE_PROPS + "." + 
EagleConfigConstants.EAGLE_SERVICE + "." + EagleConfigConstants.PASSWORD) : 
null;
+    }
+
+    public static String getSite(Config config) {
+        return config.getString(EagleConfigConstants.EAGLE_PROPS + "." + 
EagleConfigConstants.SITE);
+    }
+
+    public static String getApplication(Config config) {
+        return config.getString(EagleConfigConstants.EAGLE_PROPS + "." + 
EagleConfigConstants.APPLICATION);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/email/EagleMailClient.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/email/EagleMailClient.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/email/EagleMailClient.java
new file mode 100755
index 0000000..6edac0a
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/email/EagleMailClient.java
@@ -0,0 +1,253 @@
+/*
+ * 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.common.email;
+
+import java.io.File;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.activation.DataHandler;
+import javax.activation.DataSource;
+import javax.activation.FileDataSource;
+import javax.mail.Authenticator;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.Multipart;
+import javax.mail.PasswordAuthentication;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.internet.AddressException;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+
+import org.apache.commons.configuration.AbstractConfiguration;
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.VelocityEngine;
+import org.apache.velocity.exception.ResourceNotFoundException;
+import org.apache.velocity.runtime.RuntimeConstants;
+import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.netflix.config.ConcurrentMapConfiguration;
+
+public class EagleMailClient {
+//     private static final String CONFIG_FILE = "config.properties";
+       private static final String BASE_PATH = "templates/";
+       private static final String AUTH_CONFIG = "mail.smtp.auth";
+       private static final String DEBUG_CONFIG = "mail.debug";
+       private static final String USER_CONFIG = "mail.user";
+       private static final String PASSWORD_CONFIG = "mail.password";
+
+       private VelocityEngine velocityEngine;
+       private Session session;
+       private static final Logger LOG = 
LoggerFactory.getLogger(EagleMailClient.class);
+
+       public EagleMailClient() {
+               this(new ConcurrentMapConfiguration());
+       }
+
+       public EagleMailClient(AbstractConfiguration configuration) {
+               try {
+                       ConcurrentMapConfiguration con = 
(ConcurrentMapConfiguration)configuration;
+                       velocityEngine = new VelocityEngine();
+                       
velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
+                       
velocityEngine.setProperty("classpath.resource.loader.class", 
ClasspathResourceLoader.class.getName());
+                       velocityEngine.init();
+
+                       con.setProperty("mail.transport.protocol", "smtp");
+                       final Properties config = con.getProperties();
+                       
if(Boolean.parseBoolean(config.getProperty(AUTH_CONFIG))){
+                               session = Session.getDefaultInstance(config, 
new Authenticator() {
+                                       protected PasswordAuthentication 
getPasswordAuthentication() {
+                                               return new 
PasswordAuthentication(config.getProperty(USER_CONFIG), 
config.getProperty(PASSWORD_CONFIG));
+                                       }
+                               });
+                       }
+                       else session = Session.getDefaultInstance(config, new 
Authenticator() {});
+                       final String debugMode = 
config.getProperty(DEBUG_CONFIG, "false");
+                       final boolean debug = Boolean.parseBoolean(debugMode);
+                       session.setDebug(debug);
+               } catch (Exception e) {
+            LOG.error("Failed connect to smtp server",e);
+               }
+       }
+
+       private boolean _send(String from, String to, String cc, String title,
+                       String content) {
+               Message msg = new MimeMessage(session);
+               try {
+                       msg.setFrom(new InternetAddress(from));
+                       msg.setSubject(title);
+                       if (to != null) {
+                               msg.setRecipients(Message.RecipientType.TO,
+                                               InternetAddress.parse(to));
+                       }
+                       if (cc != null) {
+                               msg.setRecipients(Message.RecipientType.CC,
+                                               InternetAddress.parse(cc));
+                       }
+                       //msg.setRecipients(Message.RecipientType.BCC, 
InternetAddress.parse(DEFAULT_BCC_ADDRESS));
+                       msg.setContent(content, "text/html;charset=utf-8");
+                       LOG.info(String.format("Going to send mail: from[%s], 
to[%s], cc[%s], title[%s]", from, to, cc, title));
+
+                       Transport.send(msg);
+
+                       return true;
+               } catch (AddressException e) {
+                       LOG.info("Send mail failed, got an AddressException: " 
+ e.getMessage(), e);
+                       return false;
+               } catch (MessagingException e) {
+                       LOG.info("Send mail failed, got an AddressException: " 
+ e.getMessage(), e);
+                       return false;
+               }
+       }
+
+       private boolean _send(String from,String to,String cc,String 
title,String content,List<MimeBodyPart> attachments){
+               MimeMessage mail = new MimeMessage(session);
+               try {
+                       mail.setFrom(new InternetAddress(from));
+                       mail.setSubject(title);
+                       if (to != null) {
+                               mail.setRecipients(Message.RecipientType.TO,
+                                               InternetAddress.parse(to));
+                       }
+                       if (cc != null) {
+                               mail.setRecipients(Message.RecipientType.CC,
+                                               InternetAddress.parse(cc));
+                       }
+
+                       //mail.setRecipients(Message.RecipientType.BCC, 
InternetAddress.parse(DEFAULT_BCC_ADDRESS));
+
+                       MimeBodyPart mimeBodyPart = new MimeBodyPart();
+                       
mimeBodyPart.setContent(content,"text/html;charset=utf-8");
+
+                       Multipart multipart = new MimeMultipart();
+                       multipart.addBodyPart(mimeBodyPart);
+
+                       for(MimeBodyPart attachment:attachments){
+                               multipart.addBodyPart(attachment);
+                       }
+
+                       mail.setContent(multipart);
+//                     mail.setContent(content, "text/html;charset=utf-8");
+                       LOG.info(String.format("Going to send mail: from[%s], 
to[%s], cc[%s], title[%s]", from, to, cc, title));
+
+                       Transport.send(mail);
+
+                       return true;
+               } catch (AddressException e) {
+                       LOG.info("Send mail failed, got an AddressException: " 
+ e.getMessage(), e);
+                       return false;
+               } catch (MessagingException e) {
+                       LOG.info("Send mail failed, got an AddressException: " 
+ e.getMessage(), e);
+                       return false;
+               }
+       }
+
+       public boolean send(String from, String to, String cc, String title,
+                       String content) {
+               return this._send(from, to, cc, title, content);
+       }
+
+       public boolean send(String from, String to, String cc, String title,
+                       String templatePath, VelocityContext context) {
+               Template t = null;
+               try {
+                       t = velocityEngine.getTemplate(BASE_PATH + 
templatePath);
+               } catch (ResourceNotFoundException ex) {
+
+               }
+               if (t == null) {
+                       try {
+                               t = velocityEngine.getTemplate(templatePath);
+                       } catch (ResourceNotFoundException e) {
+                               t = velocityEngine.getTemplate("/" + 
templatePath);
+                       }
+               }
+               final StringWriter writer = new StringWriter();
+               t.merge(context, writer);
+               if(LOG.isDebugEnabled()) LOG.debug(writer.toString());
+               return this.send(from, to, cc, title, writer.toString());
+       }
+
+       public boolean send(String from, String to, String cc, String title,
+                           String templatePath, VelocityContext context, 
Map<String,File> attachments) {
+               if (attachments == null || attachments.isEmpty()) {
+                       return send(from, to, cc, title, templatePath, context);
+               }
+               Template t = null;
+
+               List<MimeBodyPart> mimeBodyParts = new 
ArrayList<MimeBodyPart>();
+               Map<String,String> cid = new HashMap<String,String>();
+
+               for (Map.Entry<String,File> entry : attachments.entrySet()) {
+                       final String attachment = entry.getKey();
+                       final File attachmentFile  = entry.getValue();
+                       final MimeBodyPart mimeBodyPart = new MimeBodyPart();
+                       if(attachmentFile !=null && attachmentFile.exists()){
+                               DataSource source = new 
FileDataSource(attachmentFile);
+                               try {
+                                       mimeBodyPart.setDataHandler(new 
DataHandler(source));
+                                       mimeBodyPart.setFileName(attachment);
+                                       
mimeBodyPart.setDisposition(MimeBodyPart.ATTACHMENT);
+                                       mimeBodyPart.setContentID(attachment);
+                                       
cid.put(attachment,mimeBodyPart.getContentID());
+                                       mimeBodyParts.add(mimeBodyPart);
+                               } catch (MessagingException e) {
+                                       LOG.error("Generate mail failed, got 
exception while attaching files: " + e.getMessage(), e);
+                               }
+                       }else{
+                               LOG.error("Attachment: " + attachment + " is 
null or not exists");
+                       }
+               }
+               //TODO remove cid, because not used at all
+               if(LOG.isDebugEnabled()) LOG.debug("Cid maps: "+cid);
+               context.put("cid", cid);
+
+               try {
+                       t = velocityEngine.getTemplate(BASE_PATH + 
templatePath);
+               } catch (ResourceNotFoundException ex) {
+//                     LOGGER.error("Template not found:"+BASE_PATH + 
templatePath, ex);
+               }
+
+               if (t == null) {
+                       try {
+                               t = velocityEngine.getTemplate(templatePath);
+                       } catch (ResourceNotFoundException e) {
+                               try {
+                                       t = velocityEngine.getTemplate("/" + 
templatePath);
+                               }
+                               catch (Exception ex) {
+                                       LOG.error("Template not found:"+ "/" + 
templatePath, ex);
+                               }
+                       }
+               }
+
+               final StringWriter writer = new StringWriter();
+               t.merge(context, writer);
+               if(LOG.isDebugEnabled()) LOG.debug(writer.toString());
+               return this._send(from, to, cc, title, writer.toString(), 
mimeBodyParts);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/metric/AlertContext.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/metric/AlertContext.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/metric/AlertContext.java
new file mode 100644
index 0000000..f8b11c3
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/metric/AlertContext.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.common.metric;
+
+import org.codehaus.jackson.map.ObjectMapper;
+import org.slf4j.Logger;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * not thread safe
+ */
+public class AlertContext implements Serializable{
+       private static final Logger LOG = 
org.slf4j.LoggerFactory.getLogger(AlertContext.class);
+
+       private Map<String, String> properties = new HashMap<String, String>();
+       
+       public AlertContext(){
+       }
+       
+       public AlertContext(AlertContext context){
+               this.properties = new HashMap<String, 
String>(context.properties);
+       }
+       
+       public String removeProperty(String name)
+       {
+               return properties.remove(name);
+       }
+       
+       public AlertContext addProperty(String name, String value){
+               properties.put(name, value);
+               return this;
+       }
+
+       public AlertContext addAll(Map<String,String> propHash){
+               this.properties.putAll(propHash);
+               return this;
+       }
+
+       public String toJsonString(){
+               ObjectMapper objectMapper = new ObjectMapper();
+               try {
+                       return objectMapper.writeValueAsString(properties);
+               }catch(Exception ex){
+                       LOG.error("fail converting alertcontext into string", 
ex);
+                       return null;
+               }
+       }
+
+       public static AlertContext fromJsonString(String json){
+               ObjectMapper objectMapper = new ObjectMapper();
+               try{
+                       Map m = objectMapper.readValue(json, Map.class);
+                       AlertContext c = new AlertContext();
+                       c.addAll(m);
+                       return c;
+               }catch(Exception ex){
+                       LOG.error("fail converting string into alertcontext", 
ex);
+                       return null;
+               }
+       }
+
+       public String getProperty(String name){
+               return properties.get(name);
+       }
+       
+       public String toString(){
+               return properties.toString();
+       }
+
+       public Map<String, String> getProperties(){
+               return properties;
+       }
+       
+       public void setProperties(Map<String, String> properties){
+               this.properties = properties;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/module/CommonGuiceModule.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/module/CommonGuiceModule.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/module/CommonGuiceModule.java
new file mode 100644
index 0000000..c44ca01
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/module/CommonGuiceModule.java
@@ -0,0 +1,28 @@
+/**
+ * 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.common.module;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Singleton;
+import com.typesafe.config.Config;
+
+public class CommonGuiceModule extends AbstractModule{
+    @Override
+    protected void configure() {
+        
bind(Config.class).toProvider(ConfigServiceProvider.class).in(Singleton.class);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/module/ConfigServiceProvider.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/module/ConfigServiceProvider.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/module/ConfigServiceProvider.java
new file mode 100644
index 0000000..37da582
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/module/ConfigServiceProvider.java
@@ -0,0 +1,30 @@
+/**
+ * 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.common.module;
+
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+import com.typesafe.config.Config;
+import com.typesafe.config.ConfigFactory;
+
+@Singleton
+public class ConfigServiceProvider implements Provider<Config> {
+    @Override
+    public Config get() {
+        return ConfigFactory.load();
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/service/HadoopAccountService.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/service/HadoopAccountService.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/service/HadoopAccountService.java
new file mode 100644
index 0000000..0b4893a
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/service/HadoopAccountService.java
@@ -0,0 +1,23 @@
+/*
+ * 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.common.service;
+
+import java.util.List;
+
+public interface HadoopAccountService {
+       public List<HadoopUser> searchByUsername(List<String> username);
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/e21b073f/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/service/HadoopUser.java
----------------------------------------------------------------------
diff --git 
a/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/service/HadoopUser.java
 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/service/HadoopUser.java
new file mode 100644
index 0000000..2e84f77
--- /dev/null
+++ 
b/eagle-core/eagle-common/src/main/java/org/apache/eagle/common/service/HadoopUser.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.common.service;
+
+import java.util.List;
+
+/**
+ * @since : 7/11/14,2014
+ */
+public class HadoopUser {
+       public String getUsername() {
+               return username;
+       }
+
+       public void setUsername(String username) {
+               this.username = username;
+       }
+
+       protected String username;
+
+       public List<String> getEmail() {
+               return email;
+       }
+
+       public void setEmail(List<String> emails) {
+               this.email = emails;
+       }
+
+       protected List<String> email;
+}
\ No newline at end of file

Reply via email to