
com.reprezen.genflow.rapidml.nodejs.AppGenerator Maven / Gradle / Ivy
package com.reprezen.genflow.rapidml.nodejs;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.reprezen.genflow.api.GenerationException;
import com.reprezen.genflow.api.template.IGenTemplateContext;
import com.reprezen.genflow.rapidml.nodejs.NodejsGenerator;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.eclipse.xtext.xbase.lib.Pair;
@SuppressWarnings("all")
public class AppGenerator implements NodejsGenerator.Generator {
private final static Map builtinDaoAdapters = Collections.unmodifiableMap(CollectionLiterals.newHashMap(Pair.of("ES", "./lib/daoAdapters/ES_DAO")));
private final static ObjectMapper mapper = new ObjectMapper();
private final String metadataFile;
private final IGenTemplateContext context;
public AppGenerator(final String metadataFile, final IGenTemplateContext context) {
this.metadataFile = metadataFile;
this.context = context;
}
@Override
public String generate() throws GenerationException {
String _xblockexpression = null;
{
Object _elvis = null;
Map _genTargetParameters = this.context.getGenTargetParameters();
Object _get = _genTargetParameters.get("servicePort");
if (_get != null) {
_elvis = _get;
} else {
_elvis = Integer.valueOf(3000);
}
final Object port = _elvis;
Map _genTargetParameters_1 = this.context.getGenTargetParameters();
final Object baseUrl = _genTargetParameters_1.get("baseURL");
Map _genTargetParameters_2 = this.context.getGenTargetParameters();
final Object linksPropertyName = _genTargetParameters_2.get("linksPropertyName");
StringConcatenation _builder = new StringConcatenation();
_builder.append("const url = require(\'url\');");
_builder.newLine();
_builder.append("const express = require(\'express\');");
_builder.newLine();
_builder.append("const winston = require(\'winston\');");
_builder.newLine();
_builder.append("const expressWinston = require(\'express-winston\');");
_builder.newLine();
_builder.append("const fillEnv = require(\'./lib/fillEnv\');");
_builder.newLine();
_builder.append("const fs = require(\'fs\');");
_builder.newLine();
_builder.append("const walk = require(\'walk\');");
_builder.newLine();
_builder.append("const EventEmitter = require(\'events\');");
_builder.newLine();
_builder.append("const http = require(\'http\');");
_builder.newLine();
_builder.newLine();
_builder.append("const defaultOptions = {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("port: \'");
_builder.append(port, "\t\t");
_builder.append("\',");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("baseUrl: \'");
_builder.append(baseUrl, "\t\t");
_builder.append("\',");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("mainMetadataFile: \'");
_builder.append(this.metadataFile, "\t\t");
_builder.append("\',");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("otherMetadataFiles: [");
_builder.newLine();
{
List _otherMetadatas = this.getOtherMetadatas();
boolean _hasElements = false;
for(final String mdFile : _otherMetadatas) {
if (!_hasElements) {
_hasElements = true;
} else {
_builder.appendImmediate(",", "\t\t\t");
}
_builder.append("\t\t\t");
_builder.append("\'");
_builder.append(mdFile, "\t\t\t");
_builder.append("\'");
_builder.newLineIfNotEmpty();
}
}
_builder.append("\t\t");
_builder.append("],");
_builder.newLine();
_builder.append("\t\t");
_builder.append("daoAdapter: \'");
Object _daoAdapter = this.getDaoAdapter();
_builder.append(_daoAdapter, "\t\t");
_builder.append("\',");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("daoOptions: ");
String _daoAdapterOptions = this.getDaoAdapterOptions();
_builder.append(_daoAdapterOptions, "\t\t");
_builder.append(",");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("middlewareModules: [");
_builder.newLine();
{
List _middlewares = this.getMiddlewares();
boolean _hasElements_1 = false;
for(final String mw : _middlewares) {
if (!_hasElements_1) {
_hasElements_1 = true;
} else {
_builder.appendImmediate(",", "\t\t\t");
}
_builder.append("\t\t\t");
_builder.append("\'");
_builder.append(mw, "\t\t\t");
_builder.append("\'");
_builder.newLineIfNotEmpty();
}
}
_builder.append("\t\t");
_builder.append("],");
_builder.newLine();
_builder.append("\t\t");
_builder.append("setupModules: [");
_builder.newLine();
{
List _setupModules = this.getSetupModules();
boolean _hasElements_2 = false;
for(final String setup : _setupModules) {
if (!_hasElements_2) {
_hasElements_2 = true;
} else {
_builder.appendImmediate(",", "\t\t\t");
}
_builder.append("\t\t\t");
_builder.append("\'");
_builder.append(setup, "\t\t\t");
_builder.append("\'");
_builder.newLineIfNotEmpty();
}
}
_builder.append("\t\t");
_builder.append("]");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("class App extends EventEmitter {");
_builder.newLine();
_builder.append("\t");
_builder.append("constructor(options = {}) {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("super();");
_builder.newLine();
_builder.append("\t\t");
_builder.append("this.options = Object.assign({}, defaultOptions, options);");
_builder.newLine();
_builder.append("\t\t");
_builder.append("this.options = fillEnv(this.options);");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.newLine();
_builder.append("\t");
_builder.append("setup() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("this.pSetup = loadMetadata(this.options).then(metadata => {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("this.metadata = metadata;");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("this.dao = loadDAO(this.options, this);");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("return createApp(this.options, this);");
_builder.newLine();
_builder.append("\t\t");
_builder.append("}).then(app => {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("this.app = app;");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("loadSetupModules(this.options, this);");
_builder.newLine();
_builder.append("\t\t");
_builder.append("});");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return this;");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.newLine();
_builder.append("\t");
_builder.append("run() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("if (!this.pSetup) {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("setup();");
_builder.newLine();
_builder.append("\t\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t\t");
_builder.append("this.pSetup.then(_ => {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("this.server = new http.createServer(this.app);");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("this.server.listen(this.options.port, _ => {");
_builder.newLine();
_builder.append("\t\t\t\t");
_builder.append("this.emit(\'ready\', this.options.port);");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("});");
_builder.newLine();
_builder.append("\t\t");
_builder.append("}).catch(error => {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("console.error(error);");
_builder.newLine();
_builder.append("\t\t");
_builder.append("});");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.newLine();
_builder.append("\t");
_builder.append("close() {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("this.server.close();");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("function loadMetadata(options) {");
_builder.newLine();
_builder.append("\t");
_builder.append("const Metadata = require(\'./lib/Metadata\');\tlet metadata = new Metadata();");
_builder.newLine();
_builder.append("\t");
_builder.append("let p = metadata.ingest(options.mainMetadataFile);");
_builder.newLine();
_builder.append("\t");
_builder.append("for (let mdfile of options.otherMetadataFiles) {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("p = p.then(_ => metadata.ingest(mdfile));");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.append("p = p.then(_ => metadata.resolve());");
_builder.newLine();
_builder.append("\t");
_builder.append("return p.then(_ => metadata);");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("function loadDAO(options, self) {");
_builder.newLine();
_builder.append("\t");
_builder.append("const DataAccessObject = require(\'./lib/DataAccessObject\');");
_builder.newLine();
_builder.append("\t");
_builder.append("let adapterClass = require(options.daoAdapter);");
_builder.newLine();
_builder.append("\t");
_builder.append("return new DataAccessObject(adapterClass, options.daoOptions, self.metadata, options.baseUrl);");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("function createApp(options, self) {");
_builder.newLine();
_builder.append("\t");
_builder.append("let app = new express();");
_builder.newLine();
_builder.append("\t");
_builder.append("app.locals.baseUrl = options.baseUrl;");
_builder.newLine();
_builder.append("\t");
_builder.append("app.locals.basePath = url.parse(options.baseUrl).pathname;");
_builder.newLine();
_builder.append("\t");
_builder.append("app.locals.daoLimits = self.dao.adapter.constructor.limits;");
_builder.newLine();
_builder.append("\t");
_builder.append("app.locals.linksPropertyName = \'");
_builder.append(linksPropertyName, "\t");
_builder.append("\';");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("app.use(expressWinston.logger({");
_builder.newLine();
_builder.append("\t\t");
_builder.append("transports: [new winston.transports.Console()]");
_builder.newLine();
_builder.append("\t");
_builder.append("}));");
_builder.newLine();
_builder.append("\t");
_builder.append("for (let mw of options.middlewareModules) {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("app.use(require(mw));");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("\t");
_builder.append("return setupPaths(app, self.dao).then(_ => {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("// this has to go after all the routes have been established");
_builder.newLine();
_builder.append("\t\t");
_builder.append("app.use(expressWinston.errorLogger({");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("transports: [new winston.transports.Console({dumpExceptions: true, showStack: true, json:true})]");
_builder.newLine();
_builder.append("\t\t");
_builder.append("}));");
_builder.newLine();
_builder.append("\t\t");
_builder.append("// suppress standard express error logging");
_builder.newLine();
_builder.append("\t\t");
_builder.append("app.use((req,res,next,error) => {});");
_builder.newLine();
_builder.append("\t\t");
_builder.append("return app;");
_builder.newLine();
_builder.append("\t");
_builder.append("});");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("function setupPaths(app, dao) {");
_builder.newLine();
_builder.append("\t");
_builder.append("return new Promise((resolve, reject) => {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("walker = walk.walk(\'handlers\');");
_builder.newLine();
_builder.append("\t\t");
_builder.append("walker.on(\'file\', (root, stat, next) => {");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("let path = `./${root}/${stat.name}`;");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("let handlerClass = require(path);");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("new handlerClass(app, dao);");
_builder.newLine();
_builder.append("\t\t\t");
_builder.append("next();");
_builder.newLine();
_builder.append("\t\t");
_builder.append("});");
_builder.newLine();
_builder.append("\t\t");
_builder.append("walker.on(\'errors\', () => reject(\'Failed to load resource handlers\'));");
_builder.newLine();
_builder.append("\t\t");
_builder.append("walker.on(\'end\', () => resolve());");
_builder.newLine();
_builder.append("\t");
_builder.append("});\t");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("function loadSetupModules(options, self) {");
_builder.newLine();
_builder.append("\t");
_builder.append("for (let setupModule of options.setupModules) {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("require(setupModule)(self.metadata, self.dao, self.app);");
_builder.newLine();
_builder.append("\t");
_builder.append("}");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("if (require.main === module) {");
_builder.newLine();
_builder.append("\t");
_builder.append("let app = new App()");
_builder.newLine();
_builder.append("\t");
_builder.append("app.setup();");
_builder.newLine();
_builder.append("\t");
_builder.append("app.on(\'ready\', port => {");
_builder.newLine();
_builder.append("\t\t");
_builder.append("console.log(`Listening on port ${port}`);");
_builder.newLine();
_builder.append("\t");
_builder.append("});");
_builder.newLine();
_builder.append("\t");
_builder.append("app.run();");
_builder.newLine();
_builder.append("}");
_builder.newLine();
_builder.newLine();
_builder.append("module.exports = App;");
_builder.newLine();
_xblockexpression = _builder.toString();
}
return _xblockexpression;
}
private Object getDaoAdapter() {
Object _xblockexpression = null;
{
Map _genTargetParameters = this.context.getGenTargetParameters();
final Object adapter = _genTargetParameters.get("daoAdapter");
Object _xifexpression = null;
boolean _containsKey = AppGenerator.builtinDaoAdapters.containsKey(adapter);
if (_containsKey) {
_xifexpression = AppGenerator.builtinDaoAdapters.get(adapter);
} else {
_xifexpression = adapter;
}
_xblockexpression = _xifexpression;
}
return _xblockexpression;
}
private String getDaoAdapterOptions() {
try {
String _xblockexpression = null;
{
Object _elvis = null;
Map _genTargetParameters = this.context.getGenTargetParameters();
Object _get = _genTargetParameters.get("daoAdapterOptions");
if (_get != null) {
_elvis = _get;
} else {
_elvis = "{}";
}
Object options = _elvis;
String _xifexpression = null;
if ((options instanceof Map, ?>)) {
ObjectWriter _writerWithDefaultPrettyPrinter = AppGenerator.mapper.writerWithDefaultPrettyPrinter();
_xifexpression = _writerWithDefaultPrettyPrinter.writeValueAsString(options);
}
_xblockexpression = _xifexpression;
}
return _xblockexpression;
} catch (Throwable _e) {
throw Exceptions.sneakyThrow(_e);
}
}
private List getOtherMetadatas() {
List _elvis = null;
Map _genTargetParameters = this.context.getGenTargetParameters();
Object _get = _genTargetParameters.get("additionalMetadata");
if (((List) _get) != null) {
_elvis = ((List) _get);
} else {
_elvis = Collections.unmodifiableList(CollectionLiterals.newArrayList());
}
return _elvis;
}
private List getMiddlewares() {
List _elvis = null;
Map _genTargetParameters = this.context.getGenTargetParameters();
Object _get = _genTargetParameters.get("middlewareModules");
if (((List) _get) != null) {
_elvis = ((List) _get);
} else {
_elvis = Collections.unmodifiableList(CollectionLiterals.newArrayList());
}
return _elvis;
}
private List getSetupModules() {
List _elvis = null;
Map _genTargetParameters = this.context.getGenTargetParameters();
Object _get = _genTargetParameters.get("setupModules");
if (((List) _get) != null) {
_elvis = ((List) _get);
} else {
_elvis = Collections.unmodifiableList(CollectionLiterals.newArrayList());
}
return _elvis;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy