Statistics
| Branch: | Revision:

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

History | View | Annotate | Download (26.2 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.view.Menu;
33
import android.view.MenuInflater;
34
import android.view.MenuItem;
35
import android.view.View;
36
import android.view.View.OnClickListener;
37
import android.widget.Button;
38
import android.widget.EditText;
39
import android.widget.LinearLayout;
40
import android.widget.TextView;
41
import android.widget.Toast;
42

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

    
51
/**
52
 * @author Mike Mayo - mike.mayo@rackspace.com - twitter.com/greenisus
53
 *
54
 */
55
public class ViewServerActivity extends GaActivity {
56

    
57
        private Server server;
58
        private boolean ipAddressesLoaded; // to prevent polling from loading tons of duplicates
59
        private Flavor[] flavors;
60
        private String[] flavorNames;
61
        private String selectedFlavorId;
62
        Context context;
63
        //private boolean imageLoaded;
64
        private String modifiedServerName;
65
        private Image[] images;
66
        private String[] imageNames;
67
        private String selectedImageId;
68
        private boolean isPolling;
69
        private PollServerTask pollServerTask;
70
        private boolean canPoll;
71
        private boolean noAskForConfirm;
72

    
73
        /** Called when the activity is first created. */
74
        @Override
75
        public void onCreate(Bundle savedInstanceState) {
76
                super.onCreate(savedInstanceState);
77
                trackPageView(PAGE_SERVER);
78
                server = (Server) this.getIntent().getExtras().get("server");
79
                context = getApplicationContext();
80
                setContentView(R.layout.viewserver);
81
                restoreState(savedInstanceState);
82
        }
83

    
84
        @Override
85
        protected void onSaveInstanceState(Bundle outState) {
86
                super.onSaveInstanceState(outState);
87
                outState.putSerializable("server", server);
88
                outState.putBoolean("noAskForConfirm", noAskForConfirm);
89
                if(pollServerTask != null && isPolling){
90
                        pollServerTask.cancel(true);
91
                }
92
                outState.putBoolean("wasPolling", isPolling);
93
        }
94

    
95
        private void restoreState(Bundle state) {
96
                if(state != null && state.containsKey("noAskForConfirm")){
97
                        noAskForConfirm = state.getBoolean("noAskForConfirm");
98
                }
99
                if(state != null && state.containsKey("wasPolling") && state.getBoolean("wasPolling") == true){
100
                        pollServerTask = new PollServerTask();
101
                        pollServerTask.execute((Void[]) null);
102
                }
103
                if (server == null && state != null && state.containsKey("server")) {
104
                        server = (Server) state.getSerializable("server");
105
                        //imageLoaded = state.getBoolean("imageLoaded");
106
                }
107
                canPoll = true;
108
                loadServerData();
109
                setupButtons();
110
                loadFlavors();
111
                loadImages();
112
        }
113

    
114

    
115
        /*
116
    private void loadImage() {
117
            // hate to do this, but devices run out of memory after a few rotations
118
            // because the background images are so large
119
            if (!imageLoaded) {
120
                    ImageView osLogo = (ImageView) findViewById(R.id.view_server_os_logo);
121
                    osLogo.setAlpha(100);
122
                    osLogo.setImageResource(server.getImage().logoResourceId());
123
                    imageLoaded = true;
124
            }
125

126
    }
127
         */  
128

    
129
        /*
130
         * need to manage the polling task
131
         * if the activity is stopped
132
         */
133
        @Override
134
        public void onStop(){
135
                super.onStop();
136
                if(pollServerTask != null && isPolling){
137
                        pollServerTask.cancel(true);
138
                        isPolling = true;
139
                }
140
                canPoll = false;
141

    
142
        }
143

    
144
        /*
145
         * restart the pollingtask 
146
         * if it was running before
147
         * 
148
         */
149
        @Override
150
        public void onStart(){
151
                super.onStart();
152
                if(isPolling){
153
                        pollServerTask = new PollServerTask();
154
                        pollServerTask.execute((Void[]) null);
155
                }
156
                canPoll = true;
157

    
158
        }
159

    
160
        private void loadServerData() {
161
                if(server != null){
162
                        TextView name = (TextView) findViewById(R.id.view_server_name);
163
                        name.setText(server.getName());
164

    
165
                        TextView os = (TextView) findViewById(R.id.view_server_os);
166
                        os.setText(server.getImage().getName());
167

    
168
                        TextView memory = (TextView) findViewById(R.id.view_server_memory);
169
                        memory.setText(server.getFlavor().getRam() + " MB");
170

    
171
                        TextView disk = (TextView) findViewById(R.id.view_server_disk);
172
                        disk.setText(server.getFlavor().getDisk() + " GB");
173

    
174
                        TextView status = (TextView) findViewById(R.id.view_server_status);
175

    
176
                        if(noAskForConfirm == false){
177
                                if(status.getText().toString().contains("VERIFY_RESIZE")){
178
                                        //show the confimresizeactivity
179
                                        noAskForConfirm = true;
180
                                        Intent viewIntent = new Intent(getApplicationContext(), ConfirmResizeActivity.class);
181
                                        viewIntent.putExtra("server", server);
182
                                        startActivity(viewIntent);
183
                                }
184
                        }
185

    
186
                        // show status and possibly the progress, with polling
187
                        if (!"ACTIVE".equals(server.getStatus())) {
188
                                status.setText(server.getStatus() + " - " + server.getProgress() + "%");
189
                                pollServerTask = new PollServerTask();
190
                                pollServerTask.execute((Void[]) null);
191
                        } else {
192
                                status.setText(server.getStatus());
193
                        }
194

    
195
                        if (!ipAddressesLoaded) {
196
                                // public IPs
197
                                int layoutIndex = 12; // public IPs start here
198
                                LinearLayout layout = (LinearLayout) this.findViewById(R.id.view_server_layout);            
199
                                String publicIps[] = server.getPublicIpAddresses();
200
                                for (int i = 0; i < publicIps.length; i++) {
201
                                        TextView tv = new TextView(this.getBaseContext());
202
                                        tv.setLayoutParams(os.getLayoutParams()); // easy quick styling! :)
203
                                        tv.setTypeface(tv.getTypeface(), 1); // 1 == bold
204
                                        tv.setTextSize(os.getTextSize());
205
                                        tv.setTextColor(Color.WHITE);
206
                                        tv.setText(publicIps[i]);
207
                                        layout.addView(tv, layoutIndex++);
208
                                }
209

    
210
                                // private IPs
211
                                layoutIndex++; // skip over the Private IPs label
212
                                String privateIps[] = server.getPrivateIpAddresses();
213
                                for (int i = 0; i < privateIps.length; i++) {
214
                                        TextView tv = new TextView(this.getBaseContext());
215
                                        tv.setLayoutParams(os.getLayoutParams()); // easy quick styling! :)
216
                                        tv.setTypeface(tv.getTypeface(), 1); // 1 == bold
217
                                        tv.setTextSize(os.getTextSize());
218
                                        tv.setTextColor(Color.WHITE);
219
                                        tv.setText(privateIps[i]);
220
                                        layout.addView(tv, layoutIndex++);
221
                                }
222
                                ipAddressesLoaded = true;
223
                        }
224
                }
225

    
226
                //loadImage();
227
        }
228

    
229
        private void loadFlavors() {
230
                flavorNames = new String[Flavor.getFlavors().size()]; 
231
                flavors = new Flavor[Flavor.getFlavors().size()];
232

    
233
                Iterator<Flavor> iter = Flavor.getFlavors().values().iterator();
234
                int i = 0;
235
                while (iter.hasNext()) {
236
                        Flavor flavor = iter.next();
237
                        flavors[i] = flavor;
238
                        flavorNames[i] = flavor.getName() + ", " + flavor.getDisk() + " GB disk";
239
                        i++;
240
                }
241
                selectedFlavorId = flavors[0].getId();
242
        }
243

    
244
        private void loadImages() {
245
                imageNames = new String[Image.getImages().size()]; 
246
                images = new Image[Image.getImages().size()];
247

    
248
                Iterator<Image> iter = Image.getImages().values().iterator();
249
                int i = 0;
250
                while (iter.hasNext()) {
251
                        Image image = iter.next();
252
                        images[i] = image;
253
                        imageNames[i] = image.getName(); 
254
                        i++;
255
                }
256
                //sort arrays so they display nicely in the spinner
257
                Arrays.sort(images);
258
                Arrays.sort(imageNames);
259
                selectedImageId = images[0].getId();
260

    
261
        }
262

    
263
        private void setupButton(int resourceId, OnClickListener onClickListener) {
264
                Button button = (Button) findViewById(resourceId);
265
                button.setOnClickListener(onClickListener);
266
        }
267

    
268
        private void setupButtons() {
269
                setupButton(R.id.view_server_soft_reboot_button, new OnClickListener() {
270
                        public void onClick(View v) {
271
                                showDialog(R.id.view_server_soft_reboot_button);
272
                        }
273
                });
274

    
275
                setupButton(R.id.view_server_hard_reboot_button, new OnClickListener() {
276
                        public void onClick(View v) {
277
                                showDialog(R.id.view_server_hard_reboot_button);
278
                        }
279
                });
280

    
281
                setupButton(R.id.view_server_resize_button, new OnClickListener() {
282
                        public void onClick(View v) {
283
                                showDialog(R.id.view_server_resize_button);
284
                        }
285
                });
286

    
287
                setupButton(R.id.view_server_delete_button, new OnClickListener() {
288
                        public void onClick(View v) {
289
                                showDialog(R.id.view_server_delete_button);
290
                        }
291
                });
292

    
293
                setupButton(R.id.view_server_rename_button, new OnClickListener() {
294
                        public void onClick(View v) {
295
                                showDialog(R.id.view_server_rename_button);
296
                        }
297
                });
298

    
299
                setupButton(R.id.view_server_rebuild_button, new OnClickListener() {
300
                        public void onClick(View v) {
301
                                showDialog(R.id.view_server_rebuild_button);
302
                        }
303
                });
304

    
305

    
306
                setupButton(R.id.view_server_backup_button, new OnClickListener() {
307
                        public void onClick(View v) {
308
                                Intent viewIntent = new Intent(v.getContext(), BackupServerActivity.class);
309
                                viewIntent.putExtra("server", server);
310
                                startActivity(viewIntent);
311
                        }
312
                });
313

    
314
                setupButton(R.id.view_server_password_button, new OnClickListener() {
315
                        public void onClick(View v) {
316
                                Intent viewIntent = new Intent(v.getContext(), PasswordServerActivity.class);
317
                                viewIntent.putExtra("server", server);
318
                                startActivity(viewIntent);
319
                        }
320
                });
321

    
322
                setupButton(R.id.view_server_ping_button, new OnClickListener() {
323
                        public void onClick(View v) {
324
                                trackEvent(CATEGORY_SERVER, EVENT_PING, "", -1);
325

    
326
                                //ping the first public ip
327
                                Intent viewIntent = new Intent(v.getContext(), PingServerActivity.class);
328
                                viewIntent.putExtra("ipAddress", server.getPublicIpAddresses()[0]);
329
                                startActivity(viewIntent);
330

    
331

    
332
                        }
333
                });
334

    
335
        }
336

    
337
        private void showToast(String message) {
338
                Context context = getApplicationContext();
339
                int duration = Toast.LENGTH_SHORT;
340
                Toast toast = Toast.makeText(context, message, duration);
341
                toast.show();
342
        }
343

    
344
        /**
345
         * @return the server
346
         */
347
        public Server getServer() {
348
                return server;
349
        }
350

    
351
        /**
352
         * @param server the server to set
353
         */
354
        public void setServer(Server server) {
355
                this.server = server;
356
        }
357

    
358
        //setup menu for when menu button is pressed
359
        public boolean onCreateOptionsMenu(Menu menu) {
360
                super.onCreateOptionsMenu(menu);
361
                MenuInflater inflater = getMenuInflater();
362
                inflater.inflate(R.menu.view_server_activity_menu, menu);
363
                return true;
364
        } 
365

    
366
        @Override 
367
        //in options menu, when add account is selected go to add account activity
368
        public boolean onOptionsItemSelected(MenuItem item) {
369
                switch (item.getItemId()) {
370
                case R.id.refresh_server:
371
                        loadServerData();
372
                        return true;
373
                }        
374
                return false;
375
        } 
376

    
377
        private void startServerError(String message, HttpBundle bundle){
378
                Intent viewIntent = new Intent(getApplicationContext(), ServerErrorActivity.class);
379
                viewIntent.putExtra("errorMessage", message);
380
                viewIntent.putExtra("response", bundle.getResponseText());
381
                viewIntent.putExtra("request", bundle.getCurlRequest());
382
                startActivity(viewIntent);
383
        }
384

    
385
        @Override
386
        protected Dialog onCreateDialog(int id) {
387
                if(server == null){
388
                        return new AlertDialog.Builder(ViewServerActivity.this)
389
                        .setIcon(R.drawable.alert_dialog_icon)
390
                        .setTitle("Error")
391
                        .setMessage("Server is Busy")
392
                        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
393
                                public void onClick(DialogInterface dialog, int whichButton) {
394
                                        // User clicked Cancel so do some stuff
395
                                }
396
                        })
397
                        .create();
398
                }
399
                else{
400
                        switch (id) {
401
                        case R.id.view_server_soft_reboot_button:
402
                                return new AlertDialog.Builder(ViewServerActivity.this)
403
                                .setIcon(R.drawable.alert_dialog_icon)
404
                                .setTitle("Soft Reboot")
405
                                .setMessage("Are you sure you want to perform a soft reboot?")
406
                                .setPositiveButton("Reboot Server", new DialogInterface.OnClickListener() {
407
                                        public void onClick(DialogInterface dialog, int whichButton) {
408
                                                trackEvent(CATEGORY_SERVER, EVENT_REBOOT, "", -1);
409
                                                new SoftRebootServerTask().execute((Void[]) null);
410
                                        }
411
                                })
412
                                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
413
                                        public void onClick(DialogInterface dialog, int whichButton) {
414
                                                // User clicked Cancel so do some stuff
415
                                        }
416
                                })
417
                                .create();
418
                        case R.id.view_server_hard_reboot_button:
419
                                return new AlertDialog.Builder(ViewServerActivity.this)
420
                                .setIcon(R.drawable.alert_dialog_icon)
421
                                .setTitle("Hard Reboot")
422
                                .setMessage("Are you sure you want to perform a hard reboot?")
423
                                .setPositiveButton("Reboot Server", new DialogInterface.OnClickListener() {
424
                                        public void onClick(DialogInterface dialog, int whichButton) {
425
                                                trackEvent(CATEGORY_SERVER, EVENT_REBOOT, "", -1);
426
                                                new HardRebootServerTask().execute((Void[]) null);
427
                                        }
428
                                })
429
                                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
430
                                        public void onClick(DialogInterface dialog, int whichButton) {
431
                                                // User clicked Cancel so do some stuff
432
                                        }
433
                                })
