Add Topic configuration API

1. Add Topic configuration APIs
2. Remove the "default_topic" DB relationship
3. Fix unit test

Issue-ID: DCAEGEN2-1437

Change-Id: I7f992a2439606a1e35dc015e0296ca86375caa87
Signed-off-by: Kate Hsuan <kate.hsuan@qct.io>
diff --git a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/TopicController.java b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/TopicController.java
index 0869fde..7583684 100644
--- a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/TopicController.java
+++ b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/TopicController.java
@@ -20,6 +20,7 @@
 package org.onap.datalake.feeder.controller;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
@@ -27,6 +28,9 @@
 
 import org.onap.datalake.feeder.domain.Db;
 import org.onap.datalake.feeder.domain.Topic;
+import org.onap.datalake.feeder.controller.domain.PostReturnBody;
+import org.onap.datalake.feeder.controller.domain.TopicConfig;
+import org.onap.datalake.feeder.repository.DbRepository;
 import org.onap.datalake.feeder.repository.TopicRepository;
 import org.onap.datalake.feeder.service.DbService;
 import org.onap.datalake.feeder.service.DmaapService;
@@ -57,11 +61,11 @@
  * script.
  * 
  * @author Guobiao Mo
- *
+ * @contributor Kate Hsuan @ QCT
  */
 
 @RestController
-@RequestMapping(value = "/topics", produces = { MediaType.APPLICATION_JSON_VALUE }) //, consumes= {MediaType.APPLICATION_JSON_UTF8_VALUE})
+@RequestMapping(value = "/topics", produces = { MediaType.APPLICATION_JSON_VALUE })//, consumes= {MediaType.APPLICATION_JSON_UTF8_VALUE})
 public class TopicController {
 
 	private final Logger log = LoggerFactory.getLogger(this.getClass());
@@ -73,6 +77,9 @@
 	private TopicRepository topicRepository;
 
 	@Autowired
+	private DbRepository dbRepository;
+
+	@Autowired
 	private TopicService topicService;
 
 	@Autowired
@@ -85,112 +92,117 @@
 		return dmaapService.getTopics();
 	}
 
-	@GetMapping("/")
+	@GetMapping("")
 	@ResponseBody
