Statistics
| Branch: | Revision:

root / src / com / rackspacecloud / android / ViewServerActivity.java @ e7534f91

History | View | Annotate | Download (23.8 kB)

1
/**
2
 * 
3
 */
4
package com.rackspacecloud.android;
5

    
6
import java.io.IOException;
7
import java.io.StringReader;
8
import java.util.Arrays;
9
import java.util.Iterator;
10

    
11
import javax.xml.parsers.FactoryConfigurationError;
12
import javax.xml.parsers.ParserConfigurationException;
13
import javax.xml.parsers.SAXParser;
14
import javax.xml.parsers.SAXParserFactory;
15

    
16
import org.apache.http.HttpResponse;
17
import org.apache.http.client.ClientProtocolException;
18
import org.apache.http.impl.client.BasicResponseHandler;
19
import org.xml.sax.InputSource;
20
import org.xml.sax.SAXException;
21
import org.xml.sax.XMLReader;
22

    
23
import android.app.Activity;
24
import android.app.AlertDialog;
25
import android.app.Dialog;
26
import android.content.Context;
27
import android.content.DialogInterface;
28
import android.content.Intent;
29
import android.graphics.Color;
30
import android.os.AsyncTask;
31
import android.os.Bundle;
32
import android.util.Log;
33
import android.view.View;
34
import android.view.View.OnClickListener;
35
import android.widget.Button;
36
import android.widget.EditText;
37
import android.widget.ImageView;
38
import android.widget.LinearLayout;
39
import android.widget.TextView;
40
import android.widget.Toast;
41

    
42
import com.rackspace.cloud.servers.api.client.CloudServersException;
43
import com.rackspace.cloud.servers.api.client.Flavor;
44
import com.rackspace.cloud.servers.api.client.Image;
45
import com.rackspace.cloud.servers.api.client.Server;
46
import com.rackspace.cloud.servers.api.client.ServerManager;
47
import com.rackspace.cloud.servers.api.client.parsers.CloudServersFaultXMLParser;
48

    
49
/**
50
 * @author Mike Mayo - mike.mayo@rackspace.com - twitter.com/greenisus
51
 *
52
 */
