Merge "Add BaseLogRecord Unit Tests"
diff --git a/Subscriber/src/SSASubscriber.java b/Subscriber/src/SSASubscriber.java
deleted file mode 100644
index 5ec099b..0000000
--- a/Subscriber/src/SSASubscriber.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * * 
- *  *      http://www.apache.org/licenses/LICENSE-2.0
- * * 
- *  * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-
-import org.eclipse.jetty.http.HttpVersion;
-import org.eclipse.jetty.servlet.*;
-import org.eclipse.jetty.util.ssl.*;
-import org.eclipse.jetty.server.*;
-import org.apache.log4j.Logger;
-
-/**
- *	Example stand alone subscriber
- */
-public class SSASubscriber {
-	private static final int Port = 8447;
-	private static final String KeyStoreType = "jks";
-	private static final String KeyStoreFile = "/root/sub/subscriber.jks";
-	//private static final String KeyStoreFile = "c:/tmp/subscriber.jks";
-	private static final String KeyStorePassword = "changeit";
-	private static final String KeyPassword = "changeit";
-	private static final String ContextPath = "/";
-	private static final String URLPattern = "/*";
-
-	public static void main(String[] args) throws Exception {
-		//User story # US792630  -Jetty Upgrade to 9.3.11
-		//SSASubscriber register Jetty server.
-        Server server = new Server();
-        HttpConfiguration http_config = new HttpConfiguration();
-        http_config.setSecureScheme("https");
-        http_config.setSecurePort(Port);
-        http_config.setRequestHeaderSize(8192);
-		
-        // HTTP connector
-        ServerConnector http = new ServerConnector(server,
-                new HttpConnectionFactory(http_config));
-        http.setPort(7070);
-        http.setIdleTimeout(30000);
-        
-        // SSL Context Factory
-        SslContextFactory sslContextFactory = new SslContextFactory();
-        sslContextFactory.setKeyStoreType(KeyStoreType);
-        sslContextFactory.setKeyStorePath(KeyStoreFile);
-        sslContextFactory.setKeyStorePassword(KeyStorePassword);
-        sslContextFactory.setKeyManagerPassword(KeyPassword);
-        
-        // sslContextFactory.setTrustStorePath(ncm.getKSFile());
-        // sslContextFactory.setTrustStorePassword("changeit");
-        sslContextFactory.setExcludeCipherSuites("SSL_RSA_WITH_DES_CBC_SHA",
-                "SSL_DHE_RSA_WITH_DES_CBC_SHA", "SSL_DHE_DSS_WITH_DES_CBC_SHA",
-                "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
-                "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
-                "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
-                "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA");
-
-        // SSL HTTP Configuration
-        HttpConfiguration https_config = new HttpConfiguration(http_config);
-        https_config.addCustomizer(new SecureRequestCustomizer());
-
-        // SSL Connector
-        ServerConnector sslConnector = new ServerConnector(server,
-            new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()),
-            new HttpConnectionFactory(https_config));
-        sslConnector.setPort(Port);
-        server.addConnector(sslConnector);
-        
-    	/**Skip SSLv3 Fixes*/
-        sslContextFactory.addExcludeProtocols("SSLv3");
-        System.out.println("Excluded protocols SSASubscriber-"+sslContextFactory.getExcludeProtocols().toString());  
-		/**End of SSLv3 Fixes*/
-        
-        // HTTPS Configuration
-        ServerConnector https = new ServerConnector(server,
-            new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()),
-                new HttpConnectionFactory(https_config));
-        https.setPort(Port);
-        https.setIdleTimeout(30000);
-        //server.setConnectors(new Connector[] { http, https });
-        server.setConnectors(new Connector[] {  http });
-		ServletContextHandler ctxt = new ServletContextHandler(0);
-		ctxt.setContextPath(ContextPath);
-		server.setHandler(ctxt);
-		
-		ctxt.addServlet(new ServletHolder(new SubscriberServlet()), "/*");
-		
-		try { 
-		    server.start();
-		} catch ( Exception e ) { 
-			System.out.println("Jetty failed to start. Reporting will we unavailable-"+e);
-		};
-        server.join();
-        
-        System.out.println("Subscriber started-"+ server.getState());  
-
-	}
-}
\ No newline at end of file
diff --git a/Subscriber/src/SubscriberServlet.java b/Subscriber/src/SubscriberServlet.java
deleted file mode 100644
index 1af62a6..0000000
--- a/Subscriber/src/SubscriberServlet.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * ============LICENSE_START==================================================
- * * org.onap.dmaap
- * * ===========================================================================
- * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- * * ===========================================================================
- * * Licensed under the Apache License, Version 2.0 (the "License");
- * * you may not use this file except in compliance with the License.
- * * You may obtain a copy of the License at
- * * 
- *  *      http://www.apache.org/licenses/LICENSE-2.0
- * * 
- *  * Unless required by applicable law or agreed to in writing, software
- * * distributed under the License is distributed on an "AS IS" BASIS,
- * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * * See the License for the specific language governing permissions and
- * * limitations under the License.
- * * ============LICENSE_END====================================================
- * *
- * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
- * *
- ******************************************************************************/
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URLEncoder;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.log4j.Logger;
-
-/**
- *	Example stand alone subscriber servlet with Authorization header checking
- */
-public class SubscriberServlet extends HttpServlet	{
-	private static Logger logger = Logger.getLogger("com.att.datarouter.pubsub.ssasubscribe.SubscriberServlet");
-	private String Login = "LOGIN";
-	private String Password = "PASSWORD";
-	private String OutputDirectory = "/root/sub/received";
-
-	private String auth;
-
-	private static String gp(ServletConfig config, String param, String deflt) {
-		param = config.getInitParameter(param);
-		if (param == null || param.length() == 0) {
-			param = deflt;
-		}
-		return(param);
-	}
-	/**
-	 *	Configure this subscriberservlet.  Configuration parameters from config.getInitParameter() are:
-	 *	<ul>
-	 *	<li>Login - The login expected in the Authorization header (default "LOGIN").
-	 *	<li>Password - The password expected in the Authorization header (default "PASSWORD").
-	 *	<li>OutputDirectory - The directory where files are placed (default "received").
-	 *	</ul>
-	 */
-	public void init(ServletConfig config) throws ServletException {
-		Login = gp(config, "Login", Login);
-		Password = gp(config, "Password", Password);
-		OutputDirectory = gp(config, "OutputDirectory", OutputDirectory);
-		(new File(OutputDirectory)).mkdirs();
-		auth = "Basic " + Base64.encodeBase64String((Login + ":" + Password).getBytes());
-	}
-	/**
-	 *	Invoke common(req, resp, false).
-	 */
-	protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-		common(req, resp, false);
-	}
-	/**
-	 *	Invoke common(req, resp, true).
-	 */
-	protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
-		common(req, resp, true);
-	}
-	/**
-	 *	Process a PUT or DELETE request.
-	 *	<ol>
-	 *	<li>Verify that the request contains an Authorization header
-	 *	or else UNAUTHORIZED.
-	 *	<li>Verify that the Authorization header matches the configured
-	 *	Login and Password or else FORBIDDEN.
-	 *	<li>If the request is PUT, store the message body as a file
-	 *	in the configured OutputDirectory directory protecting against
-	 *	evil characters in the received FileID.  The file is created
-	 *	initially with its name prefixed with a ".", and once it is complete, it is
-	 *	renamed to remove the leading "." character.
-	 *	<li>If the request is DELETE, instead delete the file (if it exists) from the configured OutputDirectory directory.
-	 *	<li>Respond with NO_CONTENT.
-	 *	</ol>
-	 */
-	protected void common(HttpServletRequest req, HttpServletResponse resp, boolean isdelete) throws ServletException, IOException {
-		String ah = req.getHeader("Authorization");
-		if (ah == null) {
-			logger.info("Rejecting request with no Authorization header from " + req.getRemoteAddr() + ": " + req.getPathInfo());
-			resp.sendError(HttpServletResponse.SC_UNAUTHORIZED);
-			return;
-		}
-		if (!auth.equals(ah)) {
-			logger.info("Rejecting request with incorrect Authorization header from " + req.getRemoteAddr() + ": " + req.getPathInfo());
-			resp.sendError(HttpServletResponse.SC_FORBIDDEN);
-			return;
-		}
-		String fileid = req.getPathInfo();
-		fileid = fileid.substring(fileid.lastIndexOf('/') + 1);
-		String qs = req.getQueryString();
-		if (qs != null) {
-			fileid = fileid + "?" + qs;
-		}
-		String publishid = req.getHeader("X-ATT-DR-PUBLISH-ID");
-		String filename = URLEncoder.encode(fileid, "UTF-8").replaceAll("^\\.", "%2E").replaceAll("\\*", "%2A");
-		String finalname = OutputDirectory + "/" + filename;
-		String tmpname = OutputDirectory + "/." + filename;
-		try {
-			if (isdelete) {
-				(new File(finalname)).delete();
-				logger.info("Received delete for file id " + fileid + " from " + req.getRemoteAddr() + " publish id " + publishid + " as " + finalname);
-			} else {
-				InputStream is = req.getInputStream();
-				OutputStream os = new FileOutputStream(tmpname);
-				byte[] buf = new byte[65536];
-				int i;
-				while ((i = is.read(buf)) > 0) {
-					os.write(buf, 0, i);
-				}
-				is.close();
-				os.close();
-				(new File(tmpname)).renameTo(new File(finalname));
-				logger.info("Received file id " + fileid + " from " + req.getRemoteAddr() + " publish id " + publishid + " as " + finalname);
-				resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
-				logger.info("Received file id " + fileid + " from " + req.getRemoteAddr() + " publish id " + publishid + " as " + finalname);
-			}
-			resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
-		} catch (IOException ioe) {
-			(new File(tmpname)).delete();
-			logger.info("Failure to save file " + finalname + " from " + req.getRemoteAddr() + ": " + req.getPathInfo(), ioe);
-			throw ioe;
-		}
-	}
-}
diff --git a/Subscriber/src/log4j.properties b/Subscriber/src/log4j.properties
deleted file mode 100644
index 8c12d5c..0000000
--- a/Subscriber/src/log4j.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-log4j.debug=FALSE

-log4j.rootLogger=INFO,Root

-

-log4j.appender.Root=org.apache.log4j.DailyRollingFileAppender

-log4j.appender.Root.file=/opt/app/datartr/logs/subscriber.log

-log4j.appender.Root.datePattern='.'yyyyMMdd

-log4j.appender.Root.append=true

-log4j.appender.Root.layout=org.apache.log4j.PatternLayout

-log4j.appender.Root.layout.ConversionPattern=%d %p %t %m%n

diff --git a/datarouter-node/pom.xml b/datarouter-node/pom.xml
index 61e9540..c6bd3e9 100755
--- a/datarouter-node/pom.xml
+++ b/datarouter-node/pom.xml
@@ -43,7 +43,7 @@
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
-            <version>3.8.1</version>
+            <version>4.10</version>
             <scope>test</scope>
         </dependency>
         <dependency>
