All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.reprezen.genflow.rapidml.nodejs.AppGenerator Maven / Gradle / Ivy

package com.reprezen.genflow.rapidml.nodejs;

import com.fasterxml.jackson.databind.ObjectMapper;
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;
      Object _get = this.context.getGenTargetParameters().get("servicePort");
      if (_get != null) {
        _elvis = _get;
      } else {
        _elvis = Integer.valueOf(3000);
      }
      final Object port = _elvis;
      final Object baseUrl = this.context.getGenTargetParameters().get("baseURL");
      final Object linksPropertyName = this.context.getGenTargetParameters().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;
    {
      final Object adapter = this.context.getGenTargetParameters().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;
        Object _get = this.context.getGenTargetParameters().get("daoAdapterOptions");
        if (_get != null) {
          _elvis = _get;
        } else {
          _elvis = "{}";
        }
        Object options = _elvis;
        String _xifexpression = null;
        if ((options instanceof Map)) {
          _xifexpression = AppGenerator.mapper.writerWithDefaultPrettyPrinter().writeValueAsString(options);
        }
        _xblockexpression = _xifexpression;
      }
      return _xblockexpression;
    } catch (Throwable _e) {
      throw Exceptions.sneakyThrow(_e);
    }
  }
  
  private List getOtherMetadatas() {
    List _elvis = null;
    Object _get = this.context.getGenTargetParameters().get("additionalMetadata");
    if (((List) _get) != null) {
      _elvis = ((List) _get);
    } else {
      _elvis = Collections.unmodifiableList(CollectionLiterals.newArrayList());
    }
    return _elvis;
  }
  
  private List getMiddlewares() {
    List _elvis = null;
    Object _get = this.context.getGenTargetParameters().get("middlewareModules");
    if (((List) _get) != null) {
      _elvis = ((List) _get);
    } else {
      _elvis = Collections.unmodifiableList(CollectionLiterals.newArrayList());
    }
    return _elvis;
  }
  
  private List getSetupModules() {
    List _elvis = null;
    Object _get = this.context.getGenTargetParameters().get("setupModules");
    if (((List) _get) != null) {
      _elvis = ((List) _get);
    } else {
      _elvis = Collections.unmodifiableList(CollectionLiterals.newArrayList());
    }
    return _elvis;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy