Merge "Sonar Fix - ConnectionFactory.java"
diff --git a/INFO.yaml b/INFO.yaml
index 3c821b8..20a439a 100644
--- a/INFO.yaml
+++ b/INFO.yaml
@@ -1,5 +1,5 @@
 ---
-project: 'dmaap-messagerouter-msgrtr'
+project: 'dmaap-dbcapi'
 project_creation_date: '2017-08-29'
 lifecycle_state: 'Incubation'
 project_lead: &onap_releng_ptl
@@ -9,50 +9,67 @@
     company: 'ATT'
     timezone: 'America/Dallas'
 primary_contact: *onap_releng_ptl
+project_category: ''
 issue_tracking:
     type: 'jira'
     url: 'https://jira.onap.org/projects/DMAAP'
     key: 'DMAAP'
+mailing_list:
+    type: 'groups.io'
+    url: 'lists.onap.org'
+    tag: '<[sub-project_name]>'
+realtime_discussion: ''
 meetings:
     - type: 'zoom'
-        agenda: ''
-        url: 'https://wiki.onap.org/pages/viewpage.action?pageId=13599275'
-        server: 'n/a'
-        channel: 'n/a'
-        repeats: 'weekly'
-        time: '13:00 UTC'
+      agenda: ''
+      url: 'https://wiki.onap.org/pages/viewpage.action?pageId=13599275'
+      server: 'n/a'
+      channel: 'n/a'
+      repeats: 'weekly'
+      time: '13:00 UTC'
+repositories:
+    - 'dmaap-buscontroller'
+    - 'dmaap-datarouter'
+    - 'dmaap-dbcapi'
+    - 'dmaap-kafka11aaf'
+    - 'dmaap-messagerouter-dmaapclient'
+    - 'dmaap-messagerouter-messageservice'
+    - 'dmaap-messagerouter-mirroragent'
+    - 'dmaap-messagerouter-msgrtr'
+    - 'dmaap-oom'
+    - 'dmaap-zookeeper'
 committers:
     - <<: *onap_releng_ptl
     - name: 'Mandar Sawant'
-        email: 'ms5838@att.com'
-        company: 'ATT'
-        id: 'sawantmandar'
-        timezone: 'America/Dallas'
+      email: 'ms5838@att.com'
+      company: 'ATT'
+      id: 'sawantmandar'
+      timezone: 'America/Dallas'
     - name: 'Varun Gudisena'
-        email: 'vg411h@att.com'
-        company: 'ATT'
-        id: 'vg411h'
-        timezone: 'America/Dallas'
+      email: 'vg411h@att.com'
+      company: 'ATT'
+      id: 'vg411h'
+      timezone: 'America/Dallas'
     - name: 'Bhanu Ramesh'
-        email: 'bg6954@att.com'
-        company: 'ATT'
-        id: 'BhanuRamesh'
-        timezone: 'America/Dallas'
+      email: 'bg6954@att.com'
+      company: 'ATT'
+      id: 'BhanuRamesh'
+      timezone: 'America/Dallas'
     - name: 'Dominic Lunanuova'
-        email: 'dgl@research.att.com'
-        company: 'ATT'
-        id: 'dglFromAtt'
-        timezone: 'America/Dallas'
+      email: 'dgl@research.att.com'
+      company: 'ATT'
+      id: 'dglFromAtt'
+      timezone: 'America/Dallas'
     - name: 'Sunil Unnava'
-        email: 'su622b@att.com'
-        company: 'ATT'
-        id: 'su622b'
-        timezone: 'America/Louisville'
+      email: 'su622b@att.com'
+      company: 'ATT'
+      id: 'su622b'
+      timezone: 'America/Louisville'
     - name: 'Conor Ward'
-        email: 'conor.ward@ericsson.com'
-        company: 'ericsson'
-        id: 'econwar'
-        timezone: 'America/Dallas'
+      email: 'conor.ward@ericsson.com'
+      company: 'ericsson'
+      id: 'econwar'
+      timezone: 'America/Dallas'
 tsc:
     approval: 'https://lists.onap.org/pipermail/onap-tsc'
     changes:
diff --git a/src/main/java/org/onap/dmaap/dbcapi/client/DrProvConnection.java b/src/main/java/org/onap/dmaap/dbcapi/client/DrProvConnection.java
index 441596a..3cb3d67 100644
--- a/src/main/java/org/onap/dmaap/dbcapi/client/DrProvConnection.java
+++ b/src/main/java/org/onap/dmaap/dbcapi/client/DrProvConnection.java
@@ -411,7 +411,7 @@
             if (rc >= 200 && rc < 300 ) {
      			responseBody = bodyToString( uc.getInputStream() );
     			logger.info( "responseBody=" + responseBody );
-
+    			err.setCode( rc );
             } else if ( rc == 404 ) {
             	err.setCode( rc );
             	err.setFields( "feedid");
diff --git a/src/main/java/org/onap/dmaap/dbcapi/model/DR_Pub.java b/src/main/java/org/onap/dmaap/dbcapi/model/DR_Pub.java
index 06598f7..0d146b7 100644
--- a/src/main/java/org/onap/dmaap/dbcapi/model/DR_Pub.java
+++ b/src/main/java/org/onap/dmaap/dbcapi/model/DR_Pub.java
@@ -32,6 +32,10 @@
 	private String userpwd;
 	private String feedId;
 	private String pubId;
+	
+	// NOTE: the following fields are optional in the API but not stored in the DB
+	private	String	feedName;
+	private String	feedVersion;
 
 	
 	public DR_Pub() {
@@ -114,6 +118,22 @@
 	public void setNextPubId() {
 		this.pubId = this.feedId + "." +  DR_Pub.nextKey();
 	}
+	
+	public String getFeedName() {
+		return feedName;
+	}
+
+	public void setFeedName(String feedName) {
+		this.feedName = feedName;
+	}
+
+	public String getFeedVersion() {
+		return feedVersion;
+	}
+
+	public void setFeedVersion(String feedVersion) {
+		this.feedVersion = feedVersion;
+	}
 
 	public DR_Pub setRandomUserName() {
 		RandomString r = new RandomString(15);
diff --git a/src/main/java/org/onap/dmaap/dbcapi/model/DR_Sub.java b/src/main/java/org/onap/dmaap/dbcapi/model/DR_Sub.java
index dd0b85d..9b6e2d7 100644
--- a/src/main/java/org/onap/dmaap/dbcapi/model/DR_Sub.java
+++ b/src/main/java/org/onap/dmaap/dbcapi/model/DR_Sub.java
@@ -45,6 +45,10 @@
 	private boolean guaranteedDelivery;
 	private boolean guaranteedSequence;
 	private boolean privilegedSubscriber;
+	
+	// NOTE: the following fields are optional in the API but not stored in the DB
+	private	String	feedName;
+	private String	feedVersion;
 
 	public DR_Sub() {
 
@@ -230,6 +234,24 @@
 	public void setPrivilegedSubscriber(boolean privilegedSubscriber) {
 		this.privilegedSubscriber = privilegedSubscriber;
 	}
+	
+	
+
+	public String getFeedName() {
+		return feedName;
+	}
+
+	public void setFeedName(String feedName) {
+		this.feedName = feedName;
+	}
+
+	public String getFeedVersion() {
+		return feedVersion;
+	}
+
+	public void setFeedVersion(String feedVersion) {
+		this.feedVersion = feedVersion;
+	}
 
 	public byte[] getBytes(String provApi) {
 		if ( "AT&T".equals(provApi)) {
diff --git a/src/main/java/org/onap/dmaap/dbcapi/resources/DR_PubResource.java b/src/main/java/org/onap/dmaap/dbcapi/resources/DR_PubResource.java
index bcdb4b3..1673857 100644
--- a/src/main/java/org/onap/dmaap/dbcapi/resources/DR_PubResource.java
+++ b/src/main/java/org/onap/dmaap/dbcapi/resources/DR_PubResource.java
@@ -91,21 +91,42 @@
 			DR_Pub pub
 			) {
 		ApiService resp = new ApiService();
+		FeedService feeds = new FeedService();
+		Feed fnew = null;
 
 		logger.info( "Entry: POST /dr_pubs");
 
 		try {
 			resp.required( "feedId", pub.getFeedId(), "");
+		} catch ( RequiredFieldException rfe ) {
+			try {
+				resp.required( "feedName", pub.getFeedName(), "");
+			}catch ( RequiredFieldException rfe2 ) {
+				logger.debug( resp.toString() );
+				return resp.error();
+			}
+			// if we found a FeedName instead of a FeedId then try to look it up.
+			List<Feed> nfeeds =  feeds.getAllFeeds( pub.getFeedName(), pub.getFeedVersion(), "equals");
+			if ( nfeeds.size() != 1 ) {
+				logger.debug( "Attempt to match "+ pub.getFeedName() + " ver="+pub.getFeedVersion() + " matched " + nfeeds.size() );
+				return resp.error();
+			}
+			fnew = nfeeds.get(0);
+		}
+		try {
 			resp.required( "dcaeLocationName", pub.getDcaeLocationName(), "");
 		} catch ( RequiredFieldException rfe ) {
 			logger.debug( resp.getErr().toString() );
 			return resp.error();	
 		}
 
-		FeedService feeds = new FeedService();
-		Feed fnew = feeds.getFeed( pub.getFeedId(), resp.getErr() );
+
+		// we may have fnew already if located by FeedName
 		if ( fnew == null ) {
-			logger.info( "Specified feed " + pub.getFeedId() + " not known to Bus Controller");	
+			fnew = feeds.getFeed( pub.getFeedId(), resp.getErr() );
+		}
+		if ( fnew == null ) {
+			logger.info( "Specified feed " + pub.getFeedId() + " or " + pub.getFeedName() + " not known to Bus Controller");	
 			return resp.error();	
 		}
 
diff --git a/src/main/java/org/onap/dmaap/dbcapi/resources/DR_SubResource.java b/src/main/java/org/onap/dmaap/dbcapi/resources/DR_SubResource.java
index 28bfdc5..498454e 100644
--- a/src/main/java/org/onap/dmaap/dbcapi/resources/DR_SubResource.java
+++ b/src/main/java/org/onap/dmaap/dbcapi/resources/DR_SubResource.java
@@ -92,24 +92,41 @@
 			) {
 	
 		ApiService resp = new ApiService();
-
+		FeedService feeds = new FeedService();
+		Feed fnew = null;
 		try {
 			resp.required( "feedId", sub.getFeedId(), "");
+		} catch ( RequiredFieldException rfe ) {
+			try {
+				resp.required( "feedName", sub.getFeedName(), "");
+			}catch ( RequiredFieldException rfe2 ) {
+				logger.debug( resp.toString() );
+				return resp.error();
+			}
+			// if we found a FeedName instead of a FeedId then try to look it up.
+			List<Feed> nfeeds =  feeds.getAllFeeds( sub.getFeedName(), sub.getFeedVersion(), "equals");
+			if ( nfeeds.size() != 1 ) {
+				logger.debug( "Attempt to match "+ sub.getFeedName() + " ver="+sub.getFeedVersion() + " matched " + nfeeds.size() );
+				return resp.error();
+			}
+			fnew = nfeeds.get(0);
+		}
+			
+		try {
 			resp.required( "dcaeLocationName", sub.getDcaeLocationName(), "");
-	
 		} catch ( RequiredFieldException rfe ) {
 			logger.debug( resp.toString() );
 			return resp.error();	
 		}
-		
-		FeedService feeds = new FeedService();
-		Feed fnew = feeds.getFeed( sub.getFeedId(), resp.getErr() );
+		// we may have fnew already if located by FeedName
 		if ( fnew == null ) {
-			logger.warn( "Specified feed " + sub.getFeedId() + " not known to Bus Controller");
+			fnew = feeds.getFeed( sub.getFeedId(), resp.getErr() );
+		}
+		if ( fnew == null ) {
+			logger.warn( "Specified feed " + sub.getFeedId() + " or " + sub.getFeedName() + " not known to Bus Controller");
 			resp.setCode(Status.NOT_FOUND.getStatusCode());
 			return resp.error();
 		}
-
 		DR_SubService dr_subService = new DR_SubService( fnew.getSubscribeURL());
 		ArrayList<DR_Sub> subs = fnew.getSubs();
 		logger.info( "num existing subs before = " + subs.size() );
@@ -157,7 +174,7 @@
 			logger.warn( "Specified feed " + sub.getFeedId() + " not known to Bus Controller");
 			return resp.error();
 		}
-		
+
 		DR_SubService dr_subService = new DR_SubService();
 		sub.setSubId(name);
 		DR_Sub nsub = dr_subService.updateDr_Sub(sub, resp.getErr() );
diff --git a/src/main/java/org/onap/dmaap/dbcapi/service/ApiService.java b/src/main/java/org/onap/dmaap/dbcapi/service/ApiService.java
index 6ae639d..48f81db 100644
--- a/src/main/java/org/onap/dmaap/dbcapi/service/ApiService.java
+++ b/src/main/java/org/onap/dmaap/dbcapi/service/ApiService.java
@@ -165,6 +165,7 @@
 
 	// test for presence of a required field
 	public void required( String name, Object val, String expr ) throws RequiredFieldException {
+		err.setCode(0);
 		if ( val == null  ) {
 			err.setCode(Status.BAD_REQUEST.getStatusCode());
 			err.setMessage("missing required field");
diff --git a/src/main/java/org/onap/dmaap/dbcapi/service/DR_SubService.java b/src/main/java/org/onap/dmaap/dbcapi/service/DR_SubService.java
index 99c8f31..9d233a5 100644
--- a/src/main/java/org/onap/dmaap/dbcapi/service/DR_SubService.java
+++ b/src/main/java/org/onap/dmaap/dbcapi/service/DR_SubService.java
@@ -98,7 +98,7 @@
 		String resp = prov.doPostDr_Sub( sub, apiError );
 		if ( "Yes".equals(unit_test) ) {
 			resp = simulateResp( sub, "POST" );
-			apiError.setCode(200);
+			apiError.setCode(201);
 		}
 		logger.debug( "addDr_Sub resp=" + resp );
 
@@ -110,7 +110,7 @@
 			snew.setLastMod();
 			addEgressRoute( snew, apiError );
 			dr_subs.put( snew.getSubId(), snew );	
-			apiError.setCode(200);
+			apiError.setCode(201);
 		} else {
 			apiError.setCode(400);
 		}
diff --git a/src/test/java/org/onap/dmaap/dbcapi/resources/DR_PubResourceTest.java b/src/test/java/org/onap/dmaap/dbcapi/resources/DR_PubResourceTest.java
index 42c8014..d4f71bb 100644
--- a/src/test/java/org/onap/dmaap/dbcapi/resources/DR_PubResourceTest.java
+++ b/src/test/java/org/onap/dmaap/dbcapi/resources/DR_PubResourceTest.java
@@ -98,6 +98,18 @@
 		return dr_pub;
 	}
 	
+	private DR_Pub addPubByName( String d, String un, String up, String feedName) {
+		DR_Pub dr_pub = new DR_Pub( d, un, up, null, "" );
+		dr_pub.setFeedName(feedName);
+		Entity<DR_Pub> reqEntity2 = Entity.entity( dr_pub, MediaType.APPLICATION_JSON);
+		Response resp = target( "dr_pubs").request().post( reqEntity2, Response.class);
+		System.out.println( "POST dr_pubs resp=" + resp.getStatus() );
+		assertTrue( resp.getStatus() == 201 );
+		dr_pub = resp.readEntity( DR_Pub.class );
+		
+		return dr_pub;
+	}
+	
 	@Test
 	public void GetTest() {
 		Response resp = target( "dr_pubs").request().get( Response.class );
@@ -119,6 +131,20 @@
 
 		DR_Pub dr_pub = addPub( d, un, up, feed.getFeedId() );
 	}
+	
+	@Test
+	public void PostTestByName() {
+
+		Feed feed = addFeed( "pubPostTest2", "post unit test" );
+		System.out.println( "fpubPostTest: feedId=" + feed.getFeedId());
+		
+		String d, un, up;
+		d = "central-onap";
+		un = "user1";
+		up = "secretW0rd";
+
+		DR_Pub dr_pub = addPubByName( d, un, up, "pubPostTest2" );	
+	}
 
 	@Test
 	public void PutTest() {
diff --git a/src/test/java/org/onap/dmaap/dbcapi/resources/DR_SubResourceTest.java b/src/test/java/org/onap/dmaap/dbcapi/resources/DR_SubResourceTest.java
index 917507f..2227870 100644
--- a/src/test/java/org/onap/dmaap/dbcapi/resources/DR_SubResourceTest.java
+++ b/src/test/java/org/onap/dmaap/dbcapi/resources/DR_SubResourceTest.java
@@ -129,7 +129,21 @@
 		
 		return dr_sub;
 	}
-	
+	private DR_Sub addSubByName( String d, String un, String up, String feedName ) {
+		DR_Sub dr_sub = new DR_Sub( d, un, up, null, 
+				"https://subscriber.onap.org/foo", "https://dr-prov/sublog", true );
+		
+		dr_sub.setFeedName(feedName);
+
+		Entity<DR_Sub> reqEntity2 = Entity.entity( dr_sub, MediaType.APPLICATION_JSON);
+		Response resp = target( "dr_subs").request().post( reqEntity2, Response.class);
+		System.out.println( "POST dr_subs resp=" + resp.getStatus() );
+		assertTrue( resp.getStatus() == 201 );
+		dr_sub = resp.readEntity( DR_Sub.class );
+		
+		return dr_sub;
+	}
+
 	@Test
 	public void GetTest() {
 		Response resp = target( "dr_subs").request().get( Response.class );
@@ -153,6 +167,20 @@
 	}
 
 	@Test
+	public void PostTestByName() {
+
+		Feed feed = addFeed( "subPostTest2", "post unit test" );
+		System.out.println( "subPostTest2: feedId=" + feed.getFeedId());
+		
+		String d, un, up;
+		d = "central-onap";
+		un = "user1";
+		up = "secretW0rd";
+
+		DR_Sub dr_pub = addSubByName( d, un, up, feed.getFeedName() );
+	}
+
+	@Test
 	public void PutTest() {
 
 		Feed feed = addFeed( "subPutTest", "put unit test");
@@ -172,6 +200,7 @@
 		System.out.println( "PUT dr_subs resp=" + resp.getStatus() );
 		assertTrue( resp.getStatus() == 200 );
 	}
+
 /*
  * TODO: figure out how to check delete() response
 	@Test