diff --git a/.gitignore b/.gitignore index cd735ac33958271dab56a2cb5af864401b4f6ecb..2dc5300c2337379329a657033bc9fba2854e782b 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ /tmp /explorviz-ui-backend /explorviz-ui-frontend +/explorviz-backend-plugin-example explorviz-builds.zip # dependencies diff --git a/app.js b/app.js index 485a3e4f7d77b3d1b6d4b7c8b9e2f5cc7429d486..b8911bd09864297e95b7dbf0c75add1892badc7e 100644 --- a/app.js +++ b/app.js @@ -1,52 +1,52 @@ - var express = require('express'); - var bodyParser = require('body-parser'); +var express = require('express'); +var bodyParser = require('body-parser'); - var exec = require('child_process').exec; - var execSync = require('child_process').execSync; - var fs = require('fs'); - var path = require('path'); - var fsReaddir = require('fs-readdir'); - var Zip = require('node-zip'); - var JSZip = require('jszip'); +var exec = require('child_process').exec; +var execSync = require('child_process').execSync; +var fs = require('fs'); +var path = require('path'); +var fsReaddir = require('fs-readdir'); +var Zip = require('node-zip'); +var JSZip = require('jszip'); - var exphbs = require('express-handlebars'); +var exphbs = require('express-handlebars'); - //initializer - var nanit = require('nanit'); - //load names of available download files - const downloadFiles = require('./downloadFiles.json'); - const downloadNames = Object.keys(downloadFiles); +//initializer +var initGitRepos = require('./initializers/gitRepos.js'); +//load names of available download files +const downloadFiles = require('./downloadFiles.json'); +const downloadNames = Object.keys(downloadFiles); - var app = express(); +//load functions for frontend and backend build +let backendFunctions = require('./backendFunctions.js'); +let frontendFunctions = require('./frontendFunctions.js'); +let zipFunctions = require('./zipFunctions.js'); - app.use(bodyParser.urlencoded({ - extended: true - })); - app.use(bodyParser.json()); +var app = express(); + +app.use(bodyParser.urlencoded({ + extended: true +})); +app.use(bodyParser.json()); //set handlebars as view engine app.engine('.hbs', exphbs({extname: '.hbs'})); app.set('view engine', '.hbs'); - //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; -// }; - -// }); + + //TODO clone the git repos: function initialize here (for better understanding) or in gitRepos.js defined? + //Clone the git repos initially for performance. + // function initialize(downloadFiles){ + // return initGitRepos.initBackend(downloadFiles).then(function(downloadFiles){ + // return initGitRepos.initBackendPlugins(downloadFiles).then(function(downloadFiles){ + // return initGitRepos.initFrontend(downloadFiles) + // }) + // }) + // }; + + //initGitRepos.initialize(downloadFiles); //routes app.get('/', function(req, res){ @@ -71,10 +71,7 @@ const promiseArray = [] const checkedFiles = req.query.checkedFiles.split(','); - // create a file to stream archive data to. - const zip = new JSZip(); - zip.file("README.txt", "text for README"); - + backendChecked = checkedFiles.find(function(file){ return file === 'explorviz-ui-backend'; @@ -83,117 +80,27 @@ if (backendChecked){ const fileName = backendChecked; - const downloadURL = downloadFiles[backendChecked]; - - - function backendClean(){ - console.log('in backendClean'); - return new Promise((resolve,reject)=>{ - exec('cd explorviz-ui-backend/plugins/net/explorviz/ && rm -rf plugins/*', (error, stdout,stderr)=>{ - if (error) { - reject(error); - return; - } - - console.log(stdout); - console.log(stderr); - - resolve(); - - }) - }) - } - - function backendPull(){ - console.log('in backendPull'); - 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(){ - console.log('in 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(); - } - - }) - - - } - - function backendBuild(){ - console.log('in 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() + return backendFunctions.backendClean(fileName).then(function(){ + return backendFunctions.backendPull(fileName).then(function(){ + return backendFunctions.backendInstallAddons(checkedFiles,downloadFiles).then(function(){ + return backendFunctions.backendBuild(fileName) }) }) + }).catch(function(error){ + let response = + 'There was an error during your backend build. ' + + 'Please contact "explorviz-developers-request@listserv.dfn.de" ' + + 'and add the following information: ' + error; + res.send(response); + }) } promiseArray.push(backendAll()); - console.log('promiseArray:', promiseArray); - finalizeZip(); + console.log('promiseArray in backendChecked:', promiseArray); + finalizeZip(promiseArray); } @@ -205,123 +112,45 @@ const fileName = frontendChecked; const downloadURL = downloadFiles[frontendChecked]; - function frontendPull(){ - - return new Promise((resolve, reject) => { - console.log('in frontendPull()'); - //' 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) - return; - } - - console.log(stdout); - console.log(stderr); - resolve(); - }); - }) - } - - function frontendInstallAddons(){ - console.log('in frontendInstallAddons()'); - return new Promise((resolve, reject) => { - - checkedPlugins = checkedFiles.filter(function(file){ - return /\bexplorviz-frontend-plugin-\w*/.exec(file); - }); - - if(checkedPlugins.length !== 0 ){ - - checkedPlugins.forEach((pluginName) => { - exec('cd ' + ' explorviz-ui-frontend ' + ' ember install ' + downloadFiles[pluginName], (error, stdout, stderr) => { - - if (error) { - reject(error); - return; - } - - console.log(stdout); - console.log(stderr); - - resolve(); - - }); - - }) - } else { - resolve(); - } - - }) - } - - function frontendBuild(){ - - return new Promise((resolve,reject)=> { - console.log('in frontendBuild()'); - - - exec('cd ' + fileName +' && ember build --environment=production', (error, stdout, stderr) => { - - if (error) { - reject(error); - return; - } - - console.log(stdout); - console.log(stderr); - - resolve({zipFileName:'frontend', path:'./explorviz-ui-frontend/dist/'}); - }); - - - - }) - console.log('resolve build:', resolve); - } - function frontendAll() { - - return frontendPull().then(function(){ - return frontendInstallAddons().then(function(){ - return frontendBuild() + return frontendFunctions.frontendClean(fileName).then(function(){ + return frontendFunctions.frontendPull(fileName).then(function(){ + return frontendFunctions.frontendInstallAddons(checkedFiles, downloadFiles).then(function(){ + return frontendFunctions.frontendBuild(fileName) + }) }) + }).catch(function(error){ + let response = + 'There was an error during your frontend build. ' + + 'Please contact "explorviz-developers-request@listserv.dfn.de" ' + + 'and add the following information: ' + error; + res.send(response); + }) } //frontend was selected and the next step (streaming to zip) has to wait until the frontend is built promiseArray.push(frontendAll()); -finalizeZip(); +finalizeZip(promiseArray); }; +//TODO put all zip-things in zipFunctions.js; +//problem: createZip has to know the res from /download-route and if just the other functions will be exported, the zip has to be passed to createZip with resolve() +// create a file to stream archive data to. +const zip = new JSZip(); +zip.file("README.txt", "text for README"); -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(){ +function streamFilesToZip(promiseArray){ console.log('in streamFilesToZip'); return new Promise((resolve,reject)=> { - console.log('promiseArray:', promiseArray); + console.log('promiseArray in streamFilesToZip before Promise.all:', promiseArray); Promise.all(promiseArray).then(files => { - console.log('in Promise.all'); + console.log('in Promise.all, files:', files); let finishedArray=[]; files.forEach(file => { if (file.zipFileName === 'backend.war'){ - console.log('in backend.war'); fs.readFileAsync = function(filePath){ return new Promise(function (resolve, reject) { @@ -336,13 +165,14 @@ function streamFilesToZip(){ }); } + function addBackendToZip(data){ return new Promise(function(resolve,reject){ zip.file(file.zipFileName, data); resolve(); }) } - + console.log('in backend.war'); backendContent = fs.readFileAsync(file.path); backendContent.then(function(data){ @@ -353,6 +183,7 @@ function streamFilesToZip(){ }) if(finishedArray.length === files.length){ + console.log('before resolve() in backend.war'); resolve(); } @@ -375,7 +206,6 @@ function streamFilesToZip(){ resolve(); } }) - console.log('frontendStream:', frontendStream); } @@ -389,6 +219,19 @@ function streamFilesToZip(){ }) }; +function finalizeZip(promiseArray){ + + return streamFilesToZip(promiseArray).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 createZip(){ console.log('in createZip'); @@ -406,11 +249,8 @@ function createZip(){ } - - - }); - app.listen(3000); - console.log("Downloader started on port 3000."); \ No newline at end of file +app.listen(3000); +console.log("Downloader started on port 3000."); \ No newline at end of file diff --git a/backendFunctions.js b/backendFunctions.js new file mode 100644 index 0000000000000000000000000000000000000000..ec9ec54a73cf240019641fd446fd9e488eac73e8 --- /dev/null +++ b/backendFunctions.js @@ -0,0 +1,107 @@ +var express = require('express'); +var exec = require('child_process').exec; + +function backendClean(fileName){ + console.log('in backendClean'); + + return new Promise((resolve,reject)=>{ + exec('cd explorviz-ui-backend/plugins/net/explorviz/ && rm -rf plugins/*', (error, stdout,stderr)=>{ + + if (error) { + reject(error); + return; + } + + console.log(stdout); + console.log(stderr); + + resolve(fileName); + + }) + }) +} + +function backendPull(fileName){ + console.log('in backendPull'); + 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(checkedFiles,downloadFiles){ + console.log('in 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) => { + //TODO want to copy everything in backend-plugin except .git, workaround: ./demo/ + exec('cd '+ pluginName + ' git pull ' + ' && cp -R ' + ' ./demo/ '+' ../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(); + } + + }) + + +} +function backendBuild(fileName){ + console.log('in 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'}); + + + }) + + }) + + +} + +module.exports = { + backendClean, + backendPull, + backendInstallAddons, + backendBuild + + +} \ No newline at end of file diff --git a/frontendFunctions.js b/frontendFunctions.js new file mode 100644 index 0000000000000000000000000000000000000000..948c9cd7a733164b33f4b13bec0a15a17a7dbc3e --- /dev/null +++ b/frontendFunctions.js @@ -0,0 +1,106 @@ + let express = require('express'); + let exec = require('child_process').exec; + + function frontendClean(fileName){ + return new Promise((resolve, reject) => { + console.log('in frontendClean()'); + //' git fetch origin && git reset --hard origin/master ' + exec('cd ' + fileName + ' git checkout package.json && npm prune ', (error, stdout, stderr) => { + + if (error) { + reject(error) + return; + } + + console.log(stdout); + console.log(stderr); + resolve(); + }); + }) + + } + + + function frontendPull(fileName){ + + return new Promise((resolve, reject) => { + console.log('in frontendPull()'); + //' 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) + return; + } + + console.log(stdout); + console.log(stderr); + resolve(); + }); + }) + } + + function frontendInstallAddons(checkedFiles, downloadFiles){ + console.log('in frontendInstallAddons()'); + return new Promise((resolve, reject) => { + + checkedPlugins = checkedFiles.filter(function(file){ + return /\bexplorviz-frontend-plugin-\w*/.exec(file); + }); + + if(checkedPlugins.length !== 0 ){ + + checkedPlugins.forEach((pluginName) => { + exec('cd ' + ' explorviz-ui-frontend ' + ' ember install ' + downloadFiles[pluginName], (error, stdout, stderr) => { + + if (error) { + reject(error); + return; + } + + console.log(stdout); + console.log(stderr); + + resolve(); + + }); + + }) + } else { + resolve(); + } + + }) + } + + function frontendBuild(fileName){ + + return new Promise((resolve,reject)=> { + console.log('in frontendBuild()'); + + + exec('cd ' + fileName +' && ember build --environment=production', (error, stdout, stderr) => { + + if (error) { + reject(error); + return; + } + + console.log(stdout); + console.log(stderr); + + resolve({zipFileName:'frontend', path:'./explorviz-ui-frontend/dist/'}); + }); + + + + }) + console.log('resolve build:', resolve); + } + + module.exports = { + frontendClean, + frontendPull, + frontendInstallAddons, + frontendBuild + } diff --git a/initializers/gitRepos.js b/initializers/gitRepos.js index 25380fca30b47c72ba7cf7ed8d8b860b9ecad06e..1f35ed391c9cafe9c2cfc3787514d2ef33e15fd3 100644 --- a/initializers/gitRepos.js +++ b/initializers/gitRepos.js @@ -1,37 +1,102 @@ var express = require('express'); var exec = require('child_process').exec; + //Clone the git repos initially for performance. + function initialize(downloadFiles){ + return initBackend(downloadFiles).then(function(downloadFiles){ + return initBackendPlugins(downloadFiles).then(function(downloadFiles){ + return initFrontend(downloadFiles) + }) + }) + }; -//Clone the git repos initially for performance. -//TODO error handling is not working properly, error returned is not in var error, but in req -function initGitRepos(downloadFiles, next){ + +function initBackend(downloadFiles){ const backendName= 'explorviz-ui-backend'; - const downloadBackend= downloadFiles[backendName]; -exec('git clone ' + downloadBackend, (error, stdout, stderr) => { - - if (error) { - console.log('initGitRepos: backendFailed'); - return next(error); - } - - console.log(stdout); - console.log(stderr); -}); + const downloadBackendURL = downloadFiles[backendName]; + + return new Promise((resolve,reject)=>{ + exec('git clone ' + downloadBackendURL + ' '+ backendName, (error, stdout, stderr) => { + + if (error) { + console.log('initGitRepos: backendFailed ->', error); + reject(error); + return; + } + + console.log(stdout); + console.log(stderr); + }); + resolve(downloadFiles); + + }); +} + +function initBackendPlugins(downloadFiles){ + downloadNames = Object.keys(downloadFiles); - const frontendName='explorviz-ui-frontend'; - const downloadFrontend= downloadFiles[frontendName]; - exec('git clone ' + downloadFrontend + ' ' + frontendName + ' && cd '+ frontendName + ' && npm install', (error, stdout, stderr) => { - - if (error) { - console.log('initGitRepos: frontendFailed'); - return next(error); - } + const backendPlugins = downloadNames.filter(function(file){ + return /\bexplorviz-backend-plugin-\w*/.exec(file); + }); + + return new Promise((resolve, reject) => { + if(backendPlugins.length !== 0 ){ + + backendPlugins.forEach((pluginName) => { + exec('git clone ' + downloadFiles[pluginName], (error, stdout, stderr) => { + + if (error) { + reject(error); + return; + } + + console.log(stdout); + console.log(stderr); + + resolve(downloadFiles); - console.log(stdout); - console.log(stderr); -}); + }); + }) + } else { + resolve(downloadFiles); + } + +}) + + + +} + +function initFrontend(downloadFiles){ + + return new Promise((resolve,reject)=>{ + + const frontendName ='explorviz-ui-frontend'; + const downloadFrontendURL = downloadFiles[frontendName]; + exec('git clone ' + downloadFrontendURL + ' ' + frontendName + ' && cd '+ frontendName + ' && npm install', (error, stdout, stderr) => { + + if (error) { + console.log('initGitRepos: frontendFailed ->', error); + reject(error); + return; + } + + console.log(stdout); + console.log(stderr); + }); + resolve(); + + }) -next(); }; -module.exports = initGitRepos; \ No newline at end of file + + +// module.exports = { +// initBackend, +// initBackendPlugins, +// initFrontend +// } +module.exports = { + initialize +} \ No newline at end of file diff --git a/package.json b/package.json index c1386eab031fcd9f33c3a19fb510bdd77a24efbc..8f08ffd0020dd951ed998c3cd81ac2a10580a39c 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,6 @@ "fs": "0.0.1-security", "fs-readdir": "0.0.3", "jszip": "^3.1.3", - "nanit": "^0.3.1", "node-zip": "^1.1.1", "path": "^0.12.7" },