Revision b9a1049a src/gr/grnet/pithos/web/client/othersharedtree/OtherSharedTreeViewModel.java

b/src/gr/grnet/pithos/web/client/othersharedtree/OtherSharedTreeViewModel.java
35 35

  
36 36
package gr.grnet.pithos.web.client.othersharedtree;
37 37

  
38
import gr.grnet.pithos.web.client.FolderContextMenu;
39
import gr.grnet.pithos.web.client.Pithos;
40
import gr.grnet.pithos.web.client.SharingUsers;
41
import gr.grnet.pithos.web.client.foldertree.AccountResource;
42
import gr.grnet.pithos.web.client.foldertree.Folder;
43
import gr.grnet.pithos.web.client.othersharedtree.OtherSharedTreeView.Templates;
44
import gr.grnet.pithos.web.client.rest.GetRequest;
45
import gr.grnet.pithos.web.client.rest.RestException;
46

  
47
import java.util.HashMap;
48
import java.util.Iterator;
49
import java.util.Map;
50

  
51 38
import com.google.gwt.cell.client.AbstractCell;
52 39
import com.google.gwt.cell.client.Cell;
53 40
import com.google.gwt.cell.client.TextCell;
......
55 42
import com.google.gwt.core.client.GWT;
56 43
import com.google.gwt.core.client.Scheduler;
57 44
import com.google.gwt.event.dom.client.ContextMenuEvent;
45
import com.google.gwt.http.client.Request;
58 46
import com.google.gwt.http.client.Response;
59 47
import com.google.gwt.http.client.URL;
48
import com.google.gwt.json.client.JSONObject;
60 49
import com.google.gwt.safehtml.shared.SafeHtml;
61 50
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
62 51
import com.google.gwt.text.shared.SafeHtmlRenderer;
......
65 54
import com.google.gwt.view.client.ListDataProvider;
66 55
import com.google.gwt.view.client.SingleSelectionModel;
67 56
import com.google.gwt.view.client.TreeViewModel;
57
import gr.grnet.pithos.web.client.FolderContextMenu;
58
import gr.grnet.pithos.web.client.Pithos;
59
import gr.grnet.pithos.web.client.SharingUsers;
60
import gr.grnet.pithos.web.client.catalog.GetUserCatalogs;
61
import gr.grnet.pithos.web.client.catalog.UserCatalogs;
62
import gr.grnet.pithos.web.client.foldertree.AccountResource;
63
import gr.grnet.pithos.web.client.foldertree.Folder;
64
import gr.grnet.pithos.web.client.othersharedtree.OtherSharedTreeView.Templates;
65
import gr.grnet.pithos.web.client.rest.GetRequest;
66
import gr.grnet.pithos.web.client.rest.RestException;
67

  
68
import java.util.HashMap;
69
import java.util.Iterator;
70
import java.util.List;
71
import java.util.Map;
68 72

  
69 73
public class OtherSharedTreeViewModel implements TreeViewModel {
70 74

  
71 75
    protected Pithos app;
72 76

  
73
    String dummy = "No shares by others yet";
77
    final String dummy = "No shares by others yet";
74 78

  
75 79
    private Cell<Folder> folderCell = new AbstractCell<Folder>(ContextMenuEvent.getType().getName()) {
76 80

  
77
       @Override
81
        @Override
78 82
        public void render(Context context, Folder folder, SafeHtmlBuilder safeHtmlBuilder) {
79 83
            String html = AbstractImagePrototype.create(OtherSharedTreeView.images.folderYellow()).getHTML();
80
           	safeHtmlBuilder.appendHtmlConstant(html).appendHtmlConstant("&nbsp;");
84
            safeHtmlBuilder.appendHtmlConstant(html).appendHtmlConstant("&nbsp;");
81 85
            safeHtmlBuilder.append(Templates.INSTANCE.nameSpan(folder.getName()));
82 86
        }
83 87

  
84 88
        @Override
85 89
        public void onBrowserEvent(Context context, com.google.gwt.dom.client.Element parent, final Folder folder, com.google.gwt.dom.client.NativeEvent event, ValueUpdater<Folder> valueUpdater) {
86
            if (event.getType().equals(ContextMenuEvent.getType().getName())) {
87
            	final int x = event.getClientX();
88
            	final int y = event.getClientY();
90
            if(event.getType().equals(ContextMenuEvent.getType().getName())) {
91
                final int x = event.getClientX();
92
                final int y = event.getClientY();
89 93
                OtherSharedTreeViewModel.this.selectionModel.setSelected(folder, true);
90 94
                app.scheduleFolderHeadCommand(folder, new Command() {
91
					
92
					@Override
93
					public void execute() {
94
		                FolderContextMenu menu = new FolderContextMenu(app, OtherSharedTreeView.images, app.getSelectedTree(), folder);
95
		                menu.setPopupPosition(x, y);
96
		                menu.show();
97
					}
98
				});
95

  
96
                    @Override
97
                    public void execute() {
98
                        FolderContextMenu menu = new FolderContextMenu(app, OtherSharedTreeView.images, app.getSelectedTree(), folder);
99
                        menu.setPopupPosition(x, y);
100
                        menu.show();
101
                    }
102
                });
99 103
            }
100 104
        }
101 105
    };
