From ba6763e3d240edfed1c5f3a066d8b6d70edccde1 Mon Sep 17 00:00:00 2001
From: jweg <jweg@informatik.uni-kiel.de>
Date: Fri, 7 Jul 2017 15:00:26 +0200
Subject: [PATCH] work in progress: part of downloader for backend

---
 app.js | 280 +++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 185 insertions(+), 95 deletions(-)

diff --git a/app.js b/app.js
index 4f38493..58f929d 100644
--- a/app.js
+++ b/app.js
@@ -31,22 +31,22 @@
 	//initialize the git repos
 	//TODO error handling is not working properly, error returned is not in let error, but in req + req and res are undefined!
 	//TODO add spinner for telling user to wait until initialization is done
-	nanit.initialize(downloadFiles, function(req,res,err){
-	// console.log('err in nanit.initialize:', err);
-	// console.log('req in nanit.initialize:', req);
-	// console.log('res in nanit.initialize:', res);
-
-	let response = 
-	          'There was an error during cloning the git repositories. ' +
-	          'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
-	          'and add the following information: ' + req;
-		if(err){
-			console.log('nanit.initialize error');
-			res.send(response);
-			return;
-		};
-
-	});
+// 	nanit.initialize(downloadFiles, function(req,res,err){
+// 	// console.log('err in nanit.initialize:', err);
+// 	// console.log('req in nanit.initialize:', req);
+// 	// console.log('res in nanit.initialize:', res);
+
+// 	let response = 
+// 	'There was an error during cloning the git repositories. ' +
+// 	'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
+// 	'and add the following information: ' + req;
+// 	if(err){
+// 		console.log('nanit.initialize error');
+// 		res.send(response);
+// 		return;
+// 	};
+
+// });
 
 	//routes
 	app.get('/', function(req, res){
@@ -67,6 +67,7 @@
 
 
 	app.get('/download', function(req, res){
+		//holds promises for backend and/or frontend
 		const promiseArray = []
 		const checkedFiles = req.query.checkedFiles.split(',');
 
@@ -84,25 +85,113 @@
 		const fileName = backendChecked;
 		const downloadURL = downloadFiles[backendChecked]; 
 
-		const backendPromise = new Promise((resolve, reject)=> {
 
-			exec('git pull ' + ' && cd ' + fileName + ' && mvn compile war:war ', (error, stdout, stderr) => {
+		function backendClean(){
+			return new Promise((resolve,reject)=>{
+				exec('cd explorviz-ui-backend/plugins/net/explorviz/plugins/ && rm *', (error, stdout,stderr)=>{
+					if (error) {
+						reject(error);
+						return;
+					}
+
+					console.log(stdout);
+					console.log(stderr);
+
+					resolve();
+
+				})
+			})
+		}
+
+		function backendPull(){
 
-				if (error) {
-					reject(error);
-					return;
+			return new Promise((resolve, reject)=> {
+
+				exec('cd ' + fileName + 'git pull ', (error, stdout, stderr) => {
+
+					if (error) {
+						reject(error);
+						return;
+					}
+
+					console.log(stdout);
+					console.log(stderr);
+
+					resolve();
+
+				}); 
+			})
+			
+		}
+
+		function backendInstallAddons(){
+			return new Promise((resolve, reject)=>{
+				checkedPlugins = checkedFiles.filter(function(file){
+					return /\bexplorviz-backend-plugin-\w*/.exec(file);
+				});
+
+				if(checkedPlugins.length !== 0 ){
+
+					checkedPlugins.forEach((pluginName) => {
+						exec('git clone ' + downloadFiles[pluginName] + 'cd ' + pluginName + 'cp -r . explorviz-ui-backend/plugins/net/explorviz/plugins/', (error, stdout, stderr) => { //'cd explorviz-ui-backend/plugins/net/explorviz/plugins/ ' + 
+							
+							if (error) {
+								reject(error);
+								return;
+							}
+
+							console.log(stdout);
+							console.log(stderr);
+							
+							resolve();
+
+						});
+
+					})
+				} else {
+					resolve();
 				}
 
-				console.log(stdout);
-				console.log(stderr);
+			})
 
-				resolve({zipFileName:'backend.war', path:'explorviz-ui-backend/target/explorviz-ui-backend-1.0-SNAPSHOT.war'});
 
-			}); 
-		})
+		}
 
-		promiseArray.push(backendPromise);
-			} 
+		function backendBuild(){
+			return new Promise((resolve,reject)=>{
+				exec('cd '+ fileName + ' && mvn compile war:war ', (error,stdout,stderr)=> {
+					if (error) {
+						reject(error);
+						return;
+					}
+
+					console.log(stdout);
+					console.log(stderr);
+					resolve({zipFileName:'backend.war', path:'explorviz-ui-backend/target/explorviz-ui-backend-1.0-SNAPSHOT.war'});
+
+
+				})
+
+			})
+
+
+		}
+
+		function backendAll(){
+			return backendClean().then(function(){
+
+				return backendPull().then(function(){
+					return backendInstallAddons().then(function(){
+						return backendBuild()
+					})
+				})
+			})
+
+		}
+		promiseArray.push(backendAll());
+		finalizeZip();
+		
+	} 
 
 	frontendChecked = checkedFiles.find(function(file){
 		return file === 'explorviz-ui-frontend';
@@ -116,7 +205,8 @@
 
 			return new Promise((resolve, reject) => {
 				console.log('in frontendPull()');
-				exec('cd ' +  fileName + ' git pull ', (error, stdout, stderr) => {
+				//' git fetch origin && git reset --hard origin/master '
+				exec('cd ' +  fileName + ' git checkout package.json && npm prune ' +' && git pull ', (error, stdout, stderr) => {
 
 					if (error) {
 						reject(error)
@@ -168,23 +258,23 @@
 			return new Promise((resolve,reject)=> {
 				console.log('in frontendBuild()');
 
-	
-	exec('cd ' + fileName +' && ember build --environment=production', (error, stdout, stderr) => {
 
-		if (error) {
-			reject(error);
-			return;
-		}
+				exec('cd ' + fileName +' && ember build --environment=production', (error, stdout, stderr) => {
 
-		console.log(stdout);
-		console.log(stderr);
+					if (error) {
+						reject(error);
+						return;
+					}
 
-		resolve({zipFileName:'frontend', path:'./explorviz-ui-frontend/dist/'});
-	});
+					console.log(stdout);
+					console.log(stderr);
+
+					resolve({zipFileName:'frontend', path:'./explorviz-ui-frontend/dist/'});
+				});
 
 
 
-})
+			})
 		}
 
 		function frontendAll() {
@@ -195,95 +285,95 @@
 				})
 			})
 		}
+//frontend was selected and the next step (streaming to zip) has to wait until the frontend is built
+promiseArray.push(frontendAll());
+finalizeZip();
 
-		promiseArray.push(frontendAll());
-		finalizeZip();
-
-	};
+};
 
 
 
-	function finalizeZip(){
-		
-		return streamFilesToZip().then(function(){
-			return createZip()
-		}).catch(function(error) {let response = 
-			'There was an error during your build. ' +
-			'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
-			'and add the following information: ' + error;
-			res.send(response);
-		})
+function finalizeZip(){
+	
+	return streamFilesToZip().then(function(){
+		return createZip()
+	}).catch(function(error) {let response = 
+		'There was an error during your build. ' +
+		'Please contact "explorviz-developers-request@listserv.dfn.de" ' +
+		'and add the following information: ' + error;
+		res.send(response);
+	})
 
-	}
+}
 
-	function streamFilesToZip(){
-		console.log('in streamFilesToZip');
+function streamFilesToZip(){
+	console.log('in streamFilesToZip');
 
-		return new Promise((resolve,reject)=> {
-			
-			Promise.all(promiseArray).then(files => {
-				console.log('in Promise.all');
-				let finishedArray=[];
-				files.forEach(file => {
-					if (file.zipFileName === 'backend.war'){
-						const backendSteam = fsReaddir(file.path).on('data', function(data){
-							const backendReadStream = fs.createReadStream(data);
-							zip.file(zipFileName, backendReadStream);
-						}).on('error', function(){
-							console.log('error:', error);
-						}).on('finish', function(){
-							finishedArray.push('backend finished');
-							if(finishedArray.length === files.length){
-						resolve();
-					}
-						})
+	return new Promise((resolve,reject)=> {
+		
+		Promise.all(promiseArray).then(files => {
+			console.log('in Promise.all');
+			let finishedArray=[];
+			files.forEach(file => {
+				if (file.zipFileName === 'backend.war'){
+					const backendSteam = fsReaddir(file.path).on('data', function(data){
+						const backendReadStream = fs.createReadStream(data);
+						zip.file(zipFileName, backendReadStream);
+					}).on('error', function(){
+						console.log('error:', error);
+					}).on('finish', function(){
+						finishedArray.push('backend finished');
+						if(finishedArray.length === files.length){
+							resolve();
+						}
+					})
 
 						// backendStream = fs.createReadStream(file.path);
 						// zip.file(file.zipFileName, backendStream);
 						// finishedArray.push('backend done');
 					}
 					if(file.zipFileName === 'frontend'){
-						const stream = fsReaddir(file.path)
+						const frontendStream = fsReaddir(file.path)
 						.on('error', function(err) {
 							console.log('error:', err);
 						}).on('data', function(data){
 							for (let i=0; i<data.length; i++) {
-								const frontendStream = fs.createReadStream(data[i]);
-								zip.file(data[i], frontendStream);
+								const frontendReadsStream = fs.createReadStream(data[i]);
+								zip.file(data[i], frontendReadStream);
 							}
 
 						}).on('finish', function(){
 							finishedArray.push('frontend finished');
 							if(finishedArray.length === files.length){
-						resolve();
-					}
+								resolve();
+							}
 						})
 
 					}
-				
+
 					
 
 				})
 
-			})
-
-
 		})
-	};
 
-	function createZip(){
-		console.log('in createZip');
 
-		return new Promise((resolve,reject) => {
-			zip.generateNodeStream({type:'nodebuffer',streamFiles:true}).pipe(fs.createWriteStream('explorviz-builds.zip')).on('finish', function () {
-				console.log('explorviz-builds.zip written.');
-				res.download('explorviz-builds.zip');
-			}); 
-			
-		})
+	})
+};
 
+function createZip(){
+	console.log('in createZip');
+
+	return new Promise((resolve,reject) => {
+		zip.generateNodeStream({type:'nodebuffer',streamFiles:true}).pipe(fs.createWriteStream('explorviz-builds.zip')).on('finish', function () {
+			console.log('explorviz-builds.zip written.');
+			res.download('explorviz-builds.zip');
+		}); 
 		
-	}
+	})
+
+	
+}
 
 
 
-- 
GitLab