53
public class ViewServerActivity extends Activity {
54
        
55
        private Server server;
56
        private boolean ipAddressesLoaded; // to prevent polling from loading tons of duplicates
57
        private Flavor[] flavors;
58
        private String[] flavorNames;
59
        private String selectedFlavorId;
60
        Context context;
61
        //private boolean imageLoaded;
62
    private String modifiedServerName;
63
    private Image[] images;
64
        private String[] imageNames;
65
        private String selectedImageId;
66
        
67
    /** Called when the activity is first created. */
68
    @Override
69
    public void onCreate(Bundle savedInstanceState) {
70
        super.onCreate(savedInstanceState);
71
        server = (Server) this.getIntent().getExtras().get("server");
72
        context = getApplicationContext();
73
        setContentView(R.layout.viewserver);
74
        restoreState(savedInstanceState);
75
    }
76
    
77
        @Override
78
        protected void onSaveInstanceState(Bundle outState) {
79
                super.onSaveInstanceState(outState);
80
                outState.putSerializable("server", server);
81
                //outState.putBoolean("imageLoaded", imageLoaded);
82
        }
83

    
84
    private void restoreState(Bundle state) {
85
            if (state != null && state.containsKey("server")) {
86
                    server = (Server) state.getSerializable("server");
87
                    //imageLoaded = state.getBoolean("imageLoaded");
88
            }
89
        loadServerData();
90
        setupButtons();
91
        loadFlavors();
92
        loadImages();
93
    }
94
/*
95
    private void loadImage() {
96
            // hate to do this, but devices run out of memory after a few rotations
97
            // because the background images are so large
98
            if (!imageLoaded) {
99
                    ImageView osLogo = (ImageView) findViewById(R.id.view_server_os_logo);
100
                    osLogo.setAlpha(100);
101
                    osLogo.setImageResource(server.getImage().logoResourceId());
102
                    imageLoaded = true;
103
            }
104

105
    }
106
*/  
107
    private void loadServerData() {
108
            TextView name = (TextView) findViewById(R.id.view_server_name);
109
            name.setText(server.getName());
110
            
111
            TextView os = (TextView) findViewById(R.id.view_server_os);
112
            os.setText(server.getImage().getName());
113
            
114
            TextView memory = (TextView) findViewById(R.id.view_server_memory);
115
            memory.setText(server.getFlavor().getRam() + " MB");
116
            
117
            TextView disk = (TextView) findViewById(R.id.view_server_disk);
118
            disk.setText(server.getFlavor().getDisk() + " GB");
119
            
120
            TextView status = (TextView) findViewById(R.id.view_server_status);
121

    
122
            // show status and possibly the progress, with polling
123
            if (!"ACTIVE".equals(server.getStatus())) {
124
                status.setText(server.getStatus() + " - " + server.getProgress() + "%");
125
                    new PollServerTask().execute((Void[]) null);
126
            } else {
127
                status.setText(server.getStatus());
128
            }
129
            
130
            if (!ipAddressesLoaded) {
131
                    // public IPs
132
                    int layoutIndex = 12; // public IPs start here
133
                    LinearLayout layout = (LinearLayout) this.findViewById(R.id.view_server_layout);            
134
                    String publicIps[] = server.getPublicIpAddresses();
135
                    for (int i = 0; i < publicIps.length; i++) {
136
                        TextView tv = new TextView(this.getBaseContext());
137
                        tv.setLayoutParams(os.getLayoutParams()); // easy quick styling! :)
138
                        tv.setTypeface(tv.getTypeface(), 1); // 1 == bold
139
                        tv.setTextSize(os.getTextSize());
140
                        tv.setTextColor(Color.WHITE);
141
                        tv.setText(publicIps[i]);
142
                        layout.addView(tv, layoutIndex++);
143
                    }
144
                    
145
                    // private IPs
146
                    layoutIndex++; // skip over the Private IPs label
147
                    String privateIps[] = server.getPrivateIpAddresses();
148
                    for (int i = 0; i < privateIps.length; i++) {
149
                        TextView tv = new TextView(this.getBaseContext());
150
                        tv.setLayoutParams(os.getLayoutParams()); // easy quick styling! :)
151
                        tv.setTypeface(tv.getTypeface(), 1); // 1 == bold
152
                        tv.setTextSize(os.getTextSize());
153
                        tv.setTextColor(Color.WHITE);
154
                        tv.setText(privateIps[i]);
155
                        layout.addView(tv, layoutIndex++);
156
                    }
157
                    ipAddressesLoaded = true;
158
            }
159
            
160
            //loadImage();
161
    }
162
    
163
    private void loadFlavors() {
164
                flavorNames = new String[Flavor.getFlavors().size()]; 
165
                flavors = new Flavor[Flavor.getFlavors().size()];
166

    
167
                Iterator<Flavor> iter = Flavor.getFlavors().values().iterator();
168
                int i = 0;
169
                while (iter.hasNext()) {
170
                        Flavor flavor = iter.next();
171
                        flavors[i] = flavor;
172
                        flavorNames[i] = flavor.getName() + ", " + flavor.getDisk() + " GB disk";
173
                        i++;
174
                }
175
                selectedFlavorId = flavors[0].getId();
176
    }
177
    
178
    private void loadImages() {
179
                imageNames = new String[Image.getImages().size()]; 
180
                images = new Image[Image.getImages().size()];
181

    
182
                Iterator<Image> iter = Image.getImages().values().iterator();
183
                int i = 0;
184
                while (iter.hasNext()) {
185
                        Image image = iter.next();
186
                        images[i] = image;
187
                        imageNames[i] = image.getName(); 
188
                        i++;
189
                }
190
                //sort arrays so they display nicely in the spinner
191
                Arrays.sort(images);
192
                Arrays.sort(imageNames);
193
                selectedImageId = images[0].getId();
194
                
195
    }
196

    
197
    private void setupButton(int resourceId, OnClickListener onClickListener) {
198
                Button button = (Button) findViewById(resourceId);
199
                button.setOnClickListener(onClickListener);
200
    }
201
    
202
    private void setupButtons() {
203
            setupButton(R.id.view_server_soft_reboot_button, new OnClickListener() {
204
            public void onClick(View v) {
205
                showDialog(R.id.view_server_soft_reboot_button);
206
            }
207
        });
208
            
209
            setupButton(R.id.view_server_hard_reboot_button, new OnClickListener() {
210
            public void onClick(View v) {
211
                showDialog(R.id.view_server_hard_reboot_button);
212
            }
213
            });
214

    
215
            setupButton(R.id.view_server_resize_button, new OnClickListener() {
216
            public void onClick(View v) {
217
                showDialog(R.id.view_server_resize_button);
218
            }
219
            });
220

    
221
            setupButton(R.id.view_server_delete_button, new OnClickListener() {
222
            public void onClick(View v) {
223
                showDialog(R.id.view_server_delete_button);
224
            }
225
            });
226
            
227
            setupButton(R.id.view_server_rename_button, new OnClickListener() {
228
            public void onClick(View v) {
229
                showDialog(R.id.view_server_rename_button);
230
            }
231
            });
232
            
233
            setupButton(R.id.view_server_rebuild_button, new OnClickListener() {
234
            public void onClick(View v) {
235
                showDialog(R.id.view_server_rebuild_button);
236
            }
237
            });
238
            
239
            
240
            setupButton(R.id.view_server_backup_button, new OnClickListener() {
241
            public void onClick(View v) {
242
                    Intent viewIntent = new Intent(v.getContext(), BackupServerActivity.class);
243
                    viewIntent.putExtra("server", server);
244
                    startActivity(viewIntent);
245
            }
246
            });
247
            
248
            setupButton(R.id.view_server_password_button, new OnClickListener() {
249
            public void onClick(View v) {
250
                    Intent viewIntent = new Intent(v.getContext(), PasswordServerActivity.class);
251
                    viewIntent.putExtra("server", server);
252
                    startActivity(viewIntent);
253
            }
254
            });
255
            
256
            setupButton(R.id.view_server_ping_button, new OnClickListener() {
257
            public void onClick(View v) {
258
                    Intent viewIntent = new Intent(v.getContext(), PingServerActivity.class);
259
                    
260
                    //ping the first public ip
261
                    viewIntent.putExtra("ipAddress", server.getPublicIpAddresses()[0]);
262
                    startActivity(viewIntent);
263
            }
264
            });
265
            
266
    }
267
    
268
    private void showAlert(String title, String message) {
269
                AlertDialog alert = new AlertDialog.Builder(this).create();
270
                alert.setTitle(title);
271
                alert.setMessage(message);
272
                alert.setButton("OK", new DialogInterface.OnClickListener() {
273
              public void onClick(DialogInterface dialog, int which) {
274
                return;
275
            } }); 
276
                alert.show();
277
    }
278
    
279
    private void showToast(String message) {
280
                Context context = getApplicationContext();
281
                int duration = Toast.LENGTH_SHORT;
282
                Toast toast = Toast.makeText(context, message, duration);
283
                toast.show();
284
    }
285
        
286
    /**
287
         * @return the server
288
         */
289
        public Server getServer() {
290
                return server;
291
        }
292

    
293
        /**
294
         * @param server the server to set
295
         */
296
        public void setServer(Server server) {
297
                this.server = server;
298
        }
299

    
300
    @Override
301
    protected Dialog onCreateDialog(int id) {
302
        switch (id) {
303
        case R.id.view_server_soft_reboot_button:
304
            return new AlertDialog.Builder(ViewServerActivity.this)
305
                .setIcon(R.drawable.alert_dialog_icon)
306
                .setTitle("Soft Reboot")
307
                .setMessage("Are you sure you want to perform a soft reboot?")
308
                .setPositiveButton("Reboot Server", new DialogInterface.OnClickListener() {
309
                        public void onClick(DialogInterface dialog, int whichButton) {
310
                                // User clicked OK so do some stuff
311
                                new SoftRebootServerTask().execute((Void[]) null);
312
                        }
313
                })
314
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
315
                        public void onClick(DialogInterface dialog, int whichButton) {
316
                                // User clicked Cancel so do some stuff
317
                        }
318
                })
319
                .create();
320
        case R.id.view_server_hard_reboot_button:
321
            return new AlertDialog.Builder(ViewServerActivity.this)
322
                .setIcon(R.drawable.alert_dialog_icon)
323
                .setTitle("Hard Reboot")
324
                .setMessage("Are you sure you want to perform a hard reboot?")
325
                .setPositiveButton("Reboot Server", new DialogInterface.OnClickListener() {
326
                        public void onClick(DialogInterface dialog, int whichButton) {
327
                                // User clicked OK so do some stuff
328
                                new HardRebootServerTask().execute((Void[]) null);
329
                        }
330
                })
331
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
332
                        public void onClick(DialogInterface dialog, int whichButton) {
333
                                // User clicked Cancel so do some stuff
334
                        }
335
                })
