Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (18.5 kB)

1 6d8e0f58 Christos Stathis
/*
2 cae2a8db Christos Stathis
 * Copyright 2011-2012 GRNET S.A. All rights reserved.
3 6d8e0f58 Christos Stathis
 *
4 6d8e0f58 Christos Stathis
 * Redistribution and use in source and binary forms, with or
5 6d8e0f58 Christos Stathis
 * without modification, are permitted provided that the following
6 6d8e0f58 Christos Stathis
 * conditions are met:
7 6d8e0f58 Christos Stathis
 *
8 6d8e0f58 Christos Stathis
 *   1. Redistributions of source code must retain the above
9 6d8e0f58 Christos Stathis
 *      copyright notice, this list of conditions and the following
10 6d8e0f58 Christos Stathis
 *      disclaimer.
11 6d8e0f58 Christos Stathis
 *
12 6d8e0f58 Christos Stathis
 *   2. Redistributions in binary form must reproduce the above
13 6d8e0f58 Christos Stathis
 *      copyright notice, this list of conditions and the following
14 6d8e0f58 Christos Stathis
 *      disclaimer in the documentation and/or other materials
15 6d8e0f58 Christos Stathis
 *      provided with the distribution.
16 6d8e0f58 Christos Stathis
 *
17 6d8e0f58 Christos Stathis
 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18 6d8e0f58 Christos Stathis
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 6d8e0f58 Christos Stathis
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 6d8e0f58 Christos Stathis
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21 6d8e0f58 Christos Stathis
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 6d8e0f58 Christos Stathis
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 6d8e0f58 Christos Stathis
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24 6d8e0f58 Christos Stathis
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 6d8e0f58 Christos Stathis
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 6d8e0f58 Christos Stathis
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27 6d8e0f58 Christos Stathis
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 6d8e0f58 Christos Stathis
 * POSSIBILITY OF SUCH DAMAGE.
29 6d8e0f58 Christos Stathis
 *
30 6d8e0f58 Christos Stathis
 * The views and conclusions contained in the software and
31 6d8e0f58 Christos Stathis
 * documentation are those of the authors and should not be
32 6d8e0f58 Christos Stathis
 * interpreted as representing official policies, either expressed
33 6d8e0f58 Christos Stathis
 * or implied, of GRNET S.A.
34 6d8e0f58 Christos Stathis
 */
