Merge "Edit Functional Menu is not working"
diff --git a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/controller/WidgetsCatalogController.java b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/controller/WidgetsCatalogController.java
index 1896a4f..e6c1c0a 100644
--- a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/controller/WidgetsCatalogController.java
+++ b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/controller/WidgetsCatalogController.java
@@ -163,13 +163,14 @@
 		try {
 			//check the zip file structure first
 			respond = storageService.checkZipFile(file);
+			logger.debug("Check file validity"+respond.isValid()+respond.getError());
 			if(respond.isValid()){
 				//update the widget catalog
 				WidgetCatalog newWidget = new ObjectMapper().readValue(widget, WidgetCatalog.class);
 				widgetCatalogService.updateWidgetCatalog(widgetId, newWidget);
 				logger.debug("WidgetsCatalogController.saveWidgetCatalog: updating widget with widgetId={}", widgetId);
 				//update the widget zip file
-				storageService.update(file, newWidget, widgetId);
+				storageService.updateJsFile(file, newWidget, widgetId);
 			}
 		} catch (Exception e) {
 			logger.error("Exception occurred while performing WidgetsCatalogController.saveWidgetCatalog in widget microservices. Details:", e);
diff --git a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/StorageService.java b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/StorageService.java
index fbd0f96..d8b5642 100644
--- a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/StorageService.java
+++ b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/StorageService.java
@@ -30,5 +30,7 @@
     
     void update(MultipartFile file, WidgetCatalog newWidget, long widgetId);
     
+    void updateJsFile(MultipartFile file, WidgetCatalog newWidget, long widgetId);
+    
 	byte[] getWidgetCatalogContent(long widgetId) throws Exception;
 }
diff --git a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/impl/StorageServiceImpl.java b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/impl/StorageServiceImpl.java
index 7a35ba4..3bb41b6 100644
--- a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/impl/StorageServiceImpl.java
+++ b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/impl/StorageServiceImpl.java
@@ -73,7 +73,7 @@
 		Criteria criteria = session.createCriteria(WidgetFile.class);
 		criteria.add(Restrictions.eq("widgetId", widgetId));
 		List<WidgetFile> widgetFiles = criteria.list();
-		session.flush();
+		//session.flush();
 		session.close();
 		if (widgetFiles.size() > 0)
 			widgetFile = widgetFiles.get(0);
@@ -148,7 +148,7 @@
 			logger.error("StorageServiceImpl.save: Failed to store file " + file.getOriginalFilename(), e);
 			throw new StorageException("Failed to store file " + file.getOriginalFilename(), e);
 		}
-		saveHelper(newWidget, widgetId, map);
+		saveJsHelper(newWidget, widgetId, map);
 	}
 
 	@Override
@@ -167,7 +167,7 @@
 			throw new StorageException("Failed to store file " + file.getName(), e);
 		}
 		