434
                                .create();
435
                        case R.id.view_server_resize_button:
436
                                return new AlertDialog.Builder(ViewServerActivity.this)
437
                                .setItems(flavorNames, new ResizeClickListener())
438
                                .setIcon(R.drawable.alert_dialog_icon)
439
                                .setTitle("Resize Server")
440
                                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
441
                                        public void onClick(DialogInterface dialog, int whichButton) {
442
                                                // User clicked Cancel so do some stuff
443
                                        }
444
                                })
445
                                .create();
446
                        case R.id.view_server_delete_button:
447
                                return new AlertDialog.Builder(ViewServerActivity.this)
448
                                .setIcon(R.drawable.alert_dialog_icon)
449
                                .setTitle("Delete Server")
450
                                .setMessage("Are you sure you want to delete this server?  This operation cannot be undone and all backups will be deleted.")
451
                                .setPositiveButton("Delete Server", new DialogInterface.OnClickListener() {
452
                                        public void onClick(DialogInterface dialog, int whichButton) {
453
                                                trackEvent(CATEGORY_SERVER, EVENT_DELETE, "", -1);
454
                                                new DeleteServerTask().execute((Void[]) null);
455
                                        }
456
                                })
457
                                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
458
                                        public void onClick(DialogInterface dialog, int whichButton) {
459
                                                // User clicked Cancel so do some stuff
460
                                        }
