jmms
Version:
Jmms cli tools, Jmms is a java meta-micro-service framework
152 lines (144 loc) • 6.23 kB
JavaScript
const log = require('../log');
const fs = require('fs');
const jszip = require("jszip/lib");
const mvn = require('maven').create();
const shelljs = require('shelljs');
const tmp = require('tmp');
const cheerio = require('cheerio')
const formatString = require('string-format')
const pd = require('pretty-data').pd
const BaseGenerator = require('../base');
let installJar = (filePath) => {
return new Promise((resolve, reject) => {
fs.readFile(filePath, function(err, data) {
if (err) {
reject(err);
} else {
jszip.loadAsync(data).then(function (zip) {
Object.keys(zip.files).forEach(function (filename) {
var file = zip.file(filename);
if (filename.startsWith("META-INF/maven/") && filename.endsWith("/pom.xml")) {
let pomFile = tmp.fileSync({postfix: ".pom"});
file.nodeStream().pipe(fs.createWriteStream(pomFile.name)).on('finish', function () {
mvn.execute("install:install-file", {file: filePath, pomFile: pomFile.name})
.then(() => {
pomFile.removeCallback();
resolve();
})
.catch((err) => {
pomFile.removeCallback();
reject(err);
});
});
}
});
}).catch ((err) => {
reject(err);
});
}
});
});
};
let addDependencyToPomFile = (pomFile, groupId, artifactId, version) => {
return new Promise((resolve, reject) => {
fs.exists(pomFile, (exists) => {
if (exists) {
fs.readFile(pomFile, "utf-8", (err, xml) => {
if (err) {
reject(err);
} else {
let $ = cheerio.load(xml, { xmlMode: true });
let project = $("project");
if (project.length != 1) {
reject("Illegal pom file format, project element not found.");
return;
}
let dependencies = project.find("> dependencies");
if (dependencies.length <= 0) {
$("<dependencies />").appendTo(project);
dependencies = project.children().last();
}
let dependency = null;
dependencies.find("> dependency").each((index, it) => {
if ($(it).find("> groupId").text() == groupId && $(it).find("> artifactId").text() == artifactId) {
dependency = $(it);
}
});
if (dependency) {
let versionEl = dependency.find("> version");
if (versionEl.length > 0) {
versionEl.text(version);
} else {
dependency.append(formatString("<version>{}</version>", version));
}
} else {
dependencies.append(formatString("<dependency><groupId>{}</groupId><artifactId>{}</artifactId><version>{}</version></dependency>", groupId, artifactId, version));
}
pd.step = ' '
fs.writeFile(pomFile, pd.xml($.xml()), (err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
}
});
} else {
reject("./pom.xml file not exists");
}
});
});
}
module.exports = class extends BaseGenerator {
constructor(args, opts) {
super(args, opts);
}
prompting () {
let packageName = this.args[0];
let cli = "npm install " + packageName;
if (this.options.save) {
cli = cli.concat(" --save");
}
if (shelljs.exec(cli).code !== 0) {
process.exit(1);
}
let jarsDir = "./node_modules/" + packageName + "/jars";
let installJars = [];
if (fs.existsSync(jarsDir)) {
let jarFiles = fs.readdirSync(jarsDir);
jarFiles.forEach(filename => {
if (filename.endsWith(".jar")) {
installJars.push(installJar(jarsDir + "/" + filename));
}
});
}
Promise.all(installJars).catch(() => {
process.exit(1);
}).then(() => {
let pomFile = "./node_modules/" + packageName + "/pom.xml";
if (fs.existsSync(pomFile)) {
let groupId = null;
let artifactId = null;
let version = null;
fs.readFile(pomFile, "utf-8", (err, xml) => {
if (err) {
log.error(err);
} else {
let $ = cheerio.load(xml);
groupId = $("project > groupId").text();
artifactId = $("project > artifactId").text();
version = $("project > version").text();
if (groupId && artifactId && version) {
addDependencyToPomFile("./pom.xml", groupId, artifactId, version).catch(err => {
process.exit(1);
}).then(() => {
process.exit(0);
});
}
}
});
}
});
}
}