Removed d'n'd support for now
[pithos] / web_client / src / gr / grnet / pithos / web / client / foldertree / FolderTreeViewModel.java
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 }