Statistics
| Branch: | Tag: | Revision:

root / src / gr / grnet / pithos / web / client / othersharedtree / OtherSharedTreeViewModel.java @ 7811b9d1

History | View | Annotate | Download (16.4 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.safehtml.shared.SafeHtml;
62
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
63
import com.google.gwt.text.shared.SafeHtmlRenderer;
64
import com.google.gwt.user.client.Command;
65
import com.google.gwt.user.client.ui.AbstractImagePrototype;
66
import com.google.gwt.view.client.ListDataProvider;
67
import com.google.gwt.view.client.SelectionChangeEvent;
68
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
69
import com.google.gwt.view.client.SingleSelectionModel;
70
import com.google.gwt.view.client.TreeViewModel;
71

    
72
public class OtherSharedTreeViewModel implements TreeViewModel {
73

    
74
    protected Pithos app;
75

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

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

    
85
        @Override
86
        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) {
87
            if (event.getType().equals(ContextMenuEvent.getType().getName())) {
88
                OtherSharedTreeViewModel.this.selectionModel.setSelected(folder, true);
89
                FolderContextMenu menu = new FolderContextMenu(app, OtherSharedTreeView.images, folder);
90
                menu.setPopupPosition(event.getClientX(), event.getClientY());
91
                menu.show();
92
            }
93
        }
94
    };
95

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

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

    
104
    protected SingleSelectionModel<Folder> selectionModel;
105

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

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

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

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

    
149
                        @Override
150
                        public void onSelectionChange(@SuppressWarnings("unused") SelectionChangeEvent event) {
151
                            if (selectionModel3.getSelectedObject() != null) {
152
                                    app.deselectOthers(selectionModel3);
153
                                    String username = selectionModel3.getSelectedObject();
154
                                    fetchSharedFiles(username, userDataProviderMap.get(username));
155
                            }
156
                        }
157
                    });
158
                    app.addSelectionModel(selectionModel3);
159
                    return new DefaultNodeInfo<String>(userLevelDataProvider, new TextCell(new SafeHtmlRenderer<String>() {
160

    
161
                                        @Override
162
                                        public SafeHtml render(String object) {
163
                            SafeHtmlBuilder builder = new SafeHtmlBuilder();
164
                            render(object, builder);
165
                            return builder.toSafeHtml();
166
                                        }
167

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

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

    
206
            @Override
207
            public void onError(Throwable t) {
208
                GWT.log("Error getting folder", t);
209
                if (t instanceof RestException)
210
                    app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
211
                else
212
                    app.displayError("System error fetching folder: " + t.getMessage());
213
            }
214
        };
215
        getSharingUsers.setHeader("X-Auth-Token", app.getToken());
216
        Scheduler.get().scheduleDeferred(getSharingUsers);
217
        }
218

    
219
        @Override
220
    public boolean isLeaf(Object o) {
221
        if (o instanceof Folder) {
222
            Folder f = (Folder) o;
223
            return f.getSubfolders().isEmpty();
224
        }
225
        return false;
226
    }
227

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

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

    
245
                        @Override
246
                        public void onError(Throwable t) {
247
                GWT.log("Error getting account", t);
248
                if (t instanceof RestException)
249
                    app.displayError("Error getting account: " + ((RestException) t).getHttpStatusText());
250
                else
251
                    app.displayError("System error fetching user data: " + t.getMessage());
252
                        }
253
                };
254
                getUserSharedContainers.setHeader("X-Auth-Token", app.getToken());
255
                Scheduler.get().scheduleDeferred(getUserSharedContainers);
256
        }
257

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

    
261
                        @Override
262
                        public void onSuccess(AccountResource _result) {
263
                            final ListDataProvider<Folder> tempProvider = new ListDataProvider<Folder>();
264
                                Iterator<Folder> iter = _result.getContainers().iterator();
265
                                fetchFolder(username, iter, tempProvider, new Command() {
266
                                        
267
                                        @Override
268
                                        public void execute() {
269
                                                dataProvider.getList().clear();
270
                                                dataProvider.getList().addAll(tempProvider.getList());
271
                                                app.showFiles(sharedFiles.get(username));
272
                                        }
273
                                });
274
                        }