461
                                })
462
                                .create();          
463
                        case R.id.view_server_rename_button:
464
                                final EditText input = new EditText(this);
465
                                input.setText(server.getName());
466
                                return new AlertDialog.Builder(ViewServerActivity.this)
467
                                .setIcon(R.drawable.alert_dialog_icon)
468
                                .setView(input)
469
                                .setTitle("Rename")
470
                                .setMessage("Enter new name for server: ")                         
471
                                .setPositiveButton("Rename", new DialogInterface.OnClickListener() {
472
                                        public void onClick(DialogInterface dialog, int whichButton) {
473
                                                trackEvent(CATEGORY_SERVER, EVENT_RENAME, "", -1);
474
                                                modifiedServerName = input.getText().toString();
475
                                                new RenameServerTask().execute((Void[]) null);
476
                                        }
477
                                })
478
                                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
479
                                        public void onClick(DialogInterface dialog, int whichButton) {
480
                                                // User clicked Cancel so do some stuff
481
                                        }
482
                                })
483
                                .create();     
484
                        case R.id.view_server_rebuild_button:
485
                                return new AlertDialog.Builder(ViewServerActivity.this)
486
                                .setItems(imageNames, new RebuildClickListener())
487
                                .setIcon(R.drawable.alert_dialog_icon)
