Implement the /user_catalogs API
[pithos-web-client] / src / gr / grnet / pithos / web / client / catalog / GetUserCatalogs.java
1 package gr.grnet.pithos.web.client.catalog;
2
3 import com.google.gwt.core.client.GWT;
4 import com.google.gwt.core.client.Scheduler;
5 import com.google.gwt.http.client.*;
6 import com.google.gwt.json.client.JSONArray;
7 import com.google.gwt.json.client.JSONObject;
8 import com.google.gwt.json.client.JSONParser;
9 import com.google.gwt.json.client.JSONValue;
10 import gr.grnet.pithos.web.client.Helpers;
11 import gr.grnet.pithos.web.client.Pithos;
12
13 import java.util.List;
14
15 /**
16  * The request via which we obtain user catalog info.
17  */
18 public class GetUserCatalogs implements Scheduler.ScheduledCommand {
19     private final String url;
20     private final String userToken;
21     private final List<String> ids;
22     private final List<String> names;
23
24     public static final int SuccessCode = 200;
25     public static final String CallEndPoint = "/user_catalogs";
26     public static final String RequestField_uuids = "uuids";
27     public static final String RequestField_displaynames = "displaynames";
28     public static final String ResponseField_displayname_catalog = "displayname_catalog";
29     public static final String ResponseField_uuid_catalog = "uuid_catalog";
30
31     public GetUserCatalogs(Pithos app) {
32         this(app, null, null);
33     }
34
35     public GetUserCatalogs(Pithos app, String userID) {
36         this(app, Helpers.toList(userID), null);
37     }
38
39     public GetUserCatalogs(Pithos app, List<String> ids, List<String> names) {
40         assert app != null;
41
42         // https://server.com/v1/ --> https://server.com
43         String path = app.getApiPath();
44         path = Helpers.stripTrailing(path, "/");
45         path = Helpers.upToIncludingLastPart(path, "/");
46         path = Helpers.stripTrailing(path, "/");
47
48         // https://server.com/user_catalogs
49         this.url = path + CallEndPoint;
50
51         this.ids = Helpers.safeList(ids);
52         this.names = Helpers.safeList(names);
53         this.userToken = app.getUserToken();
54     }
55
56     public String getURL() {
57         return url;
58     }
59
60     private JSONObject makeRequestData() {
61         final JSONObject root = new JSONObject();
62         final JSONArray uuids = Helpers.listToJSONArray(ids);
63         final JSONArray displaynames = Helpers.listToJSONArray(names);
64
65         root.put(RequestField_uuids, uuids);
66         root.put(RequestField_displaynames, displaynames);
67
68         return root;
69     }
70
71     public UserCatalogs parseResult(JSONObject result) {
72         final UserCatalogs userCatalogs = new UserCatalogs();
73         final JSONObject uuid_catalog = result.get(ResponseField_uuid_catalog).isObject();
74         final JSONObject displayname_catalog = result.get(ResponseField_displayname_catalog).isObject();
75
76         for(String uuid: uuid_catalog.keySet()) {
77             final String name = uuid_catalog.get(uuid).isString().stringValue();
78             userCatalogs.updateWithIDAndName(uuid, name);
79         }
80
81         for(String name: displayname_catalog.keySet()) {
82             final String uuid = displayname_catalog.get(name).isString().stringValue();
83             userCatalogs.updateWithIDAndName(uuid, name);
84         }
85
86         return userCatalogs;
87     }
88
89     public void onSuccess(Request request, Response response, JSONObject result, UserCatalogs userCatalogs) {
90         System.out.println("GetUserCatalogs: " + result);
91     }
92
93     public void onBadStatusCode(Request request, Response response) {
94
95     }
96
97     public void onError(Request request, Throwable t) {
98         GWT.log("GetUserCatalogs", t);
99         System.out.print("GetUserCatalogs: " + t.getClass().getName() + ": " + t.getMessage());
100     }
101
102     @Override
103     public void execute() {
104         final RequestBuilder rb = new RequestBuilder(RequestBuilder.POST, getURL());
105         rb.setHeader("X-Auth-Token", userToken);
106         final String requestData = makeRequestData().toString();
107
108         try {
109             System.out.println("==================================");
110             System.out.println("POST " + getURL());
111             System.out.println("==================================");
112             rb.sendRequest(requestData, new RequestCallback() {
113                 @Override
114                 public void onResponseReceived(Request request, Response response) {
115                     final int statusCode = response.getStatusCode();
116
117                     if(statusCode != SuccessCode) {
118                         GetUserCatalogs.this.onBadStatusCode(request, response);
119                         return;
120                     }
121
122                     final String responseText = response.getText();
123                     final JSONValue jsonValue = JSONParser.parseStrict(responseText);
124                     final JSONObject result = jsonValue.isObject();
125
126                     if(result == null) {
127                         GetUserCatalogs.this.onError(request, new Exception("GetUserCatalogs: json result is not an object"));
128                         return;
129                     }
130
131                     final UserCatalogs userCatalogs = parseResult(result);
132
133                     GetUserCatalogs.this.onSuccess(request, response, result, userCatalogs);
134                 }
135
136                 @Override
137                 public void onError(Request request, Throwable exception) {
138                     GetUserCatalogs.this.onError(request, exception);
139                 }
140             });
141         }
142         catch(Exception e) {
143             GWT.log("GetUserCatalogs", e);
144         }
145     }
146
147     public void scheduleDeferred() {
148         Scheduler.get().scheduleDeferred(this);
149     }
150 }