336
                .create();
337
        case R.id.view_server_resize_button:
338
            return new AlertDialog.Builder(ViewServerActivity.this)
339
            .setItems(flavorNames, new ResizeClickListener())
340
                .setIcon(R.drawable.alert_dialog_icon)
341
                .setTitle("Resize Server")
342
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
343
                        public void onClick(DialogInterface dialog, int whichButton) {
344
                                // User clicked Cancel so do some stuff
345
                        }
346
                })
347
                .create();
348
        case R.id.view_server_delete_button:
349
            return new AlertDialog.Builder(ViewServerActivity.this)
350
                .setIcon(R.drawable.alert_dialog_icon)
351
                .setTitle("Delete Server")
352
                .setMessage("Are you sure you want to delete this server?  This operation cannot be undone and all backups will be deleted.")
353
                .setPositiveButton("Delete Server", new DialogInterface.OnClickListener() {
354
                        public void onClick(DialogInterface dialog, int whichButton) {
355
                                // User clicked OK so do some stuff
356
                                new DeleteServerTask().execute((Void[]) null);
357
                        }
358
                })
359
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
360
                        public void onClick(DialogInterface dialog, int whichButton) {
361
                                // User clicked Cancel so do some stuff
362
                        }
363
                })
364
                .create();          
365
         case R.id.view_server_rename_button:
366
                final EditText input = new EditText(this);
367
                input.setText(server.getName());
368
            return new AlertDialog.Builder(ViewServerActivity.this)
369
                .setIcon(R.drawable.alert_dialog_icon)
370
            .setView(input)
371
                .setTitle("Rename")
372
                .setMessage("Enter new name for server: ")                         
373
                .setPositiveButton("Rename", new DialogInterface.OnClickListener() {
374
                        public void onClick(DialogInterface dialog, int whichButton) {
375
                                // User clicked OK so do some stuff
376
                                modifiedServerName = input.getText().toString();
377
                                new RenameServerTask().execute((Void[]) null);
378
                        }
379
                })
380
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
381
                        public void onClick(DialogInterface dialog, int whichButton) {
382
                                // User clicked Cancel so do some stuff
383
                        }
384
                })
385
                .create();     
386
         case R.id.view_server_rebuild_button:
387
            return new AlertDialog.Builder(ViewServerActivity.this)
388
            .setItems(imageNames, new RebuildClickListener())
389
                 .setIcon(R.drawable.alert_dialog_icon)
390
                 .setTitle("Rebuild Server")
391
                 .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
392
                         public void onClick(DialogInterface dialog, int whichButton) {
393
                                 // User clicked Cancel so do some stuff
394
                         }