488
                                .setTitle("Rebuild Server")
489
                                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
490
                                        public void onClick(DialogInterface dialog, int whichButton) {
491
                                                // User clicked Cancel so do some stuff
492
                                        }
493
                                })
494
                                .create();
495
                        }
496
                }
497
                return new AlertDialog.Builder(ViewServerActivity.this)
498
                .setIcon(R.drawable.alert_dialog_icon)
499
                .setTitle("Error")
500
                .setMessage("Server is Busy")
501
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
502
                        public void onClick(DialogInterface dialog, int whichButton) {
503
                                // User clicked Cancel so do some stuff
504
                        }
505
                })
506
                .create();
507
        }
508

    
509
        private class ResizeClickListener implements android.content.DialogInterface.OnClickListener {
510

    
511
                public void onClick(DialogInterface dialog, int which) {
512
                        trackEvent(CATEGORY_SERVER, EVENT_RESIZE, "", -1);
513
                        selectedFlavorId = which + 1 + "";
514
                        new ResizeServerTask().execute((Void[]) null);
515
                }
516

    
517
        }
518

    
519
        private class RebuildClickListener implements android.content.DialogInterface.OnClickListener {
520

    
521
                public void onClick(DialogInterface dialog, int which) {
522
                        trackEvent(CATEGORY_SERVER, EVENT_REBUILD, "", -1);
523
                        selectedImageId = images[which].getId() + "";
524
                        new RebuildServerTask().execute((Void[]) null);
525
                }
526

    
527
        }
