2 * Copyright (c) 2011 Greek Research and Technology Network
5 package gr.grnet.pithos.web.client.foldertree;
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;
22 public class FolderTreeViewModel implements TreeViewModel {
24 private SingleSelectionModel<Folder> selectionModel = new SingleSelectionModel<Folder>();
26 private ListDataProvider<Folder> rootDataProvider = new ListDataProvider<Folder>();
28 public FolderTreeViewModel() {
29 Handler selectionHandler = new SelectionChangeEvent.Handler() {
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());
37 nodeInfo.getValueUpdater().update(selectionModel.getSelectedObject());
38 GSS.get().setCurrentSelection(selectionModel.getSelectedObject());
41 selectionModel.addSelectionChangeHandler(selectionHandler);
45 public <T> NodeInfo<?> getNodeInfo(T value) {
47 Folder f = new Folder("Loading ...");
48 rootDataProvider.getList().add(f);
49 return new DefaultNodeInfo<Folder>(rootDataProvider, new FolderCell(), selectionModel, null);
52 final Folder f = (Folder) value;
53 final ListDataProvider<Folder> dataProvider = new ListDataProvider<Folder>();
55 Scheduler.get().scheduleDeferred(new ScheduledCommand() {
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) {
62 public void onSuccess(Folder result) {
63 Iterator<Folder> iter = result.getSubfolders().iterator();
64 fetchFolder(iter, dataProvider, result.getSubfolders());
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());
73 GSS.get().displayError("System error fetching folder: " + t.getMessage());
76 Scheduler.get().scheduleDeferred(getFolder);
79 return new DefaultNodeInfo<Folder>(dataProvider, new FolderCell(), selectionModel, null);
84 public boolean isLeaf(Object o) {
85 if (o instanceof Folder) {
86 Folder f = (Folder) o;
87 return f.getSubfolders().isEmpty();
92 private void fetchFolder(final Iterator<Folder> iter, final ListDataProvider<Folder> dataProvider, final Set<Folder> folders) {
94 final Folder f = iter.next();
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) {
100 public void onSuccess(Folder result) {
101 fetchFolder(iter, dataProvider, folders);
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());
110 GSS.get().displayError("System error fetching folder: " + t.getMessage());
113 Scheduler.get().scheduleDeferred(getFolder);
116 dataProvider.getList().clear();
117 dataProvider.getList().addAll(folders);
121 public void initialize(AccountResource account) {
122 Iterator<Folder> iter = account.getContainers().iterator();
123 fetchFolder(iter, rootDataProvider, account.getContainers());