package com.eslint.config.schema; import com.google.gson.*; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.List; public final class ESLintSchema { public static final String RULES = "rules"; // public RootProp properties; // public static final SchemaJsonObject instance = load(); // public static SchemaJsonObject ROOT = new SchemaJsonObject("root", PropertyType.OBJECT, "", new BaseType[]{ // new SchemaJsonObject("env", PropertyType.OBJECT, "env", // new BaseType[]{ // new BaseType("amd", PropertyType.BOOLEAN, "amd"), // new BaseType("node", PropertyType.BOOLEAN, "node"), // new BaseType("browser", PropertyType.BOOLEAN, "browser") // } // ), // new SchemaJsonObject("globals", PropertyType.OBJECT, "globals", new BaseType[]{ // new BaseType(BaseType.ANY_NAME, PropertyType.BOOLEAN, "") // }), // new SchemaJsonObject("rules", PropertyType.OBJECT, "rules", new BaseType[]{}) // } // ); public static SchemaJsonObject ROOT; private ESLintSchema() { } public static void buildSchema() { BaseType rules = ROOT.find(RULES); if (rules != null) { List<BaseType> rulesMap = ContainerUtil.map(RuleCache.instance.rulesMap, new Function<String, BaseType>() { public BaseType fun(String rule) { return new BaseType(rule, PropertyType.ANY, rule); } }); if (rules instanceof SchemaJsonObject) { SchemaJsonObject obj = (SchemaJsonObject) rules; obj.properties = rulesMap.toArray(new BaseType[rulesMap.size()]); } } } // public static Gson getGson() { // // Gson gson = new GsonBuilder().setPrettyPrinting().create(); // GsonBuilder builder = new GsonBuilder(); // builder.registerTypeAdapter(BaseType.class, new BaseTypeAdapter()); // return builder.setPrettyPrinting().create(); // } public static Gson getGson() { RuntimeTypeAdapterFactory<BaseType> adapter = RuntimeTypeAdapterFactory.of(BaseType.class, "type") .registerSubtype(SchemaJsonObject.class, PropertyType.OBJECT.name()) .registerSubtype(BaseType.SchemaString.class, PropertyType.STRING.name()) .registerSubtype(BaseType.SchemaAny.class, PropertyType.ANY.name()) .registerSubtype(BaseType.SchemaBoolean.class, PropertyType.BOOLEAN.name()); GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapterFactory(adapter); return builder.setPrettyPrinting().create(); } public static SchemaJsonObject load() { // FileReader reader = null; InputStreamReader reader = null; try { // reader = new FileReader(schema); InputStream stream = ESLintSchema.class.getResourceAsStream("/com/eslint/config/schema/schema.json"); // Reader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); reader = new InputStreamReader(stream, "UTF-8"); Gson gson = getGson(); SchemaJsonObject ret = gson.fromJson(reader, SchemaJsonObject.class); ROOT = ret; // System.out.println(ret.description); return ret; } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } // public static class BaseTypeAdapter implements JsonSerializer<BaseType>, JsonDeserializer<BaseType> { // private static final String CLASSNAME = "CLASSNAME"; // private static final String INSTANCE = "INSTANCE"; // private static final String TYPE = "class-type"; // // @Override // public JsonElement serialize(BaseType src, Type typeOfSrc, JsonSerializationContext context) { // JsonObject retValue = new JsonObject(); // String className = src.getClass().getCanonicalName(); // retValue.addProperty(CLASSNAME, className); // JsonElement elem = context.serialize(src); // elem.getAsJsonObject().addProperty(TYPE, className); // retValue.add(INSTANCE, elem); // return retValue; // } // // @Override // public BaseType deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { // JsonObject jsonObject = json.getAsJsonObject(); // JsonPrimitive prim = (JsonPrimitive) jsonObject.get(CLASSNAME); // String className = prim.getAsString(); // // Class<?> klass; // try { // klass = Class.forName(className); // } catch (ClassNotFoundException e) { // e.printStackTrace(); // throw new JsonParseException(e.getMessage()); // } // return context.deserialize(jsonObject.get(INSTANCE), klass); // } // } // public static class BookTypeAdapter extends TypeAdapter<BaseType> { // @Override // public BaseType read(final JsonReader in) throws IOException { // final BaseType book = new BaseType(); // in.beginObject(); // while (in.hasNext()) { // switch (in.nextName()) { // case "isbn": // super.read(in); // book.setIsbn(in.nextString()); // break; // case "title": // book.setTitle(in.nextString()); // break; // case "authors": // book.setAuthors(in.nextString().split(";")); // break; // } // } // in.endObject(); // return book; // } // // @Override // public void write(final JsonWriter out, final BaseType book) throws IOException { // out.beginObject(); // out.name("isbn").value(book.getIsbn()); // out.name("title").value(book.getTitle()); // out.name("authors").value(StringUtils.join(book.getAuthors(), ";")); // out.endObject(); // } // } // public static class PropertyTypeAdapter implements JsonSerializer<PropertyType>, JsonDeserializer<PropertyType> { // private static final String CLASSNAME = "CLASSNAME"; // private static final String INSTANCE = "INSTANCE"; // private static final String TYPE = "type"; // // @Override // public JsonElement serialize(PropertyType src, Type typeOfSrc, JsonSerializationContext context) { //// JsonObject retValue = new JsonObject(); // String className = src.getClass().getCanonicalName(); //// retValue.addProperty(CLASSNAME, className); // JsonElement elem = context.serialize(src); // elem.getAsJsonObject().addProperty(TYPE, className); //// retValue.add(INSTANCE, elem); // return elem; // } // // @Override // public PropertyType deserialize(PropertyType json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { // JsonObject jsonObject = json.getAsJsonObject(); // JsonPrimitive prim = (JsonPrimitive) jsonObject.get(CLASSNAME); // String className = prim.getAsString(); // // Class<?> klass; // try { // klass = Class.forName(className); // } catch (ClassNotFoundException e) { // e.printStackTrace(); // throw new JsonParseException(e.getMessage()); // } // return context.deserialize(jsonObject.get(INSTANCE), klass); // } // } public enum PropertyType {ANY, BOOLEAN, STRING, OBJECT, INT} }