-	@ApiOperation(value = "List all topics' settings.")
-	public Iterable<Topic> list() throws IOException {
+	@ApiOperation(value="List all topics")
+	public List<String> list() throws IOException {
 		Iterable<Topic> ret = topicRepository.findAll();
-		return ret;
+		List<String> retString = new ArrayList<>();
+		for(Topic item : ret)
+		{
+			if(!topicService.istDefaultTopic(item))
+				retString.add(item.getName());
+		}
+		return retString;
+	}
+
+	@PostMapping("")
+	@ResponseBody
+	@ApiOperation(value="Create a new topic.")
+	public PostReturnBody<TopicConfig> createTopic(@RequestBody TopicConfig topicConfig, BindingResult result, HttpServletResponse response) throws IOException {
+
+		if (result.hasErrors()) {
+			sendError(response, 400, "Error parsing Topic: "+result.toString());
+			return null;
+		}
+		Topic oldTopic = topicService.getTopic(topicConfig.getName());
+		if (oldTopic != null) {
+			sendError(response, 400, "Topic already exists "+topicConfig.getName());
+			return null;
+		} else {
+			PostReturnBody<TopicConfig> retBody = new PostReturnBody<>();
+			Topic wTopic = topicService.fillTopicConfiguration(topicConfig);
+			if(wTopic.getTtl() == 0)
+				wTopic.setTtl(3650);
+			topicRepository.save(wTopic);
+			mkPostReturnBody(retBody, 200, wTopic);
+			return retBody;
+		}
 	}
 
 	@GetMapping("/{topicName}")
 	@ResponseBody
-	@ApiOperation(value = "Get a topic's settings.")
-	public Topic getTopic(@PathVariable("topicName") String topicName) throws IOException {
+	@ApiOperation(value="Get a topic's settings.")
+	public TopicConfig getTopic(@PathVariable("topicName") String topicName, HttpServletResponse response) throws IOException {
 		Topic topic = topicService.getTopic(topicName);
-		return topic;
+		if(topic == null) {
+			sendError(response, 404, "Topic not found");
+		}
+		TopicConfig tConfig = new TopicConfig();
+		mkReturnMessage(topic, tConfig);
+		return tConfig;
 	}
 
-	@GetMapping("/{topicName}/dbs")
-	@ResponseBody
-	@ApiOperation(value = "Get all DBs in a topic.")
-	public Set<Db> getTopicDbs(@PathVariable("topicName") String topicName) throws IOException {
-		Topic topic = topicService.getTopic(topicName);
-		Set<Db> dbs = topic.getDbs();
-		return dbs;
-	}
-
-	//This is not a partial update: old topic is wiped out, and new topic is created based on the input json. 
+	//This is not a partial update: old topic is wiped out, and new topic is created based on the input json.
 	//One exception is that old DBs are kept
-	@PutMapping("/")
+	@PutMapping("/{topicName}")
 	@ResponseBody
-	@ApiOperation(value = "Update a topic.")
-	public Topic updateTopic(@RequestBody Topic topic, BindingResult result, HttpServletResponse response) throws IOException {
+	@ApiOperation(value="Update a topic.")
+	public PostReturnBody<TopicConfig> updateTopic(@PathVariable("topicName") String topicName, @RequestBody TopicConfig topicConfig, BindingResult result, HttpServletResponse response) throws IOException {
 
 		if (result.hasErrors()) {
-			sendError(response, 400, "Error parsing Topic: " + result.toString());
+			sendError(response, 400, "Error parsing Topic: "+result.toString());
 			return null;
 		}
 
-		Topic oldTopic = getTopic(topic.getName());
+		if(!topicName.equals(topicConfig.getName()))
+		{
+			sendError(response, 400, "Topic name mismatch" + topicName + topicConfig.getName());
+			return null;
+		}
+
+		Topic oldTopic = topicService.getTopic(topicConfig.getName());
 		if (oldTopic == null) {
-			sendError(response, 404, "Topic not found " + topic.getName());
+			sendError(response, 404, "Topic not found "+topicConfig.getName());
 			return null;
 		} else {
-			if (!topicService.istDefaultTopic(topic)) {
-				Topic defaultTopic = topicService.getDefaultTopic();
-				topic.setDefaultTopic(defaultTopic);
-			}
-
-			topic.setDbs(oldTopic.getDbs());
-			topicRepository.save(topic);
-			return topic;
+			PostReturnBody<TopicConfig> retBody = new PostReturnBody<>();
+			topicService.fillTopicConfiguration(topicConfig, oldTopic);
+			topicRepository.save(oldTopic);
+			mkPostReturnBody(retBody, 200, oldTopic);
+			return retBody;
 		}
 	}
 
-	@PostMapping("/")
-	@ResponseBody
-	@ApiOperation(value = "Create a new topic.")
-	public Topic createTopic(@RequestBody Topic topic, BindingResult result, HttpServletResponse response) throws IOException {
-
-		if (result.hasErrors()) {
-			sendError(response, 400, "Error parsing Topic: " + result.toString());
-			return null;
+    private void mkReturnMessage(Topic topic, TopicConfig tConfig)
+	{
+		tConfig.setName(topic.getName());
+		tConfig.setEnable(topic.getEnabled());
+		if(topic.getDataFormat() != null)
+			tConfig.setData_format(topic.getDataFormat().toString());
+		tConfig.setSave_raw(topic.getSaveRaw());
+		tConfig.setCorrelated_clearred_message((topic.getCorrelateClearedMessage() == null) ? topic.getCorrelateClearedMessage() : false);
+		tConfig.setMessage_id_path(topic.getMessageIdPath());
+		tConfig.setTtl(topic.getTtl());
+		Set<Db> topicDb = topic.getDbs();
+		List<String> dbList = new ArrayList<>();
+		for(Db item: topicDb)
+		{
+			dbList.add(item.getName());
 		}
-
-		Topic oldTopic = getTopic(topic.getName());
-		if (oldTopic != null) {
-			sendError(response, 400, "Topic already exists " + topic.getName());
-			return null;
-		} else {
-			if (!topicService.istDefaultTopic(topic)) {
-				Topic defaultTopic = topicService.getDefaultTopic();
-				topic.setDefaultTopic(defaultTopic);
-			}
-
-			topicRepository.save(topic);
-			return topic;
-		}
+		tConfig.setSinkdbs(dbList);
 	}
 
-	@DeleteMapping("/{topicName}/db/{dbName}")
-	@ResponseBody
-	@ApiOperation(value = "Delete a DB from a topic.")
-	public Set<Db> deleteDb(@PathVariable("topicName") String topicName, @PathVariable("dbName") String dbName, HttpServletResponse response) throws IOException {
-		Topic topic = topicService.getTopic(topicName);
-		Set<Db> dbs = topic.getDbs();
-		dbs.remove(new Db(dbName));
-
-		topicRepository.save(topic);
-		return topic.getDbs();
+	private void mkPostReturnBody(PostReturnBody<TopicConfig> retBody, int statusCode, Topic topic)
+	{
+		TopicConfig retTopic = new TopicConfig();
+        retBody.setStatusCode(statusCode);
+        mkReturnMessage(topic, retTopic);
+        retBody.setReturnBody(retTopic);
 	}
-
-	@PutMapping("/{topicName}/db/{dbName}")
-	@ResponseBody
-	@ApiOperation(value = "Add a DB to a topic.")
-	public Set<Db> addDb(@PathVariable("topicName") String topicName, @PathVariable("dbName") String dbName, HttpServletResponse response) throws IOException {
-		Topic topic = topicService.getTopic(topicName);
-		Set<Db> dbs = topic.getDbs();
-
-		Db db = dbService.getDb(dbName);
-		dbs.add(db);
-
-		topicRepository.save(topic);
-		return topic.getDbs();
-	}
-
+	
 	private void sendError(HttpServletResponse response, int sc, String msg) throws IOException {
 		log.info(msg);
-		response.sendError(sc, msg);
+		response.sendError(sc, msg);		
 	}
 }
diff --git a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/domain/DbConfig.java b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/domain/DbConfig.java
index 63de219..e9d9ba8 100644
--- a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/domain/DbConfig.java
+++ b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/domain/DbConfig.java
@@ -19,15 +19,6 @@
  */
 package org.onap.datalake.feeder.controller.domain;
 
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.ManyToMany;
-import javax.persistence.Table;
-
-import com.fasterxml.jackson.annotation.JsonBackReference;
 
 import lombok.Getter;
 import lombok.Setter;
diff --git a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/domain/PostReturnBody.java b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/domain/PostReturnBody.java
index 107f494..84bfdd7 100644
--- a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/domain/PostReturnBody.java
+++ b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/domain/PostReturnBody.java
@@ -25,7 +25,7 @@
 
 
 /**
- *   Unified POST return format
+ *   Unified POST/PUT return format
  *   {
  *       statusCode: int,
  *       message: {
diff --git a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/domain/TopicConfig.java b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/domain/TopicConfig.java
new file mode 100644
index 0000000..9e53862
--- /dev/null
+++ b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/controller/domain/TopicConfig.java
@@ -0,0 +1,59 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP : DataLake
+ * ================================================================================
+ * Copyright 2019 QCT
+ *=================================================================================
+ * 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=========================================================
+ */
+
+package org.onap.datalake.feeder.controller.domain;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.onap.datalake.feeder.domain.Topic;
+import org.onap.datalake.feeder.domain.Db;
+import org.onap.datalake.feeder.repository.DbRepository;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+
+/**
+ * JSON request body for Topic manipulation.
+ *
+ * @author Kate Hsuan
+ *
+ */
+
+@Getter
+@Setter
+
+public class TopicConfig {
+
+    private String name;
+    private String login;
+    private String password;
+    private List<String> sinkdbs;
+    private boolean enable;
+    private boolean save_raw;
+    private String data_format;
+    private int ttl;
+    private boolean correlated_clearred_message;
+    private String message_id_path;
+
+
+
+}
diff --git a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/domain/Topic.java b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/domain/Topic.java
index 2b92e86..4273c89 100644
--- a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/domain/Topic.java
+++ b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/domain/Topic.java
@@ -54,14 +54,15 @@
 @Table(name = "topic")
 public class Topic {
 	@Id
+	@Column(name="`name`")
 	private String name;//topic name 
 
-	@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
-	@JoinColumn(name = "default_topic", nullable = true)
-	private Topic defaultTopic;
 
-	//for protected Kafka topics
+		//for protected Kafka topics
+	@Column(name = "`login`")
 	private String login;
+
+	@Column(name = "`pass`")
 	private String pass;
 
 	//@ManyToMany(mappedBy = "topics", cascade=CascadeType.ALL)
@@ -77,18 +78,20 @@
 	/**
 	 * indicate if we should monitor this topic
 	 */
+	@Column(name="`enabled`")
 	private Boolean enabled;
 
 	/**
 	 * save raw message text
 	 */
-	@Column(name = "save_raw")
+	@Column(name = "`save_raw`")
 	private Boolean saveRaw;
 
 	/**
 	 * need to explicitly tell feeder the data format of the message.
 	 * support JSON, XML, YAML, TEXT
 	 */
+	@Column(name="`data_format`")
 	private String dataFormat;
 
 	/**
@@ -97,11 +100,11 @@
 	private Integer ttl;
 
 	//if this flag is true, need to correlate alarm cleared message to previous alarm 
-	@Column(name = "correlate_cleared_message")
+	@Column(name = "`correlate_cleared_message`")
 	private Boolean correlateClearedMessage;
 
 	//paths to the values in the JSON that are used to composite DB id, comma separated, example: "/event-header/id,/event-header/entity-type,/entity/product-name"
-	@Column(name = "message_id_path")
+	@Column(name = "`message_id_path`")
 	private String messageIdPath;
 
 	public Topic() {
@@ -111,6 +114,10 @@
 		this.name = name;
 	}
 
+	public boolean isDefault() {
+		return "_DL_DEFAULT_".equals(name);
+	}
+
 	public boolean isEnabled() {
 		return is(enabled, Topic::isEnabled);
 	}
@@ -122,9 +129,7 @@
 	public int getTtl() {
 		if (ttl != null) {
 			return ttl;
-		} else if (defaultTopic != null) {
-			return defaultTopic.getTtl();
-		} else {
+		}  else {
 			return 3650;//default to 10 years for safe
 		}
 	}
@@ -132,9 +137,7 @@
 	public DataFormat getDataFormat() {
 		if (dataFormat != null) {
 			return DataFormat.fromString(dataFormat);
-		} else if (defaultTopic != null) {
-			return defaultTopic.getDataFormat();
-		} else {
+		}  else {
 			return null;
 		}
 	}
@@ -147,9 +150,7 @@
 	private boolean is(Boolean b, Predicate<Topic> pre, boolean defaultValue) {
 		if (b != null) {
 			return b;
-		} else if (defaultTopic != null) {
-			return pre.test(defaultTopic);
-		} else {
+		}  else {
 			return defaultValue;
 		}
 	}
@@ -179,10 +180,6 @@
 
 		if (dbs != null && dbs.contains(db)) {
 			return true;
-		}
-
-		if (defaultTopic != null) {
-			return defaultTopic.containDb(dbName);
 		} else {
 			return false;
 		}
diff --git a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/service/TopicService.java b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/service/TopicService.java
index ea1eb4c..3acbaf1 100644
--- a/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/service/TopicService.java
+++ b/components/datalake-handler/feeder/src/main/java/org/onap/datalake/feeder/service/TopicService.java
@@ -21,10 +21,17 @@
 package org.onap.datalake.feeder.service;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.Optional;
+import java.util.Set;
 
+import org.checkerframework.checker.units.qual.A;
 import org.onap.datalake.feeder.config.ApplicationConfiguration;
+import org.onap.datalake.feeder.controller.domain.TopicConfig;
+import org.onap.datalake.feeder.domain.Db;
 import org.onap.datalake.feeder.domain.Topic;
+import org.onap.datalake.feeder.repository.DbRepository;
 import org.onap.datalake.feeder.repository.TopicRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,6 +57,10 @@
 
 	@Autowired
 	private ElasticsearchService elasticsearchService;
+
+
+	@Autowired
+	private DbRepository dbRepository;
 	
 	public Topic getEffectiveTopic(String topicStr) {
 		try {
@@ -59,13 +70,14 @@
 		}
 		return null;
 	}
-		
+
 	//TODO caller should not modify the returned topic, maybe return a clone
 	public Topic getEffectiveTopic(String topicStr, boolean ensureTableExist) throws IOException {
 		Topic topic = getTopic(topicStr);
 		if (topic == null) {
 			topic = new Topic(topicStr);
-			topic.setDefaultTopic(getDefaultTopic());
+			topicRepository.save(topic);
+			//topic.setDefaultTopic(getDefaultTopic());
 		}
 		
 		if(ensureTableExist && topic.isEnabled() && topic.supportElasticsearch()) { 
@@ -89,4 +101,50 @@
 		}
 		return topic.getName().equals(config.getDefaultTopicName());
 	}
+
+	public void fillTopicConfiguration(TopicConfig tConfig, Topic wTopic)
+	{
+		fillTopic(tConfig, wTopic);
+	}
+
+	public Topic fillTopicConfiguration(TopicConfig tConfig)
+	{
+		Topic topic = new Topic();
+		fillTopic(tConfig, topic);
+		return topic;
+	}
+
+	private void fillTopic(TopicConfig tConfig, Topic topic)
+	{
+		Set<Db> relateDb = new HashSet<>();
+		topic.setName(tConfig.getName());
+		topic.setLogin(tConfig.getLogin());
+		topic.setPass(tConfig.getPassword());
+		topic.setEnabled(tConfig.isEnable());
+		topic.setSaveRaw(tConfig.isSave_raw());
+		topic.setTtl(tConfig.getTtl());
+		topic.setCorrelateClearedMessage(tConfig.isCorrelated_clearred_message());
+		topic.setDataFormat(tConfig.getData_format());
+		topic.setMessageIdPath(tConfig.getMessage_id_path());
+
+		if(tConfig.getSinkdbs() != null) {
+			for (String item : tConfig.getSinkdbs()) {
+				Db sinkdb = dbRepository.findByName(item);
+				if (sinkdb != null) {
+					relateDb.add(sinkdb);
+				}
+			}
+			if(relateDb.size() > 0)
+				topic.setDbs(relateDb);
+			else if(relateDb.size() == 0)
+			{
+				topic.getDbs().clear();
+			}
+		}else
+		{
+			topic.setDbs(relateDb);
+		}
+
+	}
+
 }
diff --git a/components/datalake-handler/feeder/src/test/java/org/onap/datalake/feeder/controller/TopicControllerTest.java b/components/datalake-handler/feeder/src/test/java/org/onap/datalake/feeder/controller/TopicControllerTest.java
index a770f50..775bcc3 100644
--- a/components/datalake-handler/feeder/src/test/java/org/onap/datalake/feeder/controller/TopicControllerTest.java
+++ b/components/datalake-handler/feeder/src/test/java/org/onap/datalake/feeder/controller/TopicControllerTest.java
@@ -27,6 +27,8 @@
 import org.mockito.MockitoAnnotations;
 import org.mockito.junit.MockitoJUnitRunner;
 import org.onap.datalake.feeder.config.ApplicationConfiguration;
+import org.onap.datalake.feeder.controller.domain.PostReturnBody;
+import org.onap.datalake.feeder.controller.domain.TopicConfig;
 import org.onap.datalake.feeder.domain.Db;
 import org.onap.datalake.feeder.domain.Topic;
 import org.onap.datalake.feeder.repository.TopicRepository;
@@ -61,6 +63,10 @@
     @Mock
     private TopicRepository topicRepository;
 
+    @Mock
+
+    private TopicService topicServiceMock;
+
     @InjectMocks
     private TopicService topicService1;
 
@@ -95,79 +101,51 @@
     }
 
     @Test
+    public void testListTopic() throws IOException, NoSuchFieldException, IllegalAccessException{
+        TopicController topicController = new TopicController();
+        setAccessPrivateFields(topicController);
+    }
+
+    @Test
     public void testCreateTopic() throws IOException, NoSuchFieldException, IllegalAccessException {
         TopicController topicController = new TopicController();
         setAccessPrivateFields(topicController);
-        when(topicRepository.findById(DEFAULT_TOPIC_NAME)).thenReturn(Optional.of(new Topic(DEFAULT_TOPIC_NAME)));
-        when(config.getDefaultTopicName()).thenReturn(DEFAULT_TOPIC_NAME);
-        Topic topicName = topicController.createTopic(new Topic("a"), mockBindingResult, httpServletResponse);
-        assertEquals(new Topic("a"), topicName);
+        //when(topicRepository.findById("ab")).thenReturn(Optional.of(new Topic("ab")));
+       // when(config.getDefaultTopicName()).thenReturn(DEFAULT_TOPIC_NAME);
+        PostReturnBody<TopicConfig> postTopic = topicController.createTopic(new TopicConfig(), mockBindingResult, httpServletResponse);
+        assertEquals(postTopic.getStatusCode(), 200);
         when(mockBindingResult.hasErrors()).thenReturn(true);
-        topicName = topicController.createTopic(new Topic("a"), mockBindingResult, httpServletResponse);
-        assertEquals(null, topicName);
+        PostReturnBody<TopicConfig> topicConfig= topicController.createTopic(new TopicConfig(), mockBindingResult, httpServletResponse);
+        assertEquals(null, topicConfig);
         when(mockBindingResult.hasErrors()).thenReturn(false);
-        Topic a = new Topic("a");
-        a.setName("a");
-        when(topicRepository.findById("a")).thenReturn(Optional.of(a));
-        topicName = topicController.createTopic(new Topic("a"), mockBindingResult, httpServletResponse);
-        assertEquals(null, topicName);
+        TopicConfig a = new TopicConfig();
+        a.setName(DEFAULT_TOPIC_NAME);
+        when(topicRepository.findById(DEFAULT_TOPIC_NAME)).thenReturn(Optional.of(new Topic(DEFAULT_TOPIC_NAME)));
+        PostReturnBody<TopicConfig> postTopic2= topicController.createTopic(a, mockBindingResult, httpServletResponse);
+        assertEquals(null, postTopic2);
     }
 
     @Test
     public void testUpdateTopic() throws IOException, NoSuchFieldException, IllegalAccessException {
         TopicController topicController = new TopicController();
         setAccessPrivateFields(topicController);
-        Topic topicName = topicController.updateTopic(new Topic("a"), mockBindingResult, httpServletResponse);
-        assertEquals(null, topicName);
+        PostReturnBody<TopicConfig> postTopic = topicController.updateTopic("a", new TopicConfig(), mockBindingResult, httpServletResponse);
+        assertEquals(null, postTopic);
         Topic a = new Topic("a");
         a.setName("a");
         when(topicRepository.findById("a")).thenReturn(Optional.of(a));
-        topicName = topicController.updateTopic(new Topic("a"), mockBindingResult, httpServletResponse);
-        assertEquals(new Topic("a"), topicName);
+        TopicConfig ac = new TopicConfig();
+        ac.setName("a");
+        ac.setEnable(true);
+        PostReturnBody<TopicConfig> postConfig1 = topicController.updateTopic("a", ac, mockBindingResult, httpServletResponse);
+        assertEquals(200, postConfig1.getStatusCode());
+        TopicConfig ret = postConfig1.getReturnBody();
+        assertEquals("a", ret.getName());
+        assertEquals(true, ret.isEnable());
         when(mockBindingResult.hasErrors()).thenReturn(true);
-        topicName = topicController.updateTopic(new Topic("a"), mockBindingResult, httpServletResponse);
-        assertEquals(null, topicName);
+        PostReturnBody<TopicConfig> postConfig2 = topicController.updateTopic("a", ac, mockBindingResult, httpServletResponse);
+        assertEquals(null, postConfig2);
 
-        ArrayList<Topic> topics = new ArrayList<>();
-        topics.add(a);
-        when(topicRepository.findAll()).thenReturn(topics);
-        Iterable<Topic> list = topicController.list();
-        for (Topic newTopic : list) {
-            assertEquals(a, newTopic);
-        }
-    }
-
-    @Test
-    public void testAddDb() throws NoSuchFieldException, IllegalAccessException, IOException {
-        TopicController topicController = new TopicController();
-        setAccessPrivateFields(topicController);
-        String dbName = "Elecsticsearch";
-        String name = "a";
-        Topic topic = new Topic(name);
-        topic.setEnabled(true);
-        Set<Db> dbSet = new HashSet<>();
-        dbSet.add(new Db(dbName));
-        topic.setDbs(dbSet);
-
-        when(topicRepository.findById(name)).thenReturn(Optional.of(topic));
-        topicController.addDb("a", dbName, httpServletResponse);
-        topicController.deleteDb("a", dbName, httpServletResponse);
-    }
-
-    @Test
-    public void testGetTopicDbs() throws NoSuchFieldException, IllegalAccessException, IOException {
-        TopicController topicController = new TopicController();
-        setAccessPrivateFields(topicController);
-        String dbName = "Elecsticsearch";
-        String name = "a";
-        Topic topic = new Topic(name);
-        topic.setEnabled(true);
-        Set<Db> dbSet = new HashSet<>();
-        dbSet.add(new Db(dbName));
-        topic.setDbs(dbSet);
-
-        when(topicRepository.findById(name)).thenReturn(Optional.of(topic));
-        topicController.getTopicDbs("a");
     }
 
     @Test
diff --git a/components/datalake-handler/feeder/src/test/java/org/onap/datalake/feeder/domain/TopicTest.java b/components/datalake-handler/feeder/src/test/java/org/onap/datalake/feeder/domain/TopicTest.java
index 8be45d6..b583473 100644
--- a/components/datalake-handler/feeder/src/test/java/org/onap/datalake/feeder/domain/TopicTest.java
+++ b/components/datalake-handler/feeder/src/test/java/org/onap/datalake/feeder/domain/TopicTest.java
@@ -69,19 +69,16 @@
 
         Topic defaultTopic = new Topic("_DL_DEFAULT_");
         Topic testTopic = new Topic("test");
-        testTopic.setDefaultTopic(defaultTopic);
 
         assertEquals(3650, testTopic.getTtl());
         defaultTopic.setTtl(20);
-        assertEquals(20, testTopic.getTtl());
-        topic.setDefaultTopic(new Topic("defaultTopic"));
+        assertEquals(20, defaultTopic.getTtl());
         topic.setLogin("root");
         topic.setPass("root123");
         topic.setEnabled(true);
         topic.setSaveRaw(true);
         topic.setCorrelateClearedMessage(true);
         topic.setMessageIdPath("/data/data2/value");
-        assertTrue("defaultTopic".equals(topic.getDefaultTopic().toString()));
         assertTrue("root".equals(topic.getLogin()));
         assertTrue("root123".equals(topic.getPass()));
         assertFalse("true".equals(topic.getEnabled()));
@@ -96,14 +93,13 @@
     public void testIs() {
         Topic defaultTopic = new Topic("_DL_DEFAULT_");
         Topic testTopic = new Topic("test");
-        testTopic.setDefaultTopic(defaultTopic);
 
         assertTrue(testTopic.equals(new Topic("test")));
         assertEquals(testTopic.hashCode(), (new Topic("test")).hashCode());
 
         defaultTopic.setDbs(new HashSet<>());
         defaultTopic.getDbs().add(new Db("Elasticsearch"));
-        assertTrue(testTopic.supportElasticsearch());
+        assertTrue(defaultTopic.supportElasticsearch());
         assertFalse(testTopic.supportCouchbase());
         assertFalse(testTopic.supportDruid());
         assertFalse(testTopic.supportMongoDB());
@@ -116,9 +112,9 @@
         defaultTopic.setDataFormat("XML");
         defaultTopic.setEnabled(true);
         defaultTopic.setSaveRaw(true);
-        assertTrue(testTopic.isCorrelateClearedMessage());
-        assertTrue(testTopic.isEnabled());
-        assertTrue(testTopic.isSaveRaw());
+        assertTrue(defaultTopic.isCorrelateClearedMessage());
+        assertTrue(defaultTopic.isEnabled());
+        assertTrue(defaultTopic.isSaveRaw());
 
         assertEquals(defaultTopic.getDataFormat(), DataFormat.XML);
 
diff --git a/components/datalake-handler/feeder/src/test/java/org/onap/datalake/feeder/service/TopicServiceTest.java b/components/datalake-handler/feeder/src/test/java/org/onap/datalake/feeder/service/TopicServiceTest.java
index 99f2239..8b25ec5 100644
--- a/components/datalake-handler/feeder/src/test/java/org/onap/datalake/feeder/service/TopicServiceTest.java
+++ b/components/datalake-handler/feeder/src/test/java/org/onap/datalake/feeder/service/TopicServiceTest.java
@@ -79,13 +79,6 @@
 		assertNull(topicService.getTopic(name));
 	}
 
-	@Test
-	public void testGetDefaultTopic() {
-		when(topicRepository.findById(DEFAULT_TOPIC_NAME)).thenReturn(Optional.of(new Topic(DEFAULT_TOPIC_NAME)));
-		when(config.getDefaultTopicName()).thenReturn(DEFAULT_TOPIC_NAME);
-		assertEquals(topicService.getDefaultTopic(), new Topic(DEFAULT_TOPIC_NAME));
-		assertTrue(topicService.istDefaultTopic(new Topic(DEFAULT_TOPIC_NAME)));
-	}
 
 	@Test(expected = IOException.class)
 	public void testGetEffectiveTopic() throws IOException {