docs: public void execute() throws MojoExecutionException, MojoFailureException {
          Velocity.setProperty(Velocity.RUNTIME_LOG_LOGSYSTEM, this);
          vc.put("helper", this);
          vc.put("ESC", "$");
  
          if (null != sourceVersion) {
              getLog().info("sourceVersion=" + sourceVersion);
              vc.put("sourceVersion", sourceVersion);
          }
  
          Map<String, String> mySqlTypes = new HashMap<String, String>();
          Map<String, String> sqLiteTypes = new HashMap<String, String>();
          Map<String, String> mySqlDefaults = new HashMap<String, String>();
          // for MySQL
          mySqlTypes.put(Long.class.getName(), "BIGINT");
          mySqlTypes.put(Integer.class.getName(), "INTEGER");
          mySqlTypes.put(Short.class.getName(), "SMALLINT");
          mySqlTypes.put(Byte.class.getName(), "TINYINT");
          mySqlTypes.put(Double.class.getName(), "DOUBLE PRECISION");
          // MySQL max key length is 767:
          mySqlTypes.put(String.class.getName(), "VARCHAR(255)");
          mySqlTypes.put(Boolean.class.getName(), "BIT(1)");
          mySqlTypes.put(java.util.Date.class.getName(), "TIMESTAMP");
  
          mySqlDefaults.put(Long.class.getName(), "DEFAULT NULL");
          mySqlDefaults.put(Integer.class.getName(), "DEFAULT NULL");
          mySqlDefaults.put(Short.class.getName(), "DEFAULT NULL");
          mySqlDefaults.put(Byte.class.getName(), "DEFAULT NULL");
          mySqlDefaults.put(Double.class.getName(), "DEFAULT NULL");
          mySqlDefaults.put(String.class.getName(), "DEFAULT NULL");
          mySqlDefaults.put(Boolean.class.getName(), "DEFAULT NULL");
          mySqlDefaults.put(java.util.Date.class.getName(), "NOT NULL DEFAULT CURRENT_TIMESTAMP");
          
          // for SQLite
          sqLiteTypes.put(Long.class.getName(), "INT");
          sqLiteTypes.put(String.class.getName(), "TEXT");
          sqLiteTypes.put(Boolean.class.getName(), "TINYINT");
          sqLiteTypes.put(Float.class.getName(), "REAL");
          sqLiteTypes.put(Double.class.getName(), "REAL");
  
          if ("Android".equals(persistenceType)) {
              vc.put("dbTypes", sqLiteTypes);
          }
          else {
              // FIXME: other DB types
              vc.put("dbTypes", mySqlTypes);
              vc.put("dbDefaults", mySqlDefaults);
          }
  
          Date current = new Date();
          vc.put("currentDate", DATEFORMAT.format(current));
          vc.put("persistenceUnitName", persistenceUnitName);
          vc.put("containerManagedEntityManager", containerManagedEntityManager);
          vc.put("containerManagedTransactionManager", containerManagedTransactionManager);
  
          // persistence type and merge scheme:
          vc.put("persistenceType", persistenceType);
          ApplicationContext springCtx = new GenericXmlApplicationContext("/META-INF/merge-scheme-beans.xml");
          mergeScheme = (MergeScheme) springCtx.getBean("mergeScheme" + persistenceType);
  
          getLog().debug("templateFolder=" + templateFolder);
          final Properties p = new Properties();
          p.setProperty("class.resource.loader.description", "Velocity Classpath Resource Loader");
          p.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
  
          // load templates from external folder?
          if (null == templateFolder) {
              p.setProperty("resource.loader", "class");
          }
          else {
              p.setProperty("resource.loader", "file, class");
              p.setProperty("file.resource.loader.description", "Velocity File Resource Loader");
              p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
              p.setProperty("file.resource.loader.path", templateFolder);
              p.setProperty("file.resource.loader.cache", "true");
              p.setProperty("file.resource.loader.modificationCheckInterval", "0");
          }
          try {
              Velocity.init(p);
          }
          catch (Exception e) {
              throw new MojoExecutionException(getClass().getSimpleName(), e);
          }
  
          daoBasePackage = basePackage + "." + daoPackageName;
          domainBasePackage = basePackage + "." + domainPackageName;
          controllerBasePackage = basePackage + "." + controllerPackageName;
  
          vc.put("basePackage", basePackage);
          vc.put("daoBasePackage", daoBasePackage);
          vc.put("domainBasePackage", domainBasePackage);
          vc.put("controllerBasePackage", controllerBasePackage);
  
          mkdirs();
      }