395
                 })
396
                 .create();
397
        }
398
        return null;
399
    }
400

    
401
    private class ResizeClickListener implements android.content.DialogInterface.OnClickListener {
402

    
403
                public void onClick(DialogInterface dialog, int which) {
404
                        selectedFlavorId = which + "";
405
                        new ResizeServerTask().execute((Void[]) null);
406
                }
407
            
408
    }
409
    
410
    private class RebuildClickListener implements android.content.DialogInterface.OnClickListener {
411

    
412
                public void onClick(DialogInterface dialog, int which) {
413
                        selectedImageId = images[which].getId() + "";
414
                        new RebuildServerTask().execute((Void[]) null);
415
                }
416
            
417
    }
418
    
419

    
420
    
421
    private CloudServersException parseCloudServersException(HttpResponse response) {
422
                CloudServersException cse = new CloudServersException();
423
                try {
424
                    BasicResponseHandler responseHandler = new BasicResponseHandler();
425
                    String body = responseHandler.handleResponse(response);
426
                    CloudServersFaultXMLParser parser = new CloudServersFaultXMLParser();
427
                    SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
428
                    XMLReader xmlReader = saxParser.getXMLReader();
429
                    xmlReader.setContentHandler(parser);
430
                    xmlReader.parse(new InputSource(new StringReader(body)));                            
431
                    cse = parser.getException();                            
432
                } catch (ClientProtocolException e) {
433
                        cse = new CloudServersException();
434
                        cse.setMessage(e.getLocalizedMessage());
435
                } catch (IOException e) {
436
                        cse = new CloudServersException();
437
                        cse.setMessage(e.getLocalizedMessage());
438
                } catch (ParserConfigurationException e) {
439
                        cse = new CloudServersException();
440
                        cse.setMessage(e.getLocalizedMessage());
441
                } catch (SAXException e) {
442
                        cse = new CloudServersException();
443
                        cse.setMessage(e.getLocalizedMessage());
444
                } catch (FactoryConfigurationError e) {
445
                        cse = new CloudServersException();
446
                        cse.setMessage(e.getLocalizedMessage());
447
                }
448
                return cse;
449
    }
450
    
451
    // HTTP request tasks
452
    
453
        private class PollServerTask extends AsyncTask<Void, Void, Server> {
454
            
455
                @Override
456
                protected Server doInBackground(Void... arg0) {
457
                        try {
458
                                server = (new ServerManager()).find(Integer.parseInt(server.getId()), context);
459
                        } catch (NumberFormatException e) {
460
                                // we're polling, so need to show exceptions
461
                        } catch (CloudServersException e) {
462
                                // we're polling, so need to show exceptions
463
                        }
464
                        return server;
465
                }
466
            
467
                @Override
468
                protected void onPostExecute(Server result) {
469
                        server = result;
470
                        loadServerData();
471
                }
472
    }
473

    
474
    
475
        private class SoftRebootServerTask extends AsyncTask<Void, Void, HttpResponse> {
476
            
477
                private CloudServersException exception;
478
                
479
                @Override
480
                //let user know their process has started
481
                protected void onPreExecute(){
482
                        showToast("Reboot process has begun");
483
                }
484
                
485
                @Override
486
                protected HttpResponse doInBackground(Void... arg0) {
487
                        HttpResponse resp = null;
488
                        try {
489
                                resp = (new ServerManager()).reboot(server, ServerManager.SOFT_REBOOT, context);
490
                        } catch (CloudServersException e) {
491
                                exception = e;
492
                        }
493
                        return resp;
494
                }
495
            
496
                @Override
497
                protected void onPostExecute(HttpResponse response) {
498

    
499
                        if (response != null) {
500
                                int statusCode = response.getStatusLine().getStatusCode();        
501
                                if(statusCode == 202){ showToast("Reboot successful"); }
502
                                if (statusCode != 202) {
503
                                        CloudServersException cse = parseCloudServersException(response);
504
                                        if ("".equals(cse.getMessage())) {
505
                                                showAlert("Error", "There was a problem rebooting your server.");
506
                                        } else {
507
                                                showAlert("Error", "There was a problem rebooting your server: " + cse.getMessage());
508
                                        }
509
                                }
510
                        } else if (exception != null) {
511
                                showAlert("Error", "There was a problem rebooting your server: " + exception.getMessage());
512
                                
513
                        }
514
                }
515
    }