528

    
529
        private CloudServersException parseCloudServersException(HttpResponse response) {
530
                CloudServersException cse = new CloudServersException();
531
                try {
532
                        BasicResponseHandler responseHandler = new BasicResponseHandler();
533
                        String body = responseHandler.handleResponse(response);
534
                        CloudServersFaultXMLParser parser = new CloudServersFaultXMLParser();
535
                        SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
536
                        XMLReader xmlReader = saxParser.getXMLReader();
537
                        xmlReader.setContentHandler(parser);
538
                        xmlReader.parse(new InputSource(new StringReader(body)));                            
539
                        cse = parser.getException();                            
540
                } catch (ClientProtocolException e) {
541
                        cse = new CloudServersException();
542
                        cse.setMessage(e.getLocalizedMessage());
543
                } catch (IOException e) {
544
                        cse = new CloudServersException();
545
                        cse.setMessage(e.getLocalizedMessage());
546
                } catch (ParserConfigurationException e) {
547
                        cse = new CloudServersException();
548
                        cse.setMessage(e.getLocalizedMessage());
549
                } catch (SAXException e) {
550
                        cse = new CloudServersException();
551
                        cse.setMessage(e.getLocalizedMessage());
552
                } catch (FactoryConfigurationError e) {
553
                        cse = new CloudServersException();
554
                        cse.setMessage(e.getLocalizedMessage());
555
                }
556
                return cse;
557
        }
