@Override
public Plan getDeploymentPlan(IFileStore contentLocation, ManifestParseTree manifest) {
/* a present package.json file determines a node.js application */
IFileStore packageStore = contentLocation.getChild(NodeJSConstants.PACKAGE_JSON);
if (!packageStore.fetchInfo().exists())
return null;
/* do not support multi-aplication manifests */
if (manifest != null && ManifestUtils.hasMultipleApplications(manifest))
return null;
try {
if (manifest == null)
manifest = ManifestUtils.createBoilerplate(getApplicationName(contentLocation));
ManifestParseTree application = manifest.get(ManifestConstants.APPLICATIONS).get(0);
String defaultName = getApplicationName(contentLocation);
set(application, ManifestConstants.NAME, defaultName);
set(application, ManifestConstants.HOST, ManifestUtils.slugify(defaultName));
set(application, ManifestConstants.MEMORY, ManifestUtils.DEFAULT_MEMORY);
set(application, ManifestConstants.INSTANCES, ManifestUtils.DEFAULT_INSTANCES);
set(application, ManifestConstants.PATH, ManifestUtils.DEFAULT_PATH);
/* node.js application require a start command */
if (application.has(ManifestConstants.COMMAND))
return new Plan(getId(), getWizardId(), TYPE, manifest);
InputStream is = null;
try {
is = packageStore.openInputStream(EFS.NONE, null);
JSONObject packageJSON = new JSONObject(new JSONTokener(new InputStreamReader(is)));
if (packageJSON.has(NodeJSConstants.SCRIPTS)) {
JSONObject scripts = packageJSON.getJSONObject(NodeJSConstants.SCRIPTS);
if (scripts.has(NodeJSConstants.START)) {
application.put(ManifestConstants.COMMAND, scripts.getString(NodeJSConstants.START));
return new Plan(getId(), getWizardId(), TYPE, manifest);
}
}
} catch (JSONException ex) {
/* can't parse the package.json, fail */
return null;
} finally {
IOUtilities.safeClose(is);
}
/* look for server.js or app.js files */
IFileStore serverJS = contentLocation.getChild(NodeJSConstants.SERVER_JS);
if (serverJS.fetchInfo().exists()) {
application.put(ManifestConstants.COMMAND, NodeJSConstants.NODE_SERVER_JS);
return new Plan(getId(), getWizardId(), TYPE, manifest);
}
IFileStore appJS = contentLocation.getChild(NodeJSConstants.APP_JS);
if (appJS.fetchInfo().exists()) {
application.put(ManifestConstants.COMMAND, NodeJSConstants.NODE_APP_JS);
return new Plan(getId(), getWizardId(), TYPE, manifest);
}
/* could not deduce command, mark as required */