102 106

  
103
    protected ListDataProvider<String> userLevelDataProvider = new ListDataProvider<String>();
107
    protected ListDataProvider<String> userLevelDataProviderForIDs = new ListDataProvider<String>();
108
//    protected ListDataProvider<String> userLevelDataProviderForDisplayNames = new ListDataProvider<String>();
104 109

  
105 110
    protected Map<String, ListDataProvider<Folder>> userDataProviderMap = new HashMap<String, ListDataProvider<Folder>>();
106 111
    private Map<Folder, ListDataProvider<Folder>> dataProviderMap = new HashMap<Folder, ListDataProvider<Folder>>();
107
    
112

  
108 113
    protected SingleSelectionModel<Folder> selectionModel;
109 114

  
110 115
    public OtherSharedTreeViewModel(Pithos _app, SingleSelectionModel<Folder> selectionModel) {
......
114 119

  
115 120
    @Override
116 121
    public <T> NodeInfo<?> getNodeInfo(T value) {
117
        if (value == null) {
118
        	fetchSharingUsers(null);
119
            return new DefaultNodeInfo<String>(userLevelDataProvider, new TextCell(new SafeHtmlRenderer<String>() {
120

  
121
				@Override
122
				public SafeHtml render(String object) {
122
        if(value == null) {
123
//            LOG("getNodeInfo(null), calling fetchSharingUsers(null)");
124
            fetchSharingUsers(null);
125
//            LOG("getNodeInfo(null), called fetchSharingUsers(null)");
126
            return new DefaultNodeInfo<String>(userLevelDataProviderForIDs, new TextCell(new SafeHtmlRenderer<String>() {
127
                @Override
128
                public SafeHtml render(String object) {
129
                    final String displayName = app.getUserDisplayNameForID(object);
130
//                    LOG("render(userID = "+object+"), displayName = " + displayName);
123 131
                    SafeHtmlBuilder builder = new SafeHtmlBuilder();
124
                    render(object, builder);
132
                    render(displayName, builder);
125 133
                    return builder.toSafeHtml();
126
				}
134
                }
127 135

  
128
				@Override
129
				public void render(String object, SafeHtmlBuilder builder) {
130
                    if (!object.equals(dummy)) {
131
                    	String html = AbstractImagePrototype.create(OtherSharedTreeView.images.myShared()).getHTML();
132
                    	builder.appendHtmlConstant(html).appendHtmlConstant("&nbsp;");
136
                @Override
137
                public void render(String object, SafeHtmlBuilder builder) {
138
                    if(!object.equals(dummy)) {
139
//                        LOG("render(userID [not dummy] = "+object+")");
140
                        String html = AbstractImagePrototype.create(OtherSharedTreeView.images.myShared()).getHTML();
141
                        builder.appendHtmlConstant(html).appendHtmlConstant("&nbsp;");
133 142
                    }
143
                    final String displayName = app.getUserDisplayNameForID(object);
134 144
                    builder.append(OtherSharedTreeView.Templates.INSTANCE.nameSpan(object));
135
				}
136
			}), null, null);
145
                }
146
            }), null, null);
137 147
        }
138
        else if (value instanceof String) {
139
			String username = (String) value;
140
			if (userDataProviderMap.get(username) == null) {
141
				userDataProviderMap.put(username, new ListDataProvider<Folder>());
142
			}
143
			final ListDataProvider<Folder> dataProvider = userDataProviderMap.get(username);
144
			fetchSharedContainers(username, dataProvider, null);
145
			return new DefaultNodeInfo<Folder>(dataProvider, folderCell, selectionModel, null);
148
        else if(value instanceof String) {
149
//            LOG("getNodeInfo(String "+value+"), called with userID");
150
            final String userID = (String) value;
151

  
152
            if(userDataProviderMap.get(userID) == null) {
153
                userDataProviderMap.put(userID, new ListDataProvider<Folder>());
154
            }
155
            final ListDataProvider<Folder> userIDDataProvider = userDataProviderMap.get(userID);
156
            fetchSharedContainers(userID, userIDDataProvider, null);
157

  
158
            return new DefaultNodeInfo<Folder>(userIDDataProvider, folderCell, selectionModel, null);
146 159
        }
147 160
        else {
161
//            LOG("getNodeInfo(Folder "+value+"), called with a folder");
148 162
            final Folder f = (Folder) value;
149
            if (dataProviderMap.get(f) == null) {
163
            if(dataProviderMap.get(f) == null) {
150 164
                dataProviderMap.put(f, new ListDataProvider<Folder>());
151 165
            }
152 166
            final ListDataProvider<Folder> dataProvider = dataProviderMap.get(f);
......
155 169
        }
156 170
    }
157 171

  
172
//    native void LOG(String message) /*-{
173
//      console.log(message );
174
//    }-*/;
175

  
158 176
    private void fetchSharingUsers(final Command callback) {
159 177
        GetRequest<SharingUsers> getSharingUsers = new GetRequest<SharingUsers>(SharingUsers.class, app.getApiPath(), "", "?format=json") {
160 178
            @Override
161 179
            public void onSuccess(final SharingUsers _result) {
162
                userLevelDataProvider.getList().clear();
163
                userLevelDataProvider.getList().addAll(_result.getUsers());
164
                if (userLevelDataProvider.getList().isEmpty())
165
                	userLevelDataProvider.getList().add(dummy);
166
                Iterator<String> iter = _result.getUsers().iterator();
167
                fetchSharedContainers(iter, callback);
180
                userLevelDataProviderForIDs.getList().clear();
181

  
182
                final List<String> userIDs = _result.getUserIDs();
183
//                for(String userID : userIDs) {
184
//                    LOG("fetchSharingUsers(): userID =" + userID);
185
//                }
186
                final List<String> userIDsWithUnknownDisplayNames = app.filterUserIDsWithUnknownDisplayName(userIDs);
187
//                for(String userID : userIDsWithUnknownDisplayNames) {
188
//                    LOG("fetchSharingUsers(): userID (with unknown name) =" + userID);
189
//                }
190

  
191
                userLevelDataProviderForIDs.getList().addAll(userIDs);
192
                if(userLevelDataProviderForIDs.getList().isEmpty()) {
193
                    userLevelDataProviderForIDs.getList().add(dummy);
194
//                    userLevelDataProviderForDisplayNames.getList().add(dummy);
195
                } else {
196
//                    userLevelDataProviderForDisplayNames.getList().addAll(app.getUserDisplayNamesForIDs(userIDs));
197
                }
198

  
199
                if(userIDsWithUnknownDisplayNames.size() == 0) {
200
                    // All display names are known, so we proceed directly
201
                    fetchSharedContainers(userLevelDataProviderForIDs.getList().iterator(), callback);
202
                } else {
203
                    // First fetch unknown display names and then proceed
204
                    new GetUserCatalogs(app, userIDsWithUnknownDisplayNames) {
205
                        @Override
206
                        public void onSuccess(Request request, Response response, JSONObject result, UserCatalogs userCatalogs) {
207
//                            for(Map.Entry<String, String> entry : userCatalogs) {
208
//                                final String id = entry.getKey();
209
//                                final String name = entry.getValue();
210
//                                LOG("mapping: userID("+id+") -> name("+name+")");
211
//                            }
212

  
213
                            // Update the cached user catalogs
214
                            app.getUserCatalogs().updateFrom(userCatalogs);
215

  
216
                            fetchSharedContainers(userLevelDataProviderForIDs.getList().iterator(), callback);
217
                        }
218

  
219
                        @Override
220
                        public void onError(Request request, Throwable t) {
221
                            super.onError(request, t);
222
                            app.setError(t);
223
                        }
224
                    }.scheduleDeferred();
225
                }
168 226
            }
169 227

  
170 228
            @Override
171 229
            public void onError(Throwable t) {
172 230
                GWT.log("Error getting folder", t);
173
				app.setError(t);
174
                if (t instanceof RestException)
231
                app.setError(t);
232
                if(t instanceof RestException) {
175 233
                    app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
176
                else
234
                }
235
                else {
177 236
                    app.displayError("System error fetching folder: " + t.getMessage());
237
                }
178 238
            }
179 239

  
180
			@Override
181
			protected void onUnauthorized(Response response) {
182
				app.sessionExpired();
183
			}
240
            @Override
241
            protected void onUnauthorized(Response response) {
242
                app.sessionExpired();
243
            }
184 244
        };
185 245
        getSharingUsers.setHeader("X-Auth-Token", app.getUserToken());
186 246
        Scheduler.get().scheduleDeferred(getSharingUsers);
187
	}
188

  
189
	protected void fetchSharedContainers(final Iterator<String> iter, final Command callback) {
190
		if (iter.hasNext()) {
191
			String username = iter.next();
192
			if (userDataProviderMap.get(username) == null) {
193
				userDataProviderMap.put(username, new ListDataProvider<Folder>());
194
			}
195
			final ListDataProvider<Folder> dataProvider = userDataProviderMap.get(username);
196
			fetchSharedContainers(username, dataProvider, new Command() {
197
				
198
				@Override
199
				public void execute() {
200
					fetchSharedContainers(iter, callback);
201
					
202
				}
203
			});
204
		}
205
		else
206
			if (callback != null)
207
				callback.execute();
208
	}
209

  
210
	@Override
247
    }
248

  
249
    protected void fetchSharedContainers(final Iterator<String> userIDsIterator, final Command callback) {
250
        if(userIDsIterator.hasNext()) {
251
            String userID = userIDsIterator.next();
252
            if(userDataProviderMap.get(userID) == null) {
253
                userDataProviderMap.put(userID, new ListDataProvider<Folder>());
254
            }
255
            final ListDataProvider<Folder> dataProvider = userDataProviderMap.get(userID);
256
            fetchSharedContainers(userID, dataProvider, new Command() {
257

  
258
                @Override
259
                public void execute() {
260
                    fetchSharedContainers(userIDsIterator, callback);
261

  
262
                }
263
            });
264
        }
265
        else if(callback != null) {
266
            callback.execute();
267
        }
268
    }
269

  
270
    @Override
211 271
    public boolean isLeaf(Object o) {
212
		if (o == null)
213
			return userLevelDataProvider.getList().isEmpty();
214
		else if (o instanceof Folder) {
215
            Folder f = (Folder) o;
216
            return f.getSubfolders().isEmpty();
272
        if(o == null) {
273
            boolean result =  userLevelDataProviderForIDs.getList().isEmpty();
274
//            LOG("isLeaf(null) ==> " + result);
275
            return result;
276
        }
277
        else if(o instanceof Folder) {
278
            Folder folder = (Folder) o;
279
            boolean result = folder.getSubfolders().isEmpty();
280
//            LOG("isLeaf(Folder "+folder+") ==> " + result);
281
            return result;
282
        }
283
        else {
284
            ListDataProvider<Folder> dp = userDataProviderMap.get(o);
285
            if(dp != null) {
286
                boolean result =  dp.getList().isEmpty();
287
//                LOG("isLeaf("+o.getClass().getName()+" "+o+") ==> " + result);
288
                return result;
289
            }
290
//            LOG("isLeaf("+o.getClass().getName()+" "+o+") ==> (true)");
291
            return true;
217 292
        }
218
		else {
219
			ListDataProvider<Folder> dp = userDataProviderMap.get(o);
220
			if (dp != null)
221
				return dp.getList().isEmpty();
222
			return true;
223
		}
224 293
    }
225 294

  
226
	private void fetchSharedContainers(final String username, final ListDataProvider<Folder> dataProvider, final Command callback) {
227
		GetRequest<AccountResource> getUserSharedContainers = new GetRequest<AccountResource>(AccountResource.class, app.getApiPath(), username, "?format=json") {
228

  
229
			@Override
230
			public void onSuccess(AccountResource _result) {
231
		    	final ListDataProvider<Folder> tempProvider = new ListDataProvider<Folder>();
232
				Iterator<Folder> iter = _result.getContainers().iterator();
233
				fetchFolder(username, iter, tempProvider, new Command() {
234
					
235
					@Override
236
					public void execute() {
237
						dataProvider.getList().clear();
238
						dataProvider.getList().addAll(tempProvider.getList());
239
						if (callback != null)
240
							callback.execute();
241
					}
242
				});
243
			}
244

  
245
			@Override
246
			public void onError(Throwable t) {
295
    private void fetchSharedContainers(final String userID, final ListDataProvider<Folder> dataProvider, final Command callback) {
296
        GetRequest<AccountResource> getUserSharedContainers = new GetRequest<AccountResource>(AccountResource.class, app.getApiPath(), userID, "?format=json") {
297

  
298
            @Override
299
            public void onSuccess(AccountResource _result) {
300
                final ListDataProvider<Folder> tempProvider = new ListDataProvider<Folder>();
301
                Iterator<Folder> folderIterator = _result.getContainers().iterator();
302
                fetchFolder(userID, folderIterator, tempProvider, new Command() {
303

  
304
                    @Override
305
                    public void execute() {
306
                        dataProvider.getList().clear();
307
                        dataProvider.getList().addAll(tempProvider.getList());
308
                        if(callback != null) {
309
                            callback.execute();
310
                        }
311
                    }
312
                });
313
            }
314

  
315
            @Override
316
            public void onError(Throwable t) {
247 317
                GWT.log("Error getting account", t);
248
				app.setError(t);
249
                if (t instanceof RestException)
318
                app.setError(t);
319
                if(t instanceof RestException) {
250 320
                    app.displayError("Error getting account: " + ((RestException) t).getHttpStatusText());
251
                else
321
                }
322
                else {
252 323
                    app.displayError("System error fetching user data: " + t.getMessage());
253
			}
324
                }
325
            }
254 326

  
255
			@Override
256
			protected void onUnauthorized(Response response) {
257
				app.sessionExpired();
258
			}
259
		};
260
		getUserSharedContainers.setHeader("X-Auth-Token", app.getUserToken());
261
		Scheduler.get().scheduleDeferred(getUserSharedContainers);
262
	}
327
            @Override
328
            protected void onUnauthorized(Response response) {
329
                app.sessionExpired();
330
            }
331
        };
332
        getUserSharedContainers.setHeader("X-Auth-Token", app.getUserToken());
333
        Scheduler.get().scheduleDeferred(getUserSharedContainers);
334
    }
263 335

  
264
	protected void fetchFolder(final String username, final Iterator<Folder> iter, final ListDataProvider<Folder> dataProvider, final Command callback) {
265
        if (iter.hasNext()) {
266
            final Folder f = iter.next();
336
    protected void fetchFolder(final String userID, final Iterator<Folder> folderIterator, final ListDataProvider<Folder> dataProvider, final Command callback) {
337
        if(folderIterator.hasNext()) {
338
            final Folder f = folderIterator.next();
267 339

  
268 340
            String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
269
            GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), username, path, f) {
341
            GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), userID, path, f) {
270 342
                @Override
271 343
                public void onSuccess(Folder _result) {
272
               		dataProvider.getList().add(_result);
273
                    fetchFolder(username, iter, dataProvider, callback);
344
                    dataProvider.getList().add(_result);
345
                    fetchFolder(userID, folderIterator, dataProvider, callback);
274 346
                }
275 347

  
276 348
                @Override
277 349
                public void onError(Throwable t) {
278 350
                    GWT.log("Error getting folder", t);
279
					app.setError(t);
280
                    if (t instanceof RestException)
351
                    app.setError(t);
352
                    if(t instanceof RestException) {
281 353
                        app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
282
                    else
354
                    }
355
                    else {
283 356
                        app.displayError("System error fetching folder: " + t.getMessage());
357
                    }
284 358
                }
285 359

  
286
				@Override
287
				protected void onUnauthorized(Response response) {
288
					app.sessionExpired();
289
				}
360
                @Override
361
                protected void onUnauthorized(Response response) {
362
                    app.sessionExpired();
363
                }
290 364
            };
291 365
            getFolder.setHeader("X-Auth-Token", app.getUserToken());
292 366
            Scheduler.get().scheduleDeferred(getFolder);
293 367
        }
294
        else if (callback != null)
368
        else if(callback != null) {
295 369
            callback.execute();
370
        }
296 371
    }
297 372

  
298 373
    public Folder getSelection() {
......
300 375
    }
301 376

  
302 377
    public void updateFolder(Folder folder, boolean showfiles, Command callback) {
303
        if (dataProviderMap.get(folder) == null) {
378
        if(dataProviderMap.get(folder) == null) {
304 379
            dataProviderMap.put(folder, new ListDataProvider<Folder>());
305 380
        }
306 381
        final ListDataProvider<Folder> dataProvider = dataProviderMap.get(folder);
......
312 387
        GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
313 388
            @Override
314 389
            public void onSuccess(final Folder _result) {
315
                if (showfiles)
390
                if(showfiles) {
316 391
                    app.showFiles(_result);
392
                }
317 393
                Iterator<Folder> iter = _result.getSubfolders().iterator();
318 394
                fetchFolder(_result.getOwnerID(), iter, dataProvider, new Command() {
319 395
                    @Override
......
321 397
                        dataProvider.getList().clear();
322 398
                        dataProvider.getList().addAll(_result.getSubfolders());
323 399
                        app.getOtherSharedTreeView().updateChildren(f);
324
                        if (callback != null)
325
                        	callback.execute();
400
                        if(callback != null) {
401
                            callback.execute();
402
                        }
326 403
                    }
327 404
                });
328 405
            }
......
330 407
            @Override
331 408
            public void onError(Throwable t) {
332 409
                GWT.log("Error getting folder", t);
333
				app.setError(t);
334
                if (t instanceof RestException)
410
                app.setError(t);
411
                if(t instanceof RestException) {
335 412
                    app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
336
                else
413
                }
414
                else {
337 415
                    app.displayError("System error fetching folder: " + t.getMessage());
416
                }
338 417
            }
339 418

  
340
			@Override
341
			protected void onUnauthorized(Response response) {
342
				app.sessionExpired();
343
			}
419
            @Override
420
            protected void onUnauthorized(Response response) {
421
                app.sessionExpired();
422
            }
344 423
        };
345 424
        getFolder.setHeader("X-Auth-Token", app.getUserToken());
346 425
        Scheduler.get().scheduleDeferred(getFolder);
347 426
    }
348
    
427

  
349 428
    public void initialize(Command callback) {
350
    	fetchSharingUsers(callback);
429
        fetchSharingUsers(callback);
351 430
    }
352 431
}

Also available in: Unified diff