558

    
559
        // HTTP request tasks
560

    
561
        private class PollServerTask extends AsyncTask<Void, Void, Server> {
562

    
563
                private Server tempServer;
564

    
565
                @Override 
566
                protected void onPreExecute(){
567
                        isPolling = true;
568
                }
569

    
570
                @Override
571
                protected Server doInBackground(Void... arg0) {
572
                        if(isCancelled() || !canPoll){
573
                                return null;
574
                        }
575
                        try {
576
                                tempServer = (new ServerManager()).find(Integer.parseInt(server.getId()), context);
577
                        } catch (NumberFormatException e) {
578
                                // we're polling, so need to show exceptions
579
                        } catch (CloudServersException e) {
580
                                // we're polling, so need to show exceptions
581
                        }
582
                        return tempServer;
583
                }
584

    
585
                @Override
586
                protected void onPostExecute(Server result) {
587
                        server = result;
588
                        if(server != null){
589
                                loadServerData();
590
                        }
591
                        isPolling = false;
592
                }
593

    
594
                @Override
595
                protected void onCancelled (){
596
                        isPolling = false;
597
                }
598

    
599
        }
600

    
601

    
602
        private class SoftRebootServerTask extends AsyncTask<Void, Void, HttpBundle> {
603

    
604
                private CloudServersException exception;
605

    
606
                @Override
607
                //let user know their process has started
608
                protected void onPreExecute(){
609
                        showToast("Reboot process has begun");
610
                }
611

    
612
                @Override
613
                protected HttpBundle doInBackground(Void... arg0) {
614
                        HttpBundle bundle = null;
615
                        try {
616
                                bundle = (new ServerManager()).reboot(server, ServerManager.SOFT_REBOOT, context);
617
                        } catch (CloudServersException e) {
618
                                exception = e;
619
                        }
620
                        return bundle;
621
                }
622

    
623
                @Override
624
                protected void onPostExecute(HttpBundle bundle) {
625
                        HttpResponse response = bundle.getResponse();
626
                        if (response != null) {
627
                                int statusCode = response.getStatusLine().getStatusCode();        
628
                                if(statusCode == 202){ showToast("Reboot successful"); }
629
                                if (statusCode != 202) {
630
                                        CloudServersException cse = parseCloudServersException(response);
631
                                        if ("".equals(cse.getMessage())) {
632
                                                startServerError("There was a problem rebooting your server.", bundle);
633
                                        } else {
634
                                                startServerError("There was a problem rebooting your server: " + cse.getMessage(), bundle);
635
                                        }
636
                                }
637
                        } else if (exception != null) {
638
                                startServerError("There was a problem rebooting your server: " + exception.getMessage(), bundle);
639

    
640
                        }
641
                }
642
        }