516

    
517
        private class HardRebootServerTask extends AsyncTask<Void, Void, HttpResponse> {
518
            
519
                private CloudServersException exception;
520
                
521
                @Override
522
                //let user know their process has started
523
                protected void onPreExecute(){
524
                        showToast("Reboot process has begun");
525
                }
526

    
527
                @Override
528
                protected HttpResponse doInBackground(Void... arg0) {
529
                        HttpResponse resp = null;                        
530
                        try {
531
                                resp = (new ServerManager()).reboot(server, ServerManager.HARD_REBOOT, context);
532
                        } catch (CloudServersException e) {
533
                                exception = e;
534
                        }
535
                        return resp;
536
                }
537
            
538
                @Override
539
                protected void onPostExecute(HttpResponse response) {
540
                        if (response != null) {
541
                                int statusCode = response.getStatusLine().getStatusCode();        
542
                                if(statusCode == 202){ showToast("Reboot successful"); }
543
                                if (statusCode != 202) {
544
                                        CloudServersException cse = parseCloudServersException(response);
545
                                        if ("".equals(cse.getMessage())) {
546
                                                showAlert("Error", "There was a problem rebooting your server.");
547
                                        } else {
548
                                                showAlert("Error", "There was a problem rebooting your server: " + cse.getMessage());
549
                                        }
550
                                }
551
                        } else if (exception != null) {
552
                                showAlert("Error", "There was a problem rebooting your server: " + exception.getMessage());
553
                                
554
                        }
555
                }
556
    }
557

    
558
        private class ResizeServerTask extends AsyncTask<Void, Void, HttpResponse> {
559
            
560
                private CloudServersException exception;
561

    
562
                @Override
563
                protected HttpResponse doInBackground(Void... arg0) {
564
                        HttpResponse resp = null;
565
                        try {
566
                                resp = (new ServerManager()).resize(server, Integer.parseInt(selectedFlavorId), context);
567
                        } catch (CloudServersException e) {
568
                                exception = e;
569
                        }
570
                        return resp;
571
                }
572
            
573
                @Override
574
                protected void onPostExecute(HttpResponse response) {
575
                        if (response != null) {
576
                                int statusCode = response.getStatusLine().getStatusCode();                        
577
                                if (statusCode == 202) {
578
                                        showToast("Resize process has begun, please confirm your resize after process finishes.");
579
                                        new PollServerTask().execute((Void[]) null);
580
                                } else {                                        
581
                                        CloudServersException cse = parseCloudServersException(response);
582
                                        if ("".equals(cse.getMessage())) {
583
                                                showAlert("Error", "There was a problem resizing your server.");
584
                                        } else {
585
                                                showAlert("Error", "There was a problem resizing your server: " + cse.getMessage());
586
                                        }                                        
587
                                }
588
                        } else if (exception != null) {
589
                                showAlert("Error", "There was a problem resizing your server: " + exception.getMessage());
590
                                
591
                        }
592
                        
593
                }
594
    }
595
        
596
        
