Statistics
| Branch: | Tag: | Revision:

root / web_client / src / gr / grnet / pithos / web / client / foldertree / FolderTreeViewModel.java @ d301b73f

History | View | Annotate | Download (5.4 kB)

1
/*
2
 * Copyright (c) 2011 Greek Research and Technology Network
3
 */
4

    
5
package gr.grnet.pithos.web.client.foldertree;
6

    
7
import com.google.gwt.core.client.GWT;
8
import com.google.gwt.core.client.Scheduler;
9
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
10
import com.google.gwt.view.client.ListDataProvider;
11
import com.google.gwt.view.client.SelectionChangeEvent;
12
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
13
import com.google.gwt.view.client.SingleSelectionModel;
14
import com.google.gwt.view.client.TreeViewModel;
15
import gr.grnet.pithos.web.client.GSS;
16
import gr.grnet.pithos.web.client.foldertree.FolderTreeView.FolderCell;
17
import gr.grnet.pithos.web.client.rest.GetRequest;
18
import gr.grnet.pithos.web.client.rest.RestException;
19
import java.util.Iterator;
20
import java.util.Set;
21

    
22
public class FolderTreeViewModel implements TreeViewModel {
23

    
24
    private SingleSelectionModel<Folder> selectionModel = new SingleSelectionModel<Folder>();
25

    
26
    private ListDataProvider<Folder> rootDataProvider = new ListDataProvider<Folder>();
27

    
28
    public FolderTreeViewModel() {
29
        Handler selectionHandler = new SelectionChangeEvent.Handler() {
30
            @Override
31
            public void onSelectionChange(SelectionChangeEvent event) {
32
                NodeInfo<Folder> nodeInfo = (NodeInfo<Folder>) getNodeInfo(selectionModel.getSelectedObject());
33
                if(nodeInfo == null || nodeInfo.getValueUpdater() == null) {
34
//                    GSS.get().showFileList(selectionModel.getSelectedObject());
35
                }
36
                else
37
                    nodeInfo.getValueUpdater().update(selectionModel.getSelectedObject());
38
                GSS.get().setCurrentSelection(selectionModel.getSelectedObject());
39
            }
40
        };
41
        selectionModel.addSelectionChangeHandler(selectionHandler);
42
    }
43

    
44
    @Override
45
    public <T> NodeInfo<?> getNodeInfo(T value) {
46
        if (value == null) {
47
            Folder f = new Folder("Loading ...");
48
            rootDataProvider.getList().add(f);
49
            return new DefaultNodeInfo<Folder>(rootDataProvider, new FolderCell(), selectionModel, null);
50
        }
51
        else {
52
            final Folder f = (Folder) value;
53
            final ListDataProvider<Folder> dataProvider = new ListDataProvider<Folder>();
54
            dataProvider.flush();
55
            Scheduler.get().scheduleDeferred(new ScheduledCommand() {
56
                @Override
57
                public void execute() {
58
                    final GSS app = GSS.get();
59
                    String path = app.getApiPath() + app.getUsername() + "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
60
                    GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, path, f) {
61
                        @Override
62
                        public void onSuccess(Folder result) {
63
                            Iterator<Folder> iter = result.getSubfolders().iterator();
64
                            fetchFolder(iter, dataProvider, result.getSubfolders());
65
                        }
66

    
67
                        @Override
68
                        public void onError(Throwable t) {
69
                            GWT.log("Error getting folder", t);
70
                            if (t instanceof RestException)
71
                                GSS.get().displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
72
                            else
73
                                GSS.get().displayError("System error fetching folder: " + t.getMessage());
74
                        }
75
                    };
76
                    Scheduler.get().scheduleDeferred(getFolder);
77
                }
78
            });
79
            return new DefaultNodeInfo<Folder>(dataProvider, new FolderCell(), selectionModel, null);
80
        }
81
    }
82

    
83
    @Override
84
    public boolean isLeaf(Object o) {
85
        if (o instanceof Folder) {
86
            Folder f = (Folder) o;
87
            return f.getSubfolders().isEmpty();
88
        }
89
        return false;
90
    }
91

    
92
    private void fetchFolder(final Iterator<Folder> iter, final ListDataProvider<Folder> dataProvider, final Set<Folder> folders) {
93
        if (iter.hasNext()) {
94
            final Folder f = iter.next();
95

    
96
            GSS app = GSS.get();
97
            String path = app.getApiPath() + app.getUsername() + "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
98
            GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, path, f) {
99
                @Override
100
                public void onSuccess(Folder result) {
101
                    fetchFolder(iter, dataProvider, folders);
102
                }
103

    
104
                @Override
105
                public void onError(Throwable t) {
106
                    GWT.log("Error getting folder", t);
107
                    if (t instanceof RestException)
108
                        GSS.get().displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
109
                    else
110
                        GSS.get().displayError("System error fetching folder: " + t.getMessage());
111
                }
112
            };
113
            Scheduler.get().scheduleDeferred(getFolder);
114
        }
115
        else {
116
            dataProvider.getList().clear();
117
            dataProvider.getList().addAll(folders);
118
        }
119
    }
120

    
121
    public void initialize(AccountResource account) {
122
        Iterator<Folder> iter = account.getContainers().iterator();
123
        fetchFolder(iter, rootDataProvider, account.getContainers());
124
    }
125
}