Automated merge with https://gss.googlecode.com/hg/
[pithos] / src / gr / ebs / gss / client / CellTreeViewModel.java
1 /*
2  * Copyright 2011 Electronic Business Systems Ltd.
3  *
4  * This file is part of GSS.
5  *
6  * GSS is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * GSS is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with GSS.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 package gr.ebs.gss.client;
20
21 import static com.google.gwt.query.client.GQuery.$;
22 import gr.ebs.gss.client.CellTreeView.Images;
23 import gr.ebs.gss.client.CellTreeView.RefreshHandler;
24 import gr.ebs.gss.client.rest.GetCommand;
25 import gr.ebs.gss.client.rest.MultipleGetCommand;
26 import gr.ebs.gss.client.rest.RestException;
27 import gr.ebs.gss.client.rest.resource.FileResource;
28 import gr.ebs.gss.client.rest.resource.FolderResource;
29 import gr.ebs.gss.client.rest.resource.MyFolderResource;
30 import gr.ebs.gss.client.rest.resource.OtherUserResource;
31 import gr.ebs.gss.client.rest.resource.OthersFolderResource;
32 import gr.ebs.gss.client.rest.resource.OthersResource;
33 import gr.ebs.gss.client.rest.resource.RestResource;
34 import gr.ebs.gss.client.rest.resource.RestResourceWrapper;
35 import gr.ebs.gss.client.rest.resource.SharedFolderResource;
36 import gr.ebs.gss.client.rest.resource.SharedResource;
37 import gr.ebs.gss.client.rest.resource.TrashFolderResource;
38 import gr.ebs.gss.client.rest.resource.TrashResource;
39 import gwtquery.plugins.draggable.client.DragAndDropManager;
40 import gwtquery.plugins.draggable.client.DraggableOptions;
41 import gwtquery.plugins.draggable.client.StopDragException;
42 import gwtquery.plugins.draggable.client.DraggableOptions.CursorAt;
43 import gwtquery.plugins.draggable.client.DraggableOptions.DragFunction;
44 import gwtquery.plugins.draggable.client.DraggableOptions.RevertOption;
45 import gwtquery.plugins.draggable.client.events.DragContext;
46 import gwtquery.plugins.droppable.client.DroppableOptions;
47 import gwtquery.plugins.droppable.client.DroppableOptions.DroppableFunction;
48 import gwtquery.plugins.droppable.client.events.DragAndDropContext;
49 import gwtquery.plugins.droppable.client.gwt.DragAndDropNodeInfo;
50
51 import java.util.ArrayList;
52 import java.util.Arrays;
53 import java.util.HashMap;
54 import java.util.List;
55 import java.util.Map;
56
57 import com.google.gwt.cell.client.AbstractCell;
58 import com.google.gwt.cell.client.Cell;
59 import com.google.gwt.cell.client.ValueUpdater;
60 import com.google.gwt.core.client.GWT;
61 import com.google.gwt.dom.client.Style.Cursor;
62 import com.google.gwt.query.client.plugins.GQueryUi;
63 import com.google.gwt.safehtml.client.SafeHtmlTemplates;
64 import com.google.gwt.safehtml.shared.SafeHtml;
65 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
66 import com.google.gwt.user.client.DeferredCommand;
67 import com.google.gwt.user.client.Window;
68 import com.google.gwt.user.client.ui.AbstractImagePrototype;
69 import com.google.gwt.view.client.AsyncDataProvider;
70 import com.google.gwt.view.client.HasData;
71 import com.google.gwt.view.client.ListDataProvider;
72 import com.google.gwt.view.client.ProvidesKey;
73 import com.google.gwt.view.client.SingleSelectionModel;
74 import com.google.gwt.view.client.TreeViewModel;
75
76
77
78 /**
79  * @author kman
80  *
81  */
82 public class CellTreeViewModel implements TreeViewModel{
83         
84         private final ListDataProvider<RestResource> rootNodes = new ListDataProvider<RestResource>();
85         private Map<String,FolderResource> folderCache=new HashMap<String, FolderResource>();
86         final Images images;
87         SingleSelectionModel<RestResource> selectionModel;
88         Map<String, MyFolderDataProvider> mymap = new HashMap<String, MyFolderDataProvider>();
89         Map<String, MyFolderDataProvider> sharedmap = new HashMap<String, MyFolderDataProvider>();
90         Map<String, MyFolderDataProvider> othersmap = new HashMap<String, MyFolderDataProvider>();
91         static interface Templates extends SafeHtmlTemplates {
92             Templates INSTANCE = GWT.create(Templates.class);
93
94             @Template(" <div id='dragHelper' class='{0}'></div>")
95             SafeHtml outerHelper(String cssClassName);
96           }
97
98         static void configureDragOperation(final DraggableOptions options) {
99
100             // set a custom element as drag helper. The content of the helper will be
101             // set when the drag will start
102             options.setHelper($(Templates.INSTANCE.outerHelper(
103                 "drag").asString()));
104             // opacity of the drag helper
105             options.setOpacity((float) 0.9);
106             // cursor during the drag operation
107             options.setCursor(Cursor.MOVE);
108             // the cell being greater than the helper, force the position of the
109             // helper on the mouse cursor.
110             options.setCursorAt(new CursorAt(10, 10, null, null));
111             // append the helper to the body element
112             options.setAppendTo("body");
113             // set the revert option
114             options.setRevert(RevertOption.ON_INVALID_DROP);
115             options.setOnBeforeDragStart(new DragFunction() {
116                         
117                         @Override
118                         public void f(DragContext context) {
119                                  RestResource value = context.getDraggableData();
120                              if(value instanceof TrashResource || value instanceof SharedResource || value instanceof OthersResource || value instanceof OtherUserResource){
121                                 throw new StopDragException();
122                               }
123                                 
124                         }
125                 });
126             // use a Function to fill the content of the helper
127             // we could also add a DragStartEventHandler on the DragAndDropTreeCell and
128             // DragAndDropCellList.
129             
130             options.setOnDragStart(new DragFunction() {
131               public void f(DragContext context) {
132                 RestResourceWrapper memberInfo = context.getDraggableData();
133                 context.getHelper().setInnerHTML(memberInfo.getName());
134               }
135             });
136
137           }
138
139         /**
140          * 
141          */
142         public CellTreeViewModel(final Images _images,SingleSelectionModel<RestResource> selectionModel ) {
143                 super();
144                 images=_images;
145                 this.selectionModel=selectionModel;
146         }
147         
148         private final Cell<RestResource> departmentCell = new AbstractCell<RestResource>("contextmenu"){
149                 
150                 @Override
151                 public void render(com.google.gwt.cell.client.Cell.Context arg0, RestResource arg1, SafeHtmlBuilder arg2) {
152                         String id = null;
153                         String html = null;
154                         String name = null;
155                         if(arg1 instanceof TrashFolderResource){
156                                 html = AbstractImagePrototype.create(images.folderYellow()).getHTML();
157                                 FolderResource res = ((RestResourceWrapper)arg1).getResource();
158                                 name = res.getName();
159                                 id = res.getParentName() +"."+name;
160                         }
161                         else if(arg1 instanceof RestResourceWrapper){
162                                 FolderResource res = ((RestResourceWrapper)arg1).getResource();
163                                 if(res.isShared())
164                                         html = AbstractImagePrototype.create(images.sharedFolder()).getHTML();
165                                 else if(res.getParentName()==null){
166                                         html = AbstractImagePrototype.create(images.home()).getHTML();
167                                 }
168                                 else
169                                         html = AbstractImagePrototype.create(images.folderYellow()).getHTML();
170                                 name = res.getName();
171                                 if(res.getParentName() != null){                                        
172                                         id = res.getParentName()+"."+name;
173                                 }else{                                  
174                                         id = name;
175                                 }
176                                 
177                         }
178                         else if(arg1 instanceof TrashResource){
179                                 html = AbstractImagePrototype.create(images.trash()).getHTML();
180                                 name="Trash";
181                                 id = name;                              
182                         }
183                         
184                         else if(arg1 instanceof SharedResource){
185                                 html = AbstractImagePrototype.create(images.myShared()).getHTML();
186                                 name = "My Shared";
187                                 id = name;
188                         }
189                         else if(arg1 instanceof OthersResource){
190                                 html = AbstractImagePrototype.create(images.othersShared()).getHTML();
191                                 name = "Other's Shared";
192                                 id = "others";                          
193                         }
194                         else if(arg1 instanceof OtherUserResource){
195                                 html = AbstractImagePrototype.create(images.permUser()).getHTML();
196                                 name = ((OtherUserResource)arg1).getName();
197                                 id = name;
198                         }
199                         arg2.appendHtmlConstant(html);
200                         arg2.appendHtmlConstant("<span id='"+id +"'"+ " class='papala'>");
201                         arg2.appendEscaped(name);
202                         arg2.appendHtmlConstant("</span>");
203                 }
204                 
205                 public void onBrowserEvent(Cell.Context context, com.google.gwt.dom.client.Element parent, RestResource value, com.google.gwt.dom.client.NativeEvent event, com.google.gwt.cell.client.ValueUpdater<RestResource> valueUpdater) {
206                         if(event.getType().equals("contextmenu")){
207                                 selectionModel.setSelected(value, true);
208                                 GSS.get().getTreeView().showPopup(event.getClientX(), event.getClientY());
209                         }
210                 };
211                 
212         };
213         
214         
215         @Override
216         public <T> NodeInfo<?> getNodeInfo(final T value) {
217                 
218                 if(value==null){
219                         DragAndDropNodeInfo n = new DragAndDropNodeInfo<RestResource>(getRootNodes(), departmentCell,
220                                     selectionModel, null);
221                         configureFolderDrop(n);
222                 configureDragOperation(n.getDraggableOptions());
223                         return n;
224                 }
225                 else if (value instanceof MyFolderResource) {
226                 // Second level.
227                         MyFolderDataProvider dataProvider = new MyFolderDataProvider(
228                     ((MyFolderResource) value),MyFolderResource.class);
229                 DragAndDropNodeInfo<RestResource> n =  new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
230                     selectionModel, new ResourceValueUpdater());
231                 mymap.put(((MyFolderResource) value).getUri(), dataProvider);
232                 
233                 // permission cell are not draggable
234                 //n.setCellDroppableOnly();
235                 configureFolderDrop(n);
236                 configureDragOperation(n.getDraggableOptions());
237                 
238                 return n;
239                 }
240                 else if (value instanceof SharedResource) {
241                 // Second level.
242                         MyFolderDataProvider dataProvider = new MyFolderDataProvider(
243                     ((SharedResource) value), SharedFolderResource.class);
244                         sharedmap.put(((SharedResource) value).getUri(), dataProvider);
245                         DragAndDropNodeInfo<RestResource> n = new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
246                     selectionModel, new ResourceValueUpdater());
247                          configureFolderDrop(n);
248                         configureDragOperation(n.getDraggableOptions());
249                         return n;
250                 }
251                 else if (value instanceof TrashResource) {
252                 // Second level.
253                         ListDataProvider<RestResource> trashProvider = new ListDataProvider<RestResource>();
254                         List<RestResource> r = new ArrayList<RestResource>();
255                         for(FolderResource f : GSS.get().getTreeView().getTrash().getFolders()){
256                                 r.add(new TrashFolderResource(f));
257                         }
258                         trashProvider.setList(r);
259                         DragAndDropNodeInfo<RestResource> n = new DragAndDropNodeInfo<RestResource>(trashProvider, departmentCell,
260                     selectionModel, new ResourceValueUpdater());
261                         configureFolderDrop(n);
262                 configureDragOperation(n.getDraggableOptions());
263                         return n;
264                 }
265                 else if (value instanceof OthersResource) {
266                 // Second level.
267                         OthersDataProvider dataProvider = new OthersDataProvider(
268                     ((OthersResource) value), SharedFolderResource.class);
269                 DragAndDropNodeInfo<RestResource> n = new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
270                     selectionModel, null);
271                 configureFolderDrop(n);
272                 configureDragOperation(n.getDraggableOptions());
273                 return n;
274                 }
275                 else if (value instanceof SharedFolderResource) {
276                 // Second level.
277                         MyFolderDataProvider dataProvider = new MyFolderDataProvider(
278                     ((SharedFolderResource) value),SharedFolderResource.class);
279                 DragAndDropNodeInfo<RestResource> n =  new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
280                     selectionModel, new ResourceValueUpdater());
281                 sharedmap.put(((SharedFolderResource) value).getUri(), dataProvider);
282                 configureFolderDrop(n);
283                 configureDragOperation(n.getDraggableOptions());
284                 return n;
285                 }
286                 else if (value instanceof OthersFolderResource) {
287                 // Second level.
288                         MyFolderDataProvider dataProvider = new MyFolderDataProvider(
289                     ((OthersFolderResource) value),OthersFolderResource.class);
290                 DragAndDropNodeInfo<RestResource> n =  new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
291                     selectionModel, new ResourceValueUpdater());
292                 //nodeInfos.put(((OthersFolderResource) value).getUri(), n);
293                 othersmap.put(((SharedFolderResource) value).getUri(), dataProvider);
294                 configureFolderDrop(n);
295                 configureDragOperation(n.getDraggableOptions());
296                 return n;
297                 }
298                 else if (value instanceof OtherUserResource) {
299                 // Second level.
300                         MyFolderDataProvider dataProvider = new MyFolderDataProvider(
301                     ((OtherUserResource) value),OthersFolderResource.class);
302                 DragAndDropNodeInfo<RestResource> n =  new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
303                     selectionModel, new ResourceValueUpdater());
304                 configureFolderDrop(n);
305                 configureDragOperation(n.getDraggableOptions());
306                 return n;
307                 }
308                 // TODO Auto-generated method stub
309                 return null;
310         }
311         
312         private void configureFolderDrop(DragAndDropNodeInfo<RestResource> n){
313                 DroppableOptions options = n.getDroppableOptions();
314         options.setDroppableHoverClass("droppableHover");
315         // use a DroppableFunction here. We can also add a DropHandler in the tree
316         // itself
317         
318         options.setOnOver(new DroppableFunction() {
319                         
320                         @Override
321                         public void f(final DragAndDropContext context) {
322                                 if(context.getDroppableData()!=null && context.getDroppableData() instanceof RestResource){
323
324                                         GSS.get().getTreeView().getUtils().openNodeContainingResource((RestResource) context.getDroppableData(), new RefreshHandler() {
325                                                 
326                                                 @Override
327                                                 public void onRefresh() {
328                                                         
329                                                         DragAndDropManager.getInstance().update(context);//initialize(context, GQueryUi.Event.create(com.google.gwt.user.client.Event.getCurrentEvent()));
330                                                         
331                                                 }
332                                         });
333                                         
334                                 }
335                                 
336                                 
337                                 
338                         }
339                 });
340         options.setOnDrop(new DroppableFunction() {
341
342           public void f(DragAndDropContext context) {
343                   
344                   DnDFolderPopupMenu popup ;
345                   if(context.getDraggableData() instanceof FileResource){
346                           popup = new DnDFolderPopupMenu(images, ((MyFolderResource) context.getDroppableData()).getResource(), Arrays.asList(context.getDraggableData()));
347                   }
348                   else
349                           popup = new DnDFolderPopupMenu(images, ((MyFolderResource) context.getDroppableData()).getResource(), context.getDraggableData());
350                   int left = context.getDroppable().getAbsoluteLeft() + 40;
351               int top = context.getDroppable().getAbsoluteTop() + 20;
352               popup.setPopupPosition(left, top);
353                  
354                   popup.show();
355           }
356         });
357         }
358
359         @Override
360         public boolean isLeaf(Object value) {
361                 if(value instanceof RestResourceWrapper)
362                         return ((RestResourceWrapper)value).getResource().getFolders().size()==0;
363                 else if(value instanceof TrashResource)
364                         return ((TrashResource)value).getFolders().size()==0;
365                 else if(value instanceof SharedResource)
366                         return ((SharedResource)value).getFolders().size()==0;
367                 else if(value instanceof OthersResource)
368                         return ((OthersResource)value).getOtherUsers().size()==0;
369                 else if(value instanceof OtherUserResource)
370                         return ((OtherUserResource)value).getFolders().size()==0;
371                 return false;
372         }
373         
374         class ResourceValueUpdater implements  ValueUpdater<RestResource>{
375
376                 @Override
377                 public void update(final RestResource value) {
378                         if(value instanceof MyFolderResource){
379                                 GetCommand<FolderResource> gf = new GetCommand<FolderResource>(FolderResource.class, value.getUri(), null) {
380
381                                         @Override
382                                         public void onComplete() {
383                                                 FolderResource rootResource = getResult();
384                                                 //((MyFolderResource)value).getResource().setFiles(rootResource.getFiles());
385                                                 ((MyFolderResource)value).setResource(rootResource);
386                                                 if(GSS.get().getTreeView().getSelection().getUri().equals(value.getUri()))
387                                                         selectionModel.setSelected(value, true);
388                                                 GSS.get().onResourceUpdate(value);
389                                                 
390                                         }
391         
392                                         @Override
393                                         public void onError(Throwable t) {
394                                                 GWT.log("Error fetching root folder", t);
395                                                 GSS.get().displayError("Unable to fetch root folder");
396                                         }
397         
398                                 };
399                                 DeferredCommand.addCommand(gf);
400                         }
401                         else if(value instanceof TrashResource){
402                                 DeferredCommand.addCommand(new GetCommand<TrashResource>(TrashResource.class, GSS.get().getCurrentUserResource().getTrashPath(), null) {
403                                         @Override
404                                         public void onComplete() {
405                                                 //trash = getResult();
406                                                 for(RestResource r : getRootNodes().getList()){
407                                                         if(r instanceof TrashResource)
408                                                                 getRootNodes().getList().set(getRootNodes().getList().indexOf(r),GSS.get().getTreeView().getTrash());
409                                                 }
410                                                 GSS.get().getTreeView().updateNodeChildren(GSS.get().getTreeView().getTrash());
411                                         }
412
413                                         @Override
414                                         public void onError(Throwable t) {
415                                                 if(t instanceof RestException){
416                                                         int statusCode = ((RestException)t).getHttpStatusCode();
417                                                         // On IE status code 1223 may be returned instead of 204.
418                                                         if(statusCode == 204 || statusCode == 1223){
419                                                                 //trash = new TrashResource(GSS.get().getCurrentUserResource().getTrashPath());
420                                                 }
421                                                 else{
422                                                         GWT.log("", t);
423                                                         GSS.get().displayError("Unable to fetch trash folder:"+t.getMessage());
424                                                         //GSS.get().getTreeView().getTrash() = new TrashResource(GSS.get().getCurrentUserResource().getTrashPath());
425                                                 }
426                                         }
427                                 }
428                                 });
429                         }
430                         else if(value instanceof OthersFolderResource){
431                                 
432                         }
433                         
434                 }
435                 
436         }
437         class MyFolderDataProvider extends AsyncDataProvider<RestResource>{
438                 private RestResource restResource;
439                 private Class resourceClass;
440                   public MyFolderDataProvider(RestResource department, Class resourceClass) {
441                     super(new ProvidesKey<RestResource>() {
442
443                                 @Override
444                                 public Object getKey(RestResource item) {
445                                         return item.getUri();
446                                 }});
447                     this.restResource = department;
448                     this.resourceClass=resourceClass;
449                   }
450
451                   @Override
452                   protected void onRangeChanged(final HasData<RestResource> view) {
453                         refresh(null);
454                   }
455                   
456                 /**
457                  * Retrieve the restResource.
458                  *
459                  * @return the restResource
460                  */
461                 public RestResource getRestResource() {
462                         return restResource;
463                 }
464                 
465                 
466                 /**
467                  * Modify the restResource.
468                  *
469                  * @param restResource the restResource to set
470                  */
471                 public void setRestResource(RestResource restResource) {
472                         this.restResource = restResource;
473                 }
474                 List<RestResource> res =null;
475                   public void refresh(final RefreshHandler refresh){
476                           FolderResource cache = null;
477                           if(restResource instanceof RestResourceWrapper && !((RestResourceWrapper)restResource).getResource().isNeedsExpanding())
478                                   cache = ((RestResourceWrapper)restResource).getResource();
479                           GetCommand<FolderResource> gf = new GetCommand<FolderResource>(FolderResource.class, restResource.getUri(),cache ) {
480
481                                         @Override
482                                         public void onComplete() {
483                                                 if(restResource instanceof RestResourceWrapper){
484                                                         ((RestResourceWrapper)restResource).setResource(getResult());//restResource = getResult();
485                                                         ((RestResourceWrapper)restResource).getResource().setNeedsExpanding(false);
486                                                 }
487                                                 if(usedCachedVersion()&&res!=null){
488                                                         
489                                                                 updateRowCount(res.size(), true);
490                                                                 updateRowData(0,res);
491                                                         return;
492                                                 }
493                                                 String[] folderPaths = null;
494                                                 if(resourceClass.equals(MyFolderResource.class))
495                                                         folderPaths=((MyFolderResource) restResource).getResource().getSubfolderPaths().toArray(new String[] {});
496                                                 else if(resourceClass.equals(SharedFolderResource.class) && restResource instanceof SharedResource)
497                                                         folderPaths=((SharedResource) restResource).getSubfolderPaths().toArray(new String[] {});
498                                                 else if(resourceClass.equals(SharedFolderResource.class)){
499                                                         folderPaths=((SharedFolderResource) restResource).getResource().getSubfolderPaths().toArray(new String[] {});
500                                                         GWT.log("------------>"+folderPaths);
501                                                 }
502                                                 else if(resourceClass.equals(TrashFolderResource.class))
503                                                         folderPaths=((TrashFolderResource) restResource).getResource().getSubfolderPaths().toArray(new String[] {});
504                                                 else if(resourceClass.equals(OthersFolderResource.class) && restResource instanceof OtherUserResource)
505                                                         folderPaths=((OtherUserResource) restResource).getSubfolderPaths().toArray(new String[] {});
506                                                 else if(resourceClass.equals(OthersFolderResource.class))
507                                                         folderPaths=((OthersFolderResource) restResource).getResource().getSubfolderPaths().toArray(new String[] {});
508                                                 MultipleGetCommand.Cached[] cached = null;
509                                                 if(restResource instanceof RestResourceWrapper)
510                                                         cached=((RestResourceWrapper)restResource).getResource().getCache();
511                                                 MultipleGetCommand<FolderResource> gf2 = new MultipleGetCommand<FolderResource>(FolderResource.class,
512                                                                         folderPaths, cached) {
513
514                                                         @Override
515                                                         public void onComplete() {
516                                                                 res = new ArrayList<RestResource>();
517                                                                 for(FolderResource r : getResult()){
518                                                                         if(r.isDeleted()){
519                                                                                 
520                                                                         }
521                                                                         else if(resourceClass.equals(MyFolderResource.class))
522                                                                                 res.add(new MyFolderResource(r));
523                                                                         else if(resourceClass.equals(SharedFolderResource.class)){
524                                                                                 res.add(new SharedFolderResource(r));
525                                                                         }
526                                                                         else if(resourceClass.equals(TrashFolderResource.class))
527                                                                                 res.add(new TrashFolderResource(r));
528                                                                         else if(resourceClass.equals(OthersFolderResource.class))
529                                                                                 res.add(new OthersFolderResource(r));
530                                                                 }
531                                                                 if(restResource instanceof RestResourceWrapper)
532                                                                         ((RestResourceWrapper)restResource).getResource().setFolders(getResult());
533                                                                 updateRowCount(res.size(), true);
534                                                                 updateRowData(0,res);
535                                                                 if(refresh!=null)
536                                                                         refresh.onRefresh();
537                                                         }
538
539                                                         @Override
540                                                         public void onError(Throwable t) {
541                                                                 GSS.get().displayError("Unable to fetch subfolders");
542                                                                 GWT.log("Unable to fetch subfolders", t);
543                                                         }
544
545                                                         @Override
546                                                         public void onError(String p, Throwable throwable) {
547                                                                 GWT.log("Path:"+p, throwable);
548                                                         }
549
550                                                 };
551                                                 DeferredCommand.addCommand(gf2);
552                                                 
553                                         }
554
555                                         @Override
556                                         public void onError(Throwable t) {
557                                                 
558                                                 GWT.log("Error fetching root folder", t);
559                                                 GSS.get().displayError("Unable to fetch root folder");
560                                         }
561
562                                 };
563                                 DeferredCommand.addCommand(gf);
564                   }               
565         }
566         
567         
568         class OthersDataProvider extends AsyncDataProvider<RestResource>{
569                 private RestResource restResource;
570                 private Class resourceClass;
571                   public OthersDataProvider(RestResource department, Class resourceClass) {
572                     super(new ProvidesKey<RestResource>() {
573
574                                 @Override
575                                 public Object getKey(RestResource item) {
576                                         return item.getUri();
577                                 }});
578                     this.restResource = department;
579                     this.resourceClass=resourceClass;
580                   }
581
582                   @Override
583                   protected void onRangeChanged(final HasData<RestResource> view) {
584                         refresh(null);
585                   }
586                   
587                 /**
588                  * Retrieve the restResource.
589                  *
590                  * @return the restResource
591                  */
592                 public RestResource getRestResource() {
593                         return restResource;
594                 }
595                 
596                 
597                 /**
598                  * Modify the restResource.
599                  *
600                  * @param restResource the restResource to set
601                  */
602                 public void setRestResource(RestResource restResource) {
603                         this.restResource = restResource;
604                 }
605                 
606                   public void refresh(final RefreshHandler refresh){
607                           GetCommand<OthersResource> go = new GetCommand<OthersResource>(OthersResource.class,
608                           restResource.getUri(), null) {
609
610                                   @Override
611                                   public void onComplete() {
612                                           final OthersResource others = getResult();
613                           MultipleGetCommand<OtherUserResource> gogo = new MultipleGetCommand<OtherUserResource>(OtherUserResource.class,
614                                                   others.getOthers().toArray(new String[] {}), null) {
615
616                                   @Override
617                                   public void onComplete() {
618                                           List<OtherUserResource> res = getResult();
619                                           updateRowCount(res.size(), true);
620                                           List<RestResource> r = new ArrayList<RestResource>();
621                                           r.addAll(res);
622                                                                           updateRowData(0,r);
623                                   }
624
625                                   @Override
626                                   public void onError(Throwable t) {
627                                           GWT.log("Error fetching Others Root folder", t);
628                                           GSS.get().displayError("Unable to fetch Others Root folder");
629                                   }
630
631                                   @Override
632                                   public void onError(String p, Throwable throwable) {
633                                           GWT.log("Path:"+p, throwable);
634                                   }
635                           };
636                           DeferredCommand.addCommand(gogo);
637                                   }
638                         
639                                   @Override
640                                   public void onError(Throwable t) {
641                                           GWT.log("Error fetching Others Root folder", t);
642                                           GSS.get().displayError("Unable to fetch Others Root folder");
643                                   }
644                           };
645                           DeferredCommand.addCommand(go);
646                   }               
647         }
648
649
650         
651         /**
652          * Retrieve the rootNodes.
653          *
654          * @return the rootNodes
655          */
656         public ListDataProvider<RestResource> getRootNodes() {
657                 return rootNodes;
658         }
659
660         
661         /**
662          * Retrieve the mymap.
663          *
664          * @return the mymap
665          */
666         public Map<String, MyFolderDataProvider> getMymap() {
667                 return mymap;
668         }
669
670         
671         /**
672          * Retrieve the sharedmap.
673          *
674          * @return the sharedmap
675          */
676         public Map<String, MyFolderDataProvider> getSharedmap() {
677                 return sharedmap;
678         }
679
680         
681         /**
682          * Retrieve the othersmap.
683          *
684          * @return the othersmap
685          */
686         public Map<String, MyFolderDataProvider> getOthersmap() {
687                 return othersmap;
688         }
689         
690         
691         
692         
693         
694         
695 }