643

    
644
        private class HardRebootServerTask extends AsyncTask<Void, Void, HttpBundle> {
645

    
646
                private CloudServersException exception;
647

    
648
                @Override
649
                //let user know their process has started
650
                protected void onPreExecute(){
651
                        showToast("Reboot process has begun");
652
                }
653

    
654
                @Override
655
                protected HttpBundle doInBackground(Void... arg0) {
656
                        HttpBundle bundle = null;                
657
                        try {
658
                                bundle = (new ServerManager()).reboot(server, ServerManager.HARD_REBOOT, context);
659
                        } catch (CloudServersException e) {
660
                                exception = e;
661
                        }
662
                        return bundle;
663
                }
664

    
665
                @Override
666
                protected void onPostExecute(HttpBundle bundle) {
667
                        HttpResponse response = bundle.getResponse();
668
                        if (response != null) {
669
                                int statusCode = response.getStatusLine().getStatusCode();        
670
                                if(statusCode == 202){ showToast("Reboot successful"); }
671
                                if (statusCode != 202) {
672
                                        CloudServersException cse = parseCloudServersException(response);
673
                                        if ("".equals(cse.getMessage())) {
674
                                                startServerError("There was a problem rebooting your server.", bundle);
675
                                        } else {
676
                                                startServerError("There was a problem rebooting your server: " + cse.getMessage(), bundle);
677
                                        }
678
                                }
679
                        } else if (exception != null) {
680
                                startServerError("There was a problem rebooting your server: " + exception.getMessage(), bundle);
681

    
682
                        }
683
                }
684
        }
685

    
686
        private class ResizeServerTask extends AsyncTask<Void, Void, HttpBundle> {
687

    
688
                private CloudServersException exception;
689

    
690
                @Override
691
                protected void onPreExecute(){
692
                        showToast("Resize process has begun, please confirm your resize after process finishes.");
693
                }
694

    
695
                @Override
696
                protected HttpBundle doInBackground(Void... arg0) {
697
                        HttpBundle bundle = null;        
698
                        try {
699
                                bundle = (new ServerManager()).resize(server, Integer.parseInt(selectedFlavorId), context);
700
                        } catch (CloudServersException e) {
701
                                exception = e;
702
                        }
703
                        return bundle;
704
                }
705

    
706
                @Override
707
                protected void onPostExecute(HttpBundle bundle) {
708
                        HttpResponse response = bundle.getResponse();
709
                        if (response != null) {
710
                                int statusCode = response.getStatusLine().getStatusCode();                        
711
                                if (statusCode == 202) {
712
                                        pollServerTask = new PollServerTask();
713
                                        pollServerTask.execute((Void[]) null);
714
                                } else {                                        
715
                                        CloudServersException cse = parseCloudServersException(response);
716
                                        if ("".equals(cse.getMessage())) {
717
                                                startServerError("There was a problem resizing your server.", bundle);
718
                                        } else {
719
                                                startServerError("There was a problem resizing your server: " + cse.getMessage(), bundle);
720
                                        }                                        
721
                                }
722
                        } else if (exception != null) {
723
                                startServerError("There was a problem resizing your server: " + exception.getMessage(), bundle);
724

    
725
                        }
726

    
727
                }
728
        }
729

    
730

    
731
        public class DeleteServerTask extends AsyncTask<Void, Void, HttpBundle> {
732

    
733
                private CloudServersException exception;
734

    
735
                @Override
736
                //let user know their process has started
737
                protected void onPreExecute(){
738
                        showToast("Delete process has begun");
739
                }
740
                @Override
741
                protected HttpBundle doInBackground(Void... arg0) {
742
                        HttpBundle bundle = null;
743
                        try {
744
                                bundle = (new ServerManager()).delete(server, context);
745
                        } catch (CloudServersException e) {
746
                                exception = e;
747
                        }
748
                        return bundle;
749
                }
750

    
751
                @Override
752
                protected void onPostExecute(HttpBundle bundle) {
753
                        HttpResponse response = bundle.getResponse();
754
                        if (response != null) {
755
                                int statusCode = response.getStatusLine().getStatusCode();
756
                                if (statusCode == 202) {
757
                                        showToast("Delete successful");
758
                                        setResult(Activity.RESULT_OK);
759
                                        finish();
760
                                } else {
761
                                        CloudServersException cse = parseCloudServersException(response);
762
                                        if ("".equals(cse.getMessage())) {
763
                                                startServerError("There was a problem deleting your server.", bundle);
764
                                        } else {
765
                                                startServerError("There was a problem deleting your server: " + cse.getMessage(), bundle);
766
                                        }
767
                                }
768
                        } else if (exception != null) {
769
                                startServerError("There was a problem deleting your server: " + exception.getMessage(), bundle);                                
770
                        }                        
771
                }
772
        }
