package com.sap.hana.cloud.samples.benefits.connectivity.helper;
import java.io.IOException;
import java.io.StringReader;
import java.util.Collections;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.stream.JsonReader;
import com.sap.hana.cloud.samples.benefits.api.util.GsonFactory;
import com.sap.hana.cloud.samples.benefits.odata.beans.UserInfo;
import com.sap.hana.cloud.samples.benefits.odata.beans.UserPhoto;
public class CoreODataParser {
private static final CoreODataParser INSTANCE = new CoreODataParser();
public static CoreODataParser getInstance() {
return INSTANCE;
}
private final Gson defaultGson = GsonFactory.getInstance().createDefaultGson();
private CoreODataParser() {
}
@SuppressWarnings("synthetic-access")
public SFUser loadSFUserProfileFromJsom(String json) throws IOException {
return load(json, new JsonLoadingJob<SFUser>() {
@Override
public SFUser loadFromJson(JsonReader reader) {
return defaultGson.fromJson(reader, SFUser.class);
}
});
}
@SuppressWarnings("synthetic-access")
public UserInfo loadUserInfoFromJson(String json) throws IOException {
return load(json, new JsonLoadingJob<UserInfo>() {
@Override
public UserInfo loadFromJson(JsonReader reader) {
return defaultGson.fromJson(reader, UserInfo.class);
}
});
}
@SuppressWarnings("synthetic-access")
public List<SFUser> loadSFUserProfileListFromJsom(String json) throws IOException {
if (json == null) {
return Collections.emptyList();
}
return load(json, new JsonLoadingJob<List<SFUser>>() {
@Override
public List<SFUser> loadFromJson(JsonReader reader) {
SFUserList sfUserList = defaultGson.fromJson(reader, SFUserList.class);
return sfUserList.results;
}
});
}
private JsonReader createJsonReader(String json) throws IOException {
JsonReader reader = new JsonReader(new StringReader(json));
return openJsonReader(reader);
}
private JsonReader openJsonReader(JsonReader reader) throws IOException {
// Bypasses the top level element
reader.beginObject();
reader.nextName();
return reader;
}
private JsonReader closeJsonReader(JsonReader reader) throws IOException {
reader.endObject();
reader.close();
return reader;
}
@SuppressWarnings("synthetic-access")
public String loadUserPhoto(String json) throws IOException {
return load(json, new JsonLoadingJob<String>() {
@Override
public String loadFromJson(JsonReader reader) {
UserPhoto userPhoto = defaultGson.fromJson(reader, UserPhoto.class);
return userPhoto.getPhoto();
}
});
}
private <T> T load(String json, JsonLoadingJob<T> job) throws IOException {
JsonReader reader = createJsonReader(json);
try {
return job.loadFromJson(reader);
} finally {
closeJsonReader(reader);
}
}
private interface JsonLoadingJob<T> {
T loadFromJson(JsonReader reader);
}
}