597
        public class DeleteServerTask extends AsyncTask<Void, Void, HttpResponse> {
598
            
599
                private CloudServersException exception;
600
                
601
                @Override
602
                //let user know their process has started
603
                protected void onPreExecute(){
604
                        showToast("Delete process has begun");
605
                }
606
                @Override
607
                protected HttpResponse doInBackground(Void... arg0) {
608
                        HttpResponse resp = null;
609
                        try {
610
                                resp = (new ServerManager()).delete(server, context);
611
                        } catch (CloudServersException e) {
612
                                exception = e;
613
                        }
614
                        return resp;
615
                }
616
            
617
                @Override
618
                protected void onPostExecute(HttpResponse response) {
619
                        if (response != null) {
620
                                int statusCode = response.getStatusLine().getStatusCode();
621
                                if (statusCode == 202) {
622
                                        showToast("Delete successful");
623
                                        setResult(Activity.RESULT_OK);
624
                                        finish();
625
                                } else {
626
                                        CloudServersException cse = parseCloudServersException(response);
627
                                        if ("".equals(cse.getMessage())) {
628
                                                showAlert("Error", "There was a problem deleting your server.");
629
                                        } else {
630
                                                showAlert("Error", "There was a problem deleting your server: " + cse.getMessage());
631
                                        }
632
                                }
633
                        } else if (exception != null) {
634
                                showAlert("Error", "There was a problem deleting your server: " + exception.getMessage());                                
635
                        }                        
636
                }
637
    }
638
        
639
        private class RenameServerTask extends AsyncTask<Void, Void, HttpResponse> {
640
                
641
                private CloudServersException exception;
642
                
643
                @Override
644
                //let user know their process has started
645
                protected void onPreExecute(){
646
                        showToast("Rename process has begun");
647
                }
648
                
649
                @Override
650
                protected HttpResponse doInBackground(Void... arg0) {
651
                        HttpResponse resp = null;
652
                        try {
653
                                resp = (new ServerManager()).rename(server, modifiedServerName, context);
654
                        } catch (CloudServersException e) {
655
                                exception = e;
656
                        }
657
                        return resp;
658
                }
659
                
660
                @Override
661
                protected void onPostExecute(HttpResponse response) {
662
                        if (response != null) {
663
                                int statusCode = response.getStatusLine().getStatusCode();        
664
                                if (statusCode == 204) {        
665
                                        showToast("Rename successful");
666
                                        new PollServerTask().execute((Void[]) null);
667
                                } else {
668
                                        CloudServersException cse = parseCloudServersException(response);
669
                                        if ("".equals(cse.getMessage())) {
670
                                                showAlert("Error", "There was a problem renaming your server.");
671
                                        } else {
672
                                                showAlert("Error", "There was a problem renaming your server: " + cse.getMessage());
673
                                        }                                        
674
                                }
675
                        }
676
                    else if (exception != null) {
677
                            showAlert("Error", "There was a problem renaming your server: " + exception.getMessage());        
678
                    }
679
                }
680
                
681
        }
682
        
683
        private class RebuildServerTask extends AsyncTask<Void, Void, HttpResponse> {
684
            
685
                private CloudServersException exception;
686
                
687
                @Override
688
                protected HttpResponse doInBackground(Void... arg0) {
689
                        HttpResponse resp = null;
690
                        try {
691
                                resp = (new ServerManager()).rebuild(server, Integer.parseInt(selectedImageId), context);
692
                        } catch (CloudServersException e) {
693
                                exception = e;
694
                        }
695
                        return resp;
696
                }
697
            
698
                @Override
699
                protected void onPostExecute(HttpResponse response) {
700
                        if (response != null) {
701
                                int statusCode = response.getStatusLine().getStatusCode();                        
702
                                if (statusCode == 202) {
703
                                        showToast("Rebuild process has begun");
704
                                        new PollServerTask().execute((Void[]) null);
705
                                } else {                                        
706
                                        CloudServersException cse = parseCloudServersException(response);
707
                                        if ("".equals(cse.getMessage())) {
708
                                                showAlert("Error", "There was a problem rebuilding your server.");
709
                                        } else {
710
                                                showAlert("Error", "There was a problem rebuilding your server: " + cse.getMessage());
711
                                        }                                        
712
                                }
713
                        } else if (exception != null) {
714
                                showAlert("Error", "There was a problem rebuilding your server: " + exception.getMessage());
715
                                
716
                        }
717
                        
718
                }
719
    }
720
        
721
        
722
}