Skip to content

Commit

Permalink
Serialize/deseialize list of DTO using same mechanism as single DTO o…
Browse files Browse the repository at this point in the history
…bject

Signed-off-by: Max Shaposhnik <[email protected]>
  • Loading branch information
mshaposhnik authored Oct 8, 2019
1 parent 5be73ff commit 88033a0
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
*/
package org.eclipse.che.api.core.rest;

import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
Expand Down Expand Up @@ -56,6 +57,8 @@
public class CheJsonProvider<T> implements MessageBodyReader<T>, MessageBodyWriter<T> {
private Set<Class> ignoredClasses;
private final JsonEntityProvider delegate = new JsonEntityProvider<>();
private final Type listOfJsonSerializableType =
new TypeToken<List<JsonSerializable>>() {}.getType();

@Inject
public CheJsonProvider(@Nullable @Named("che.json.ignored_classes") Set<Class> ignoredClasses) {
Expand Down Expand Up @@ -95,6 +98,10 @@ public void writeTo(
try (Writer w = new OutputStreamWriter(entityStream, StandardCharsets.UTF_8)) {
((JsonSerializable) t).toJson(w);
}
} else if (isDtoList(type, genericType, t)) {
try (Writer w = new OutputStreamWriter(entityStream, StandardCharsets.UTF_8)) {
DtoFactory.getInstance().getGson().toJson(t, listOfJsonSerializableType, w);
}
} else {
delegate.writeTo(t, type, genericType, annotations, mediaType, httpHeaders, entityStream);
}
Expand All @@ -121,15 +128,10 @@ public T readFrom(
throws IOException, WebApplicationException {
if (type.isAnnotationPresent(DTO.class)) {
return DtoFactory.getInstance().createDtoFromJson(entityStream, type);
} else if (type.isAssignableFrom(List.class) && genericType instanceof ParameterizedType) {
} else if (isDtoList(type, genericType, null)) {
ParameterizedType parameterizedType = (ParameterizedType) genericType;
Type elementType = parameterizedType.getActualTypeArguments()[0];
if (elementType instanceof Class) {
Class elementClass = (Class) elementType;
if (elementClass.isAnnotationPresent(DTO.class)) {
return (T) DtoFactory.getInstance().createListDtoFromJson(entityStream, elementClass);
}
}
return (T) DtoFactory.getInstance().createListDtoFromJson(entityStream, (Class) elementType);
}
return (T)
delegate.readFrom(type, genericType, annotations, mediaType, httpHeaders, entityStream);
Expand All @@ -142,4 +144,20 @@ public T readFrom(
public Set<Class> getIgnoredClasses() {
return ignoredClasses;
}

/** Checks if provided object is a list of DTO or serializable objects. */
private static <T> boolean isDtoList(Class<?> type, Type genericType, T t) {
if (!List.class.isAssignableFrom(type)) {
return false;
}
if (genericType instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) genericType;
Type elementType = parameterizedType.getActualTypeArguments()[0];
return elementType instanceof Class && ((Class) elementType).isAnnotationPresent(DTO.class);
} else if (t instanceof List && type.equals(genericType)) {
List list = (List) t;
return !list.isEmpty() && list.iterator().next() instanceof JsonSerializable;
}
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import com.google.gson.reflect.TypeToken;
import com.jayway.restassured.response.Response;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand All @@ -59,6 +60,7 @@
import org.eclipse.che.api.core.model.workspace.runtime.Server;
import org.eclipse.che.api.core.model.workspace.runtime.ServerStatus;
import org.eclipse.che.api.core.rest.ApiExceptionMapper;
import org.eclipse.che.api.core.rest.CheJsonProvider;
import org.eclipse.che.api.core.rest.shared.dto.ServiceError;
import org.eclipse.che.api.workspace.server.devfile.DevfileManager;
import org.eclipse.che.api.workspace.server.devfile.URLFetcher;
Expand Down Expand Up @@ -126,6 +128,9 @@ public class WorkspaceServiceTest {
@SuppressWarnings("unused")
private static final EnvironmentFilter FILTER = new EnvironmentFilter();

@SuppressWarnings("unused") // is declared for deploying by everrest-assured
private CheJsonProvider jsonProvider = new CheJsonProvider(Collections.emptySet());

@Mock private WorkspaceManager wsManager;
@Mock private MachineTokenProvider machineTokenProvider;
@Mock private WorkspaceLinksGenerator linksGenerator;
Expand Down

0 comments on commit 88033a0

Please sign in to comment.