Merge with 2ad3c504ee5d73982c0ef23336276dc1fc9e165f
[pithos] / src / gr / ebs / gss / client / tree / MyShareSubtree.java
1 /*
2  * Copyright 2008, 2009 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.tree;
20
21 import gr.ebs.gss.client.GSS;
22 import gr.ebs.gss.client.PopupTree;
23 import gr.ebs.gss.client.Folders.Images;
24 import gr.ebs.gss.client.dnd.DnDTreeItem;
25 import gr.ebs.gss.client.rest.GetCommand;
26 import gr.ebs.gss.client.rest.MultipleGetCommand;
27 import gr.ebs.gss.client.rest.resource.FolderResource;
28 import gr.ebs.gss.client.rest.resource.SharedResource;
29 import gr.ebs.gss.client.rest.resource.UserResource;
30
31 import java.util.ArrayList;
32 import java.util.List;
33
34 import com.google.gwt.core.client.GWT;
35 import com.google.gwt.user.client.DeferredCommand;
36 import com.google.gwt.user.client.IncrementalCommand;
37 import com.google.gwt.user.client.ui.TreeItem;
38 import com.google.gwt.user.client.ui.Widget;
39 /**
40  * @author kman
41  */
42 public class MyShareSubtree extends Subtree {
43
44         /**
45          * A constant that denotes the completion of an IncrementalCommand.
46          */
47         public static final boolean DONE = false;
48
49         private DnDTreeItem rootItem;
50
51         public MyShareSubtree(PopupTree aTree, final Images _images) {
52                 super(aTree, _images);
53
54                 DeferredCommand.addCommand(new IncrementalCommand() {
55
56                         @Override
57                         public boolean execute() {
58                                 return updateInit();
59                         }
60                 });
61         }
62
63         public boolean updateInit() {
64                 UserResource userResource = GSS.get().getCurrentUserResource();
65                 if (userResource == null || GSS.get().getFolders().getRootItem() == null || GSS.get().getFolders().getTrashItem() == null)
66                         return !DONE;
67
68                 GetCommand<SharedResource> gs = new GetCommand<SharedResource>(SharedResource.class, userResource.getSharedPath(), null) {
69
70                         @Override
71                         public void onComplete() {
72                                 Widget rootItemWidget = imageItemHTML(images.myShared(), "My Shared");
73                                 rootItemWidget.getElement().setId("tree.myShared");
74                                 rootItem = new DnDTreeItem(rootItemWidget, false,tree,true);
75                                 rootItem.setUserObject(getResult());
76                                 tree.addItem(rootItem);
77                                 //rootItem.removeItems();
78                                 rootItem.doDroppable();
79                                 //update(rootItem);
80                         }
81
82                         @Override
83                         public void onError(Throwable t) {
84                                 GWT.log("Error fetching Shared Root folder", t);
85                                 GSS.get().displayError("Unable to fetch Shared Root folder");
86                                 if(rootItem != null){
87                                         rootItem = new DnDTreeItem(imageItemHTML(images.myShared(), "ERROR"), false,tree);
88                                         tree.addItem(rootItem);
89                                 }
90                         }
91                 };
92                 DeferredCommand.addCommand(gs);
93                 return DONE;
94         }
95
96         public void update(final DnDTreeItem folderItem) {
97                 if (folderItem.getFolderResource() != null) {
98                         folderItem.removeItems();
99                         List<String> newPaths = new ArrayList<String>();
100                         for (String s : folderItem.getFolderResource().getSubfolderPaths()) {
101                                 if (!s.endsWith("/"))
102                                         s = s + "/";
103                                 newPaths.add(s);
104                         }
105                         String parentName = "";
106                         if(folderItem.getParentItem() != null && ((DnDTreeItem)folderItem.getParentItem()).getFolderResource() != null)
107                                 parentName = ((DnDTreeItem)folderItem.getParentItem()).getFolderResource().getName()+"->";
108                         parentName = parentName+folderItem.getFolderResource().getName();
109                         folderItem.getFolderResource().setSubfolderPaths(newPaths);
110                         MultipleGetCommand<FolderResource> gf = new MultipleGetCommand<FolderResource>(FolderResource.class, newPaths.toArray(new String[] {}), folderItem.getFolderResource().getCache()) {
111
112                                 @Override
113                                 public void onComplete() {
114                                         List<FolderResource> res = getResult();
115                                         for (FolderResource r : res)
116                                                 if(r.isShared() || r.isReadForAll()){
117                                                         DnDTreeItem child = (DnDTreeItem) addImageItem(folderItem, r.getName(), images.folderYellow(), true);
118                                                         child.setUserObject(r);
119                                                         child.setState(false);
120                                                         child.doDraggable();
121                                                         if(folderItem.getState())
122                                                                 update(child);
123                                                 }
124                                 }
125
126                                 @Override
127                                 public void onError(Throwable t) {
128                                         GSS.get().displayError("Unable to fetch subfolders");
129                                         GWT.log("Unable to fetch subfolders", t);
130                                 }
131
132                                 @Override
133                                 public void onError(String p, Throwable throwable) {
134                                         GWT.log("Path:"+p, throwable);
135                                 }
136                         };
137                         DeferredCommand.addCommand(gf);
138                 }
139                 if (folderItem.getSharedResource() != null) {
140                         folderItem.removeItems();
141                         List<String> paths = folderItem.getSharedResource().getSubfolderPaths();
142                         List<String> newPaths = new ArrayList<String>();
143                         for (String r : paths)
144                                 if (isRoot(r, paths))
145                                         newPaths.add(r);
146                         MultipleGetCommand<FolderResource> gf = new MultipleGetCommand<FolderResource>(FolderResource.class, newPaths.toArray(new String[] {}), null) {
147
148                                 @Override
149                                 public void onComplete() {
150                                         List<FolderResource> res = getResult();
151                                         for (FolderResource r : res) {
152                                                 DnDTreeItem child = (DnDTreeItem) addImageItem(folderItem, r.getName(), images.folderYellow(), true);
153                                                 child.setUserObject(r);
154                                                 child.setState(false);
155                                                 child.doDraggable();
156                                                 update(child);
157                                         }
158                                 }
159
160                                 @Override
161                                 public void onError(Throwable t) {
162                                         GSS.get().displayError("Unable to fetch subfolders");
163                                         GWT.log("Unable to fetch subfolders", t);
164                                 }
165
166                                 @Override
167                                 public void onError(String p, Throwable throwable) {
168                                         GWT.log("Path:"+p, throwable);
169                                 }
170                         };
171                         DeferredCommand.addCommand(gf);
172                 }
173         }
174
175         private boolean isRoot(String f, List<String> folders) {
176                 for (String t : folders)
177                         if (!f.equals(t) && f.startsWith(t))
178                                 return false;
179                 return true;
180         }
181
182         public void updateFolderAndSubfolders(final DnDTreeItem folderItem) {
183                 if (folderItem.getFolderResource() != null) {
184                         final String path = folderItem.getFolderResource().getUri();
185                         GetCommand<SharedResource> gs = new GetCommand<SharedResource>(SharedResource.class, GSS.get().getCurrentUserResource().getSharedPath(), null) {
186
187                                 @Override
188                                 public void onComplete() {
189                                         rootItem.setUserObject(getResult());
190                                         GetCommand<FolderResource> gf = new GetCommand<FolderResource>(FolderResource.class, path, folderItem.getFolderResource()) {
191
192                                                 @Override
193                                                 public void onComplete() {
194                                                         FolderResource rootResource = getResult();
195                                                         if(rootResource.isShared()){
196                                                                 folderItem.undoDraggable();
197                                                                 folderItem.updateWidget(imageItemHTML(images.folderYellow(), rootResource.getName()));
198                                                                 folderItem.setUserObject(rootResource);
199                                                                 folderItem.doDraggable();
200                                                                 update(folderItem);
201                                                         } else
202                                                                 folderItem.getParentItem().removeItem(folderItem);
203                                                 }
204
205                                                 @Override
206                                                 public void onError(Throwable t) {
207                                                         GWT.log("Error fetching folder", t);
208                                                         GSS.get().displayError("Unable to fetch folder:" + folderItem.getFolderResource().getName());
209                                                 }
210                                         };
211                                         DeferredCommand.addCommand(gf);
212                                 }
213
214                                 @Override
215                                 public void onError(Throwable t) {
216                                         GWT.log("Error fetching Shared Root folder", t);
217                                         GSS.get().displayError("Unable to fetch Shared Root folder");
218                                 }
219                         };
220                         DeferredCommand.addCommand(gs);
221                 }
222                 else if( folderItem.getSharedResource() != null){
223                         GetCommand<SharedResource> gs = new GetCommand<SharedResource>(SharedResource.class, GSS.get().getCurrentUserResource().getSharedPath(), null) {
224
225                                 @Override
226                                 public void onComplete() {
227                                         rootItem.setUserObject(getResult());
228                                         if(rootItem.getState()){
229                                                 rootItem.removeItems();
230                                                 update(rootItem);
231                                         }
232                                 }
233
234                                 @Override
235                                 public void onError(Throwable t) {
236                                         GWT.log("Error fetching Shared Root folder", t);
237                                         GSS.get().displayError("Unable to fetch Shared Root folder");
238                                 }
239                         };
240                         DeferredCommand.addCommand(gs);
241                 }
242         }
243
244         /**
245          * Retrieve the rootItem.
246          *
247          * @return the rootItem
248          */
249         public TreeItem getRootItem() {
250                 return rootItem;
251         }
252
253         public void updateNode(TreeItem node, FolderResource folder) {
254                 node.getWidget().removeStyleName("gss-SelectedRow");
255                 if (node instanceof DnDTreeItem) {
256                         ((DnDTreeItem) node).undoDraggable();
257                         ((DnDTreeItem) node).updateWidget(imageItemHTML(images.folderYellow(), folder.getName()));
258                         ((DnDTreeItem) node).doDraggable();
259                 } else
260                         node.setWidget(imageItemHTML(images.folderYellow(), folder.getName()));
261                 node.setUserObject(folder);
262         }
263 }