Esempio n. 1
0
  public HalResource deserialize(
      JsonElement json, Type typeOfT, JsonDeserializationContext context, Class<?> targetType)
      throws JsonParseException {
    // Das Objekt mal von Gson deserialiseren lassen
    HalResource result = context.deserialize(json, targetType);

    // Es handelt sich um ein JSON-Objekt.
    JsonObject jsonObject = json.getAsJsonObject();
    // Nodes mit den Links und den eingebetteten Resourcen auslesen
    JsonObject linkRoot = jsonObject.getAsJsonObject(HalConstants.LINK_ROOT);
    JsonObject embeddedRoot = jsonObject.getAsJsonObject(HalConstants.EMBEDDED_ROOT);

    // Die Felder nach Links und eingebetteten Resourcen absuchen
    List<Field> fields = HalReflectionHelper.getAllFields(targetType);
    for (Field field : fields) {
      // Ist es ein Link?
      if (HalReflectionHelper.isLink(field) && linkRoot != null) {
        // Metadaten auslesen
        HalReferenceMetaData metaData = HalReflectionHelper.getReferenceMetaData(field);

        // Im JSON danach suchen
        JsonElement jsonField = linkRoot.get(metaData.getName());

        // Wenn im JSON kein Feld gefunden wurde, müssen wir auch nichts machen
        if (jsonField == null) {
          continue;
        }

        // Wert aus dem Json zurück in das Objekt schreiben
        writeLink(result, field, jsonField, context);
      }

      // Ist es eine Resource?
      if (HalReflectionHelper.isResource(field) && embeddedRoot != null) {
        // Name der Resouce auslesen
        String resName = HalReflectionHelper.getResourceName(field);

        // Im JSON danach suchen
        JsonElement jsonField = embeddedRoot.get(resName);

        // Wenn im JSON kein entsprechendes Feld gefunden wurde, können wir auch nichts machen
        if (jsonField == null) {
          continue;
        }

        // Werte aus dem Json zurück ins Objekt schreiben
        writeResource(result, field, jsonField, context);
      }
    }

    return result;
  }
Esempio n. 2
0
 /**
  * Schreibt eine Referenz in einen einfachen String
  *
  * @param result Hal-Resource, in welcher sich die Referenz befindet
  * @param field Zu schreibendes Feld
  * @param jsonField JSON-Feld, welches die Referenz enthält
  * @param context GSON-Context für die Deserialisierung
  */
 private void writeLinkInString(
     HalResource result, Field field, JsonElement jsonField, JsonDeserializationContext context) {
   // Wir haben ein einzelne Objekt, das wir nun Deserialisieren
   HalReference halRef = context.deserialize(jsonField, HalReference.class);
   // Wert schreiben
   String href = halRef.getHref();
   HalReflectionHelper.setValue(result, field, href);
 }
Esempio n. 3
0
  protected void writeLink(
      HalResource result, Field field, JsonElement jsonField, JsonDeserializationContext context) {
    // Einfacher Fall: Das Feld ist ein String
    if (field.getType().equals(String.class)) {
      if (jsonField.isJsonObject()) {
        writeLinkInString(result, field, jsonField, context);
      } else if (jsonField.isJsonArray()) {
        // Wenn das Array nur ein Element hat, dann können wir es auch verarbeiten
        JsonArray jsonArray = jsonField.getAsJsonArray();
        if (jsonArray.size() == 1) {
          writeLinkInString(result, field, jsonArray.get(0), context);
        }
      }
    } else if (HalReference.class.isAssignableFrom(field.getType())) {
      if (jsonField.isJsonObject()) {
        writeLinkInReference(result, field, jsonField, context);
      } else if (jsonField.isJsonArray()) {
        // Wenn das Array nur ein Element hat, können wir es auch verarbeiten
        JsonArray jsonArray = jsonField.getAsJsonArray();
        if (jsonArray.size() == 1) {
          writeLinkInReference(result, field, jsonArray.get(0), context);
        }
      }
    } else if (Collection.class.isAssignableFrom(field.getType())) {
      // Wir erwarten ein JSON-Array
      if (jsonField.isJsonArray()) {
        // Collection auslesen
        Collection collection = (Collection) HalReflectionHelper.getValue(field, result);
        if (collection == null) {
          throw new HalDeserializingException("Collection is null; no values can be added");
        }

        JsonArray jsonArray = jsonField.getAsJsonArray();
        Iterator<JsonElement> iterator = jsonArray.iterator();

        while (iterator.hasNext()) {
          JsonElement element = iterator.next();
          writeLinkInCollection(collection, element, context);
        }
      }
    }
  }
Esempio n. 4
0
  private void writeResource(
      HalResource result, Field field, JsonElement jsonField, JsonDeserializationContext context) {
    if (HalResource.class.isAssignableFrom(field.getType())) {
      if (jsonField.isJsonObject()) {
        writeEmeddedInResource(result, field, jsonField, context);
      } else if (jsonField.isJsonArray()) {
        // Wenn das Array nur ein Element hat, dann können wir es verarbeiten
        JsonArray jsonArray = jsonField.getAsJsonArray();
        if (jsonArray.size() == 1) {
          writeEmeddedInResource(result, field, jsonArray.get(0), context);
        }
      }
    } else if (Collection.class.isAssignableFrom(field.getType())) {

      Collection collection = (Collection) HalReflectionHelper.getValue(field, result);

      // Generischer Type auslesen
      ParameterizedType gType = (ParameterizedType) field.getGenericType();
      Type[] actualTypeArguments = gType.getActualTypeArguments();

      if (collection == null) {
        throw new HalDeserializingException("Collection is null; no values can be added");
      }

      // Wir erwarten ein JSON-Array
      if (jsonField.isJsonArray()) {

        JsonArray jsonArray = jsonField.getAsJsonArray();
        Iterator<JsonElement> iterator = jsonArray.iterator();

        while (iterator.hasNext()) {
          JsonElement element = iterator.next();
          writeEmbeddedInCollection(collection, actualTypeArguments[0], element, context);
        }
      } else if (jsonField.isJsonObject()) {
        writeEmbeddedInCollection(collection, actualTypeArguments[0], jsonField, context);
      }
    }
  }
Esempio n. 5
0
 /**
  * Schreibt eine eingebettete Resource direkt ein eine {@link HalResource}
  *
  * @param result Hal-Resource, in welcher sich die eingebettete Resource befindet
  * @param field Zu schreibendes Feld
  * @param jsonField JSON-Feld, welches die Resource enthält
  * @param context GSON-Context für die Deserialisierung
  */
 protected void writeEmeddedInResource(
     HalResource result, Field field, JsonElement jsonField, JsonDeserializationContext context) {
   // Objekt deserialisieren
   Object resource = deserialize(jsonField, field.getType(), context, field.getType());
   HalReflectionHelper.setValue(result, field, resource);
 }
Esempio n. 6
0
 /**
  * Schreibt eine Referenz direkt ein eine {@link HalReference}
  *
  * @param result Hal-Resource, in welcher sich die Referenz befindet
  * @param field Zu schreibendes Feld
  * @param jsonField JSON-Feld, welches die Referenz enthält
  * @param context GSON-Context für die Deserialisierung
  */
 protected void writeLinkInReference(
     HalResource result, Field field, JsonElement jsonField, JsonDeserializationContext context) {
   Object reference = context.deserialize(jsonField, field.getType());
   HalReflectionHelper.setValue(result, field, reference);
 }