35 6d8e0f58 Christos Stathis
36 6d8e0f58 Christos Stathis
package gr.grnet.pithos.web.client.othersharedtree;
37 6d8e0f58 Christos Stathis
38 6d8e0f58 Christos Stathis
import com.google.gwt.cell.client.AbstractCell;
39 6d8e0f58 Christos Stathis
import com.google.gwt.cell.client.Cell;
40 6d8e0f58 Christos Stathis
import com.google.gwt.cell.client.TextCell;
41 6d8e0f58 Christos Stathis
import com.google.gwt.cell.client.ValueUpdater;
42 6d8e0f58 Christos Stathis
import com.google.gwt.core.client.GWT;
43 6d8e0f58 Christos Stathis
import com.google.gwt.core.client.Scheduler;
44 6d8e0f58 Christos Stathis
import com.google.gwt.event.dom.client.ContextMenuEvent;
45 b9a1049a Christos KK Loverdos
import com.google.gwt.http.client.Request;
46 9539e23d Christos Stathis
import com.google.gwt.http.client.Response;
47 f5023f13 Christos Stathis
import com.google.gwt.http.client.URL;
48 b9a1049a Christos KK Loverdos
import com.google.gwt.json.client.JSONObject;
49 6d8e0f58 Christos Stathis
import com.google.gwt.safehtml.shared.SafeHtml;
50 6d8e0f58 Christos Stathis
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
51 6d8e0f58 Christos Stathis
import com.google.gwt.text.shared.SafeHtmlRenderer;
52 6d8e0f58 Christos Stathis
import com.google.gwt.user.client.Command;
53 6d8e0f58 Christos Stathis
import com.google.gwt.user.client.ui.AbstractImagePrototype;
54 6d8e0f58 Christos Stathis
import com.google.gwt.view.client.ListDataProvider;
55 6d8e0f58 Christos Stathis
import com.google.gwt.view.client.SingleSelectionModel;
56 6d8e0f58 Christos Stathis
import com.google.gwt.view.client.TreeViewModel;
57 b9a1049a Christos KK Loverdos
import gr.grnet.pithos.web.client.FolderContextMenu;
58 b9a1049a Christos KK Loverdos
import gr.grnet.pithos.web.client.Pithos;
59 b9a1049a Christos KK Loverdos
import gr.grnet.pithos.web.client.SharingUsers;
60 b9a1049a Christos KK Loverdos
import gr.grnet.pithos.web.client.catalog.GetUserCatalogs;
61 eee72ed5 Christos KK Loverdos
import gr.grnet.pithos.web.client.catalog.UpdateUserCatalogs;
62 b9a1049a Christos KK Loverdos
import gr.grnet.pithos.web.client.catalog.UserCatalogs;
63 b9a1049a Christos KK Loverdos
import gr.grnet.pithos.web.client.foldertree.AccountResource;
64 b9a1049a Christos KK Loverdos
import gr.grnet.pithos.web.client.foldertree.Folder;
65 b9a1049a Christos KK Loverdos
import gr.grnet.pithos.web.client.othersharedtree.OtherSharedTreeView.Templates;
66 b9a1049a Christos KK Loverdos
import gr.grnet.pithos.web.client.rest.GetRequest;
67 b9a1049a Christos KK Loverdos
import gr.grnet.pithos.web.client.rest.RestException;
68 b9a1049a Christos KK Loverdos
69 b9a1049a Christos KK Loverdos
import java.util.HashMap;
70 b9a1049a Christos KK Loverdos
import java.util.Iterator;
71 b9a1049a Christos KK Loverdos
import java.util.List;
72 b9a1049a Christos KK Loverdos
import java.util.Map;
73 6d8e0f58 Christos Stathis
74 6d8e0f58 Christos Stathis
public class OtherSharedTreeViewModel implements TreeViewModel {
75 6d8e0f58 Christos Stathis
76 6d8e0f58 Christos Stathis
    protected Pithos app;
77 6d8e0f58 Christos Stathis
78 b9a1049a Christos KK Loverdos
    final String dummy = "No shares by others yet";
79 3f62b626 Christos Stathis
80 6d8e0f58 Christos Stathis
    private Cell<Folder> folderCell = new AbstractCell<Folder>(ContextMenuEvent.getType().getName()) {
81 6d8e0f58 Christos Stathis
82 b9a1049a Christos KK Loverdos
        @Override
83 ebead1b5 Christos Stathis
        public void render(Context context, Folder folder, SafeHtmlBuilder safeHtmlBuilder) {
84 6d8e0f58 Christos Stathis
            String html = AbstractImagePrototype.create(OtherSharedTreeView.images.folderYellow()).getHTML();
85 b9a1049a Christos KK Loverdos
            safeHtmlBuilder.appendHtmlConstant(html).appendHtmlConstant("&nbsp;");
86 6d8e0f58 Christos Stathis
            safeHtmlBuilder.append(Templates.INSTANCE.nameSpan(folder.getName()));
87 6d8e0f58 Christos Stathis
        }
88 6d8e0f58 Christos Stathis
89 6d8e0f58 Christos Stathis
        @Override
90 a2f617f8 Christos Stathis
        public void onBrowserEvent(Context context, com.google.gwt.dom.client.Element parent, final Folder folder, com.google.gwt.dom.client.NativeEvent event, ValueUpdater<Folder> valueUpdater) {
91 b9a1049a Christos KK Loverdos
            if(event.getType().equals(ContextMenuEvent.getType().getName())) {
92 b9a1049a Christos KK Loverdos
                final int x = event.getClientX();
93 b9a1049a Christos KK Loverdos
                final int y = event.getClientY();
94 6d8e0f58 Christos Stathis
                OtherSharedTreeViewModel.this.selectionModel.setSelected(folder, true);
95 a2f617f8 Christos Stathis
                app.scheduleFolderHeadCommand(folder, new Command() {
96 b9a1049a Christos KK Loverdos
97 b9a1049a Christos KK Loverdos
                    @Override
98 b9a1049a Christos KK Loverdos
                    public void execute() {
99 b9a1049a Christos KK Loverdos
                        FolderContextMenu menu = new FolderContextMenu(app, OtherSharedTreeView.images, app.getSelectedTree(), folder);
100 b9a1049a Christos KK Loverdos
                        menu.setPopupPosition(x, y);
101 b9a1049a Christos KK Loverdos
                        menu.show();
102 b9a1049a Christos KK Loverdos
                    }
103 b9a1049a Christos KK Loverdos
                });
104 6d8e0f58 Christos Stathis
            }
105 6d8e0f58 Christos Stathis
        }
106 6d8e0f58 Christos Stathis
    };
107 6d8e0f58 Christos Stathis
108 b9a1049a Christos KK Loverdos
    protected ListDataProvider<String> userLevelDataProviderForIDs = new ListDataProvider<String>();
109 b9a1049a Christos KK Loverdos
//    protected ListDataProvider<String> userLevelDataProviderForDisplayNames = new ListDataProvider<String>();
110 6d8e0f58 Christos Stathis
111 220831bd Christos Stathis
    protected Map<String, ListDataProvider<Folder>> userDataProviderMap = new HashMap<String, ListDataProvider<Folder>>();
112 6d8e0f58 Christos Stathis
    private Map<Folder, ListDataProvider<Folder>> dataProviderMap = new HashMap<Folder, ListDataProvider<Folder>>();
113 b9a1049a Christos KK Loverdos
114 220831bd Christos Stathis
    protected SingleSelectionModel<Folder> selectionModel;
115 6d8e0f58 Christos Stathis
116 6d8e0f58 Christos Stathis
    public OtherSharedTreeViewModel(Pithos _app, SingleSelectionModel<Folder> selectionModel) {
117 6d8e0f58 Christos Stathis
        app = _app;
118 6d8e0f58 Christos Stathis
        this.selectionModel = selectionModel;
119 6d8e0f58 Christos Stathis
    }
120 6d8e0f58 Christos Stathis
121 6d8e0f58 Christos Stathis
    @Override
122 6d8e0f58 Christos Stathis
    public <T> NodeInfo<?> getNodeInfo(T value) {
123 b9a1049a Christos KK Loverdos
        if(value == null) {
124 b9a1049a Christos KK Loverdos
//            LOG("getNodeInfo(null), calling fetchSharingUsers(null)");
125 b9a1049a Christos KK Loverdos
            fetchSharingUsers(null);
126 b9a1049a Christos KK Loverdos
//            LOG("getNodeInfo(null), called fetchSharingUsers(null)");
127 b9a1049a Christos KK Loverdos
            return new DefaultNodeInfo<String>(userLevelDataProviderForIDs, new TextCell(new SafeHtmlRenderer<String>() {
128 b9a1049a Christos KK Loverdos
                @Override
129 b9a1049a Christos KK Loverdos
                public SafeHtml render(String object) {
130 b9a1049a Christos KK Loverdos
                    final String displayName = app.getUserDisplayNameForID(object);
131 b9a1049a Christos KK Loverdos
//                    LOG("render(userID = "+object+"), displayName = " + displayName);
132 6d8e0f58 Christos Stathis
                    SafeHtmlBuilder builder = new SafeHtmlBuilder();
133 b9a1049a Christos KK Loverdos
                    render(displayName, builder);
134 6d8e0f58 Christos Stathis
                    return builder.toSafeHtml();
135 b9a1049a Christos KK Loverdos
                }
136 6d8e0f58 Christos Stathis
137 b9a1049a Christos KK Loverdos
                @Override
138 b9a1049a Christos KK Loverdos
                public void render(String object, SafeHtmlBuilder builder) {
139 b9a1049a Christos KK Loverdos
                    if(!object.equals(dummy)) {
140 b9a1049a Christos KK Loverdos
//                        LOG("render(userID [not dummy] = "+object+")");
141 b9a1049a Christos KK Loverdos
                        String html = AbstractImagePrototype.create(OtherSharedTreeView.images.myShared()).getHTML();
142 b9a1049a Christos KK Loverdos
                        builder.appendHtmlConstant(html).appendHtmlConstant("&nbsp;");
143 3f62b626 Christos Stathis
                    }
144 b9a1049a Christos KK Loverdos
                    final String displayName = app.getUserDisplayNameForID(object);
145 6d8e0f58 Christos Stathis
                    builder.append(OtherSharedTreeView.Templates.INSTANCE.nameSpan(object));
146 b9a1049a Christos KK Loverdos
                }
147 b9a1049a Christos KK Loverdos
            }), null, null);
148 6d8e0f58 Christos Stathis
        }
149 b9a1049a Christos KK Loverdos
        else if(value instanceof String) {
150 b9a1049a Christos KK Loverdos
//            LOG("getNodeInfo(String "+value+"), called with userID");
151 b9a1049a Christos KK Loverdos
            final String userID = (String) value;
152 b9a1049a Christos KK Loverdos
153 b9a1049a Christos KK Loverdos
            if(userDataProviderMap.get(userID) == null) {
154 b9a1049a Christos KK Loverdos
                userDataProviderMap.put(userID, new ListDataProvider<Folder>());
155 b9a1049a Christos KK Loverdos
            }
156 b9a1049a Christos KK Loverdos
            final ListDataProvider<Folder> userIDDataProvider = userDataProviderMap.get(userID);
157 b9a1049a Christos KK Loverdos
            fetchSharedContainers(userID, userIDDataProvider, null);
158 b9a1049a Christos KK Loverdos
159 b9a1049a Christos KK Loverdos
            return new DefaultNodeInfo<Folder>(userIDDataProvider, folderCell, selectionModel, null);
160 6d8e0f58 Christos Stathis
        }
161 6d8e0f58 Christos Stathis
        else {
162 b9a1049a Christos KK Loverdos
//            LOG("getNodeInfo(Folder "+value+"), called with a folder");
163 6d8e0f58 Christos Stathis
            final Folder f = (Folder) value;
164 b9a1049a Christos KK Loverdos
            if(dataProviderMap.get(f) == null) {
165 6d8e0f58 Christos Stathis
                dataProviderMap.put(f, new ListDataProvider<Folder>());
166 6d8e0f58 Christos Stathis
            }
167 6d8e0f58 Christos Stathis
            final ListDataProvider<Folder> dataProvider = dataProviderMap.get(f);
168 3646552f Christos Stathis
            fetchFolder(f, dataProvider, false, null);
169 6d8e0f58 Christos Stathis
            return new DefaultNodeInfo<Folder>(dataProvider, folderCell, selectionModel, null);
170 6d8e0f58 Christos Stathis
        }
171 6d8e0f58 Christos Stathis
    }
172 6d8e0f58 Christos Stathis
173 b9a1049a Christos KK Loverdos
//    native void LOG(String message) /*-{
174 b9a1049a Christos KK Loverdos
//      console.log(message );
175 b9a1049a Christos KK Loverdos
//    }-*/;
176 b9a1049a Christos KK Loverdos
177 7c54d867 Christos Stathis
    private void fetchSharingUsers(final Command callback) {
178 6d8e0f58 Christos Stathis
        GetRequest<SharingUsers> getSharingUsers = new GetRequest<SharingUsers>(SharingUsers.class, app.getApiPath(), "", "?format=json") {
179 6d8e0f58 Christos Stathis
            @Override
180 7811b9d1 Christos Stathis
            public void onSuccess(final SharingUsers _result) {
181 b9a1049a Christos KK Loverdos
                userLevelDataProviderForIDs.getList().clear();
182 b9a1049a Christos KK Loverdos
183 b9a1049a Christos KK Loverdos
                final List<String> userIDs = _result.getUserIDs();
184 b9a1049a Christos KK Loverdos
//                for(String userID : userIDs) {
185 b9a1049a Christos KK Loverdos
//                    LOG("fetchSharingUsers(): userID =" + userID);
186 b9a1049a Christos KK Loverdos
//                }
187 b9a1049a Christos KK Loverdos
                final List<String> userIDsWithUnknownDisplayNames = app.filterUserIDsWithUnknownDisplayName(userIDs);
188 b9a1049a Christos KK Loverdos
//                for(String userID : userIDsWithUnknownDisplayNames) {
189 b9a1049a Christos KK Loverdos
//                    LOG("fetchSharingUsers(): userID (with unknown name) =" + userID);
190 b9a1049a Christos KK Loverdos
//                }
191 b9a1049a Christos KK Loverdos
192 b9a1049a Christos KK Loverdos
                userLevelDataProviderForIDs.getList().addAll(userIDs);
193 b9a1049a Christos KK Loverdos
                if(userLevelDataProviderForIDs.getList().isEmpty()) {
194 b9a1049a Christos KK Loverdos
                    userLevelDataProviderForIDs.getList().add(dummy);
195 b9a1049a Christos KK Loverdos
//                    userLevelDataProviderForDisplayNames.getList().add(dummy);
196 b9a1049a Christos KK Loverdos
                } else {
197 b9a1049a Christos KK Loverdos
//                    userLevelDataProviderForDisplayNames.getList().addAll(app.getUserDisplayNamesForIDs(userIDs));
198 b9a1049a Christos KK Loverdos
                }
199 b9a1049a Christos KK Loverdos
200 b9a1049a Christos KK Loverdos
                if(userIDsWithUnknownDisplayNames.size() == 0) {
201 b9a1049a Christos KK Loverdos
                    // All display names are known, so we proceed directly
202 b9a1049a Christos KK Loverdos
                    fetchSharedContainers(userLevelDataProviderForIDs.getList().iterator(), callback);
203 b9a1049a Christos KK Loverdos
                } else {
204 b9a1049a Christos KK Loverdos
                    // First fetch unknown display names and then proceed
205 eee72ed5 Christos KK Loverdos
                    new UpdateUserCatalogs(app, userIDsWithUnknownDisplayNames) {
206 b9a1049a Christos KK Loverdos
                        @Override
207 eee72ed5 Christos KK Loverdos
                        public void onSuccess(UserCatalogs requestedUserCatalogs, UserCatalogs updatedUserCatalogs) {
208 b9a1049a Christos KK Loverdos
                            fetchSharedContainers(userLevelDataProviderForIDs.getList().iterator(), callback);
209 b9a1049a Christos KK Loverdos
                        }
210 b9a1049a Christos KK Loverdos
211 b9a1049a Christos KK Loverdos
                        @Override
212 b9a1049a Christos KK Loverdos
                        public void onError(Request request, Throwable t) {
213 b9a1049a Christos KK Loverdos
                            super.onError(request, t);
214 b9a1049a Christos KK Loverdos
                            app.setError(t);
215 b9a1049a Christos KK Loverdos
                        }
216 b9a1049a Christos KK Loverdos
                    }.scheduleDeferred();
217 b9a1049a Christos KK Loverdos
                }
218 6d8e0f58 Christos Stathis
            }
219 6d8e0f58 Christos Stathis
220 6d8e0f58 Christos Stathis
            @Override
221 6d8e0f58 Christos Stathis
            public void onError(Throwable t) {
222 6d8e0f58 Christos Stathis
                GWT.log("Error getting folder", t);
223 b9a1049a Christos KK Loverdos
                app.setError(t);
224 b9a1049a Christos KK Loverdos
                if(t instanceof RestException) {
225 6d8e0f58 Christos Stathis
                    app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
226 b9a1049a Christos KK Loverdos
                }
227 b9a1049a Christos KK Loverdos
                else {
228 6d8e0f58 Christos Stathis
                    app.displayError("System error fetching folder: " + t.getMessage());
229 b9a1049a Christos KK Loverdos
                }
230 6d8e0f58 Christos Stathis
            }
231 9539e23d Christos Stathis
232 b9a1049a Christos KK Loverdos
            @Override
233 b9a1049a Christos KK Loverdos
            protected void onUnauthorized(Response response) {
234 b9a1049a Christos KK Loverdos
                app.sessionExpired();
235 b9a1049a Christos KK Loverdos
            }
236 6d8e0f58 Christos Stathis
        };
237 cc0120ab Christos KK Loverdos
        getSharingUsers.setHeader("X-Auth-Token", app.getUserToken());
238 6d8e0f58 Christos Stathis
        Scheduler.get().scheduleDeferred(getSharingUsers);
239 b9a1049a Christos KK Loverdos
    }
240 b9a1049a Christos KK Loverdos
241 b9a1049a Christos KK Loverdos
    protected void fetchSharedContainers(final Iterator<String> userIDsIterator, final Command callback) {
242 b9a1049a Christos KK Loverdos
        if(userIDsIterator.hasNext()) {
243 b9a1049a Christos KK Loverdos
            String userID = userIDsIterator.next();
244 b9a1049a Christos KK Loverdos
            if(userDataProviderMap.get(userID) == null) {
245 b9a1049a Christos KK Loverdos
                userDataProviderMap.put(userID, new ListDataProvider<Folder>());
246 b9a1049a Christos KK Loverdos
            }
247 b9a1049a Christos KK Loverdos
            final ListDataProvider<Folder> dataProvider = userDataProviderMap.get(userID);
248 b9a1049a Christos KK Loverdos
            fetchSharedContainers(userID, dataProvider, new Command() {
249 b9a1049a Christos KK Loverdos
250 b9a1049a Christos KK Loverdos
                @Override
251 b9a1049a Christos KK Loverdos
                public void execute() {
252 b9a1049a Christos KK Loverdos
                    fetchSharedContainers(userIDsIterator, callback);
253 b9a1049a Christos KK Loverdos
254 b9a1049a Christos KK Loverdos
                }
255 b9a1049a Christos KK Loverdos
            });
256 b9a1049a Christos KK Loverdos
        }
257 b9a1049a Christos KK Loverdos
        else if(callback != null) {
258 b9a1049a Christos KK Loverdos
            callback.execute();
259 b9a1049a Christos KK Loverdos
        }
260 b9a1049a Christos KK Loverdos
    }
261 b9a1049a Christos KK Loverdos
262 b9a1049a Christos KK Loverdos
    @Override
263 6d8e0f58 Christos Stathis
    public boolean isLeaf(Object o) {
264 b9a1049a Christos KK Loverdos
        if(o == null) {
265 b9a1049a Christos KK Loverdos
            boolean result =  userLevelDataProviderForIDs.getList().isEmpty();
266 b9a1049a Christos KK Loverdos
//            LOG("isLeaf(null) ==> " + result);
267 b9a1049a Christos KK Loverdos
            return result;
268 b9a1049a Christos KK Loverdos
        }
269 b9a1049a Christos KK Loverdos
        else if(o instanceof Folder) {
270 b9a1049a Christos KK Loverdos
            Folder folder = (Folder) o;
271 b9a1049a Christos KK Loverdos
            boolean result = folder.getSubfolders().isEmpty();
272 b9a1049a Christos KK Loverdos
//            LOG("isLeaf(Folder "+folder+") ==> " + result);
273 b9a1049a Christos KK Loverdos
            return result;
274 b9a1049a Christos KK Loverdos
        }
275 b9a1049a Christos KK Loverdos
        else {
276 b9a1049a Christos KK Loverdos
            ListDataProvider<Folder> dp = userDataProviderMap.get(o);
277 b9a1049a Christos KK Loverdos
            if(dp != null) {
278 b9a1049a Christos KK Loverdos
                boolean result =  dp.getList().isEmpty();
279 b9a1049a Christos KK Loverdos
//                LOG("isLeaf("+o.getClass().getName()+" "+o+") ==> " + result);
280 b9a1049a Christos KK Loverdos
                return result;
281 b9a1049a Christos KK Loverdos
            }
282 b9a1049a Christos KK Loverdos
//            LOG("isLeaf("+o.getClass().getName()+" "+o+") ==> (true)");
283 b9a1049a Christos KK Loverdos
            return true;
284 6d8e0f58 Christos Stathis
        }
285 6d8e0f58 Christos Stathis
    }
286 6d8e0f58 Christos Stathis
287 b9a1049a Christos KK Loverdos
    private void fetchSharedContainers(final String userID, final ListDataProvider<Folder> dataProvider, final Command callback) {
288 b9a1049a Christos KK Loverdos
        GetRequest<AccountResource> getUserSharedContainers = new GetRequest<AccountResource>(AccountResource.class, app.getApiPath(), userID, "?format=json") {
289 b9a1049a Christos KK Loverdos
290 b9a1049a Christos KK Loverdos
            @Override
291 b9a1049a Christos KK Loverdos
            public void onSuccess(AccountResource _result) {
292 b9a1049a Christos KK Loverdos
                final ListDataProvider<Folder> tempProvider = new ListDataProvider<Folder>();
293 b9a1049a Christos KK Loverdos
                Iterator<Folder> folderIterator = _result.getContainers().iterator();
294 b9a1049a Christos KK Loverdos
                fetchFolder(userID, folderIterator, tempProvider, new Command() {
295 b9a1049a Christos KK Loverdos
296 b9a1049a Christos KK Loverdos
                    @Override
297 b9a1049a Christos KK Loverdos
                    public void execute() {
298 b9a1049a Christos KK Loverdos
                        dataProvider.getList().clear();
299 b9a1049a Christos KK Loverdos
                        dataProvider.getList().addAll(tempProvider.getList());
300 b9a1049a Christos KK Loverdos
                        if(callback != null) {
301 b9a1049a Christos KK Loverdos
                            callback.execute();
302 b9a1049a Christos KK Loverdos
                        }
303 b9a1049a Christos KK Loverdos
                    }
304 b9a1049a Christos KK Loverdos
                });
305 b9a1049a Christos KK Loverdos
            }
306 b9a1049a Christos KK Loverdos
307 b9a1049a Christos KK Loverdos
            @Override
308 b9a1049a Christos KK Loverdos
            public void onError(Throwable t) {
309 220831bd Christos Stathis
                GWT.log("Error getting account", t);
310 b9a1049a Christos KK Loverdos
                app.setError(t);
311 b9a1049a Christos KK Loverdos
                if(t instanceof RestException) {
312 220831bd Christos Stathis
                    app.displayError("Error getting account: " + ((RestException) t).getHttpStatusText());
313 b9a1049a Christos KK Loverdos
                }
314 b9a1049a Christos KK Loverdos
                else {
315 220831bd Christos Stathis
                    app.displayError("System error fetching user data: " + t.getMessage());
316 b9a1049a Christos KK Loverdos
                }
317 b9a1049a Christos KK Loverdos
            }
318 9539e23d Christos Stathis
319 b9a1049a Christos KK Loverdos
            @Override
320 b9a1049a Christos KK Loverdos
            protected void onUnauthorized(Response response) {
321 b9a1049a Christos KK Loverdos
                app.sessionExpired();
322 b9a1049a Christos KK Loverdos
            }
323 b9a1049a Christos KK Loverdos
        };
324 b9a1049a Christos KK Loverdos
        getUserSharedContainers.setHeader("X-Auth-Token", app.getUserToken());
325 b9a1049a Christos KK Loverdos
        Scheduler.get().scheduleDeferred(getUserSharedContainers);
326 b9a1049a Christos KK Loverdos
    }
327 220831bd Christos Stathis
328 b9a1049a Christos KK Loverdos
    protected void fetchFolder(final String userID, final Iterator<Folder> folderIterator, final ListDataProvider<Folder> dataProvider, final Command callback) {
329 b9a1049a Christos KK Loverdos
        if(folderIterator.hasNext()) {
330 b9a1049a Christos KK Loverdos
            final Folder f = folderIterator.next();
331 6d8e0f58 Christos Stathis
332 f5023f13 Christos Stathis
            String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
333 b9a1049a Christos KK Loverdos
            GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), userID, path, f) {
334 6d8e0f58 Christos Stathis
                @Override
335 7811b9d1 Christos Stathis
                public void onSuccess(Folder _result) {
336 b9a1049a Christos KK Loverdos
                    dataProvider.getList().add(_result);
337 b9a1049a Christos KK Loverdos
                    fetchFolder(userID, folderIterator, dataProvider, callback);
338 6d8e0f58 Christos Stathis
                }
339 6d8e0f58 Christos Stathis
340 6d8e0f58 Christos Stathis
                @Override
341 6d8e0f58 Christos Stathis
                public void onError(Throwable t) {
342 6d8e0f58 Christos Stathis
                    GWT.log("Error getting folder", t);
343 b9a1049a Christos KK Loverdos
                    app.setError(t);
344 b9a1049a Christos KK Loverdos
                    if(t instanceof RestException) {
345 6d8e0f58 Christos Stathis
                        app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
346 b9a1049a Christos KK Loverdos
                    }
347 b9a1049a Christos KK Loverdos
                    else {
348 6d8e0f58 Christos Stathis
                        app.displayError("System error fetching folder: " + t.getMessage());
349 b9a1049a Christos KK Loverdos
                    }
350 6d8e0f58 Christos Stathis
                }
351 9539e23d Christos Stathis
352 b9a1049a Christos KK Loverdos
                @Override
353 b9a1049a Christos KK Loverdos
                protected void onUnauthorized(Response response) {
354 b9a1049a Christos KK Loverdos
                    app.sessionExpired();
355 b9a1049a Christos KK Loverdos
                }
356 6d8e0f58 Christos Stathis
            };
357 cc0120ab Christos KK Loverdos
            getFolder.setHeader("X-Auth-Token", app.getUserToken());
358 6d8e0f58 Christos Stathis
            Scheduler.get().scheduleDeferred(getFolder);
359 6d8e0f58 Christos Stathis
        }
