@Override
  public RunResult dataDictionary(GeneratorInstanceDataDictionaryRequest request) {
    RunResult runResult = new RunResult();
    Authentication authentication = request.getAuthentication();
    Long userId = authentication.getUserId();

    Long id = request.getId();
    GeneratorInstance generatorInstance = generatorInstanceRepository.selectById(id);
    if (generatorInstance == null) {
      throw new AppException("实例不存在");
    }

    if (!userId.equals(generatorInstance.getUser().getId())) {
      throw new AppException("权限不足");
    }

    Long generatorId = generatorInstance.getGenerator().getId();
    Generator generator = generatorRepository.selectById(generatorId);
    if (generator == null) {
      throw new AppException("生成器不存在");
    }

    if (generatorInstance.getVersion() < generator.getVersion()) {
      throw new AppException("当前生成器已升级发布,请刷新数据,重新操作!");
    }

    if (!generator.getIsOpen() && !generator.getDeveloper().getId().equals(userId)) {
      throw new AppException("当前生成器正在维护,请暂停操作,等待发布!");
    }

    DynamicModelQueryRequest dynamicModelQueryRequest = new DynamicModelQueryRequest();
    dynamicModelQueryRequest.setGeneratorId(generatorId);
    dynamicModelQueryRequest.setAuthentication(authentication);

    List<DynamicModel> dynamicModels = dynamicModelService.query(dynamicModelQueryRequest);
    Map<Long, Map<String, Object>> dynamicModelGroupData = new HashMap<>();
    Map<Long, DynamicModel> dynamicModelCache = new HashMap<>();
    Map<Long, Map<String, Map<String, Set<String>>>> dynamicModelKeysCache = new HashMap<>();
    dynamicModels.forEach(
        dynamicModel -> {
          Map<String, Object> groupData = new HashMap<>();
          List<Map<String, Object>> fromGroups = new ArrayList<>();
          groupData.put("fromGroups", fromGroups);
          List<Map<String, Object>> headGroups = new ArrayList<>();
          groupData.put("headGroups", headGroups);
          List<DynamicProperty> heads = new ArrayList<>();
          groupData.put("heads", heads);

          DynamicModel newDynamicModel = new DynamicModel();
          newDynamicModel.setId(dynamicModel.getId());
          newDynamicModel.setName(dynamicModel.getName());
          newDynamicModel.setIcon(dynamicModel.getIcon());

          Map<String, Map<String, Set<String>>> keysCache = new HashMap<>();
          Map<String, Set<String>> propertiesKeys = new HashMap<>();
          Set<String> propertiesKeys_dateTypeKeys = new HashSet<>();
          Set<String> propertiesKeys_dataModelTypeKeys = new HashSet<>();
          propertiesKeys.put("dateTypeKeys", propertiesKeys_dateTypeKeys);
          propertiesKeys.put("dataModelTypeKeys", propertiesKeys_dataModelTypeKeys);
          Map<String, Set<String>> associationKeys = new HashMap<>();
          Set<String> associationKeys_dateTypeKeys = new HashSet<>();
          Set<String> associationKeys_dataModelTypeKeys = new HashSet<>();
          associationKeys.put("dateTypeKeys", associationKeys_dateTypeKeys);
          associationKeys.put("dataModelTypeKeys", associationKeys_dataModelTypeKeys);
          keysCache.put("propertiesKeys", propertiesKeys);
          keysCache.put("associationKeys", associationKeys);
          dynamicModelKeysCache.put(dynamicModel.getId(), keysCache);

          List<DynamicProperty> properties = dynamicModel.getProperties();
          properties.forEach(
              property -> {
                if ("Date".equals(property.getType())) {
                  propertiesKeys_dateTypeKeys.add(property.getName());
                } else if ("Model".equals(property.getType())) {
                  propertiesKeys_dataModelTypeKeys.add(property.getName());
                }

                DynamicProperty newDynamicProperty = new DynamicProperty();
                newDynamicProperty.setId(property.getId());
                newDynamicProperty.setLabel(property.getLabel());
                newDynamicProperty.setName(property.getName());
                newDynamicProperty.setViewWidth(property.getViewWidth());
                newDynamicProperty.setType(property.getType());
                newDynamicProperty.setDefaultValue(property.getDefaultValue());
                newDynamicModel.getProperties().add(newDynamicProperty);

                String group = property.getGroup();
                Map<String, Object> groupMap = new HashMap<>();
                if (!StringUtils.hasText(group)) {
                  groupMap.put("property", property);
                  fromGroups.add(groupMap);
                } else {
                  Map<String, Object> prevFromGroup =
                      fromGroups.isEmpty() ? null : fromGroups.get(fromGroups.size() - 1);
                  String prevGroup =
                      prevFromGroup == null
                          ? null
                          : (prevFromGroup.get("group") == null
                              ? null
                              : prevFromGroup.get("group").toString());
                  if (prevFromGroup == null || !group.equals(prevGroup)) {
                    groupMap.put("group", group);
                    List<DynamicProperty> children = new ArrayList<>();
                    children.add(property);
                    groupMap.put("children", children);
                    fromGroups.add(groupMap);
                  }
                  if (prevFromGroup != null && group.equals(prevGroup)) {
                    List<DynamicProperty> children =
                        (List<DynamicProperty>) prevFromGroup.get("children");
                    children.add(property);
                  }
                }
              });

          List<DynamicProperty> association = dynamicModel.getAssociation();
          association.forEach(
              property -> {
                if ("Date".equals(property.getType())) {
                  associationKeys_dateTypeKeys.add(property.getName());
                } else if ("Model".equals(property.getType())) {
                  associationKeys_dataModelTypeKeys.add(property.getName());
                }

                DynamicProperty newDynamicProperty = new DynamicProperty();
                newDynamicProperty.setId(property.getId());
                newDynamicProperty.setLabel(property.getLabel());
                newDynamicProperty.setName(property.getName());
                newDynamicProperty.setViewWidth(property.getViewWidth());
                newDynamicProperty.setType(property.getType());
                newDynamicProperty.setDefaultValue(property.getDefaultValue());
                newDynamicModel.getAssociation().add(newDynamicProperty);

                String group = property.getGroup();
                Map<String, Object> groupMap = new HashMap<>();
                if (!StringUtils.hasText(group)) {
                  groupMap.put("property", property);
                  headGroups.add(groupMap);
                } else {
                  Map<String, Object> prevHeadGroup =
                      headGroups.isEmpty() ? null : headGroups.get(headGroups.size() - 1);
                  String prevGroup =
                      prevHeadGroup == null
                          ? null
                          : (prevHeadGroup.get("group") == null
                              ? null
                              : prevHeadGroup.get("group").toString());
                  if (prevHeadGroup == null || !group.equals(prevGroup)) {
                    groupMap.put("group", group);
                    groupMap.put("span", 1);
                    headGroups.add(groupMap);
                  }
                  if (prevHeadGroup != null && group.equals(prevGroup)) {
                    Integer span = (Integer) prevHeadGroup.get("span");
                    prevHeadGroup.put("span", span + 1);
                  }
                  heads.add(property);
                }
              });
          dynamicModelCache.put(newDynamicModel.getId(), newDynamicModel);
          dynamicModelGroupData.put(newDynamicModel.getId(), groupData);
        });

    List<Long> excludeIds = request.getExcludeIds();
    Map<Long, Long> excludeIdCache = new HashMap<>();
    excludeIds.forEach(excludeId -> excludeIdCache.put(excludeId, excludeId));

    Long dataModelId = generatorInstance.getDataModel().getId();
    DataModel rootDataModel = dataModelRepository.selectById(dataModelId);

    Map<Long, DataModel> dataModelSourceCache = new HashMap<>();
    Map<Long, DataModel> dataModelTargetCache = new HashMap<>();
    LinkedList<DataModel> stack = new LinkedList<>();
    stack.push(rootDataModel);
    while (!stack.isEmpty()) {
      DataModel dataModel = stack.pop();
      dataModelSourceCache.put(dataModel.getId(), dataModel);
      dataModelTargetCache.put(dataModel.getId(), new DataModel());
      dataModel.getChildren().forEach(stack::push);
    }
    dataModelSourceCache.forEach(
        (dataModelSourceId, dataModelSource) -> {
          DataModel dataModelTarget = dataModelTargetCache.get(dataModelSourceId);
          dataModelTarget.setId(dataModelSource.getId());
          dataModelTarget.setName(dataModelSource.getName());
          if (dataModelSource.getParent() != null) {
            Long parentId = dataModelSource.getParent().getId();
            DataModel parentSource = dataModelSourceCache.get(parentId);
            if (parentSource != null) {
              DataModel parentTarget = dataModelTargetCache.get(parentId);
              dataModelTarget.setParent(parentTarget);
            }
          }
          dataModelSource
              .getChildren()
              .forEach(
                  child -> {
                    Long childId = child.getId();
                    if (!excludeIdCache.containsKey(childId)) {
                      dataModelTarget.getChildren().add(dataModelTargetCache.get(childId));
                    }
                  });

          if (!dataModelSource.equals(rootDataModel)) {
            DynamicModel dynamicModel =
                dynamicModelCache.get(dataModelSource.getDynamicModel().getId());
            dataModelTarget.setDynamicModel(dynamicModel);

            Map<String, Map<String, Set<String>>> keysCache =
                dynamicModelKeysCache.get(dynamicModel.getId());
            Map<String, Set<String>> propertiesKeys = keysCache.get("propertiesKeys");
            Map<String, Set<String>> associationKeys = keysCache.get("associationKeys");
            Set<String> propertiesKeys_dateTypeKeys = propertiesKeys.get("dateTypeKeys");
            Set<String> propertiesKeys_dataModelTypeKeys = propertiesKeys.get("dataModelTypeKeys");
            Set<String> associationKeys_dateTypeKeys = associationKeys.get("dateTypeKeys");
            Set<String> associationKeys_dataModelTypeKeys =
                associationKeys.get("dataModelTypeKeys");
            dataModelSource
                .getProperties()
                .forEach(
                    (name, value) -> {
                      try {
                        if (propertiesKeys_dateTypeKeys.contains(name)) {
                          dataModelTarget.getProperties().put(name, new Date((Long) value));
                        } else if (propertiesKeys_dataModelTypeKeys.contains(name)) {
                          dataModelTarget
                              .getProperties()
                              .put(name, dataModelTargetCache.get(value));
                        } else {
                          dataModelTarget.getProperties().put(name, value);
                        }
                      } catch (Exception e) {
                        //
                      }
                    });
            dataModelSource
                .getAssociation()
                .forEach(
                    property -> {
                      Map<String, Object> newProperty = new LinkedHashMap<>();
                      property.forEach(
                          (name, value) -> {
                            try {
                              if (associationKeys_dateTypeKeys.contains(name)) {
                                newProperty.put(name, new Date((Long) value));
                              } else if (associationKeys_dataModelTypeKeys.contains(name)) {
                                newProperty.put(name, dataModelTargetCache.get(value));
                              } else {
                                newProperty.put(name, value);
                              }
                            } catch (Exception e) {
                              //
                            }
                          });
                      dataModelTarget.getAssociation().add(newProperty);
                    });
          }
        });

    Long generateId = idWorker.nextId();
    ComparisonDateTool comparisonDateTool = new ComparisonDateTool();
    Map<String, String> themeIndex = new HashMap<>();
    themeIndex.put("cerulean", "cerulean");
    themeIndex.put("cosmo", "cosmo");
    themeIndex.put("cyborg", "cyborg");
    themeIndex.put("darkly", "darkly");
    themeIndex.put("default", "default");
    themeIndex.put("flatly", "flatly");
    themeIndex.put("journal", "journal");
    themeIndex.put("lumen", "lumen");
    themeIndex.put("paper", "paper");
    themeIndex.put("readable", "readable");
    themeIndex.put("sandstone", "sandstone");
    themeIndex.put("simplex", "simplex");
    themeIndex.put("slate", "slate");
    themeIndex.put("spacelab", "spacelab");
    themeIndex.put("superhero", "superhero");
    themeIndex.put("united", "united");
    themeIndex.put("yeti", "yeti");
    String theme = themeIndex.get(request.getTheme());
    theme = theme == null ? "slate" : theme;

    Global global = new Global();
    global.setGenerateId(generateId);
    global.setTheme(theme);

    User userClone = new User();
    userClone.setId(userId);
    userClone.setUserName(authentication.getUserName());
    global.setUser(userClone);

    GeneratorInstance generatorInstanceClone = new GeneratorInstance();
    generatorInstanceClone.setId(generatorInstance.getId());
    generatorInstanceClone.setName(generatorInstance.getName());
    global.setGeneratorInstance(generatorInstanceClone);

    DataModel rootDataModelClone = dataModelTargetCache.get(rootDataModel.getId());
    String generatePath =
        ConfigProperties.TEMPORARY_PATH
            + ConfigProperties.fileSeparator
            + userId
            + ConfigProperties.fileSeparator
            + generatorInstance.getName()
            + "("
            + generateId
            + ")";

    String indexOutFile = generatePath + ConfigProperties.fileSeparator + "index.html";
    Map<String, Object> indexVarMap = new HashMap<>();
    indexVarMap.put("global", global);
    indexVarMap.put("date", comparisonDateTool);
    indexVarMap.put("data", rootDataModelClone);
    FileUtil.mkdirs(new File(indexOutFile).getParent());
    VelocityUtil.mergeWrite(
        ConfigProperties.ROOT_PATH + ConfigProperties.fileSeparator + "client/template",
        "index.html.vm",
        indexOutFile,
        indexVarMap);

    FileUtil.mkdirs(generatePath + ConfigProperties.fileSeparator + "library");
    FileUtil.copyFile(
        new File(
            ConfigProperties.ROOT_PATH
                + ConfigProperties.fileSeparator
                + "client/library/jquery/jquery.min.js"),
        new File(generatePath + ConfigProperties.fileSeparator + "library/jquery.min.js"));
    FileUtil.copyFile(
        new File(
            ConfigProperties.ROOT_PATH
                + ConfigProperties.fileSeparator
                + "client/library/bootstrap/js/bootstrap.min.js"),
        new File(generatePath + ConfigProperties.fileSeparator + "library/bootstrap.min.js"));
    FileUtil.copyFile(
        new File(
            ConfigProperties.ROOT_PATH
                + ConfigProperties.fileSeparator
                + "client/library/angular/angular.min.js"),
        new File(generatePath + ConfigProperties.fileSeparator + "library/angular.min.js"));

    FileUtil.copyFile(
        new File(
            ConfigProperties.ROOT_PATH
                + ConfigProperties.fileSeparator
                + "client/library/bootstrap/theme/"
                + theme
                + ".min.css"),
        new File(generatePath + ConfigProperties.fileSeparator + "library/" + theme + ".min.css"));

    FileUtil.mkdirs(generatePath + ConfigProperties.fileSeparator + "fonts");
    File[] fontFiles =
        new File(
                ConfigProperties.ROOT_PATH
                    + ConfigProperties.fileSeparator
                    + "client/library/bootstrap/fonts")
            .listFiles();
    for (File fontFile : fontFiles) {
      FileUtil.copyFile(
          new File(
              ConfigProperties.ROOT_PATH
                  + ConfigProperties.fileSeparator
                  + "client/library/bootstrap/fonts/"
                  + fontFile.getName()),
          new File(generatePath + ConfigProperties.fileSeparator + "fonts/" + fontFile.getName()));
    }

    LinkedList<DataModel> dataStack = new LinkedList<>();
    dataStack.push(rootDataModelClone);
    FileUtil.mkdirs(generatePath + ConfigProperties.fileSeparator + "data");
    while (!dataStack.isEmpty()) {
      DataModel dataModel = dataStack.pop();
      if (dataModel != rootDataModelClone) {
        String dataModelOutFile =
            generatePath
                + ConfigProperties.fileSeparator
                + "data"
                + ConfigProperties.fileSeparator
                + dataModel.getId()
                + ".html";
        Map<String, Object> dataModelVarMap = new HashMap<>();
        dataModelVarMap.put("global", global);
        dataModelVarMap.put("date", comparisonDateTool);
        dataModelVarMap.put("dataModel", dataModel);
        dataModelVarMap.put("dynamicModelGroupData", dynamicModelGroupData);
        VelocityUtil.mergeWrite(
            ConfigProperties.ROOT_PATH + ConfigProperties.fileSeparator + "client/template",
            "dataModel.html.vm",
            dataModelOutFile,
            dataModelVarMap);
      }
      dataModel.getChildren().forEach(dataStack::push);
    }

    File generateFolder = new File(generatePath);
    try {
      ZipUtil.compress(generateFolder);
    } catch (Exception e) {
      throw new AppException(e, "压缩文件失败");
    }
    FileUtil.deleteFile(generateFolder);
    runResult.setUrl(userId + "/" + generatorInstance.getName() + "(" + generateId + ").zip");
    runResult.setFileName(generatorInstance.getName() + "(" + generateId + ").zip");
    return runResult;
  }
  @Override
  public RunResult run(GeneratorInstanceRunRequest request) {
    RunResult runResult = new RunResult();
    Authentication authentication = request.getAuthentication();
    Long userId = authentication.getUserId();

    Long id = request.getId();
    GeneratorInstance generatorInstance = generatorInstanceRepository.selectById(id);
    if (generatorInstance == null) {
      throw new AppException("实例不存在");
    }

    if (!userId.equals(generatorInstance.getUser().getId())) {
      throw new AppException("权限不足");
    }

    Long generatorId = generatorInstance.getGenerator().getId();
    Generator generator = generatorRepository.selectById(generatorId);
    if (generator == null) {
      throw new AppException("生成器不存在");
    }

    if (generatorInstance.getVersion() < generator.getVersion()) {
      throw new AppException("当前生成器已升级发布,请刷新数据,重新操作!");
    }

    if (!generator.getIsOpen() && !generator.getDeveloper().getId().equals(userId)) {
      throw new AppException("当前生成器正在维护,请暂停操作,等待发布!");
    }

    Long templateStrategyId = request.getTemplateStrategyId();
    TemplateStrategy templateStrategy = templateStrategyRepository.selectById(templateStrategyId);

    DynamicModelQueryRequest dynamicModelQueryRequest = new DynamicModelQueryRequest();
    dynamicModelQueryRequest.setGeneratorId(generatorId);
    dynamicModelQueryRequest.setAuthentication(authentication);
    List<DynamicModel> dynamicModels = dynamicModelService.query(dynamicModelQueryRequest);
    Map<Long, DynamicModel> dynamicModelCache = new HashMap<>();
    Map<Long, Map<String, Map<String, Set<String>>>> dynamicModelKeysCache = new HashMap<>();
    dynamicModels.forEach(
        dynamicModel -> {
          DynamicModel newDynamicModel = new DynamicModel();
          newDynamicModel.setId(dynamicModel.getId());
          newDynamicModel.setName(dynamicModel.getName());
          newDynamicModel.setIcon(dynamicModel.getIcon());

          Map<String, Map<String, Set<String>>> keysCache = new HashMap<>();
          Map<String, Set<String>> propertiesKeys = new HashMap<>();
          Set<String> propertiesKeys_dateTypeKeys = new HashSet<>();
          Set<String> propertiesKeys_dataModelTypeKeys = new HashSet<>();
          propertiesKeys.put("dateTypeKeys", propertiesKeys_dateTypeKeys);
          propertiesKeys.put("dataModelTypeKeys", propertiesKeys_dataModelTypeKeys);
          Map<String, Set<String>> associationKeys = new HashMap<>();
          Set<String> associationKeys_dateTypeKeys = new HashSet<>();
          Set<String> associationKeys_dataModelTypeKeys = new HashSet<>();
          associationKeys.put("dateTypeKeys", associationKeys_dateTypeKeys);
          associationKeys.put("dataModelTypeKeys", associationKeys_dataModelTypeKeys);
          keysCache.put("propertiesKeys", propertiesKeys);
          keysCache.put("associationKeys", associationKeys);
          dynamicModelKeysCache.put(dynamicModel.getId(), keysCache);

          List<DynamicProperty> properties = dynamicModel.getProperties();
          properties.forEach(
              property -> {
                if ("Date".equals(property.getType())) {
                  propertiesKeys_dateTypeKeys.add(property.getName());
                } else if ("Model".equals(property.getType())) {
                  propertiesKeys_dataModelTypeKeys.add(property.getName());
                }

                DynamicProperty newDynamicProperty = new DynamicProperty();
                newDynamicProperty.setId(property.getId());
                newDynamicProperty.setLabel(property.getLabel());
                newDynamicProperty.setName(property.getName());
                newDynamicProperty.setViewWidth(property.getViewWidth());
                newDynamicProperty.setType(property.getType());
                newDynamicProperty.setDefaultValue(property.getDefaultValue());
                newDynamicModel.getProperties().add(newDynamicProperty);
              });
          List<DynamicProperty> association = dynamicModel.getAssociation();
          association.forEach(
              property -> {
                if ("Date".equals(property.getType())) {
                  associationKeys_dateTypeKeys.add(property.getName());
                } else if ("Model".equals(property.getType())) {
                  associationKeys_dataModelTypeKeys.add(property.getName());
                }

                DynamicProperty newDynamicProperty = new DynamicProperty();
                newDynamicProperty.setId(property.getId());
                newDynamicProperty.setLabel(property.getLabel());
                newDynamicProperty.setName(property.getName());
                newDynamicProperty.setViewWidth(property.getViewWidth());
                newDynamicProperty.setType(property.getType());
                newDynamicProperty.setDefaultValue(property.getDefaultValue());
                newDynamicModel.getAssociation().add(newDynamicProperty);
              });
          dynamicModelCache.put(newDynamicModel.getId(), newDynamicModel);
        });

    List<Long> excludeIds = request.getExcludeIds();
    Map<Long, Long> excludeIdCache = new HashMap<>();
    excludeIds.forEach(excludeId -> excludeIdCache.put(excludeId, excludeId));

    Long dataModelId = generatorInstance.getDataModel().getId();
    DataModel rootDataModel = dataModelRepository.selectById(dataModelId);

    Map<Long, DataModel> dataModelSourceCache = new HashMap<>();
    Map<Long, DataModel> dataModelTargetCache = new HashMap<>();
    LinkedList<DataModel> stack = new LinkedList<>();
    stack.push(rootDataModel);
    while (!stack.isEmpty()) {
      DataModel dataModel = stack.pop();
      dataModelSourceCache.put(dataModel.getId(), dataModel);
      dataModelTargetCache.put(dataModel.getId(), new DataModel());
      dataModel.getChildren().forEach(stack::push);
    }
    dataModelSourceCache.forEach(
        (dataModelSourceId, dataModelSource) -> {
          DataModel dataModelTarget = dataModelTargetCache.get(dataModelSourceId);
          dataModelTarget.setId(dataModelSource.getId());
          dataModelTarget.setName(dataModelSource.getName());
          if (dataModelSource.getParent() != null) {
            Long parentId = dataModelSource.getParent().getId();
            DataModel parentSource = dataModelSourceCache.get(parentId);
            if (parentSource != null) {
              DataModel parentTarget = dataModelTargetCache.get(parentId);
              dataModelTarget.setParent(parentTarget);
            }
          }
          dataModelSource
              .getChildren()
              .forEach(
                  child -> {
                    Long childId = child.getId();
                    if (!excludeIdCache.containsKey(childId)) {
                      dataModelTarget.getChildren().add(dataModelTargetCache.get(childId));
                    }
                  });

          if (!dataModelSource.equals(rootDataModel)) {
            DynamicModel dynamicModel =
                dynamicModelCache.get(dataModelSource.getDynamicModel().getId());
            dataModelTarget.setDynamicModel(dynamicModel);

            Map<String, Map<String, Set<String>>> keysCache =
                dynamicModelKeysCache.get(dynamicModel.getId());
            Map<String, Set<String>> propertiesKeys = keysCache.get("propertiesKeys");
            Map<String, Set<String>> associationKeys = keysCache.get("associationKeys");
            Set<String> propertiesKeys_dateTypeKeys = propertiesKeys.get("dateTypeKeys");
            Set<String> propertiesKeys_dataModelTypeKeys = propertiesKeys.get("dataModelTypeKeys");
            Set<String> associationKeys_dateTypeKeys = associationKeys.get("dateTypeKeys");
            Set<String> associationKeys_dataModelTypeKeys =
                associationKeys.get("dataModelTypeKeys");
            dataModelSource
                .getProperties()
                .forEach(
                    (name, value) -> {
                      try {
                        if (propertiesKeys_dateTypeKeys.contains(name)) {
                          dataModelTarget.getProperties().put(name, new Date((Long) value));
                        } else if (propertiesKeys_dataModelTypeKeys.contains(name)) {
                          dataModelTarget
                              .getProperties()
                              .put(name, dataModelTargetCache.get(value));
                        } else {
                          dataModelTarget.getProperties().put(name, value);
                        }
                      } catch (Exception e) {
                        //
                      }
                    });
            dataModelSource
                .getAssociation()
                .forEach(
                    property -> {
                      Map<String, Object> newProperty = new LinkedHashMap<>();
                      property.forEach(
                          (name, value) -> {
                            try {
                              if (associationKeys_dateTypeKeys.contains(name)) {
                                newProperty.put(name, new Date((Long) value));
                              } else if (associationKeys_dataModelTypeKeys.contains(name)) {
                                newProperty.put(name, dataModelTargetCache.get(value));
                              } else {
                                newProperty.put(name, value);
                              }
                            } catch (Exception e) {
                              //
                            }
                          });
                      dataModelTarget.getAssociation().add(newProperty);
                    });
          }
        });

    Template templateTemplate = new Template();
    templateTemplate.setIsDelete(false);
    templateTemplate.setGenerator(generator);
    List<Template> templates = templateRepository.selectList(templateTemplate);
    Map<Long, Template> templateCache = new HashMap<>();
    templates.forEach(
        template -> {
          Template newTemplate = new Template();
          newTemplate.setId(template.getId());
          newTemplate.setName(template.getName());
          newTemplate.setUrl(template.getUrl());
          templateCache.put(template.getId(), newTemplate);
        });

    Long generateId = idWorker.nextId();
    User developer = userRepository.selectById(generator.getDeveloper().getId());
    TemplateStrategy templateStrategyClone = templateStrategy.clone();

    Global global = new Global();
    global.setGenerateId(generateId);
    global.setTemplateCache(templateCache);

    User userClone = new User();
    userClone.setId(userId);
    userClone.setUserName(authentication.getUserName());
    global.setUser(userClone);

    Generator generatorClone = new Generator();
    generatorClone.setId(generator.getId());
    generatorClone.setName(generator.getName());
    global.setGenerator(generatorClone);

    GeneratorInstance generatorInstanceClone = new GeneratorInstance();
    generatorInstanceClone.setId(generatorInstance.getId());
    generatorInstanceClone.setName(generatorInstance.getName());
    global.setGeneratorInstance(generatorInstanceClone);

    User developerClone = new User();
    developerClone.setId(developer.getId());
    developerClone.setUserName(developer.getUserName());
    global.setDeveloper(developerClone);

    global.setTemplateStrategy(templateStrategyClone);

    Context context = new Context();
    context.setVariable("global", global);
    context.setVariable("data", dataModelTargetCache.get(rootDataModel.getId()));
    try {
      templateStrategyClone.execute(context);
    } catch (Throwable e) {
      List<String> messages = new ArrayList<>();
      LinkedList<Throwable> exceptionStack = new LinkedList<>();
      exceptionStack.push(e);
      while (!exceptionStack.isEmpty()) {
        Throwable exception = exceptionStack.pop();
        messages.add(exception.toString());
        if (exception.getCause() != null) {
          exceptionStack.push(exception.getCause());
        }
      }
      runResult.setMessages(messages);
      return runResult;
    }
    String generatePath =
        ConfigProperties.TEMPORARY_PATH
            + ConfigProperties.fileSeparator
            + userId
            + ConfigProperties.fileSeparator
            + generatorInstance.getName()
            + "("
            + generateId
            + ")";
    FileUtil.mkdirs(generatePath);
    File generateFolder = new File(generatePath);
    try {
      ZipUtil.compress(generateFolder);
    } catch (Exception e) {
      throw new AppException(e, "压缩文件失败");
    }
    FileUtil.deleteFile(generateFolder);
    runResult.setUrl(userId + "/" + generatorInstance.getName() + "(" + generateId + ").zip");
    runResult.setFileName(generatorInstance.getName() + "(" + generateId + ").zip");
    return runResult;
  }
