@SuppressWarnings("static-method")
  public Map<String, Object> processModels(
      CodegenConfig config, Map<String, Model> definitions, Map<String, Model> allDefinitions) {
    Map<String, Object> objs = new HashMap<String, Object>();
    objs.put("package", config.modelPackage());
    List<Object> models = new ArrayList<Object>();
    Set<String> allImports = new LinkedHashSet<String>();
    for (String key : definitions.keySet()) {
      Model mm = definitions.get(key);
      CodegenModel cm = config.fromModel(key, mm, allDefinitions);
      Map<String, Object> mo = new HashMap<String, Object>();
      mo.put("model", cm);
      mo.put("importPath", config.toModelImport(key));
      models.add(mo);

      allImports.addAll(cm.imports);
    }
    objs.put("models", models);

    Set<String> importSet = new TreeSet<String>();
    for (String nextImport : allImports) {
      String mapping = config.importMapping().get(nextImport);
      if (mapping == null) {
        mapping = config.toModelImport(nextImport);
      }
      if (mapping != null && !config.defaultIncludes().contains(mapping)) {
        importSet.add(mapping);
      }
      // add instantiation types
      mapping = config.instantiationTypes().get(nextImport);
      if (mapping != null && !config.defaultIncludes().contains(mapping)) {
        importSet.add(mapping);
      }
    }

    List<Map<String, String>> imports = new ArrayList<Map<String, String>>();
    for (String s : importSet) {
      Map<String, String> item = new HashMap<String, String>();
      item.put("import", s);
      imports.add(item);
    }

    objs.put("imports", imports);
    config.postProcessModels(objs);

    return objs;
  }