360 b9a1049a Christos KK Loverdos
        else if(callback != null) {
361 6d8e0f58 Christos Stathis
            callback.execute();
362 b9a1049a Christos KK Loverdos
        }
363 6d8e0f58 Christos Stathis
    }
364 6d8e0f58 Christos Stathis
365 6d8e0f58 Christos Stathis
    public Folder getSelection() {
366 6d8e0f58 Christos Stathis
        return selectionModel.getSelectedObject();
367 6d8e0f58 Christos Stathis
    }
368 6d8e0f58 Christos Stathis
369 3646552f Christos Stathis
    public void updateFolder(Folder folder, boolean showfiles, Command callback) {
370 b9a1049a Christos KK Loverdos
        if(dataProviderMap.get(folder) == null) {
371 6d8e0f58 Christos Stathis
            dataProviderMap.put(folder, new ListDataProvider<Folder>());
372 6d8e0f58 Christos Stathis
        }
373 6d8e0f58 Christos Stathis
        final ListDataProvider<Folder> dataProvider = dataProviderMap.get(folder);
374 3646552f Christos Stathis
        fetchFolder(folder, dataProvider, showfiles, callback);
375 6d8e0f58 Christos Stathis
    }
376 6d8e0f58 Christos Stathis
377 3646552f Christos Stathis
    public void fetchFolder(final Folder f, final ListDataProvider<Folder> dataProvider, final boolean showfiles, final Command callback) {
378 f5023f13 Christos Stathis
        String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
379 4eaecbac Christos KK Loverdos
        GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
380 6d8e0f58 Christos Stathis
            @Override
381 7811b9d1 Christos Stathis
            public void onSuccess(final Folder _result) {
382 b9a1049a Christos KK Loverdos
                if(showfiles) {
383 7811b9d1 Christos Stathis
                    app.showFiles(_result);
384 b9a1049a Christos KK Loverdos
                }
385 7811b9d1 Christos Stathis
                Iterator<Folder> iter = _result.getSubfolders().iterator();
386 4eaecbac Christos KK Loverdos
                fetchFolder(_result.getOwnerID(), iter, dataProvider, new Command() {
387 6d8e0f58 Christos Stathis
                    @Override
388 6d8e0f58 Christos Stathis
                    public void execute() {
389 6d8e0f58 Christos Stathis
                        dataProvider.getList().clear();
390 7811b9d1 Christos Stathis
                        dataProvider.getList().addAll(_result.getSubfolders());
391 6d8e0f58 Christos Stathis
                        app.getOtherSharedTreeView().updateChildren(f);
392 b9a1049a Christos KK Loverdos
                        if(callback != null) {
393 b9a1049a Christos KK Loverdos
                            callback.execute();
394 b9a1049a Christos KK Loverdos
                        }
395 6d8e0f58 Christos Stathis
                    }
396 6d8e0f58 Christos Stathis
                });
397 6d8e0f58 Christos Stathis
            }
398 6d8e0f58 Christos Stathis
399 6d8e0f58 Christos Stathis
            @Override
400 6d8e0f58 Christos Stathis
            public void onError(Throwable t) {
401 6d8e0f58 Christos Stathis
                GWT.log("Error getting folder", t);
402 b9a1049a Christos KK Loverdos
                app.setError(t);
403 b9a1049a Christos KK Loverdos
                if(t instanceof RestException) {
404 6d8e0f58 Christos Stathis
                    app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
405 b9a1049a Christos KK Loverdos
                }
406 b9a1049a Christos KK Loverdos
                else {
407 6d8e0f58 Christos Stathis
                    app.displayError("System error fetching folder: " + t.getMessage());
408 b9a1049a Christos KK Loverdos
                }
409 6d8e0f58 Christos Stathis
            }
410 9539e23d Christos Stathis
411 b9a1049a Christos KK Loverdos
            @Override
412 b9a1049a Christos KK Loverdos
            protected void onUnauthorized(Response response) {
413 b9a1049a Christos KK Loverdos
                app.sessionExpired();
414 b9a1049a Christos KK Loverdos
            }
415 6d8e0f58 Christos Stathis
        };
416 cc0120ab Christos KK Loverdos
        getFolder.setHeader("X-Auth-Token", app.getUserToken());
417 6d8e0f58 Christos Stathis
        Scheduler.get().scheduleDeferred(getFolder);
418 6d8e0f58 Christos Stathis
    }
419 b9a1049a Christos KK Loverdos
420 7c54d867 Christos Stathis
    public void initialize(Command callback) {
421 b9a1049a Christos KK Loverdos
        fetchSharingUsers(callback);
422 7c54d867 Christos Stathis
    }
423 6d8e0f58 Christos Stathis
}