-		saveHelper(newWidget, widgetId, map);
+		saveJsHelper(newWidget, widgetId, map);
 	}
 
 	/**
@@ -259,6 +259,90 @@
 				widgetId);
 
 	}
+	
+	/**
+	 * Helper method to UnZip File
+	 * 
+	 * @param file
+	 */
+	private Map<String, byte[]> unZipFile(MultipartFile file) {
+		UnzipUtil unzipper = new UnzipUtil();
+		Map<String, byte[]> map;
+		File convFile;
+		try {
+			if (file.isEmpty()) {
+				logger.error("StorageServiceImpl.update: Failed to store empty file " + file.getOriginalFilename());
+				throw new StorageException("Failed to store empty file " + file.getOriginalFilename());
+			}
+			String fileLocation = file.getOriginalFilename();
+			logger.debug("StorageServiceImpl.update: store the widget to:" + fileLocation);
+			convFile = new File(fileLocation);
+			try(FileOutputStream fos = new FileOutputStream(convFile)){
+				fos.write(file.getBytes());
+			}
+			map = unzipper.unzip_db(fileLocation, ".", "tempWidgets");
+			convFile.delete();
+			return map;
+		} catch (IOException e) {
+			logger.error("StorageServiceImpl.update: Failed to store file " + file.getOriginalFilename(), e);
+			throw new StorageException("StorageServiceImpl.update: Failed to store file " + file.getOriginalFilename(),
+					e);
+		}
+	}
+	
+	/**
+	 * Helper method for saving widget file (controller.js) to ep_widget_catalog_files table in database
+	 * 
+	 * @param newWidget
+	 * @param widgetId
+	 * @param map
+	 */
+	private void saveJsHelper(WidgetCatalog newWidget, long widgetId, Map<String, byte[]> map) {
+
+		logger.debug("Going to save controller.js " + newWidget);
+		WidgetFile widgetFile = new WidgetFile();
+		widgetFile.setName(newWidget.getName());
+		widgetFile.setWidgetId(widgetId);
+		final byte[] controllerLoc = map.get(WidgetConstant.WIDGET_CONTROLLER_LOCATION);
+		if (controllerLoc == null || controllerLoc.length == 0)
+			throw new IllegalArgumentException(
+					"Map is missing required key " + WidgetConstant.WIDGET_CONTROLLER_LOCATION);
+		String javascript = new String(controllerLoc);
+
+		widgetFile.setController(javascript.getBytes());
+		Session session = sessionFactory.openSession();
+		session.save(widgetFile);
+		session.flush();
+		session.close();
+		logger.debug(
+				"StorageServiceImpl.save: saved controller.js file to the database for widget {}",
+				widgetId);
+
+	}
+	
+	@Override
+	public void updateJsFile(MultipartFile file, WidgetCatalog newWidget, long widgetId) {
+		Map<String, byte[]> map;
+		map = unZipFile(file);
+		//Get existing widget file from DB	
+		WidgetFile widgetFile = getWidgetFile(widgetId);
+		
+		String javascript = new String(map.get(WidgetConstant.WIDGET_CONTROLLER_LOCATION));
+		widgetFile.setController(javascript.getBytes());
+		Session session = sessionFactory.openSession();
+		Transaction tx = session.beginTransaction();
+		session.update(widgetFile);
+		tx.commit();
+		session.flush();
+		session.close();
+		logger.debug(
+				"StorageServiceImpl.save: updated controller.js file to the database for widget {}",
+				widgetId);
+	}
+	
+	
+	
+	
 
 	@Override
 	public void update(MultipartFile file, WidgetCatalog newWidget, long widgetId) {
@@ -424,53 +508,14 @@
 	public byte[] getWidgetCatalogContent(long widgetId) throws Exception {
 
 		WidgetCatalog widget = widgetCatalogService.getWidgetCatalog(widgetId);
-		String namespace = "Portal" + widgetId + "Widget";
-		String controllerName = "Portal" + widgetId + "Ctrl";
-		String cssName = "portal" + widgetId + "-css-ready";
-
-		String styles = getWidgetCSS(widgetId).replaceAll(cssName, widget.getName() + "-css-ready");
 		File f = File.createTempFile("temp", ".zip");
 		try(ZipOutputStream out = new ZipOutputStream(new FileOutputStream(f))){
-			ZipEntry e = new ZipEntry(widget.getName() + "/styles/styles.css");
-			out.putNextEntry(new ZipEntry(widget.getName() + "/"));
-			out.putNextEntry(new ZipEntry(widget.getName() + "/styles/"));
-			out.putNextEntry(e);
-			byte[] data = styles.getBytes();
-			out.write(data, 0, data.length);
+			String javascript = getWidgetController(widgetId);
 	
-			String widgetData = namespace + "=" + namespace + "||{};" + "var res = " + namespace + ".widgetData;";
-			String javascript = getWidgetController(widgetId).replace(widgetData, "").replace(namespace + ".controller =",
-					"");
-	
-			String functionHeader = javascript.substring(javascript.indexOf("function"), javascript.indexOf(")") + 1);
-			javascript = javascript.replaceFirst(controllerName, widget.getName() + "Ctrl");
-			String functionParam = functionHeader.substring(functionHeader.indexOf("(") + 1, functionHeader.indexOf(")"));
-			StringBuilder injectStr = new StringBuilder().append("[");
-			List<String> paramList = Arrays.asList(functionParam.split(","));
-			for (int i = 0; i < paramList.size(); i++) {
-				if (i == paramList.size() - 1)
-					injectStr.append("'" + paramList.get(i).trim() + "'];");
-				else
-					injectStr.append("'" + paramList.get(i).trim() + "',");
-			}
-			javascript = javascript.replace(";" + namespace + ".controller.$inject = " + injectStr.toString(), "");
-	
-			e = new ZipEntry(widget.getName() + "/js/controller.js");
+			ZipEntry e = new ZipEntry(widget.getName() + "/js/controller.js");
 			out.putNextEntry(new ZipEntry(widget.getName() + "/js/"));
 			out.putNextEntry(e);
-			data = javascript.getBytes();
-			out.write(data, 0, data.length);
-	
-			String html = getWidgetMarkup(widgetId).replaceFirst(controllerName, widget.getName() + "Ctrl");
-	
-			// new
-			// String(map.get(WidgetConstant.WIDGET_MARKUP_LOCATION)).replaceFirst(functionName,
-			// controllerName);;
-	
-			e = new ZipEntry(widget.getName() + "/markup/markup.html");
-			out.putNextEntry(new ZipEntry(widget.getName() + "/markup/"));
-			out.putNextEntry(e);
-			data = html.getBytes();
+			byte[] data = javascript.getBytes();
 			out.write(data, 0, data.length);
 			out.closeEntry();
 			byte[] result = Files.readAllBytes(Paths.get(f.getPath()));
diff --git a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/impl/WidgetCatalogServiceImpl.java b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/impl/WidgetCatalogServiceImpl.java
index f5558e2..76ca31a 100644
--- a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/impl/WidgetCatalogServiceImpl.java
+++ b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/service/impl/WidgetCatalogServiceImpl.java
@@ -148,9 +148,7 @@
 	@Override
 	public WidgetCatalog getWidgetCatalog(Long widgetCatalogId) {
 		Session session = sessionFactory.getCurrentSession();
-		Transaction tx = session.beginTransaction();
 		WidgetCatalog widget = (WidgetCatalog) session.get(WidgetCatalog.class, widgetCatalogId);
-		tx.commit();
 		logger.debug("WidgetCatalogServiceImpl.getWidgetCatalog: getting widget={}", widget);
 		return widget;
 	}
diff --git a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/utils/UnzipUtil.java b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/utils/UnzipUtil.java
index f20ed1b..164a698 100644
--- a/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/utils/UnzipUtil.java
+++ b/ecomp-portal-widget-ms/widget-ms/src/main/java/org/onap/portalapp/widget/utils/UnzipUtil.java
@@ -51,8 +51,7 @@
 			ZipEntry entry = zipIn.getNextEntry();
 			Map<String, byte[]> map = new HashMap<>();
 	
-			String[] requiredKeys = { WidgetConstant.WIDGET_CONTROLLER_LOCATION, WidgetConstant.WIDGET_MARKUP_LOCATION,
-					WidgetConstant.WIDGET_STYLE_LOCATION };
+			String[] requiredKeys = { WidgetConstant.WIDGET_CONTROLLER_LOCATION };
 			for (String k : requiredKeys)
 				map.put(k, null);
 	
diff --git a/portal-FE-common/src/app/layout/components/tabbar/tabbar.component.html b/portal-FE-common/src/app/layout/components/tabbar/tabbar.component.html
index 65ccf1d..db0b6af 100644
--- a/portal-FE-common/src/app/layout/components/tabbar/tabbar.component.html
+++ b/portal-FE-common/src/app/layout/components/tabbar/tabbar.component.html
@@ -35,6 +35,17 @@
 
   -->
 
+  <style>
+    .apps-tab {
+     position: absolute;
+     width: 100%;
+     height: 100%;
+     top: 100px;
+     left: 5px;
+     background-color: white;
+   }
+ </style>
+
   <div style="display: flex; flex-direction:column">
 
       <mat-tab-group [selectedIndex]="selected.value" (selectedIndexChange)="selected.setValue($event)"
@@ -79,19 +90,15 @@
 
       </mat-tab-group>
 
-
-
-
-
-        <div *ngFor="let tab of tabs; let index = index"
-          [style.display]='tab.active? "inline" : "none"'
-          [style.position]='tab.active? "static" : "absolute"'
-          [style.height]='tab.active? "calc(100vh)" : "calc(0vh)"'>
-
-          <iframe id="tabframe-{{tab.label.split(' ').join('-')}}-{{index}}" scrolling='yes' frameBorder='0' width='100%'
-            scrolling='yes' frameBorder='0' width='100%' height='90%' [src]='tab.url'></iframe>
-
-        </div>
-
-
-    </div>
+      <div class="apps-tab" *ngFor="let tab of tabs; let index = index"
+          [style.display]='"inline"'
+          [style.position]='"absolute"'
+          [style.height]='"calc(100vh)"'
+          [style.z-index]="tab.active? 1 : 0"
+          [style.opacity]="tab.active? 1 : 0"
+      >
+          <iframe id="tabframe-{{tab.label.split(' ').join('-')}}-{{index}}" scrolling='yes' frameBorder='0'
+            scrolling='yes' frameBorder='0' width='100%' height='90%' [src]='tab.url'>
+          </iframe>
+      </div>
+</div>