Statistics
| Branch: | Tag: | Revision:

root / web_client / src / gr / grnet / pithos / web / client / othersharedtree / OtherSharedTreeViewModel.java @ 045234b6

History | View | Annotate | Download (17.3 kB)

1
/*
2
 * Copyright 2011 GRNET S.A. All rights reserved.
3
 *
4
 * Redistribution and use in source and binary forms, with or
5
 * without modification, are permitted provided that the following
6
 * conditions are met:
7
 *
8
 *   1. Redistributions of source code must retain the above
9
 *      copyright notice, this list of conditions and the following
10
 *      disclaimer.
11
 *
12
 *   2. Redistributions in binary form must reproduce the above
13
 *      copyright notice, this list of conditions and the following
14
 *      disclaimer in the documentation and/or other materials
15
 *      provided with the distribution.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28
 * POSSIBILITY OF SUCH DAMAGE.
29
 *
30
 * The views and conclusions contained in the software and
31
 * documentation are those of the authors and should not be
32
 * interpreted as representing official policies, either expressed
33
 * or implied, of GRNET S.A.
34
 */
35

    
36
package gr.grnet.pithos.web.client.othersharedtree;
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.File;
43
import gr.grnet.pithos.web.client.foldertree.Folder;
44
import gr.grnet.pithos.web.client.othersharedtree.OtherSharedTreeView.Templates;
45
import gr.grnet.pithos.web.client.rest.GetRequest;
46
import gr.grnet.pithos.web.client.rest.RestException;
47

    
48
import java.util.HashMap;
49
import java.util.HashSet;
50
import java.util.Iterator;
51
import java.util.Map;
52
import java.util.Set;
53

    
54
import com.google.gwt.cell.client.AbstractCell;
55
import com.google.gwt.cell.client.Cell;
56
import com.google.gwt.cell.client.TextCell;
57
import com.google.gwt.cell.client.ValueUpdater;
58
import com.google.gwt.core.client.GWT;
59
import com.google.gwt.core.client.Scheduler;
60
import com.google.gwt.event.dom.client.ContextMenuEvent;
61
import com.google.gwt.http.client.Response;
62
import com.google.gwt.safehtml.shared.SafeHtml;
63
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
64
import com.google.gwt.text.shared.SafeHtmlRenderer;
65
import com.google.gwt.user.client.Command;
66
import com.google.gwt.user.client.ui.AbstractImagePrototype;
67
import com.google.gwt.view.client.ListDataProvider;
68
import com.google.gwt.view.client.SelectionChangeEvent;
69
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
70
import com.google.gwt.view.client.SingleSelectionModel;
71
import com.google.gwt.view.client.TreeViewModel;
72

    
73
public class OtherSharedTreeViewModel implements TreeViewModel {
74

    
75
    protected Pithos app;
76

    
77
    private Cell<Folder> folderCell = new AbstractCell<Folder>(ContextMenuEvent.getType().getName()) {
78

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

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

    
97
    private ListDataProvider<String> rootDataProvider = new ListDataProvider<String>();
98
    protected ListDataProvider<String> userLevelDataProvider = new ListDataProvider<String>();
99

    
100
    protected Map<String, ListDataProvider<Folder>> userDataProviderMap = new HashMap<String, ListDataProvider<Folder>>();
101
    private Map<Folder, ListDataProvider<Folder>> dataProviderMap = new HashMap<Folder, ListDataProvider<Folder>>();
102
    
103
    protected Map<String, Set<File>> sharedFiles = new HashMap<String, Set<File>>();
104

    
105
    protected SingleSelectionModel<Folder> selectionModel;
106

    
107
    public OtherSharedTreeViewModel(Pithos _app, SingleSelectionModel<Folder> selectionModel) {
108
        app = _app;
109
        this.selectionModel = selectionModel;
110
    }
111

    
112
    @Override
113
    public <T> NodeInfo<?> getNodeInfo(T value) {
114
        if (value == null) {
115
            rootDataProvider.getList().add("Other 's Shared");
116
            final SingleSelectionModel<String> selectionModel2 = new SingleSelectionModel<String>();
117
            selectionModel2.addSelectionChangeHandler(new Handler() {
118

    
119
                @Override
120
                public void onSelectionChange(@SuppressWarnings("unused") SelectionChangeEvent event) {
121
                    if (selectionModel2.getSelectedObject() != null) {
122
                            app.deselectOthers(app.getOtherSharedTreeView(), selectionModel2);
123
                            app.applyPermissions(null);
124
                            app.showFiles(new HashSet<File>());
125
                    }
126
                }
127
            });
128
            app.addSelectionModel(selectionModel2);
129
            return new DefaultNodeInfo<String>(rootDataProvider, new TextCell(new SafeHtmlRenderer<String>() {
130
                @Override
131
                public SafeHtml render(String object) {
132
                    SafeHtmlBuilder builder = new SafeHtmlBuilder();
133
                    render(object, builder);
134
                    return builder.toSafeHtml();
135
                }
136

    
137
                @Override
138
                public void render(String object, SafeHtmlBuilder builder) {
139
                    String html = AbstractImagePrototype.create(OtherSharedTreeView.images.othersShared()).getHTML();
140
                    builder.appendHtmlConstant(html);
141
                    builder.append(OtherSharedTreeView.Templates.INSTANCE.nameSpan(object));
142
                }
143
            }),  selectionModel2, null);
144
        }
145
        else if (value instanceof String) {
146
                if (value.equals("Other 's Shared")) {
147
                        fetchSharingUsers();
148
                    final SingleSelectionModel<String> selectionModel3 = new SingleSelectionModel<String>();
149
                    selectionModel3.addSelectionChangeHandler(new Handler() {
150

    
151
                        @Override
152
                        public void onSelectionChange(@SuppressWarnings("unused") SelectionChangeEvent event) {
153
                            if (selectionModel3.getSelectedObject() != null) {
154
                                    app.deselectOthers(app.getOtherSharedTreeView(), selectionModel3);
155
                                    app.applyPermissions(null);
156
                                    String username = selectionModel3.getSelectedObject();
157
                                            if (userDataProviderMap.get(username) == null) {
158
                                                    userDataProviderMap.put(username, new ListDataProvider<Folder>());
159
                                            }
160
                                    fetchSharedFiles(username, userDataProviderMap.get(username));
161
                            }
162
                        }
163
                    });
164
                    app.addSelectionModel(selectionModel3);
165
                    return new DefaultNodeInfo<String>(userLevelDataProvider, new TextCell(new SafeHtmlRenderer<String>() {
166

    
167
                                        @Override
168
                                        public SafeHtml render(String object) {
169
                            SafeHtmlBuilder builder = new SafeHtmlBuilder();
170
                            render(object, builder);
171
                            return builder.toSafeHtml();
172
                                        }
173

    
174
                                        @Override
175
                                        public void render(String object, SafeHtmlBuilder builder) {
176
                            String html = AbstractImagePrototype.create(OtherSharedTreeView.images.user()).getHTML();
177
                            builder.appendHtmlConstant(html);
178
                            builder.append(OtherSharedTreeView.Templates.INSTANCE.nameSpan(object));
179
                                        }
180
                                }), selectionModel3, null);
181
                }
182
                        String username = (String) value;
183
                        if (userDataProviderMap.get(username) == null) {
184
                                userDataProviderMap.put(username, new ListDataProvider<Folder>());
185
                        }
186
                        final ListDataProvider<Folder> dataProvider = userDataProviderMap.get(username);
187
                        fetchSharedContainers(username, dataProvider);
188
                        return new DefaultNodeInfo<Folder>(dataProvider, folderCell, selectionModel, null);
189
        }
190
        else {
191
            final Folder f = (Folder) value;
192
            if (dataProviderMap.get(f) == null) {
193
                dataProviderMap.put(f, new ListDataProvider<Folder>());
194
            }
195
            final ListDataProvider<Folder> dataProvider = dataProviderMap.get(f);
196
            fetchFolder(f, dataProvider, false);
197
            return new DefaultNodeInfo<Folder>(dataProvider, folderCell, selectionModel, null);
198
        }
199
    }
200

    
201
    private void fetchSharingUsers() {
202
        GetRequest<SharingUsers> getSharingUsers = new GetRequest<SharingUsers>(SharingUsers.class, app.getApiPath(), "", "?format=json") {
203
            @Override
204
            public void onSuccess(final SharingUsers _result) {
205
                userLevelDataProvider.getList().clear();
206
                userLevelDataProvider.getList().addAll(_result.getUsers());
207
                for (String name : _result.getUsers()) {
208
                        sharedFiles.put(name, new HashSet<File>());
209
                }
210
            }
211

    
212
            @Override
213
            public void onError(Throwable t) {
214
                GWT.log("Error getting folder", t);
215
                if (t instanceof RestException)
216
                    app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
217
                else
218
                    app.displayError("System error fetching folder: " + t.getMessage());
219
            }
220

    
221
                        @Override
222
                        protected void onUnauthorized(Response response) {
223
                                app.sessionExpired();
224
                        }
225
        };
226
        getSharingUsers.setHeader("X-Auth-Token", app.getToken());
227
        Scheduler.get().scheduleDeferred(getSharingUsers);
228
        }
229

    
230
        @Override
231
    public boolean isLeaf(Object o) {
232
        if (o instanceof Folder) {
233
            Folder f = (Folder) o;
234
            return f.getSubfolders().isEmpty();
235
        }
236
        return false;
237
    }
238

    
239
        private void fetchSharedContainers(final String username, final ListDataProvider<Folder> dataProvider) {
240
                GetRequest<AccountResource> getUserSharedContainers = new GetRequest<AccountResource>(AccountResource.class, app.getApiPath(), username, "?format=json") {
241

    
242
                        @Override
243
                        public void onSuccess(AccountResource _result) {
244
                            final ListDataProvider<Folder> tempProvider = new ListDataProvider<Folder>();
245
                                Iterator<Folder> iter = _result.getContainers().iterator();
246
                                fetchFolder(username, iter, tempProvider, new Command() {
247
                                        
248
                                        @Override
249
                                        public void execute() {
250
                                                dataProvider.getList().clear();
251
                                                dataProvider.getList().addAll(tempProvider.getList());
252
                                        }
253
                                });
254
                        }
255

    
256
                        @Override
257
                        public void onError(Throwable t) {
258
                GWT.log("Error getting account", t);
259
                if (t instanceof RestException)
260
                    app.displayError("Error getting account: " + ((RestException) t).getHttpStatusText());
261
                else
262
                    app.displayError("System error fetching user data: " + t.getMessage());
263
                        }
264

    
265
                        @Override
266
                        protected void onUnauthorized(Response response) {
267
                                app.sessionExpired();
268
                        }
269
                };
270
                getUserSharedContainers.setHeader("X-Auth-Token", app.getToken());
271
                Scheduler.get().scheduleDeferred(getUserSharedContainers);
272
        }
273

    
274
        protected void fetchSharedFiles(final String username, final ListDataProvider<Folder> dataProvider) {
275
                GetRequest<AccountResource> getUserSharedContainers = new GetRequest<AccountResource>(AccountResource.class, app.getApiPath(), username, "?format=json") {
276

    
277
                        @Override
278
                        public void onSuccess(AccountResource _result) {
279
                            final ListDataProvider<Folder> tempProvider = new ListDataProvider<Folder>();
280
                                Iterator<Folder> iter = _result.getContainers().iterator();
281
                                fetchFolder(username, iter, tempProvider, new Command() {
282
                                        
283
                                        @Override
284
                                        public void execute() {
285
                                                dataProvider.getList().clear();
286
                                                dataProvider.getList().addAll(tempProvider.getList());
287
                                                app.showFiles(sharedFiles.get(username));
288
                                        }
289
                                });
290
                        }
291

    
292
                        @Override
293
                        public void onError(Throwable t) {
294
                GWT.log("Error getting account", t);
295
                if (t instanceof RestException)
296
                    app.displayError("Error getting account: " + ((RestException) t).getHttpStatusText());
297
                else
298
                    app.displayError("System error fetching user data: " + t.getMessage());
299
                        }
300

    
301
                        @Override
302
                        protected void onUnauthorized(Response response) {
303
                                app.sessionExpired();
304
                        }
305
                };
306
                getUserSharedContainers.setHeader("X-Auth-Token", app.getToken());
307
                Scheduler.get().scheduleDeferred(getUserSharedContainers);
308
        }
309

    
310
        protected void fetchFolder(final String username, final Iterator<Folder> iter, final ListDataProvider<Folder> dataProvider, final Command callback) {
311
        if (iter.hasNext()) {
312
            final Folder f = iter.next();
313

    
314
            String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
315
            GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), username, path, f) {
316
                @Override
317
                public void onSuccess(Folder _result) {
318
                        if (!_result.isShared()) {
319
                                for (File file : _result.getFiles()) {
320
                                        if (file.isShared())
321
                                                sharedFiles.get(username).add(file);
322
                                }
323
                                Iterator<Folder> iter2 = _result.getSubfolders().iterator();
324
                                fetchFolder(username, iter2, dataProvider, new Command() {
325
                                                        
326
                                                        @Override
327
                                                        public void execute() {
328
                                            fetchFolder(username, iter, dataProvider, callback);
329
                                                        }
330
                                                });
331
                        }
332
                        else {
333
                                dataProvider.getList().add(_result);
334
                            fetchFolder(username, iter, dataProvider, callback);
335
                        }
336
                }
337

    
338
                @Override
339
                public void onError(Throwable t) {
340
                    GWT.log("Error getting folder", t);
341
                    if (t instanceof RestException)
342
                        app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
343
                    else
344
                        app.displayError("System error fetching folder: " + t.getMessage());
345
                }
346

    
347
                                @Override
348
                                protected void onUnauthorized(Response response) {
349
                                        app.sessionExpired();
350
                                }
351
            };
352
            getFolder.setHeader("X-Auth-Token", app.getToken());
353
            Scheduler.get().scheduleDeferred(getFolder);
354
        }
355
        else if (callback != null)
356
            callback.execute();
357
    }