Esempio n. 3
0
  private Component create() {
    JPanel result = new JPanel(new BorderLayout());
    final DynamicModel model = new DynamicModel();

    final JSpinField rowCount = new JSpinField(0, 1000);
    rowCount.setValue(model.getRowCount());
    rowCount.addPropertyChangeListener(
        SwingProperties.SPIN_FIELD_VALUE_PROPERTY,
        new PropertyChangeListener() {
          @Override
          public void propertyChange(PropertyChangeEvent evt) {
            model.setRowCount(rowCount.getValue());
          }
        });
    final JSpinField colCount = new JSpinField(0, 1000);
    colCount.setValue(model.getColumnCount());
    colCount.addPropertyChangeListener(
        SwingProperties.SPIN_FIELD_VALUE_PROPERTY,
        new PropertyChangeListener() {
          @Override
          public void propertyChange(PropertyChangeEvent evt) {
            model.setColCount(colCount.getValue());
          }
        });

    JPanel north = new JPanel(new FlowLayout());
    north.add(new JLabel("RowCount:"));
    north.add(rowCount);
    north.add(new JLabel("ColCount:"));
    north.add(colCount);
    north.setBorder((Border) UIManager.get("Nb.Editor.Toolbar.border"));
    result.add(north, BorderLayout.NORTH);

    JGrid grid = new JGrid();

    grid.setModel(model);
    grid.setNoDataRenderer(new XTable.DefaultNoDataRenderer("Drag anything here"));
    grid.setRowSelectionAllowed(true);
    grid.setColumnSelectionAllowed(true);
    grid.setTransferHandler(
        new TransferHandler() {
          Random r = new Random();

          @Override
          public boolean canImport(TransferHandler.TransferSupport support) {
            return true;
          }

          @Override
          public boolean importData(TransferHandler.TransferSupport support) {
            model.setColCount(r.nextInt(10));
            model.setRowCount(r.nextInt(10));
            return true;
          }
        });

    result.add(grid, BorderLayout.CENTER);
    return result;
  }
  /**
   * @param dynamicModels
   * @param modelName
   * @return model with given name
   */
  private DynamicModel findModel(Collection<DynamicModel> models, String modelName) {
    assertNotNull(models);
    for (DynamicModel model : models) {
      if (model.getName().equals(modelName)) return model;
    }

    Assert.fail("No dynamic model named " + modelName);
    return null;
  }
  @Test
  public void testCommentsInDynamicVdb() throws Exception {
    MockFileBuilder portfolioXmlFile = VdbTestUtils.mockPortfolioVdbXmlFile();
    DynamicVdb vdb = new DynamicVdb(portfolioXmlFile.getResourceFile());

    CommentSets vdbComments = vdb.getComments();
    assertNotNull(vdbComments);
    assertEquals(2, vdbComments.size());
    checkComment(Comments.VDB_TITLE, vdbComments, EMPTY_STRING, 0);
    checkComment(Comments.VDB_TITLE_2, vdbComments, EMPTY_STRING, 1);
    checkComment(Comments.VDB_DESCRIPTION, vdbComments, DESCRIPTION, 0);

    CommentSets propertyComments = vdb.getPropertyComments("UseConnectorMetadata");
    assertNotNull(propertyComments);

    checkComment(Comments.USE_CONNECTOR_PROPERTY, propertyComments, EMPTY_STRING, 0);

    DynamicModel model = findModel(vdb.getDynamicModels(), "MarketData");
    checkComment(Comments.MODEL_MARKETDATA, model.getComments(), EMPTY_STRING, 0);

    VdbSource source = model.getSources()[0];
    assertEquals("text-connector", source.getName());
    checkComment(Comments.MARKETDATA_TEXT_CONNECTOR, source.getComments(), EMPTY_STRING, 0);

    model = findModel(vdb.getDynamicModels(), "Accounts");
    propertyComments = model.getPropertyComments("importer.useFullSchemaName");
    assertNotNull(propertyComments);
    checkComment(Comments.ACCOUNTS_USEFULLSCHEMA_PROPERTY, propertyComments, EMPTY_STRING, 0);

    source = model.getSources()[0];
    assertEquals("h2-connector", source.getName());
    checkComment(Comments.ACCOUNT_H2_CONNECTOR, source.getComments(), EMPTY_STRING, 0);

    model = findModel(vdb.getDynamicModels(), "PersonalValuations");
    propertyComments = model.getPropertyComments("importer.headerRowNumber");
    assertNotNull(propertyComments);
    checkComment(Comments.IMPORTER_HEADER_ROW_NUMBER_PROPERTY, propertyComments, EMPTY_STRING, 0);

    propertyComments = model.getPropertyComments("importer.ExcelFileName");
    assertNotNull(propertyComments);
    checkComment(Comments.IMPORT_EXCEL_FILE_NAME_PROPERTY, propertyComments, EMPTY_STRING, 0);

    Metadata metadata = model.getMetadata();
    assertNotNull(metadata);
    checkComment(Comments.METADATA_ELEMENT, metadata.getComments(), EMPTY_STRING, 0);

    Iterator<DataRole> dataRoleIter = vdb.getDataRoles().iterator();
    DataRole dataRole = dataRoleIter.next();
    assertNotNull(dataRole);
    checkComment(Comments.DATA_ROLE, dataRole.getComments(), EMPTY_STRING, 0);
    checkComment(Comments.DATA_ROLE_DESCRIPTION, dataRole.getComments(), DESCRIPTION, 0);
    checkComment(
        Comments.SUPERVISOR_MAPPED_ROLE,
        dataRole.getComments(),
        MAPPED_ROLE_NAME + HYPHEN + "supervisor",
        0);
    checkComment(
        Comments.DEPT_SUPER_MAPPED_ROLE,
        dataRole.getComments(),
        MAPPED_ROLE_NAME + HYPHEN + "dept-supervisor",
        0);

    Collection<Permission> permissions = dataRole.getPermissions();
    assertNotNull(permissions);
    Iterator<Permission> permIter = permissions.iterator();
    assertTrue(permIter.hasNext());
    Permission permission = permIter.next();
    assertEquals("Accounts", permission.getName());
    checkComment(Comments.PERMISSION_ON_ACCOUNTS_TABLE, permission.getComments(), EMPTY_STRING, 0);
    checkComment(
        Comments.RESOURCE_NAME_REFERENCED_BY_PERMISSION,
        permission.getComments(),
        RESOURCE_NAME,
        0);
    checkComment(Comments.DENY_CREATE, permission.getComments(), ALLOW_CREATE, 0);
    checkComment(Comments.ALLOW_READ, permission.getComments(), ALLOW_READ, 0);
    checkComment(Comments.ALLOW_UPDATE, permission.getComments(), ALLOW_UPDATE, 0);

    permission = permIter.next();
    assertEquals("Accounts.Customer", permission.getName());

    CommentSets conditionComments = permission.getConditionComments();
    assertNotNull(conditionComments);
    checkComment(Comments.PERMISSION_USING_A_CONDITION, conditionComments, EMPTY_STRING, 0);

    permission = permIter.next();
    assertEquals("Accounts.Customer.SSN", permission.getName());
    CommentSets maskComments = permission.getMaskComments();
    assertNotNull(maskComments);
    checkComment(Comments.PERMISSION_MASK, maskComments, EMPTY_STRING, 0);
  }
  @Test
  public void convertDynamicVdbToXmiVdb() throws Exception {
    DynamicVdb dynVdb = VdbTestUtils.mockPortfolioDynamicVdb(modelWorkspaceMock);
    assertNotNull(dynVdb);

    IFile dynVdbSrcFile = dynVdb.getSourceFile();
    IProject parent = dynVdbSrcFile.getProject();
    assertNotNull(parent);

    File destFile = File.createTempFile(dynVdb.getName(), ITeiidVdb.VDB_DOT_EXTENSION);
    MockFileBuilder destination = new MockFileBuilder(destFile);

    XmiVdb xmiVdb = dynVdb.convert(XmiVdb.class, destination.getResourceFile(), new Properties());

    assertEquals(dynVdb.getName(), xmiVdb.getName());
    assertEquals(dynVdb.getDescription(), xmiVdb.getDescription());

    for (Map.Entry<Object, Object> entry : dynVdb.getProperties().entrySet()) {
      System.out.println(
          "VDB Property:  "
              + entry.getValue()
              + " == "
              + xmiVdb.getProperties().getProperty(entry.getKey().toString()));
      assertEquals(entry.getValue(), xmiVdb.getProperties().getProperty(entry.getKey().toString()));
    }

    assertEquals(destination.getResourceFile(), xmiVdb.getSourceFile());
    assertEquals(dynVdb.getVersion(), xmiVdb.getVersion());

    assertEquals(dynVdb.getConnectionType(), xmiVdb.getConnectionType());
    assertEquals(dynVdb.isPreview(), xmiVdb.isPreview());
    assertEquals(dynVdb.getQueryTimeout(), xmiVdb.getQueryTimeout());

    assertEquals(dynVdb.getAllowedLanguages().size(), xmiVdb.getAllowedLanguages().size());
    List<String> dynLanguageValues =
        Arrays.asList(xmiVdb.getAllowedLanguages().getAllowedLanguageValues());
    for (String language : dynVdb.getAllowedLanguages().getAllowedLanguageValues()) {
      assertTrue(dynLanguageValues.contains(language));
    }

    assertEquals(dynVdb.getSecurityDomain(), xmiVdb.getSecurityDomain());
    assertEquals(dynVdb.getGssPattern(), xmiVdb.getGssPattern());
    assertEquals(dynVdb.getPasswordPattern(), xmiVdb.getPasswordPattern());
    assertEquals(dynVdb.getAuthenticationType(), xmiVdb.getAuthenticationType());
    assertEquals(dynVdb.getValidationDateTime(), xmiVdb.getValidationDateTime());
    assertEquals(dynVdb.isAutoGenerateRESTWar(), xmiVdb.isAutoGenerateRESTWar());

    assertEquals(dynVdb.getImports().size(), xmiVdb.getImports().size());
    for (VdbImportVdbEntry entry : dynVdb.getImports()) {
      assertTrue(xmiVdb.getImports().contains(entry));
    }

    assertEquals(dynVdb.getTranslators().size(), xmiVdb.getTranslators().size());
    for (TranslatorOverride translator : dynVdb.getTranslators()) {
      assertTrue(xmiVdb.getTranslators().contains(translator));
    }

    assertEquals(dynVdb.getDataRoles().size(), xmiVdb.getDataRoles().size());
    for (DataRole role : dynVdb.getDataRoles()) {
      assertTrue(xmiVdb.getDataRoles().contains(role));
    }

    assertEquals(dynVdb.getDynamicModels().size(), xmiVdb.getModelEntries().size());
    for (DynamicModel dynModel : dynVdb.getDynamicModels()) {

      VdbModelEntry modelEntry = null;
      Collection<VdbModelEntry> entries = xmiVdb.getModelEntries();
      for (VdbModelEntry entry : entries) {
        if (dynModel.getName().equals(entry.getName())) {
          modelEntry = entry;
          break;
        }
      }
      assertNotNull(modelEntry);

      assertEquals(dynModel.getDescription(), modelEntry.getDescription());

      for (Map.Entry<Object, Object> prop : dynModel.getProperties().entrySet()) {
        assertEquals(
            prop.getValue(), modelEntry.getProperties().getProperty(prop.getKey().toString()));
      }

      VdbSourceInfo sourceInfo = modelEntry.getSourceInfo();

      assertEquals(dynModel.getModelType().toString(), modelEntry.getType());
      assertEquals(dynModel.isMultiSource(), sourceInfo.isMultiSource());
      assertEquals(dynModel.doAddColumn(), sourceInfo.isAddColumn());
      assertEquals(dynModel.getColumnAlias(), sourceInfo.getColumnAlias());

      assertEquals(dynModel.getSources().length, sourceInfo.getSources().size());
      List<VdbSource> entrySources = new ArrayList<VdbSource>(sourceInfo.getSources());
      for (VdbSource source : dynModel.getSources()) {
        assertTrue(entrySources.contains(source));
      }
    }
  }