Removed all static references to the Pithos class
[pithos] / web_client / src / gr / grnet / pithos / web / client / rest / MultiplePostCommand.java
1 /*
2  * Copyright 2011 GRNET S.A. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or
5  * without modification, are permitted provided that the following
6  * conditions are met:
7  *
8  *   1. Redistributions of source code must retain the above
9  *      copyright notice, this list of conditions and the following
10  *      disclaimer.
11  *
12  *   2. Redistributions in binary form must reproduce the above
13  *      copyright notice, this list of conditions and the following
14  *      disclaimer in the documentation and/or other materials
15  *      provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  *
30  * The views and conclusions contained in the software and
31  * documentation are those of the authors and should not be
32  * interpreted as representing official policies, either expressed
33  * or implied, of GRNET S.A.
34  */
35 package gr.grnet.pithos.web.client.rest;
36
37 import gr.grnet.pithos.web.client.Pithos;
38 import gr.grnet.pithos.web.client.InsufficientPermissionsException;
39
40 import java.util.ArrayList;
41 import java.util.HashMap;
42 import java.util.List;
43 import java.util.Map;
44
45 import com.google.gwt.core.client.GWT;
46 import com.google.gwt.http.client.Request;
47 import com.google.gwt.http.client.RequestBuilder;
48 import com.google.gwt.http.client.RequestCallback;
49 import com.google.gwt.http.client.Response;
50
51
52 public abstract class MultiplePostCommand extends RestCommand {
53
54         Map<String, Throwable> errors = new HashMap<String, Throwable>();
55
56         List<String> successPaths = new ArrayList<String>();
57
58         String[] paths;
59
60         public MultiplePostCommand(Pithos app, String[] pathToDelete, final int okStatusCode){
61                 this(app, pathToDelete, okStatusCode, true);
62         }
63
64         public MultiplePostCommand(Pithos app, String[] pathToDelete, String data, final int okStatusCode){
65                 this(app, pathToDelete, data, okStatusCode, true);
66         }
67
68         public MultiplePostCommand(Pithos app, String[] pathToDelete, final int okStatusCode, boolean showLoading){
69                 this(app, pathToDelete, "", okStatusCode, showLoading);
70         }
71
72         public MultiplePostCommand(Pithos app, String[] pathToDelete, String data, final int okStatusCode, boolean showLoading){
73         super(app);
74                 setShowLoadingIndicator(showLoading);
75                 if(isShowLoadingIndicator())
76                         app.showLoadingIndicator("Updating "+pathToDelete.length+" items", null);
77                 paths = pathToDelete;
78                 for (final String pathg : pathToDelete) {
79                         GWT.log("[DEL]"+pathg, null);
80                         RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, pathg);
81
82                         try {
83                                 handleHeaders(builder, pathg);
84                                 builder.sendRequest(data, new RequestCallback() {
85
86                                         @Override
87                                         public void onError(Request arg0, Throwable arg1) {
88                                                 errors.put(pathg, arg1);
89                                         }
90
91                                         @Override
92                                         public void onResponseReceived(Request arg0, Response arg1) {
93                                                 if (arg1.getStatusCode() == okStatusCode)
94                                                         successPaths.add(pathg);
95                                                 else if(arg1.getStatusCode() == 403)
96                                                         sessionExpired();
97                                                 else if (arg1.getStatusCode() == 405)
98                                                         errors.put(pathg, new InsufficientPermissionsException("You don't have permissions to delete this resource"));
99                                                 else
100                                                         errors.put(pathg, new RestException(pathg, arg1.getStatusCode(), arg1.getStatusText(), arg1.getText()));
101                                         }
102
103                                 });
104                         } catch (Exception ex) {
105                                 errors.put(pathg, ex);
106                         }
107                 }
108         }
109
110         public boolean isComplete() {
111                 return errors.size() + successPaths.size() == paths.length;
112         }
113
114         @Override
115         public boolean execute() {
116                 boolean com = isComplete();
117                 if (com) {
118                         if(hasErrors())
119                                 for(String p : errors.keySet())
120                                         onError(p, errors.get(p));
121                         onComplete();
122                         if(isShowLoadingIndicator())
123                                 app.hideLoadingIndicator();
124                         return false;
125                 }
126                 return true;
127         }
128
129
130         /**
131          * @param p
132          * @param throwable
133          */
134         public abstract void onError(String p, Throwable throwable);
135
136         public boolean hasErrors(){
137                 return errors.size() >0;
138         }
139
140
141         /**
142          * Retrieve the errors.
143          *
144          * @return the errors
145          */
146         public Map<String, Throwable> getErrors() {
147                 return errors;
148         }
149
150         public void debug(){
151                 GWT.log("-ERRORS-->"+getErrors().size(), null);
152                 for(String p : getErrors().keySet())
153                         GWT.log("error:"+p, getErrors().get(p));
154         }
155
156         @Override
157         public void onError(Throwable t) {
158
159
160         }
161
162 }