358

    
359
    public Folder getSelection() {
360
        return selectionModel.getSelectedObject();
361
    }
362

    
363
    public void updateFolder(Folder folder, boolean showfiles) {
364
        if (dataProviderMap.get(folder) == null) {
365
            dataProviderMap.put(folder, new ListDataProvider<Folder>());
366
        }
367
        final ListDataProvider<Folder> dataProvider = dataProviderMap.get(folder);
368
        fetchFolder(folder, dataProvider, showfiles);
369
    }
370

    
371
    public void fetchFolder(final Folder f, final ListDataProvider<Folder> dataProvider, final boolean showfiles) {
372
        String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
373
        GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwner(), path, f) {
374
            @Override
375
            public void onSuccess(final Folder _result) {
376
                if (showfiles)
377
                    app.showFiles(_result);
378
                Iterator<Folder> iter = _result.getSubfolders().iterator();
379
                fetchFolder(_result.getOwner(), iter, dataProvider, new Command() {
380
                    @Override
381
                    public void execute() {
382
                        dataProvider.getList().clear();
383
                        dataProvider.getList().addAll(_result.getSubfolders());
384
                        app.getOtherSharedTreeView().updateChildren(f);
385
                    }
386
                });
387
            }
388

    
389
            @Override
390
            public void onError(Throwable t) {
391
                GWT.log("Error getting folder", t);
392
                if (t instanceof RestException)
393
                    app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
394
                else
395
                    app.displayError("System error fetching folder: " + t.getMessage());
396
            }
397

    
398
                        @Override
399
                        protected void onUnauthorized(Response response) {
400
                                app.sessionExpired();
401
                        }
402
        };
403
        getFolder.setHeader("X-Auth-Token", app.getToken());
404
        Scheduler.get().scheduleDeferred(getFolder);
405
    }
406
}