Fixed bug when displaying folder tree after the second level. Now the tree works...
[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.cell.client.AbstractCell;
8 import com.google.gwt.cell.client.Cell;
9 import com.google.gwt.core.client.GWT;
10 import com.google.gwt.core.client.Scheduler;
11 import com.google.gwt.core.client.Scheduler.ScheduledCommand;
12 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
13 import com.google.gwt.user.client.ui.AbstractImagePrototype;
14 import com.google.gwt.view.client.ListDataProvider;
15 import com.google.gwt.view.client.SelectionChangeEvent;
16 import com.google.gwt.view.client.SelectionChangeEvent.Handler;
17 import com.google.gwt.view.client.SingleSelectionModel;
18 import com.google.gwt.view.client.TreeViewModel;
19 import gr.grnet.pithos.web.client.GSS;
20 import gr.grnet.pithos.web.client.foldertree.FolderTreeView.FolderCell;
21 import gr.grnet.pithos.web.client.rest.GetRequest;
22 import gr.grnet.pithos.web.client.rest.RestException;
23 import gr.grnet.pithos.web.client.rest.resource.FolderResource;
24 import gwtquery.plugins.droppable.client.gwt.DragAndDropNodeInfo;
25 import java.util.Iterator;
26 import java.util.List;
27 import java.util.Set;
28
29 public class FolderTreeViewModel implements TreeViewModel {
30
31     private SingleSelectionModel<Folder> selectionModel = new SingleSelectionModel<Folder>();
32
33     private ListDataProvider<Folder> rootDataProvider = new ListDataProvider<Folder>();
34
35     public FolderTreeViewModel() {
36         Handler selectionHandler = new SelectionChangeEvent.Handler() {
37             @Override
38             public void onSelectionChange(SelectionChangeEvent event) {
39                 NodeInfo<Folder> nodeInfo = (NodeInfo<Folder>) getNodeInfo(selectionModel.getSelectedObject());
40                 if(nodeInfo == null || nodeInfo.getValueUpdater() == null) {
41                     //GSS.get().showFileList(selectionModel.getSelectedObject());
42                 }
43                 else
44                     nodeInfo.getValueUpdater().update(selectionModel.getSelectedObject());
45                 GSS.get().setCurrentSelection(selectionModel.getSelectedObject());
46             }
47         };
48         selectionModel.addSelectionChangeHandler(selectionHandler);
49     }
50
51     @Override
52     public <T> NodeInfo<?> getNodeInfo(T value) {
53         if (value == null) {
54             Folder f = new Folder("Loading ...");
55             rootDataProvider.getList().add(f);
56             return new DragAndDropNodeInfo<Folder>(rootDataProvider, new FolderCell(), selectionModel, null);
57         }
58         else {
59             final Folder f = (Folder) value;
60             final ListDataProvider<Folder> dataProvider = new ListDataProvider<Folder>();
61             dataProvider.flush();
62             Scheduler.get().scheduleDeferred(new ScheduledCommand() {
63                 @Override
64                 public void execute() {
65                     final GSS app = GSS.get();
66                     String path = app.getApiPath() + app.getUsername() + "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
67                     GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, path, f) {
68                         @Override
69                         public void onSuccess(Folder result) {
70                             Iterator<Folder> iter = result.getSubfolders().iterator();
71                             fetchFolder(iter, dataProvider, result.getSubfolders());
72                         }
73
74                         @Override
75                         public void onError(Throwable t) {
76                             GWT.log("Error getting folder", t);
77                             if (t instanceof RestException)
78                                 GSS.get().displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
79                             else
80                                 GSS.get().displayError("System error fetching folder: " + t.getMessage());
81                         }
82                     };
83                     Scheduler.get().scheduleDeferred(getFolder);
84                 }
85             });
86             return new DragAndDropNodeInfo<Folder>(dataProvider, new FolderCell(), selectionModel, null);
87         }
88     }
89
90     @Override
91     public boolean isLeaf(Object o) {
92         if (o instanceof Folder) {
93             Folder f = (Folder) o;
94             return f.getSubfolders().isEmpty();
95         }
96         return false;
97     }
98
99     private void fetchFolder(final Iterator<Folder> iter, final ListDataProvider<Folder> dataProvider, final Set<Folder> folders) {
100         if (iter.hasNext()) {
101             final Folder f = iter.next();
102
103             GSS app = GSS.get();
104             String path = app.getApiPath() + app.getUsername() + "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
105             GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, path, f) {
106                 @Override
107                 public void onSuccess(Folder result) {
108                     fetchFolder(iter, dataProvider, folders);
109                 }
110
111                 @Override
112                 public void onError(Throwable t) {
113                     GWT.log("Error getting folder", t);
114                     if (t instanceof RestException)
115                         GSS.get().displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
116                     else
117                         GSS.get().displayError("System error fetching folder: " + t.getMessage());
118                 }
119             };
120             Scheduler.get().scheduleDeferred(getFolder);
121         }
122         else {
123             dataProvider.getList().clear();
124             dataProvider.getList().addAll(folders);
125         }
126     }
127
128     public void initialize(AccountResource account) {
129         Iterator<Folder> iter = account.getContainers().iterator();
130         fetchFolder(iter, rootDataProvider, account.getContainers());
131     }
132 }