773

    
774
        private class RenameServerTask extends AsyncTask<Void, Void, HttpBundle> {
775

    
776
                private CloudServersException exception;
777

    
778
                @Override
779
                //let user know their process has started
780
                protected void onPreExecute(){
781
                        showToast("Rename process has begun.");
782
                }
783

    
784
                @Override
785
                protected HttpBundle doInBackground(Void... arg0) {
786
                        HttpBundle bundle = null;
787
                        try {
788
                                bundle = (new ServerManager()).rename(server, modifiedServerName, context);
789
                        } catch (CloudServersException e) {
790
                                exception = e;
791
                        }
792
                        return bundle;
793
                }
794

    
795
                @Override
796
                protected void onPostExecute(HttpBundle bundle) {
797
                        HttpResponse response = bundle.getResponse();
798
                        if (response != null) {
799
                                int statusCode = response.getStatusLine().getStatusCode();        
800
                                if (statusCode == 204) {        
801
                                        showToast("Rename successful");
802
                                        pollServerTask = new PollServerTask();
803
                                        pollServerTask.execute((Void[]) null);
804
                                } else {
805
                                        CloudServersException cse = parseCloudServersException(response);
806
                                        if ("".equals(cse.getMessage())) {
807
                                                startServerError("There was a problem renaming your server.", bundle);
808
                                        } else {
809
                                                startServerError("There was a problem renaming your server: " + cse.getMessage(), bundle);
810
                                        }                                        
811
                                }
812
                        }
813
                        else if (exception != null) {
814
                                startServerError("There was a problem renaming your server: " + exception.getMessage(), bundle);        
815
                        }
816
                }
817

    
818
        }
819

    
820
        private class RebuildServerTask extends AsyncTask<Void, Void, HttpBundle> {
821

    
822
                private CloudServersException exception;
823

    
824
                @Override
825
                protected void onPreExecute(){
826
                        showToast("Rebuild process has begun");
827
                }
828

    
829
                @Override
830
                protected HttpBundle doInBackground(Void... arg0) {
831
                        HttpBundle bundle = null;
832
                        try {
833
                                bundle = (new ServerManager()).rebuild(server, Integer.parseInt(selectedImageId), context);
834
                        } catch (CloudServersException e) {
835
                                exception = e;
836
                        }
837
                        return bundle;
838
                }
839

    
840
                @Override
841
                protected void onPostExecute(HttpBundle bundle) {
842
                        HttpResponse response = bundle.getResponse();
843
                        if (response != null) {
844
                                int statusCode = response.getStatusLine().getStatusCode();                        
845
                                if (statusCode == 202) {
846
                                        pollServerTask = new PollServerTask();
847
                                        pollServerTask.execute((Void[]) null);
848
                                } else {                                        
849
                                        CloudServersException cse = parseCloudServersException(response);
850
                                        if ("".equals(cse.getMessage())) {
851
                                                startServerError("There was a problem rebuilding your server.", bundle);
852
                                        } else {
853
                                                startServerError("There was a problem rebuilding your server: " + cse.getMessage(), bundle);
854
                                        }                                        
855
                                }
856
                        } else if (exception != null) {
857
                                startServerError("There was a problem rebuilding your server: " + exception.getMessage(), bundle);
858
                        }
859

    
860
                }
861
        }
862

    
863

    
864
}