package de.tuberlin.onedrivesdk.drive;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import de.tuberlin.onedrivesdk.OneDriveException;
import de.tuberlin.onedrivesdk.common.ConcreteOneDriveSDK;
import de.tuberlin.onedrivesdk.folder.OneFolder;
import de.tuberlin.onedrivesdk.common.OneDriveError;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import java.io.IOException;
import java.util.List;
/**
* Implementation of the OneDrive Interface
*/
public class ConcreteOneDrive implements OneDrive {
protected String id;
protected ConcreteOneDriveSDK api;
protected String driveType;
protected DriveOwner owner;
protected DriveQuota quota;
protected String rawJson = "";
private static final Logger logger = LogManager.getLogger(ConcreteOneDrive.class);
private ConcreteOneDrive() {
}
public static List<OneDrive> parseDrivesFromJson(String json) throws OneDriveException, ParseException {
OneDriveError error;
if ((error = OneDriveError.parseError(json)) != null) {
throw new OneDriveException(error.toString());
}
JSONParser parser = new JSONParser();
JSONObject root = null;
try {
root = (JSONObject) parser.parse(json);
} catch (ParseException e) {
logger.warn("Something failed while parsing Json {}",e.getMessage());
logger.debug("Exception while parsing",e);
}
JSONArray values = (JSONArray) root.get("value");
json = values.toJSONString();
Gson gson = new Gson();
List<OneDrive> oneDrives = gson.fromJson(json, new TypeToken<List<ConcreteOneDrive>>() {
}.getType());
return oneDrives;
}
public static ConcreteOneDrive fromJSON(String json) throws ParseException, OneDriveException {
OneDriveError error;
if ((error = OneDriveError.parseError(json)) != null) {
throw new OneDriveException(error.toString());
}
Gson gson = new Gson();
ConcreteOneDrive drive = gson.fromJson(json, ConcreteOneDrive.class);
return drive.setRawJson(json);
}
public OneDrive setApi(ConcreteOneDriveSDK api) {
this.api = api;
return this;
}
public ConcreteOneDrive setRawJson(String rawJson) {
this.rawJson = rawJson;
return this;
}
@Override
public String getId() {
return id;
}
@Override
public String getDriveType() {
return driveType;
}
@Override
public DriveUser getUser() {
return owner.user;
}
@Override
public DriveQuota getQuota() {
return quota;
}
@Override
public String toString() {
return "Drive: "+ id + " - " + driveType + " " + owner;
}
@Override
public OneFolder getRootFolder() throws IOException, OneDriveException {
return api.getRootFolder(this);
}
@Override
public String getRawJson() {
return rawJson;
}
}