Use separate progress bars next to each file, in order to better track the progress...
[pithos] / src / gr / ebs / gss / client / rest / MultiplePostCommand.java
1 /*
2  * Copyright 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.rest;
20
21 import gr.ebs.gss.client.GSS;
22 import gr.ebs.gss.client.exceptions.InsufficientPermissionsException;
23
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.List;
27 import java.util.Map;
28
29 import com.google.gwt.core.client.GWT;
30 import com.google.gwt.http.client.Request;
31 import com.google.gwt.http.client.RequestCallback;
32 import com.google.gwt.http.client.Response;
33
34
35 /**
36  * @author kman
37  *
38  */
39 public abstract class MultiplePostCommand extends RestCommand {
40
41
42         Map<String, Throwable> errors = new HashMap<String, Throwable>();
43
44         List<String> successPaths = new ArrayList<String>();
45
46         String[] paths;
47
48         public MultiplePostCommand(String[] pathToDelete, final int okStatusCode){
49                 this(pathToDelete, okStatusCode, true);
50         }
51
52         public MultiplePostCommand(String[] pathToDelete, final int okStatusCode, boolean showLoading){
53                 setShowLoadingIndicator(showLoading);
54                 if(isShowLoadingIndicator())
55                         GSS.get().showLoadingIndicator();
56                 paths = pathToDelete;
57                 for (final String pathg : pathToDelete) {
58                         GWT.log("[DEL]"+pathg, null);
59                         RestRequestBuilder builder = new RestRequestBuilder("POST", pathg);
60
61                         try {
62                                 handleHeaders(builder, pathg);
63                                 builder.sendRequest("", new RequestCallback() {
64
65                                         public void onError(Request arg0, Throwable arg1) {
66                                                 errors.put(pathg, arg1);
67                                         }
68
69                                         public void onResponseReceived(Request arg0, Response arg1) {
70                                                 if (arg1.getStatusCode() == okStatusCode)
71                                                         successPaths.add(pathg);
72                                                 else if(arg1.getStatusCode() == 403)
73                                                         sessionExpired();
74                                                 else if (arg1.getStatusCode() == 405)
75                                                         errors.put(pathg, new InsufficientPermissionsException("You don't have permissions to delete this resource"));
76                                                 else
77                                                         errors.put(pathg, new RestException(pathg, arg1.getStatusCode(), arg1.getStatusText(), arg1.getText()));
78                                         }
79
80                                 });
81                         } catch (Exception ex) {
82                                 errors.put(pathg, ex);
83                         }
84                 }
85         }
86
87         public boolean isComplete() {
88                 return errors.size() + successPaths.size() == paths.length;
89         }
90
91         public boolean execute() {
92                 boolean com = isComplete();
93                 if (com) {
94                         if(hasErrors())
95                                 for(String p : errors.keySet())
96                                         onError(p, errors.get(p));
97                         onComplete();
98                         if(isShowLoadingIndicator())
99                                 GSS.get().hideLoadingIndicator();
100                         return false;
101                 }
102                 return true;
103         }
104
105
106         /**
107          * @param p
108          * @param throwable
109          */
110         public abstract void onError(String p, Throwable throwable);
111
112         public boolean hasErrors(){
113                 return errors.size() >0;
114         }
115
116
117         /**
118          * Retrieve the errors.
119          *
120          * @return the errors
121          */
122         public Map<String, Throwable> getErrors() {
123                 return errors;
124         }
125
126         public void debug(){
127                 GWT.log("-ERRORS-->"+getErrors().size(), null);
128                 for(String p : getErrors().keySet())
129                         GWT.log("error:"+p, getErrors().get(p));
130         }
131
132         @Override
133         public void onError(Throwable t) {
134
135
136         }
137
138 }