diff --git a/datarouter-node/src/test/java/org/onap/dmaap/datarouter/node/DeliveryQueueTest.java b/datarouter-node/src/test/java/org/onap/dmaap/datarouter/node/DeliveryQueueTest.java
new file mode 100644
index 0000000..97904a5
--- /dev/null
+++ b/datarouter-node/src/test/java/org/onap/dmaap/datarouter/node/DeliveryQueueTest.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ *  *      http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ *  * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package org.onap.dmaap.datarouter.node;
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import static org.junit.Assert.*;
+import java.io.File;
+
+
+
+import static org.mockito.Mockito.*;
+
+@RunWith(PowerMockRunner.class)
+public class DeliveryQueueTest {
+
+    private DeliveryQueue deliveryQueue;
+    @Mock
+    private DestInfo destInfo;
+    @Mock
+    DeliveryQueueHelper deliveryQueueHelper;
+
+    private String dirPath = "/tmp/dir001/";
+    private String FileName1 = "10000000000004.fileName.M";
+
+    @Before
+    public void setUp() {
+        when(destInfo.getSpool()).thenReturn("tmp");
+        deliveryQueue = new DeliveryQueue(deliveryQueueHelper, destInfo);
+    }
+
+    @Test
+    public void Given_New_DeliveryQueue_Directory_Is_Created_As_Defined_By_DestInfo() throws Exception {
+        when(destInfo.getSpool()).thenReturn("tmp");
+        File file = new File("tmp");
+        assertTrue(file.exists());
+        deleteFile("tmp");
+    }
+
+    @Test
+    public void Given_Delivery_Task_Failed_And_Resume_Time_Not_Reached_Return_Null() throws Exception{
+        FieldUtils.writeField(deliveryQueue,"failed",true,true);
+        FieldUtils.writeField(deliveryQueue,"resumetime",System.currentTimeMillis()*2,true);
+        assertNull(deliveryQueue.peekNext());
+    }
+
+    @Test
+    public void Given_Delivery_Task_Return_Next_Delivery_Task_Id() throws Exception{
+        prepareFiles();
+        when(destInfo.getSpool()).thenReturn(dirPath);
+        deliveryQueue = new DeliveryQueue(deliveryQueueHelper, destInfo);
+        DeliveryTask nt = deliveryQueue.getNext();
+        assertEquals("10000000000004.fileName", nt.getPublishId());
+        deleteFile(dirPath + FileName1);
+        deleteFile(dirPath);
+    }
+
+    @Test
+    public void Given_Delivery_Task_Cancel_And_FileId_Is_Null_Return_Zero() throws Exception{
+        long rc = deliveryQueue.cancelTask("123.node.datarouternew.com");
+        assertEquals(0, rc);
+    }
+
+    private void prepareFiles() throws Exception{
+        createFolder(dirPath);
+        createFile(FileName1, dirPath);
+        String[] files = new String[2];
+        files[0] = dirPath + FileName1;
+    }
+
+    private void createFolder(String dirName) throws Exception{
+        String dirPath = dirName;
+
+        File newDirectory = new File(dirPath);
+        boolean isCreated = newDirectory.mkdirs();
+        if (isCreated) {
+            System.out.println("1. Successfully created directories, path: " + newDirectory.getCanonicalPath());
+        } else if (newDirectory.exists()) {
+            System.out.printf("1. Directory path already exist, path: " + newDirectory.getCanonicalPath());
+        } else {
+            System.out.println("1. Unable to create directory");
+        }
+    }
+
+    private void createFile( String file, String dir) throws Exception{
+        String FileName = file;
+        String dirPath = dir;
+
+        File newFile = new File(dirPath + File.separator + FileName);
+        boolean isCreated = newFile.createNewFile();
+        if (isCreated) {
+            System.out.println("\n2. Successfully created new file, path: " + newFile.getCanonicalPath());
+        } else { //File may already exist
+            System.out.println("\n2. Unable to create new file: " + newFile.getCanonicalPath());
+        }
+    }
+
+    private void deleteFile(String fileName) {
+        File file = new File(fileName);
+
+        if (file.exists()) {
+            file.delete();
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/datarouter-prov/pom.xml b/datarouter-prov/pom.xml
index b3c2878..a970f71 100755
--- a/datarouter-prov/pom.xml
+++ b/datarouter-prov/pom.xml
@@ -277,7 +277,7 @@
                 <directory>src/main/resources</directory>

                 <filtering>true</filtering>

                 <includes>

-                    <include>**/proserver.properties</include>

+                    <include>**/provserver.properties</include>

                 </includes>

             </resource>

             <resource>

diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/LogServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/LogServlet.java
index 8614a6e..101c9e6 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/LogServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/LogServlet.java
@@ -417,13 +417,13 @@
         Connection conn = null;

         try {

             conn = db.getConnection();

-            Statement  stmt = conn.createStatement();

-            ResultSet rs = stmt.executeQuery(sql);

-            while (rs.next()) {

-                rh.handleRow(rs);

-            }

-            rs.close();

-            stmt.close();

+           try( Statement  stmt = conn.createStatement()){

+             try(ResultSet rs = stmt.executeQuery(sql)){

+                 while (rs.next()) {

+                     rh.handleRow(rs);

+                 }

+             }

+           }

         } catch (SQLException sqlException) {

             intlogger.info("Failed to get Records. Exception = " +sqlException.getMessage(),sqlException);

         } finally {

diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/ProxyServlet.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/ProxyServlet.java
index 6564e17..c560299 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/ProxyServlet.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/ProxyServlet.java
@@ -181,7 +181,7 @@
         if (inited) {
             String url = buildUrl(req);
             intlogger.info("ProxyServlet: proxying with fallback GET "+url);
-            AbstractHttpClient httpclient = new DefaultHttpClient();
+            try(AbstractHttpClient httpclient = new DefaultHttpClient()){
             HttpRequestBase proxy = new HttpGet(url);
             try {
                 httpclient.getConnectionManager().getSchemeRegistry().register(sch);
@@ -204,6 +204,7 @@
                     in.close();
                 }
                 rv = true;
+
             } catch (IOException e) {
                 System.err.println("ProxyServlet: "+e);
                 e.printStackTrace();
@@ -211,6 +212,7 @@
                 proxy.releaseConnection();
                 httpclient.getConnectionManager().shutdown();
             }
+            }
         } else {
             intlogger.warn("ProxyServlet: proxy disabled");
         }
@@ -220,41 +222,42 @@
         if (inited && isProxyServer()) {
             String url = buildUrl(req);
             intlogger.info("ProxyServlet: proxying "+method + " "+url);
-            AbstractHttpClient httpclient = new DefaultHttpClient();
-            ProxyHttpRequest proxy = new ProxyHttpRequest(method, url);
-            try {
-                httpclient.getConnectionManager().getSchemeRegistry().register(sch);
+            try(AbstractHttpClient httpclient = new DefaultHttpClient()) {
+                ProxyHttpRequest proxy = new ProxyHttpRequest(method, url);
+                try {
+                    httpclient.getConnectionManager().getSchemeRegistry().register(sch);
 
-                // Copy request headers and request body
-                copyRequestHeaders(req, proxy);
-                if (method.equals("POST") || method.equals("PUT")){
-                    BasicHttpEntity body = new BasicHttpEntity();
-                    body.setContent(req.getInputStream());
-                    body.setContentLength(-1);    // -1 = unknown
-                    proxy.setEntity(body);
+                    // Copy request headers and request body
+                    copyRequestHeaders(req, proxy);
+                    if (method.equals("POST") || method.equals("PUT")) {
+                        BasicHttpEntity body = new BasicHttpEntity();
+                        body.setContent(req.getInputStream());
+                        body.setContentLength(-1);    // -1 = unknown
+                        proxy.setEntity(body);
+                    }
+
+                    // Execute the request
+                    HttpResponse pxy_response = httpclient.execute(proxy);
+
+                    // Get response headers and body
+                    int code = pxy_response.getStatusLine().getStatusCode();
+                    resp.setStatus(code);
+                    copyResponseHeaders(pxy_response, resp);
+
+                    HttpEntity entity = pxy_response.getEntity();
+                    if (entity != null) {
+                        InputStream in = entity.getContent();
+                        IOUtils.copy(in, resp.getOutputStream());
+                        in.close();
+                    }
+                } catch (IOException e) {
+                    intlogger.warn("ProxyServlet: " + e);
+                    resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
+                    e.printStackTrace();
+                } finally {
+                    proxy.releaseConnection();
+                    httpclient.getConnectionManager().shutdown();
                 }
-
-                // Execute the request
-                HttpResponse pxy_response = httpclient.execute(proxy);
-
-                // Get response headers and body
-                int code = pxy_response.getStatusLine().getStatusCode();
-                resp.setStatus(code);
-                copyResponseHeaders(pxy_response, resp);
-
-                HttpEntity entity = pxy_response.getEntity();
-                if (entity != null) {
-                    InputStream in = entity.getContent();
-                    IOUtils.copy(in, resp.getOutputStream());
-                    in.close();
-                }
-            } catch (IOException e) {
-                intlogger.warn("ProxyServlet: "+e);
-                resp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
-                e.printStackTrace();
-            } finally {
-                proxy.releaseConnection();
-                httpclient.getConnectionManager().shutdown();
             }
         } else {
             intlogger.warn("ProxyServlet: proxy disabled");
diff --git a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/DB.java b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/DB.java
index a907a03..bbcacb5 100644
--- a/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/DB.java
+++ b/datarouter-prov/src/main/java/org/onap/dmaap/datarouter/provisioning/utils/DB.java
@@ -38,14 +38,12 @@
  */

 public class DB {

 

-    /**

-     * The name of the properties file (in CLASSPATH)

-     */

+    private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");

+

     private static String DB_URL;

     private static String DB_LOGIN;

     private static String DB_PASSWORD;

     private static Properties props;

-    private static Logger intlogger = Logger.getLogger("org.onap.dmaap.datarouter.provisioning.internal");

     private static final Queue<Connection> queue = new LinkedList<>();

 

     public static String HTTPS_PORT;

diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/StatisticsServletTest.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/StatisticsServletTest.java
index 0a9632e..0babdc4 100755
--- a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/StatisticsServletTest.java
+++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/StatisticsServletTest.java
@@ -105,6 +105,8 @@
     when(response.getOutputStream()).thenReturn(outStream);
     statisticsServlet = PowerMockito.mock(StatisticsServlet.class);
     PowerMockito.doReturn(null).when(statisticsServlet, "getRecordsForSQL", anyString());
+    PowerMockito.doCallRealMethod().when(statisticsServlet, "buildMapFromRequest", anyObject());
+    PowerMockito.doCallRealMethod().when(statisticsServlet, "getTimeFromParam", anyString());
     doNothing().when(statisticsServlet).rsToCSV(anyObject(), anyObject());
     doCallRealMethod().when(statisticsServlet).doGet(request, response);
     when(statisticsServlet.getFeedIdsByGroupId(anyInt())).thenReturn(new StringBuffer("1"));
@@ -116,10 +118,13 @@
   public void Given_Request_Is_HTTP_GET_With_GroupId_And_FeedId_Parameters_Then_Request_Succeeds()
       throws Exception {
     when(request.getParameter("feedid")).thenReturn("1");
+    when(request.getParameter("statusCode")).thenReturn("500");
     ServletOutputStream outStream = mock(ServletOutputStream.class);
     when(response.getOutputStream()).thenReturn(outStream);
     statisticsServlet = PowerMockito.mock(StatisticsServlet.class);
     PowerMockito.doReturn(null).when(statisticsServlet, "getRecordsForSQL", anyString());
+    PowerMockito.doCallRealMethod().when(statisticsServlet, "buildMapFromRequest", anyObject());
+    PowerMockito.doCallRealMethod().when(statisticsServlet, "getTimeFromParam", anyString());
     doNothing().when(statisticsServlet).rsToCSV(anyObject(), anyObject());
     doCallRealMethod().when(statisticsServlet).doGet(request, response);
     doCallRealMethod().when(statisticsServlet).queryGeneretor(anyObject());
diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/beans/IngressRouteTest.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/beans/IngressRouteTest.java
new file mode 100644
index 0000000..ad259a5
--- /dev/null
+++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/beans/IngressRouteTest.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ *  *      http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ *  * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+package org.onap.dmaap.datarouter.provisioning.beans;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.mockito.Mockito.mock;
+
+@RunWith(PowerMockRunner.class)
+@SuppressStaticInitializationFor("org.onap.dmaap.datarouter.provisioning.beans.Feed")
+public class IngressRouteTest {
+
+  private IngressRoute ingressRoute;
+
+  @Before
+  public void setUp() throws IllegalAccessException{
+    PowerMockito.mockStatic(Feed.class);
+    Feed feed = mock(Feed.class);
+    PowerMockito.when(Feed.getFeedById(1)).thenReturn(feed);
+    Map<String, Integer> map = new HashMap<>();
+    FieldUtils.writeDeclaredStaticField(NodeClass.class, "map", map, true);
+  }
+
+  @Test
+  public void Validate_IngressRoute_Constructors_Create_Same_Object() {
+    List<String> nodes = new ArrayList<>();
+    nodes.add("node.datarouternew.com");
+    ingressRoute = new IngressRoute(1, 1, "user1", "172.100.0.0/25", nodes);
+    JSONObject ingressRouteJson = createIngressRouteJson();
+    Assert.assertEquals(ingressRoute, new IngressRoute(ingressRouteJson));
+  }
+
+  @Test
+  public void Validate_AsJsonObject_Returns_Same_Values() {
+    List<String> nodes = new ArrayList<>();
+    nodes.add("node.datarouternew.com");
+    ingressRoute = new IngressRoute(1, 1, "user1", "172.100.0.0/25", nodes);
+    JSONObject ingressRouteJson = createIngressRouteJson();
+    Assert.assertEquals(ingressRoute.asJSONObject().toString(), ingressRouteJson.toString());
+  }
+
+  private JSONObject createIngressRouteJson() {
+    JSONObject ingressRouteJson = new JSONObject();
+    ingressRouteJson.put("seq", 1);
+    ingressRouteJson.put("feedid", 1);
+    ingressRouteJson.put("user", "user1");
+    ingressRouteJson.put("subnet", "172.100.0.0/25");
+    JSONArray nodes = new JSONArray();
+    nodes.put("node.datarouternew.com");
+    ingressRouteJson.put("node", nodes);
+    return ingressRouteJson;
+  }
+
+}
diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/beans/PublishRecordTest.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/beans/PublishRecordTest.java
new file mode 100644
index 0000000..eaeb91c
--- /dev/null
+++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/beans/PublishRecordTest.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ *  *      http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ *  * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+package org.onap.dmaap.datarouter.provisioning.beans;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.dmaap.datarouter.provisioning.utils.LOGJSONObject;
+
+import java.text.ParseException;
+import java.util.LinkedHashMap;
+
+public class PublishRecordTest {
+
+  private PublishRecord publishRecord;
+
+  @Before
+  public void setUp() throws ParseException {
+    String[] args = {"2018-08-29-10-10-10-543.", "PUB", "238465493.fileName",
+        "1", "/publish/1/fileName", "PUT", "application/octet-stream", "285",
+        "172.100.0.3", "user1", "301"};
+    publishRecord = new PublishRecord(args);
+  }
+
+  @Test
+  public void Validate_Contructor_Creates_Object_With_Get_Methods() {
+    Assert.assertEquals("fileName", publishRecord.getFeedFileid());
+    Assert.assertEquals("172.100.0.3", publishRecord.getRemoteAddr());
+    Assert.assertEquals("user1", publishRecord.getUser());
+    Assert.assertEquals(301, publishRecord.getStatus());
+  }
+
+  @Test
+  public void Validate_AsJsonObject_Correct_Json_Object_After_Set_Methods() {
+    publishRecord.setFeedFileid("fileName2");
+    publishRecord.setRemoteAddr("172.100.0.4");
+    publishRecord.setStatus(201);
+    publishRecord.setUser("user2");
+    LOGJSONObject publishRecordJson = createPublishRecordJson();
+    Assert.assertEquals(publishRecordJson.toString(), publishRecord.asJSONObject().toString());
+  }
+
+  private LOGJSONObject createPublishRecordJson() {
+    LinkedHashMap<String, Object> publishRecordMap = new LinkedHashMap<>();
+    publishRecordMap.put("statusCode", 201);
+    publishRecordMap.put("publishId", "238465493.fileName");
+    publishRecordMap.put("requestURI", "/publish/1/fileName");
+    publishRecordMap.put("sourceIP", "172.100.0.4");
+    publishRecordMap.put("method", "PUT");
+    publishRecordMap.put("contentType", "application/octet-stream");
+    publishRecordMap.put("endpointId", "user2");
+    publishRecordMap.put("type", "pub");
+    publishRecordMap.put("date", "2018-08-29T10:10:10.543Z");
+    publishRecordMap.put("contentLength", 285);
+    return  new LOGJSONObject(publishRecordMap);
+  }
+}
diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/utils/DRRouteCLITest.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/utils/DRRouteCLITest.java
new file mode 100755
index 0000000..dc8d4c7
--- /dev/null
+++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/utils/DRRouteCLITest.java
@@ -0,0 +1,215 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ *  *      http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ *  * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+package org.onap.dmaap.datarouter.provisioning.utils;
+
+import org.apache.commons.lang3.reflect.FieldUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.StatusLine;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.impl.client.AbstractHttpClient;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Mockito.doCallRealMethod;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+@RunWith(PowerMockRunner.class)
+public class DRRouteCLITest {
+
+    @Mock
+    private AbstractHttpClient httpClient;
+
+    @Mock
+    private CloseableHttpResponse httpResponse;
+
+    @Mock
+    private HttpEntity httpEntity;
+
+    @Mock
+    private StatusLine statusLine;
+
+    private DRRouteCLI drRouteCLI;
+
+    @Before
+    public void setUp() throws IllegalAccessException{
+        drRouteCLI = mock(DRRouteCLI.class);
+        doCallRealMethod().when(drRouteCLI).runCommand(anyObject());
+        FieldUtils.writeField(drRouteCLI, "server", "prov.datarouternew.com", true);
+    }
+
+    @Test
+    public void Given_Add_Egress_Then_RunCommand_Returns_True() throws Exception{
+        mockHttpClientForRestCall();
+        Assert.assertTrue(drRouteCLI.runCommand(new String[]{"add", "egress", "1", "node.datarouternew.com"}));
+    }
+
+    @Test
+    public void Given_Add_Network_Then_RunCommand_Returns_True() throws Exception{
+        mockHttpClientForRestCall();
+        Assert.assertTrue(drRouteCLI.runCommand(new String[]{"add", "network", "prov.datarouternew.com", "node.datarouternew.com", "172.100.0.1"}));
+    }
+
+    @Test
+    public void Given_Add_Egress_With_Incorrect_Args_Then_RunCommand_Returns_False() throws Exception{
+        mockHttpClientForRestCall();
+        Assert.assertFalse(drRouteCLI.runCommand(new String[]{"add", "egress", "1", "user1", "172.100.0.0", "node.datarouternew.com"}));
+    }
+
+    @Test
+    public void Given_Error_On_Post_Rest_Call_RunCommand_Returns_False() throws Exception{
+        mockErrorResponseFromRestCall();
+        Assert.assertFalse(drRouteCLI.runCommand(new String[]{"add", "network", "prov.datarouternew.com", "node.datarouternew.com"}));
+    }
+
+    @Test
+    public void Given_Delete_Ingress_Then_RunCommand_Returns_True() throws Exception{
+        mockHttpClientForRestCall();
+        Assert.assertTrue(drRouteCLI.runCommand(new String[]{"del", "ingress", "1", "user1", "172.100.0.0"}));
+    }
+
+    @Test
+    public void Given_Delete_Egress_Then_RunCommand_Returns_True() throws Exception{
+        mockHttpClientForRestCall();
+        Assert.assertTrue(drRouteCLI.runCommand(new String[]{"del", "egress", "1"}));
+    }
+
+    @Test
+    public void Given_Delete_Network_Then_RunCommand_Returns_True() throws Exception{
+        mockHttpClientForRestCall();
+        Assert.assertTrue(drRouteCLI.runCommand(new String[]{"del", "network", "prov.datarouternew.com", "node.datarouternew.com"}));
+    }
+
+    @Test
+    public void Given_Delete_Ingress_With_Incorrect_Args_Then_RunCommand_Returns_False() throws Exception{
+        mockHttpClientForRestCall();
+        Assert.assertFalse(drRouteCLI.runCommand(new String[]{"del", "ingress", "prov.datarouternew.com", "node.datarouternew.com"}));
+    }
+
+    @Test
+    public void Given_Error_On_Delete_Rest_Call_RunCommand_Returns_False() throws Exception{
+        mockErrorResponseFromRestCall();
+        Assert.assertFalse(drRouteCLI.runCommand(new String[]{"del", "network", "prov.datarouternew.com", "node.datarouternew.com"}));
+    }
+
+    @Test
+    public void Given_List_Args_Then_RunCommand_Returns_True() throws Exception{
+        mockHttpClientForGetRequest();
+        Assert.assertTrue(drRouteCLI.runCommand(new String[]{"list"}));
+    }
+
+    @Test
+    public void Given_Error_On_Get_Rest_Call_RunCommand_Returns_True() throws Exception{
+        mockErrorResponseFromRestCall();
+        Assert.assertTrue(drRouteCLI.runCommand(new String[]{"list"}));
+    }
+
+    @Test
+    public void Given_Width_Arg_Then_RunCommand_Returns_True() {
+        Assert.assertTrue(drRouteCLI.runCommand(new String[]{"width", "130"}));
+    }
+
+    @Test
+    public void Given_Usage_Arg_Then_RunCommand_Returns_False() {
+        Assert.assertFalse(drRouteCLI.runCommand(new String[]{"usage"}));
+    }
+
+    private void mockHttpClientForRestCall() throws Exception{
+        when(httpResponse.getEntity()).thenReturn(httpEntity);
+        when(statusLine.getStatusCode()).thenReturn(200);
+        when(httpResponse.getStatusLine()).thenReturn(statusLine);
+        when(httpClient.execute(anyObject())).thenReturn(httpResponse);
+        FieldUtils.writeField(drRouteCLI, "httpclient", httpClient, true);
+    }
+
+    private void mockHttpClientForGetRequest() throws Exception{
+        mockResponseFromGet();
+        when(httpResponse.getEntity()).thenReturn(httpEntity);
+        when(statusLine.getStatusCode()).thenReturn(200);
+        when(httpResponse.getStatusLine()).thenReturn(statusLine);
+        when(httpClient.execute(anyObject())).thenReturn(httpResponse);
+        FieldUtils.writeField(drRouteCLI, "httpclient", httpClient, true);
+    }
+
+    private void mockResponseFromGet() throws IOException {
+        JSONObject response = new JSONObject();
+        response.put("ingress", addIngressObject());
+        response.put("egress", addEgressObject());
+        response.put("routing", addRoutingObject());
+        InputStream in = new ByteArrayInputStream(response.toString().getBytes());
+        when(httpEntity.getContent()).thenReturn(in);
+    }
+
+    private JSONArray addRoutingObject() {
+        JSONArray routing = new JSONArray();
+        JSONObject route = new JSONObject();
+        route.put("from", "prov.datarouternew.com");
+        route.put("to", "node.datarouternew.com");
+        route.put("via", "172.100.0.1");
+        routing.put(route);
+        return routing;
+    }
+
+    private JSONObject addEgressObject() {
+        JSONObject egress = new JSONObject();
+        egress.put("1", "node.datarouternew.com");
+        egress.put("2", "172.0.0.1");
+        return egress;
+    }
+
+    private JSONArray addIngressObject() {
+        JSONArray ingresses = new JSONArray();
+        JSONObject ingress = new JSONObject();
+        ingress.put("seq", 21);
+        ingress.put("feedid", 1);
+        ingress.put("user", "user1");
+        ingress.put("subnet", "172.0.0.0");
+        JSONArray nodes = new JSONArray();
+        nodes.put("node.datarouternew.com");
+        nodes.put("172.0.0.1");
+        ingress.put("node", nodes);
+        ingresses.put(ingress);
+        return ingresses;
+    }
+
+    private void mockErrorResponseFromRestCall() throws Exception{
+        InputStream in = new ByteArrayInputStream("<pre> Server Not Found </pre>".getBytes());
+        when(httpEntity.getContent()).thenReturn(in);
+        when(httpResponse.getEntity()).thenReturn(httpEntity);
+        when(statusLine.getStatusCode()).thenReturn(400);
+        when(httpResponse.getStatusLine()).thenReturn(statusLine);
+        when(httpClient.execute(anyObject())).thenReturn(httpResponse);
+        FieldUtils.writeField(drRouteCLI, "httpclient", httpClient, true);
+    }
+}
diff --git a/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/utils/LOGJSONObjectTest.java b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/utils/LOGJSONObjectTest.java
new file mode 100755
index 0000000..7cfe68f
--- /dev/null
+++ b/datarouter-prov/src/test/java/org/onap/dmaap/datarouter/provisioning/utils/LOGJSONObjectTest.java
@@ -0,0 +1,498 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ *  *      http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ *  * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package org.onap.dmaap.datarouter.provisioning.utils;
+
+import java.io.CharArrayWriter;
+import java.io.Writer;
+import org.json.JSONArray;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.modules.junit4.PowerMockRunner;
+import java.util.HashMap;
+import java.util.Map;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+
+@RunWith(PowerMockRunner.class)
+public class LOGJSONObjectTest {
+
+  private static LOGJSONObject logJO;
+
+  @Before
+  public void setUp() throws Exception {
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", null);
+    logJO = new LOGJSONObject(map);
+  }
+
+  @Test
+  public void Given_Method_Is_Accumulate_And_Value_Is_Valid_Put_Value_Into_New_JSONArray()
+      throws Exception {
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", 3);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    logJObject.accumulate(s, null);
+    assertThat(logJObject.get("key").toString(), is("[3,null]"));
+  }
+
+  @Test
+  public void Given_Method_Is_Accumulate_And_Value_Is_Null_Dont_Add_Key_Value_Pair()
+      throws Exception {
+    String s = "key";
+    logJO.accumulate(s, null);
+    assertThat(logJO.has("key"), is(false));
+  }
+
+  @Test
+  public void Given_Method_Is_Append_And_Value_Is_Null_Append_New_Value()
+      throws Exception {
+    String s = "key";
+    double d = 2.0;
+    logJO.append(s, d);
+    assertThat(logJO.getJSONArray("key").get(0), is(2.0));
+  }
+
+
+  @Test
+  public void Given_Method_Is_DoubleToString_And_Value_Is_NaN_Return_Null()
+      throws Exception {
+    double d = 2.0;
+    assertThat(logJO.doubleToString(d), is("2"));
+  }
+
+
+  @Test
+  public void Given_Method_Is_GetBoolean_And_Value_Is_False_Return_False()
+      throws Exception {
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", false);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.getBoolean(s), is(false));
+  }
+
+  @Test
+  public void Given_Method_Is_GetBoolean_And_Value_Is_True_Return_True()
+      throws Exception {
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", true);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.getBoolean(s), is(true));
+  }
+
+  @Test
+  public void Given_Method_Is_GetDouble_And_Value_Is_A_Double_Return_Value()
+      throws Exception {
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", 2.0);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.getDouble(s), is(2.0));
+  }
+
+  @Test
+  public void Given_Method_Is_GetInt_And_Value_Is_An_Int_Return_Value()
+      throws Exception {
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", 3);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.getInt(s), is(3));
+  }
+
+  @Test
+  public void Given_Method_Is_GetJSONArray_And_Value_Is_A_JSONArray_Return_Value()
+      throws Exception {
+    JSONArray jA = new JSONArray();
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", jA);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.getJSONArray(s), is(jA));
+  }
+
+  @Test
+  public void Given_Method_Is_GetJSONObject_And_Value_Is_A_JSONObject_Return_Value()
+      throws Exception {
+    LOGJSONObject logJObj = new LOGJSONObject();
+    logJObj.put("stub_key", 1);
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", logJObj);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.getJSONObject(s), is(logJObj));
+  }
+
+  @Test
+  public void Given_Method_Is_GetLong_And_Value_Is_A_Long_Return_Value()
+      throws Exception {
+    long l = 5;
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", l);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.getLong(s), is(5L));
+  }
+
+  @Test
+  public void Given_Method_Is_getNames_And_Value_Is_A_LOGJSONObject_Return_StringArray()
+      throws Exception {
+    LOGJSONObject logJObj = new LOGJSONObject();
+    logJObj.put("name", "stub_name");
+    String[] sArray = new String[logJObj.length()];
+    sArray[0] = "name";
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", sArray);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.getNames(logJObj), is(sArray));
+  }
+
+  @Test
+  public void Given_Method_Is_GetString_And_Value_Is_A_String_Return_Value()
+      throws Exception {
+    String val = "value";
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", val);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.getString(s), is("value"));
+  }
+
+  @Test
+  public void Given_Method_Is_Increment_And_Value_Is_Null_Put_Defualt_Value()
+      throws Exception {
+    Map<String, Object> mapResult = new HashMap<>();
+    mapResult.put("key", 1);
+    LOGJSONObject logJObjectResult = new LOGJSONObject(mapResult);
+
+    String val = null;
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", val);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    logJObject.increment(s);
+    assertThat(logJObject.get("key"), is(logJObjectResult.get("key")));
+  }
+
+  @Test
+  public void Given_Method_Is_Increment_And_Value_Is_An_Int_Put_Value_Plus_One()
+      throws Exception {
+    Map<String, Object> mapResult = new HashMap<>();
+    mapResult.put("key", 3);
+    LOGJSONObject logJObjectResult = new LOGJSONObject(mapResult);
+
+    int val = 2;
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", val);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    logJObject.increment(s);
+    assertThat(logJObject.get("key"), is(logJObjectResult.get("key")));
+  }
+
+  @Test
+  public void Given_Method_Is_Increment_And_Value_Is_A_Long_Put_Value_Plus_One()
+      throws Exception {
+    Map<String, Object> mapResult = new HashMap<>();
+    mapResult.put("key", 4L);
+    LOGJSONObject logJObjectResult = new LOGJSONObject(mapResult);
+
+    long val = 3;
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", val);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    logJObject.increment(s);
+    assertThat(logJObject.get("key"), is(logJObjectResult.get("key")));
+  }
+
+  @Test
+  public void Given_Method_Is_Increment_And_Value_Is_A_Double_Put_Value_Plus_One()
+      throws Exception {
+    Map<String, Object> mapResult = new HashMap<>();
+    mapResult.put("key", 5.0);
+    LOGJSONObject logJObjectResult = new LOGJSONObject(mapResult);
+
+    double val = 4.0;
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", val);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    logJObject.increment(s);
+    assertThat(logJObject.get("key"), is(logJObjectResult.get("key")));
+  }
+
+  @Test
+  public void Given_Method_Is_Increment_And_Value_Is_A_Float_Put_Value_Plus_One()
+      throws Exception {
+    Map<String, Object> mapResult = new HashMap<>();
+    mapResult.put("key", 5.0);
+    LOGJSONObject logJObjectResult = new LOGJSONObject(mapResult);
+
+    float val = 4.0f;
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", val);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    logJObject.increment(s);
+    assertThat(logJObject.get("key"), is(logJObjectResult.get("key")));
+  }
+
+  @Test
+  public void Given_Method_Is_Names_And_Object_Contains_Keys_Put_Keys_Into_New_JSONArray()
+      throws Exception {
+    JSONArray ja = new JSONArray();
+    ja.put("key");
+
+    String val = "value";
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", val);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.names().get(0), is(ja.get(0)));
+  }
+
+  @Test
+  public void Given_Method_Is_NumberToString_And_Number_is_Not_Null_Return_Reformatted_Number_As_String()
+      throws Exception {
+    Number num = 3.0;
+
+    String val = "value";
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", val);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.numberToString(num), is("3"));
+  }
+
+  @Test
+  public void Given_Method_Is_OptBoolean_And_Value_is_Boolean_Return_Value()
+      throws Exception {
+    boolean val = true;
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", val);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.optBoolean(s, false), is(true));
+  }
+
+  @Test
+  public void Given_Method_Is_OptBoolean_And_Value_is_Not_Boolean_Return_Default_Value()
+      throws Exception {
+    String val = "not_boolean";
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", val);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.optBoolean(s, false), is(false));
+  }
+
+  @Test
+  public void Given_Method_Is_OptDouble_And_Value_is_Double_Return_Value()
+      throws Exception {
+    double val = 2.0;
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", val);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.optDouble(s, 0.0), is(2.0));
+  }
+
+  @Test
+  public void Given_Method_Is_OptDouble_And_Value_is_Not_Double_Return_Default_Value()
+      throws Exception {
+    String val = "not_double";
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", val);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.optDouble(s, 0.0), is(0.0));
+  }
+
+  @Test
+  public void Given_Method_Is_OptInt_And_Value_is_Int_Return_Value()
+      throws Exception {
+    int val = 1;
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", val);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.optInt(s, 0), is(1));
+  }
+
+  @Test
+  public void Given_Method_Is_OptInt_And_Value_Is_Null_Return_Default_Value()
+      throws Exception {
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", null);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.optInt(s, 0), is(0));
+  }
+
+  @Test
+  public void Given_Method_Is_OptLong_And_Value_is_Long_Return_Value()
+      throws Exception {
+    long val = 4;
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", val);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.optLong(s, 0), is(4L));
+  }
+
+  @Test
+  public void Given_Method_Is_OptLong_And_Value_is_Not_Long_Return_Default_Value()
+      throws Exception {
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", null);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.optLong(s, 0), is(0L));
+  }
+
+  @Test
+  public void Given_Method_Is_OptString_And_Value_is_String_Return_Value()
+      throws Exception {
+    String val = "value";
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", val);
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.optString(s, "default_value"), is("value"));
+  }
+
+  @Test
+  public void Given_Method_Is_putOnce_And_KeyValuePair_Does_Not_Exist_In_logJObject_Put_KeyValuePair_Into_logJObject()
+      throws Exception {
+    String val = "value";
+    Map<String, Object> map = new HashMap<>();
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    String s = "key";
+    assertThat(logJObject.putOnce(s, val).get("key"), is("value"));
+  }
+
+  @Test
+  public void Given_Method_Is_StringToValue_And_Value_Is_Number_Return_Number()
+      throws Exception {
+    String val = "312";
+    Map<String, Object> map = new HashMap<>();
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    assertThat(logJObject.stringToValue(val), is(312));
+  }
+
+  @Test
+  public void Given_Method_Is_ToJSONArray_And_KeyValue_Exists_Return_Value_Array()
+      throws Exception {
+    JSONArray names = new JSONArray();
+    Map<String, Object> map = new HashMap<>();
+    map.put("name", "value");
+    names.put("name");
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    assertThat(logJObject.toJSONArray(names).get(0), is("value"));
+  }
+
+  @Test
+  public void Given_Method_Is_ValueToString_And_Value_Is_JSONArray_Return_Value_To_String()
+      throws Exception {
+    JSONArray val = new JSONArray();
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", "value");
+    val.put("value");
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    assertThat(logJObject.valueToString(val), is("[\"value\"]"));
+  }
+
+  @Test
+  public void Given_Method_Is_writeValue_And_Value_IS_Not_Null_Return_Writer_With_Value()
+      throws Exception {
+    Writer writer = new CharArrayWriter();
+    String val = "value";
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", "value");
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    assertThat(logJObject.writeValue(writer, val, 3, 1).toString(), is("\"value\""));
+  }
+
+  @Test
+  public void Given_Method_Is_write_And_Length_Of_logJObject_Is_One_Write_Value_With_Indent()
+      throws Exception {
+    Writer writer = new CharArrayWriter();
+    String val = "value";
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", "value");
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    assertThat(logJObject.write(writer, 3, 1).toString(), is("{\"key\": \"value\"}"));
+  }
+
+  @Test
+  public void Given_Method_Is_write_And_Length_Of_logJObject_Is_Not_One_Or_Zero_Write_Value_With_New_Indent()
+      throws Exception {
+    Writer writer = new CharArrayWriter();
+    String val = "value";
+    Map<String, Object> map = new HashMap<>();
+    map.put("key", "value");
+    map.put("key1", "value1");
+    LOGJSONObject logJObject = new LOGJSONObject(map);
+
+    assertThat(logJObject.write(writer, 3, 1).toString(), is("{\n    \"key1\": \"value1\",\n    \"key\": \"value\"\n }"));
+  }
+}
diff --git a/datarouter-subscriber/pom.xml b/datarouter-subscriber/pom.xml
new file mode 100755
index 0000000..52cb25c
--- /dev/null
+++ b/datarouter-subscriber/pom.xml
@@ -0,0 +1,393 @@
+<!--
+  ============LICENSE_START==================================================
+  * org.onap.dmaap
+  * ===========================================================================
+  * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+  * ===========================================================================
+  * Licensed under the Apache License, Version 2.0 (the "License");
+  * you may not use this file except in compliance with the License.
+  * You may obtain a copy of the License at
+  *
+   *      http://www.apache.org/licenses/LICENSE-2.0
+  *
+   * Unless required by applicable law or agreed to in writing, software
+  * distributed under the License is distributed on an "AS IS" BASIS,
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  * See the License for the specific language governing permissions and
+  * limitations under the License.
+  * ============LICENSE_END====================================================
+  *
+  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+  *
+-->
+<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/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.onap.dmaap.datarouter</groupId>
+        <artifactId>parent</artifactId>
+        <version>1.0.1-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <artifactId>datarouter-subscriber</artifactId>
+    <packaging>jar</packaging>
+    <name>datarouter-subscriber</name>
+    <properties>
+        <sonar.language>java</sonar.language>
+        <sonar.skip>false</sonar.skip>
+        <sonar.jacoco.reportMissing.force.zero>true</sonar.jacoco.reportMissing.force.zero>
+        <sitePath>/content/sites/site/${project.groupId}/${project.artifactId}/${project.version}</sitePath>
+
+        <docker.location>${basedir}/target/${artifactId}</docker.location>
+        <datarouter.prov.image.name>onap/dmaap/datarouter-subscriber</datarouter.prov.image.name>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+            <version>${jetty.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-continuation</artifactId>
+            <version>${jetty.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-util</artifactId>
+            <version>${jetty.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-deploy</artifactId>
+            <version>${jetty.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-servlet</artifactId>
+            <version>${jetty.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-servlets</artifactId>
+            <version>${jetty.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-http</artifactId>
+            <version>${jetty.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-security</artifactId>
+            <version>${jetty.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-websocket</artifactId>
+            <version>${jetty.websocket.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-io</artifactId>
+            <version>${jetty.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.sonatype.http-testing-harness</groupId>
+            <artifactId>junit-runner</artifactId>
+            <version>0.11</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.databene</groupId>
+                    <artifactId>contiperf</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.10</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+            <version>1.2.17</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+    <profiles>
+        <profile>
+            <id>docker</id>
+            <properties>
+                <skipDockerBuild>false</skipDockerBuild>
+                <skipDockerTag>false</skipDockerTag>
+                <skipTests>true</skipTests>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>com.spotify</groupId>
+                        <artifactId>docker-maven-plugin</artifactId>
+                        <version>1.0.0</version>
+                        <configuration>
+                            <imageName>${onap.nexus.dockerregistry.daily}/${datarouter.prov.image.name}</imageName>
+                            <dockerDirectory>${docker.location}</dockerDirectory>
+                            <serverId>${onap.nexus.dockerregistry.daily}</serverId>
+                            <skipDockerBuild>false</skipDockerBuild>
+                            <imageTags>
+                                <imageTag>${project.version}</imageTag>
+                                <imageTag>latest</imageTag>
+                            </imageTags>
+                            <forceTags>true</forceTags>
+                            <resources>
+                                <resource>
+                                    <targetPath>/</targetPath>
+                                    <directory>${project.basedir}</directory>
+                                    <excludes>
+                                        <exclude>target/**/*</exclude>
+                                        <exclude>pom.xml</exclude>
+                                    </excludes>
+                                </resource>
+
+                                <resource>
+                                    <targetPath>/</targetPath>
+                                    <directory>${project.build.directory}</directory>
+                                    <include>**/**</include>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+    <build>
+        <finalName>datarouter-subscriber</finalName>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.properties</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/subscriber.properties</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/log4j.properties</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/test/resources</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/log4j.properties</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <version>2.4</version>
+                <configuration>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                    <outputDirectory>${basedir}/target/opt/app/subscriber/lib</outputDirectory>
+                    <archive>
+                        <manifest>
+                            <addClasspath>true</addClasspath>
+                            <mainClass>org.onap.dmaap.datarouter.subscriber.Subscriber</mainClass>
+                        </manifest>
+                    </archive>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id>
+                        <!-- this is used for inheritance merges -->
+                        <phase>package</phase>
+                        <!-- bind to the packaging phase -->
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+                <version>3.6.0</version>
+            </plugin>
+            <plugin>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>2.7</version>
+                <executions>
+                    <execution>
+                        <id>copy-docker-file</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>copy-resources</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${docker.location}</outputDirectory>
+                            <overwrite>true</overwrite>
+                            <resources>
+                                <resource>
+                                    <directory>${basedir}/src/main/resources/docker</directory>
+                                    <filtering>true</filtering>
+                                    <includes>
+                                        <include>**/*</include>
+                                    </includes>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>copy-resources-1</id>
+                        <phase>validate</phase>
+                        <goals>
+                            <goal>copy-resources</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${basedir}/target/opt/app/subscriber/lib</outputDirectory>
+                            <resources>
+                                <resource>
+                                    <directory>${project.basedir}/src/main/resources</directory>
+                                    <includes>
+                                        <include>**/*.jar</include>
+                                    </includes>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>copy-resources-2</id>
+                        <phase>validate</phase>
+                        <goals>
+                            <goal>copy-resources</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${basedir}/target/opt/app/subscriber/etc</outputDirectory>
+                            <resources>
+                                <resource>
+                                    <directory>${basedir}/src/main/resources</directory>
+                                    <includes>
+                                        <include>*.properties</include>
+                                    </includes>
+                                </resource>
+                            </resources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <version>2.10</version>
+                <executions>
+                    <execution>
+                        <id>copy-dependencies</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>${project.build.directory}/opt/app/subscriber/lib</outputDirectory>
+                            <overWriteReleases>false</overWriteReleases>
+                            <overWriteSnapshots>false</overWriteSnapshots>
+                            <overWriteIfNewer>true</overWriteIfNewer>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <version>2.2.1</version>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <goals>
+                            <goal>jar-no-fork</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.jacoco</groupId>
+                <artifactId>jacoco-maven-plugin</artifactId>
+                <version>${jacoco.version}</version>
+                <configuration>
+                    <excludes>
+                        <exclude>**/gen/**</exclude>
+                        <exclude>**/generated-sources/**</exclude>
+                        <exclude>**/yang-gen/**</exclude>
+                        <exclude>**/pax/**</exclude>
+                    </excludes>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>pre-unit-test</id>
+                        <goals>
+                            <goal>prepare-agent</goal>
+                        </goals>
+                        <configuration>
+                            <destFile>${project.build.directory}/code-coverage/jacoco-ut.exec</destFile>
+                            <propertyName>surefireArgLine</propertyName>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>post-unit-test</id>
+                        <phase>test</phase>
+                        <goals>
+                            <goal>report</goal>
+                        </goals>
+                        <configuration>
+                            <dataFile>${project.build.directory}/code-coverage/jacoco-ut.exec</dataFile>
+                            <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>pre-integration-test</id>
+                        <phase>pre-integration-test</phase>
+                        <goals>
+                            <goal>prepare-agent</goal>
+                        </goals>
+                        <configuration>
+                            <destFile>${project.build.directory}/code-coverage/jacoco-it.exec</destFile>
+                            <propertyName>failsafeArgLine</propertyName>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>post-integration-test</id>
+                        <phase>post-integration-test</phase>
+                        <goals>
+                            <goal>report</goal>
+                        </goals>
+                        <configuration>
+                            <dataFile>${project.build.directory}/code-coverage/jacoco-it.exec</dataFile>
+                            <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/datarouter-subscriber/src/main/java/org/onap/dmaap/datarouter/subscriber/Subscriber.java b/datarouter-subscriber/src/main/java/org/onap/dmaap/datarouter/subscriber/Subscriber.java
new file mode 100644
index 0000000..b6edb67
--- /dev/null
+++ b/datarouter-subscriber/src/main/java/org/onap/dmaap/datarouter/subscriber/Subscriber.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ *  *      http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ *  * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package org.onap.dmaap.datarouter.subscriber;
+
+import org.apache.log4j.Logger;
+import org.eclipse.jetty.servlet.*;
+import org.eclipse.jetty.util.ssl.*;
+import org.eclipse.jetty.server.*;
+import org.eclipse.jetty.http.HttpVersion;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Properties;
+
+public class Subscriber {
+
+    private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.subscriber.Subscriber");
+
+    private static final String CONTEXT_PATH = "/";
+    private static final String URL_PATTERN = "/*";
+
+    static Properties props;
+
+    private static void loadProps() {
+        if (props == null) {
+            props = new Properties();
+            try {
+                props.load(new FileInputStream(System.getProperty(
+                        "org.onap.dmaap.datarouter.subscriber.properties",
+                        "/opt/app/subscriber/etc/subscriber.properties")));
+            } catch (IOException e) {
+                logger.fatal("SubServlet: Exception opening properties: " + e.getMessage());
+                System.exit(1);
+            }
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        //Load the properties
+        loadProps();
+
+        int httpsPort = Integer.parseInt(props.getProperty("org.onap.dmaap.datarouter.subscriber.https.port", "8443"));
+        int httpPort = Integer.parseInt(props.getProperty("org.onap.dmaap.datarouter.subscriber.http.port", "8080"));
+
+        Server server = new Server();
+        HttpConfiguration httpConfig = new HttpConfiguration();
+        httpConfig.setRequestHeaderSize(8192);
+
+        // HTTP connector
+        ServletContextHandler ctxt;
+        try (ServerConnector httpServerConnector = new ServerConnector(server,
+                new HttpConnectionFactory(httpConfig))) {
+            httpServerConnector.setPort(httpPort);
+            httpServerConnector.setIdleTimeout(30000);
+
+            // SSL Context Factory
+            SslContextFactory sslContextFactory = new SslContextFactory();
+
+            // SSL HTTP Configuration
+            HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig);
+            httpsConfig.addCustomizer(new SecureRequestCustomizer());
+
+            // SSL Connector
+            ServerConnector sslConnector = new ServerConnector(server,
+                    new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
+                    new HttpConnectionFactory(httpsConfig));
+            sslConnector.setPort(httpsPort);
+            server.addConnector(sslConnector);
+
+            /*Skip SSLv3 Fixes*/
+            sslContextFactory.addExcludeProtocols("SSLv3");
+            logger.info("Excluded protocols for Subscriber:" + Arrays.toString(sslContextFactory.getExcludeProtocols()));
+            /*End of SSLv3 Fixes*/
+
+            // HTTPS Configuration
+            try (ServerConnector https = new ServerConnector(server,
+                    new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
+                    new HttpConnectionFactory(httpsConfig))) {
+                https.setPort(httpsPort);
+                https.setIdleTimeout(30000);
+            }
+            server.setConnectors(new Connector[]{ httpServerConnector });
+        }
+        ctxt = new ServletContextHandler(0);
+        ctxt.setContextPath(CONTEXT_PATH);
+        server.setHandler(ctxt);
+
+        ctxt.addServlet(new ServletHolder(new SubscriberServlet()), URL_PATTERN);
+        try {
+            server.start();
+        } catch ( Exception e ) {
+            logger.info("Jetty failed to start. Reporting will be unavailable-"+e);
+        }
+        server.join();
+        logger.info("org.onap.dmaap.datarouter.subscriber.Subscriber started-"+ server.getState());
+
+    }
+}
\ No newline at end of file
diff --git a/datarouter-subscriber/src/main/java/org/onap/dmaap/datarouter/subscriber/SubscriberServlet.java b/datarouter-subscriber/src/main/java/org/onap/dmaap/datarouter/subscriber/SubscriberServlet.java
new file mode 100644
index 0000000..72afcf0
--- /dev/null
+++ b/datarouter-subscriber/src/main/java/org/onap/dmaap/datarouter/subscriber/SubscriberServlet.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * ============LICENSE_START==================================================
+ * * org.onap.dmaap
+ * * ===========================================================================
+ * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * * ===========================================================================
+ * * Licensed under the Apache License, Version 2.0 (the "License");
+ * * you may not use this file except in compliance with the License.
+ * * You may obtain a copy of the License at
+ * *
+ *  *      http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ *  * Unless required by applicable law or agreed to in writing, software
+ * * distributed under the License is distributed on an "AS IS" BASIS,
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * * See the License for the specific language governing permissions and
+ * * limitations under the License.
+ * * ============LICENSE_END====================================================
+ * *
+ * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * *
+ ******************************************************************************/
+
+package org.onap.dmaap.datarouter.subscriber;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.log4j.Logger;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.nio.file.attribute.PosixFilePermissions;
+
+import static org.onap.dmaap.datarouter.subscriber.Subscriber.props;
+
+public class SubscriberServlet extends HttpServlet {
+
+	private static Logger logger = Logger.getLogger("org.onap.dmaap.datarouter.subscriber.SubscriberServlet");
+	private String outputDirectory;
+	private String basicAuth;
+
+	/**
+	 *	Configure this subscriberservlet.  Configuration parameters from config.getInitParameter() are:
+	 *	<ul>
+	 *	<li>Login - The login expected in the Authorization header (default "LOGIN").
+	 *	<li>Password - The password expected in the Authorization header (default "PASSWORD").
+	 *	<li>outputDirectory - The directory where files are placed (default "tmp").
+	 *	</ul>
+	 */
+	@Override
+    public void init(ServletConfig config) {
+        String login = props.getProperty("org.onap.dmaap.datarouter.subscriber.auth.user", "LOGIN");
+		String password = props.getProperty("org.onap.dmaap.datarouter.subscriber.auth.password", "PASSWORD");
+        outputDirectory = props.getProperty("org.onap.dmaap.datarouter.subscriber.delivery.dir", "/tmp");
+        try {
+            Files.createDirectory(Paths.get(outputDirectory), PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwxrwxrwx")));
+        } catch (IOException e) {
+            logger.info("SubServlet: Failed to create delivery dir: " + e.getMessage());
+            e.printStackTrace();
+        }
+		basicAuth = "Basic " + Base64.encodeBase64String((login + ":" + password).getBytes());
+	}
+
+	@Override
+	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
+		File filesPath = new File(outputDirectory);
+		File[] filesArr = filesPath.listFiles();
+        assert filesArr != null;
+        for (File file: filesArr) {
+            try (BufferedReader in = new BufferedReader(new FileReader(file))) {
+                String line = in.readLine();
+                while (line != null) {
+                    line = in.readLine();
+                }
+            }
+		}
+	}
+	/**
+	 *	Invoke common(req, resp, false).
+	 */
+	@Override
+	protected void doPut(HttpServletRequest req, HttpServletResponse resp) {
+        try {
+            common(req, resp, false);
+        } catch (IOException e) {
+            logger.info("SubServlet: Failed to doPut: " + req.getRemoteAddr() + " : " + req.getPathInfo(), e);
+        }
+    }
+	/**
+	 *	Invoke common(req, resp, true).
+	 */
+	@Override
+	protected void doDelete(HttpServletRequest req, HttpServletResponse resp) {
+        try {
+            common(req, resp, true);
+        } catch (IOException e) {
+            logger.info("SubServlet: Failed to doDelete: " + req.getRemoteAddr() + " : " + req.getPathInfo(), e);
+        }
+    }
+	/**
+	 *	Process a PUT or DELETE request.
+	 *	<ol>
+	 *	<li>Verify that the request contains an Authorization header
+	 *	or else UNAUTHORIZED.
+	 *	<li>Verify that the Authorization header matches the configured
+	 *	Login and Password or else FORBIDDEN.
+	 *	<li>If the request is PUT, store the message body as a file
+	 *	in the configured outputDirectory directory protecting against
+	 *	evil characters in the received FileID.  The file is created
+	 *	initially with its name prefixed with a ".", and once it is complete, it is
+	 *	renamed to remove the leading "." character.
+	 *	<li>If the request is DELETE, instead delete the file (if it exists) from the configured outputDirectory directory.
+	 *	<li>Respond with NO_CONTENT.
+	 *	</ol>
+	 */
+    private void common(HttpServletRequest req, HttpServletResponse resp, boolean isdelete) throws IOException {
+		String authHeader = req.getHeader("Authorization");
+		if (authHeader == null) {
+			logger.info("Rejecting request with no Authorization header from " + req.getRemoteAddr() + ": " + req.getPathInfo());
+			resp.sendError(HttpServletResponse.SC_UNAUTHORIZED);
+			return;
+		}
+		if (!basicAuth.equals(authHeader)) {
+			logger.info("Rejecting request with incorrect Authorization header from " + req.getRemoteAddr() + ": " + req.getPathInfo());
+			resp.sendError(HttpServletResponse.SC_FORBIDDEN);
+			return;
+		}
+		String fileid = req.getPathInfo();
+		fileid = fileid.substring(fileid.lastIndexOf('/') + 1);
+		String queryString = req.getQueryString();
+		if (queryString != null) {
+			fileid = fileid + "?" + queryString;
+		}
+		String publishid = req.getHeader("X-ATT-DR-PUBLISH-ID");
+		String filename = URLEncoder.encode(fileid, "UTF-8").replaceAll("^\\.", "%2E").replaceAll("\\*", "%2A");
+		String fullPath = outputDirectory + "/" + filename;
+		String tmpPath = outputDirectory + "/." + filename;
+		try {
+			if (isdelete) {
+			    Files.deleteIfExists(Paths.get(fullPath));
+				logger.info("Received delete for file id " + fileid + " from " + req.getRemoteAddr() + " publish id " + publishid + " as " + fullPath);
+			} else {
+                new File(tmpPath).createNewFile();
+                try (InputStream is = req.getInputStream(); OutputStream os = new FileOutputStream(tmpPath)) {
+                    byte[] buf = new byte[65536];
+                    int i;
+                    while ((i = is.read(buf)) > 0) {
+                        os.write(buf, 0, i);
+                    }
+                }
+                Files.move(Paths.get(tmpPath), Paths.get(fullPath), StandardCopyOption.REPLACE_EXISTING);
+				logger.info("Received file id " + fileid + " from " + req.getRemoteAddr() + " publish id " + publishid + " as " + fullPath);
+				resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
+			}
+			resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
+		} catch (IOException ioe) {
+            Files.deleteIfExists(Paths.get(tmpPath));
+			logger.info("Failed to process file " + fullPath + " from " + req.getRemoteAddr() + ": " + req.getPathInfo());
+			throw ioe;
+		}
+	}
+}
diff --git a/datarouter-subscriber/src/main/resources/docker/Dockerfile b/datarouter-subscriber/src/main/resources/docker/Dockerfile
new file mode 100644
index 0000000..6cc74cc
--- /dev/null
+++ b/datarouter-subscriber/src/main/resources/docker/Dockerfile
@@ -0,0 +1,6 @@
+FROM java:8
+ADD opt /opt/
+ADD startup.sh /startup.sh
+RUN chmod 700 /startup.sh
+ENTRYPOINT ./startup.sh start
+EXPOSE 7070
\ No newline at end of file
diff --git a/datarouter-subscriber/src/main/resources/docker/startup.sh b/datarouter-subscriber/src/main/resources/docker/startup.sh
new file mode 100644
index 0000000..53b1053
--- /dev/null
+++ b/datarouter-subscriber/src/main/resources/docker/startup.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+LIB=/opt/app/subscriber/lib
+ETC=/opt/app/subscriber/etc
+CLASSPATH=$ETC
+for FILE in `find $LIB -name *.jar`; do
+  CLASSPATH=$CLASSPATH:$FILE
+done
+java -classpath $CLASSPATH  org.onap.dmaap.datarouter.subscriber.Subscriber
+
+runner_file="$LIB/subscriber-jar-with-dependencies.jar"
+echo "Starting using" $runner_file
+java -Dorg.onap.dmaap.datarouter.subscriber.properties=/opt/app/subscriber/etc/subscriber.properties -jar $runner_file
\ No newline at end of file
diff --git a/datarouter-subscriber/src/main/resources/log4j.properties b/datarouter-subscriber/src/main/resources/log4j.properties
new file mode 100644
index 0000000..bb66ef4
--- /dev/null
+++ b/datarouter-subscriber/src/main/resources/log4j.properties
@@ -0,0 +1,31 @@
+#-------------------------------------------------------------------------------
+# ============LICENSE_START==================================================
+# * org.onap.dmaap
+# * ===========================================================================
+# * Copyright � 2017 AT&T Intellectual Property. All rights reserved.
+# * ===========================================================================
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+#  *      http://www.apache.org/licenses/LICENSE-2.0
+# *
+#  * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+# * ============LICENSE_END====================================================
+# *
+# * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+# *
+#-------------------------------------------------------------------------------
+
+log4j.rootLogger=info,Root
+
+log4j.appender.Root=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.Root.file=/opt/app/subscriber/logs/subscriber.log
+log4j.appender.Root.datePattern='.'yyyyMMdd
+log4j.appender.Root.append=true
+log4j.appender.Root.layout=org.apache.log4j.PatternLayout
+log4j.appender.Root.layout.ConversionPattern=%d %p %t %m%n
diff --git a/datarouter-subscriber/src/main/resources/subscriber.properties b/datarouter-subscriber/src/main/resources/subscriber.properties
new file mode 100644
index 0000000..771fdd3
--- /dev/null
+++ b/datarouter-subscriber/src/main/resources/subscriber.properties
@@ -0,0 +1,40 @@
+#-------------------------------------------------------------------------------
+# ============LICENSE_START==================================================
+# * org.onap.dmaap
+# * ===========================================================================
+# * Copyright � 2017 AT&T Intellectual Property. All rights reserved.
+# * ===========================================================================
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+#  *      http://www.apache.org/licenses/LICENSE-2.0
+# *
+#  * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+# * ============LICENSE_END====================================================
+# *
+# * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+# *
+#-------------------------------------------------------------------------------
+
+#Subscriber properties
+org.onap.dmaap.datarouter.subscriber.http.port           = 7070
+org.onap.dmaap.datarouter.subscriber.https.port          = 7443
+org.onap.dmaap.datarouter.subscriber.auth.user           = LOGIN
+org.onap.dmaap.datarouter.subscriber.auth.password       = PASSWORD
+org.onap.dmaap.datarouter.subscriber.delivery.dir        = /opt/app/subscriber/delivery
+
+org.onap.dmaap.datarouter.subscriber.https.relaxation    = true
+org.onap.dmaap.datarouter.subscriber.keystore.type       = jks
+org.onap.dmaap.datarouter.subscriber.keymanager.password = changeit
+org.onap.dmaap.datarouter.subscriber.keystore.path       = /opt/app/datartr/self_signed/keystore.jks
+org.onap.dmaap.datarouter.subscriber.keystore.password   = changeit
+org.onap.dmaap.datarouter.subscriber.truststore.path     = /opt/app/datartr/self_signed/cacerts.jks
+org.onap.dmaap.datarouter.subscriber.truststore.password = changeit
+
+
+
diff --git a/datarouter-prov/src/main/resources/docker-compose/database/sql_init_01.sql b/docker-compose/database/sql_init_01.sql
similarity index 100%
rename from datarouter-prov/src/main/resources/docker-compose/database/sql_init_01.sql
rename to docker-compose/database/sql_init_01.sql
diff --git a/datarouter-prov/src/main/resources/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml
similarity index 89%
rename from datarouter-prov/src/main/resources/docker-compose/docker-compose.yml
rename to docker-compose/docker-compose.yml
index 6aee4db..f8a4d84 100644
--- a/datarouter-prov/src/main/resources/docker-compose/docker-compose.yml
+++ b/docker-compose/docker-compose.yml
@@ -1,96 +1,108 @@
-#-------------------------------------------------------------------------------

-# ============LICENSE_START==================================================

-# * org.onap.dmaap

-# * ===========================================================================

-# * Copyright © 2017 AT&T Intellectual Property. All rights reserved.

-# * ===========================================================================

-# * Licensed under the Apache License, Version 2.0 (the "License");

-# * you may not use this file except in compliance with the License.

-# * You may obtain a copy of the License at

-# * 

-#  *      http://www.apache.org/licenses/LICENSE-2.0

-# * 

-#  * Unless required by applicable law or agreed to in writing, software

-# * distributed under the License is distributed on an "AS IS" BASIS,

-# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-# * See the License for the specific language governing permissions and

-# * limitations under the License.

-# * ============LICENSE_END====================================================

-# *

-# * ECOMP is a trademark and service mark of AT&T Intellectual Property.

-# *

-#-------------------------------------------------------------------------------

-version: '2.1'

-services:

-  datarouter-prov:

-    image: nexus3.onap.org:10003/onap/dmaap/datarouter-prov

-    container_name: datarouter-prov

-    hostname: prov.datarouternew.com

-    ports:

-     - "8443:8443"

-     - "8080:8080"  

-    volumes:

-     - ./prov_data/provserver.properties:/opt/app/datartr/etc/provserver.properties

-     - ./prov_data/addSubscriber.txt:/opt/app/datartr/addSubscriber.txt

-     - ./prov_data/addFeed3.txt:/opt/app/datartr/addFeed3.txt

-    depends_on:

-      mariadb_container:

-        condition: service_healthy

-    healthcheck:

-      test: ["CMD", "curl", "-f", "http://prov.datarouternew.com:8080/internal/prov"]

-      interval: 10s

-      timeout: 10s

-      retries: 5

-    extra_hosts:

-      - "node.datarouternew.com:172.100.0.4"

-    networks:

-      testing_net:

-        ipv4_address: 172.100.0.3

-

-  datarouter-node:

-    image: nexus3.onap.org:10003/onap/dmaap/datarouter-node

-    container_name: datarouter-node

-    hostname: node.datarouternew.com

-    ports:

-     - "9443:8443"

-     - "9090:8080"

-    volumes:

-     - ./node_data/node.properties:/opt/app/datartr/etc/node.properties

-    depends_on:

-      datarouter-prov:

-        condition: service_healthy

-    extra_hosts:

-      - "prov.datarouternew.com:172.100.0.3"

-    networks:

-      testing_net:

-        ipv4_address: 172.100.0.4

-      

-  mariadb_container:

-    image: mariadb:10.2.14

-    container_name: mariadb

-    ports:

-      - "3306:3306"

-#    volumes:

-#     - ./database/sql_init_01.sql:/docker-entrypoint-initdb.d/sql_init_01.sql

-    environment:

-      MYSQL_ROOT_PASSWORD: datarouter

-      MYSQL_DATABASE: datarouter

-      MYSQL_USER: datarouter

-      MYSQL_PASSWORD: datarouter

-    healthcheck:

-      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "--silent"]

-      interval: 10s

-      timeout: 30s

-      retries: 5

-

-    networks:

-      testing_net:

-        ipv4_address: 172.100.0.2

-

-networks:

-  testing_net:

-    driver: bridge

-    ipam:

-      driver: default

-      config:

-        - subnet: 172.100.0.0/16

+#-------------------------------------------------------------------------------
+# ============LICENSE_START==================================================
+# * org.onap.dmaap
+# * ===========================================================================
+# * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# * ===========================================================================
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# * 
+#  *      http://www.apache.org/licenses/LICENSE-2.0
+# * 
+#  * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+# * ============LICENSE_END====================================================
+# *
+# * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+# *
+#-------------------------------------------------------------------------------
+version: '2.1'
+services:
+  datarouter-prov:
+    image: nexus3.onap.org:10003/onap/dmaap/datarouter-prov
+    container_name: datarouter-prov
+    hostname: prov.datarouternew.com
+    ports:
+     - "8443:8443"
+     - "8080:8080"  
+    volumes:
+     - ./prov_data/provserver.properties:/opt/app/datartr/etc/provserver.properties
+     - ./prov_data/addSubscriber.txt:/opt/app/datartr/addSubscriber.txt
+     - ./prov_data/addFeed3.txt:/opt/app/datartr/addFeed3.txt
+    depends_on:
+      mariadb_container:
+        condition: service_healthy
+    healthcheck:
+      test: ["CMD", "curl", "-f", "http://prov.datarouternew.com:8080/internal/prov"]
+      interval: 10s
+      timeout: 10s
+      retries: 5
+    extra_hosts:
+      - "node.datarouternew.com:172.100.0.4"
+    networks:
+      testing_net:
+        ipv4_address: 172.100.0.3
+
+  datarouter-node:
+    image: nexus3.onap.org:10003/onap/dmaap/datarouter-node
+    container_name: datarouter-node
+    hostname: node.datarouternew.com
+    ports:
+     - "9443:8443"
+     - "9090:8080"
+    volumes:
+     - ./node_data/node.properties:/opt/app/datartr/etc/node.properties
+    depends_on:
+      datarouter-prov:
+        condition: service_healthy
+    extra_hosts:
+      - "prov.datarouternew.com:172.100.0.3"
+    networks:
+      testing_net:
+        ipv4_address: 172.100.0.4
+
+  datarouter-subscriber:
+      image: nexus3.onap.org:10003/onap/dmaap/datarouter-subscriber
+      container_name: subscriber-node
+      hostname: subscriber.com
+      ports:
+       - "7070:7070"
+      volumes:
+       - ./subscriber_data/subscriber.properties:/opt/app/subscriber/etc/subscriber.properties
+      networks:
+        testing_net:
+          ipv4_address: 172.100.0.5
+      
+  mariadb_container:
+    image: mariadb:10.2.14
+    container_name: mariadb
+    ports:
+      - "3306:3306"
+#    volumes:
+#     - ./database/sql_init_01.sql:/docker-entrypoint-initdb.d/sql_init_01.sql
+    environment:
+      MYSQL_ROOT_PASSWORD: datarouter
+      MYSQL_DATABASE: datarouter
+      MYSQL_USER: datarouter
+      MYSQL_PASSWORD: datarouter
+    healthcheck:
+      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "--silent"]
+      interval: 10s
+      timeout: 30s
+      retries: 5
+
+    networks:
+      testing_net:
+        ipv4_address: 172.100.0.2
+
+networks:
+  testing_net:
+    driver: bridge
+    ipam:
+      driver: default
+      config:
+        - subnet: 172.100.0.0/16
diff --git a/datarouter-prov/src/main/resources/docker-compose/node_data/node.properties b/docker-compose/node_data/node.properties
similarity index 97%
rename from datarouter-prov/src/main/resources/docker-compose/node_data/node.properties
rename to docker-compose/node_data/node.properties
index 4848502..20c5af1 100644
--- a/datarouter-prov/src/main/resources/docker-compose/node_data/node.properties
+++ b/docker-compose/node_data/node.properties
@@ -1,112 +1,112 @@
-#-------------------------------------------------------------------------------

-# ============LICENSE_START==================================================

-# * org.onap.dmaap

-# * ===========================================================================

-# * Copyright © 2017 AT&T Intellectual Property. All rights reserved.

-# * ===========================================================================

-# * Licensed under the Apache License, Version 2.0 (the "License");

-# * you may not use this file except in compliance with the License.

-# * You may obtain a copy of the License at

-# *

-#  *      http://www.apache.org/licenses/LICENSE-2.0

-# *

-#  * Unless required by applicable law or agreed to in writing, software

-# * distributed under the License is distributed on an "AS IS" BASIS,

-# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

-# * See the License for the specific language governing permissions and

-# * limitations under the License.

-# * ============LICENSE_END====================================================

-# *

-# * ECOMP is a trademark and service mark of AT&T Intellectual Property.

-# *

-#-------------------------------------------------------------------------------

-#

-#    Configuration parameters fixed at startup for the DataRouter node

-#

-#    URL to retrieve dynamic configuration

-#

-#ProvisioningURL:    ${DRTR_PROV_INTURL:-https://feeds-drtr.web.att.com/internal/prov}

-ProvisioningURL=https://prov.datarouternew.com:8443/internal/prov

-

-#

-#    URL to upload PUB/DEL/EXP logs

-#

-#LogUploadURL:    ${DRTR_LOG_URL:-https://feeds-drtr.web.att.com/internal/logs}

-LogUploadURL=https://prov.datarouternew.com:8443/internal/logs

-

-#

-#    The port number for http as seen within the server

-#

-#IntHttpPort:    ${DRTR_NODE_INTHTTPPORT:-8080}

-IntHttpPort=8080

-#

-#    The port number for https as seen within the server

-#

-IntHttpsPort=8443

-#

-#    The external port number for https taking port mapping into account

-#

-ExtHttpsPort=443

-#

-#    The minimum interval between fetches of the dynamic configuration

-#    from the provisioning server

-#

-MinProvFetchInterval=10000

-#

-#    The minimum interval between saves of the redirection data file

-#

-MinRedirSaveInterval=10000

-#

-#    The path to the directory where log files are stored

-#

-LogDir=/opt/app/datartr/logs

-#

-#    The retention interval (in days) for log files

-#

-LogRetention=30

-#

-#    The path to the directories where data and meta data files are stored

-#

-SpoolDir=/opt/app/datartr/spool

-#

-#    The path to the redirection data file

-#

-#RedirectionFile:    etc/redirections.dat

-#

-#    The type of keystore for https

-#

-KeyStoreType:    jks

-#

-#    The path to the keystore for https

-#

-KeyStoreFile:/opt/app/datartr/self_signed/keystore.jks

-#

-#    The password for the https keystore

-#

-KeyStorePassword=changeit

-#

-#    The password for the private key in the https keystore

-#

-KeyPassword=changeit

-#

-#    The type of truststore for https

-#

-TrustStoreType=jks

-#

-#    The path to the truststore for https

-#

-#TrustStoreFile=/usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts

-TrustStoreFile=/opt/app/datartr/self_signed/cacerts.jks

-#

-#    The password for the https truststore

-#

-TrustStorePassword=changeit

-#

-#    The path to the file used to trigger an orderly shutdown

-#

-QuiesceFile=etc/SHUTDOWN

-#

-#    The key used to generate passwords for node to node transfers

-#

-NodeAuthKey=Node123!

-

+#-------------------------------------------------------------------------------
+# ============LICENSE_START==================================================
+# * org.onap.dmaap
+# * ===========================================================================
+# * Copyright � 2017 AT&T Intellectual Property. All rights reserved.
+# * ===========================================================================
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+#  *      http://www.apache.org/licenses/LICENSE-2.0
+# *
+#  * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+# * ============LICENSE_END====================================================
+# *
+# * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+# *
+#-------------------------------------------------------------------------------
+#
+#    Configuration parameters fixed at startup for the DataRouter node
+#
+#    URL to retrieve dynamic configuration
+#
+#ProvisioningURL:    ${DRTR_PROV_INTURL:-https://feeds-drtr.web.att.com/internal/prov}
+ProvisioningURL=https://prov.datarouternew.com:8443/internal/prov
+
+#
+#    URL to upload PUB/DEL/EXP logs
+#
+#LogUploadURL:    ${DRTR_LOG_URL:-https://feeds-drtr.web.att.com/internal/logs}
+LogUploadURL=https://prov.datarouternew.com:8443/internal/logs
+
+#
+#    The port number for http as seen within the server
+#
+#IntHttpPort:    ${DRTR_NODE_INTHTTPPORT:-8080}
+IntHttpPort=8080
+#
+#    The port number for https as seen within the server
+#
+IntHttpsPort=8443
+#
+#    The external port number for https taking port mapping into account
+#
+ExtHttpsPort=443
+#
+#    The minimum interval between fetches of the dynamic configuration
+#    from the provisioning server
+#
+MinProvFetchInterval=10000
+#
+#    The minimum interval between saves of the redirection data file
+#
+MinRedirSaveInterval=10000
+#
+#    The path to the directory where log files are stored
+#
+LogDir=/opt/app/datartr/logs
+#
+#    The retention interval (in days) for log files
+#
+LogRetention=30
+#
+#    The path to the directories where data and meta data files are stored
+#
+SpoolDir=/opt/app/datartr/spool
+#
+#    The path to the redirection data file
+#
+#RedirectionFile:    etc/redirections.dat
+#
+#    The type of keystore for https
+#
+KeyStoreType:    jks
+#
+#    The path to the keystore for https
+#
+KeyStoreFile:/opt/app/datartr/self_signed/keystore.jks
+#
+#    The password for the https keystore
+#
+KeyStorePassword=changeit
+#
+#    The password for the private key in the https keystore
+#
+KeyPassword=changeit
+#
+#    The type of truststore for https
+#
+TrustStoreType=jks
+#
+#    The path to the truststore for https
+#
+#TrustStoreFile=/usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts
+TrustStoreFile=/opt/app/datartr/self_signed/cacerts.jks
+#
+#    The password for the https truststore
+#
+TrustStorePassword=changeit
+#
+#    The path to the file used to trigger an orderly shutdown
+#
+QuiesceFile=etc/SHUTDOWN
+#
+#    The key used to generate passwords for node to node transfers
+#
+NodeAuthKey=Node123!
+
diff --git a/datarouter-prov/src/main/resources/docker-compose/node_data/self_signed/cacerts.jks b/docker-compose/node_data/self_signed/cacerts.jks
similarity index 100%
rename from datarouter-prov/src/main/resources/docker-compose/node_data/self_signed/cacerts.jks
rename to docker-compose/node_data/self_signed/cacerts.jks
Binary files differ
diff --git a/datarouter-prov/src/main/resources/docker-compose/node_data/self_signed/keystore.jks b/docker-compose/node_data/self_signed/keystore.jks
similarity index 100%
rename from datarouter-prov/src/main/resources/docker-compose/node_data/self_signed/keystore.jks
rename to docker-compose/node_data/self_signed/keystore.jks
Binary files differ
diff --git a/datarouter-prov/src/main/resources/docker-compose/node_data/self_signed/mykey.cer b/docker-compose/node_data/self_signed/mykey.cer
similarity index 100%
rename from datarouter-prov/src/main/resources/docker-compose/node_data/self_signed/mykey.cer
rename to docker-compose/node_data/self_signed/mykey.cer
Binary files differ
diff --git a/datarouter-prov/src/main/resources/docker-compose/node_data/self_signed/nodekey.cer b/docker-compose/node_data/self_signed/nodekey.cer
similarity index 100%
rename from datarouter-prov/src/main/resources/docker-compose/node_data/self_signed/nodekey.cer
rename to docker-compose/node_data/self_signed/nodekey.cer
Binary files differ
diff --git a/datarouter-prov/src/main/resources/docker-compose/prov_data/addFeed3.txt b/docker-compose/prov_data/addFeed3.txt
similarity index 100%
rename from datarouter-prov/src/main/resources/docker-compose/prov_data/addFeed3.txt
rename to docker-compose/prov_data/addFeed3.txt
diff --git a/datarouter-prov/src/main/resources/docker-compose/prov_data/addSubscriber.txt b/docker-compose/prov_data/addSubscriber.txt
similarity index 100%
rename from datarouter-prov/src/main/resources/docker-compose/prov_data/addSubscriber.txt
rename to docker-compose/prov_data/addSubscriber.txt
diff --git a/datarouter-prov/src/main/resources/docker-compose/prov_data/provserver.properties b/docker-compose/prov_data/provserver.properties
similarity index 100%
rename from datarouter-prov/src/main/resources/docker-compose/prov_data/provserver.properties
rename to docker-compose/prov_data/provserver.properties
diff --git a/datarouter-prov/src/main/resources/docker-compose/prov_data/self_signed/cacerts.jks b/docker-compose/prov_data/self_signed/cacerts.jks
similarity index 100%
rename from datarouter-prov/src/main/resources/docker-compose/prov_data/self_signed/cacerts.jks
rename to docker-compose/prov_data/self_signed/cacerts.jks
Binary files differ
diff --git a/datarouter-prov/src/main/resources/docker-compose/prov_data/self_signed/keystore.jks b/docker-compose/prov_data/self_signed/keystore.jks
similarity index 100%
rename from datarouter-prov/src/main/resources/docker-compose/prov_data/self_signed/keystore.jks
rename to docker-compose/prov_data/self_signed/keystore.jks
Binary files differ
diff --git a/datarouter-prov/src/main/resources/docker-compose/prov_data/self_signed/mykey.cer b/docker-compose/prov_data/self_signed/mykey.cer
similarity index 100%
rename from datarouter-prov/src/main/resources/docker-compose/prov_data/self_signed/mykey.cer
rename to docker-compose/prov_data/self_signed/mykey.cer
Binary files differ
diff --git a/docker-compose/subscriber_data/subscriber.properties b/docker-compose/subscriber_data/subscriber.properties
new file mode 100644
index 0000000..771fdd3
--- /dev/null
+++ b/docker-compose/subscriber_data/subscriber.properties
@@ -0,0 +1,40 @@
+#-------------------------------------------------------------------------------
+# ============LICENSE_START==================================================
+# * org.onap.dmaap
+# * ===========================================================================
+# * Copyright � 2017 AT&T Intellectual Property. All rights reserved.
+# * ===========================================================================
+# * Licensed under the Apache License, Version 2.0 (the "License");
+# * you may not use this file except in compliance with the License.
+# * You may obtain a copy of the License at
+# *
+#  *      http://www.apache.org/licenses/LICENSE-2.0
+# *
+#  * Unless required by applicable law or agreed to in writing, software
+# * distributed under the License is distributed on an "AS IS" BASIS,
+# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# * See the License for the specific language governing permissions and
+# * limitations under the License.
+# * ============LICENSE_END====================================================
+# *
+# * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+# *
+#-------------------------------------------------------------------------------
+
+#Subscriber properties
+org.onap.dmaap.datarouter.subscriber.http.port           = 7070
+org.onap.dmaap.datarouter.subscriber.https.port          = 7443
+org.onap.dmaap.datarouter.subscriber.auth.user           = LOGIN
+org.onap.dmaap.datarouter.subscriber.auth.password       = PASSWORD
+org.onap.dmaap.datarouter.subscriber.delivery.dir        = /opt/app/subscriber/delivery
+
+org.onap.dmaap.datarouter.subscriber.https.relaxation    = true
+org.onap.dmaap.datarouter.subscriber.keystore.type       = jks
+org.onap.dmaap.datarouter.subscriber.keymanager.password = changeit
+org.onap.dmaap.datarouter.subscriber.keystore.path       = /opt/app/datartr/self_signed/keystore.jks
+org.onap.dmaap.datarouter.subscriber.keystore.password   = changeit
+org.onap.dmaap.datarouter.subscriber.truststore.path     = /opt/app/datartr/self_signed/cacerts.jks
+org.onap.dmaap.datarouter.subscriber.truststore.password = changeit
+
+
+
diff --git a/pom.xml b/pom.xml
index d3327ba..43aeca2 100755
--- a/pom.xml
+++ b/pom.xml
@@ -60,6 +60,7 @@
     <modules>
         <module>datarouter-prov</module>
         <module>datarouter-node</module>
+        <module>datarouter-subscriber</module>
     </modules>
     <build>
         <plugins>