275

    
276
                        @Override
277
                        public void onError(Throwable t) {
278
                GWT.log("Error getting account", t);
279
                if (t instanceof RestException)
280
                    app.displayError("Error getting account: " + ((RestException) t).getHttpStatusText());
281
                else
282
                    app.displayError("System error fetching user data: " + t.getMessage());
283
                        }
284
                };
285
                getUserSharedContainers.setHeader("X-Auth-Token", app.getToken());
286
                Scheduler.get().scheduleDeferred(getUserSharedContainers);
287
        }
288

    
289
        protected void fetchFolder(final String username, final Iterator<Folder> iter, final ListDataProvider<Folder> dataProvider, final Command callback) {
290
        if (iter.hasNext()) {
291
            final Folder f = iter.next();
292

    
293
            String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
294
            GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), username, path, f) {
295
                @Override
296
                public void onSuccess(Folder _result) {
297
                        if (!_result.isShared()) {
298
                                for (File file : _result.getFiles()) {
299
                                        if (file.isShared())
300
                                                sharedFiles.get(username).add(file);
301
                                }
302
                                Iterator<Folder> iter2 = _result.getSubfolders().iterator();
303
                                fetchFolder(username, iter2, dataProvider, new Command() {
304
                                                        
305
                                                        @Override
306
                                                        public void execute() {
307
                                            fetchFolder(username, iter, dataProvider, callback);
308
                                                        }
309
                                                });
310
                        }
311
                        else {
312
                                dataProvider.getList().add(_result);
313
                            fetchFolder(username, iter, dataProvider, callback);
314
                        }
315
                }
316

    
317
                @Override
318
                public void onError(Throwable t) {
319
                    GWT.log("Error getting folder", t);
320
                    if (t instanceof RestException)
321
                        app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
322
                    else
323
                        app.displayError("System error fetching folder: " + t.getMessage());
324
                }
325
            };
326
            getFolder.setHeader("X-Auth-Token", app.getToken());
327
            Scheduler.get().scheduleDeferred(getFolder);
328
        }
329
        else if (callback != null)
330
            callback.execute();
331
    }
332

    
333
    public Folder getSelection() {
334
        return selectionModel.getSelectedObject();
335
    }
336

    
337
    public void updateFolder(Folder folder, boolean showfiles) {
338
        if (dataProviderMap.get(folder) == null) {
339
            dataProviderMap.put(folder, new ListDataProvider<Folder>());
340
        }
341
        final ListDataProvider<Folder> dataProvider = dataProviderMap.get(folder);
342
        fetchFolder(folder, dataProvider, showfiles);
343
    }
344

    
345
    public void fetchFolder(final Folder f, final ListDataProvider<Folder> dataProvider, final boolean showfiles) {
346
        String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
347
        GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwner(), path, f) {
348
            @Override
349
            public void onSuccess(final Folder _result) {
350
                if (showfiles)
351
                    app.showFiles(_result);
352
                Iterator<Folder> iter = _result.getSubfolders().iterator();
353
                fetchFolder(_result.getOwner(), iter, dataProvider, new Command() {
354
                    @Override
355
                    public void execute() {
356
                        dataProvider.getList().clear();
357
                        dataProvider.getList().addAll(_result.getSubfolders());
358
                        app.getOtherSharedTreeView().updateChildren(f);
359
                    }
360
                });
361
            }
362

    
363
            @Override
364
            public void onError(Throwable t) {
365
                GWT.log("Error getting folder", t);
366
                if (t instanceof RestException)
367
                    app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
368
                else
369
                    app.displayError("System error fetching folder: " + t.getMessage());
370
            }
371
        };
372
        getFolder.setHeader("X-Auth-Token", app.getToken());
373
        Scheduler.get().scheduleDeferred(getFolder);
374
    }
375
}