private static JsonElement parse(File file) {
   try {
     InputStream stream = new FileInputStream(file);
     try {
       Reader fileReader = new InputStreamReader(stream, Charsets.UTF_8);
       JsonReader jsonReader = new JsonReader(fileReader);
       jsonReader.setLenient(true);
       return Streams.parse(jsonReader);
     } finally {
       stream.close();
     }
   } catch (IOException e) {
     throw Throwables.propagate(e);
   }
 }
 public JsonElement parse(JsonReader jsonreader)
     throws JsonIOException, JsonSyntaxException
 {
     boolean flag;
     flag = jsonreader.isLenient();
     jsonreader.setLenient(true);
     JsonElement jsonelement = Streams.parse(jsonreader);
     jsonreader.setLenient(flag);
     return jsonelement;
     Object obj;
     obj;
     throw new JsonParseException((new StringBuilder()).append("Failed parsing JSON source: ").append(jsonreader).append(" to Json").toString(), ((Throwable) (obj)));
     obj;
     jsonreader.setLenient(flag);
     throw obj;
     obj;
     throw new JsonParseException((new StringBuilder()).append("Failed parsing JSON source: ").append(jsonreader).append(" to Json").toString(), ((Throwable) (obj)));
 }
 @Override
 public JsonElement next() throws JsonParseException {
   if (!this.hasNext()) {
     throw new NoSuchElementException();
   }
   try {
     JsonElement jsonElement = Streams.parse(this.parser);
     return jsonElement;
   } catch (StackOverflowError var1_2) {
     throw new JsonParseException("Failed parsing JSON source to Json", var1_2);
   } catch (OutOfMemoryError var1_3) {
     throw new JsonParseException("Failed parsing JSON source to Json", var1_3);
   } catch (JsonParseException var2_5) {
     RuntimeException runtimeException = var2_5;
     if (var2_5.getCause() instanceof EOFException) {
       runtimeException = new NoSuchElementException();
     }
     throw runtimeException;
   }
 }
    @Override
    public T read(JsonReader in) throws IOException {
      JsonObject el = Streams.parse(in).getAsJsonObject();

      // Strip existing json schedules
      JsonObject directSchedules =
          el.has(SCHEDULES_FIELD_NAME)
              ? el.remove(SCHEDULES_FIELD_NAME).getAsJsonObject()
              : new JsonObject();

      // Strip off @schedule annotations to update schedules attribute
      // Load annotated schedules
      JsonObject annotatedSchedules = new JsonObject();
      // TODO: make this recursive to have nested schedules with dot notation
      for (Map.Entry<String, JsonElement> entry : el.entrySet()) {
        JsonElement entryEl = entry.getValue();
        if (entryEl.isJsonObject()) {
          JsonObject subConfig = entryEl.getAsJsonObject();
          if (subConfig.has(SCHEDULE)) {
            JsonElement scheduleConfig = subConfig.remove(SCHEDULE);
            annotatedSchedules.add(entry.getKey(), scheduleConfig);
          }
        }
      }

      T result = delegateAdapter.read(new JsonTreeReader(el));

      // If there is a 'schedules' field, inject schedules
      Field schedulesField = AnnotationUtil.getField(SCHEDULES_FIELD_NAME, result.getClass());
      if (schedulesField != null) {
        ///// Default schedules for every schedulable top level object
        JsonObject defaultSchedules = new JsonObject();
        List<Field> fields = new ArrayList<Field>();
        for (Field field : AnnotationUtil.getAllFields(fields, result.getClass())) {
          DefaultSchedule defaultSchedule = field.getAnnotation(DefaultSchedule.class);
          if (defaultSchedule == null) {
            boolean currentAccessibility = field.isAccessible();
            try {
              field.setAccessible(true);
              Object fieldValue = field.get(result);
              if (fieldValue != null) {
                Class<?> fieldRuntimeClass = field.get(result).getClass();
                defaultSchedule = fieldRuntimeClass.getAnnotation(DefaultSchedule.class);
              }
            } catch (IllegalArgumentException e) {
              Log.e(LogUtil.TAG, "Bad access of configurable fields!!", e);
            } catch (IllegalAccessException e) {
              Log.e(LogUtil.TAG, "Bad access of configurable fields!!", e);
            } finally {
              field.setAccessible(currentAccessibility);
            }
          }
          if (defaultSchedule != null) {
            defaultSchedules.add(
                field.getName(), gson.toJsonTree(defaultSchedule, DefaultSchedule.class));
          }
        }

        JsonObject schedulesJson = directSchedules;
        JsonUtils.deepCopyOnto(
            defaultSchedules,
            schedulesJson,
            false); // Copy in default schedules, but do not replace
        JsonUtils.deepCopyOnto(
            annotatedSchedules, schedulesJson, true); // Override with annotations

        // For each schedule find default schedule, fill in remainder
        Map<String, Schedule> schedules =
            gson.fromJson(schedulesJson, new TypeToken<Map<String, Schedule>>() {}.getType());

        boolean currentAccessibility = schedulesField.isAccessible();
        try {
          schedulesField.setAccessible(true);
          schedulesField.set(result, schedules);
        } catch (IllegalArgumentException e) {
          Log.e(LogUtil.TAG, "Bad access of configurable fields!!", e);
        } catch (IllegalAccessException e) {
          Log.e(LogUtil.TAG, "Bad access of configurable fields!!", e);
        } finally {
          schedulesField.setAccessible(currentAccessibility);
        }
      }

      return result;
    }