Statistics
| Branch: | Revision:

root / src / com / rackspace / cloud / android / AddAccessRuleActivity.java @ 7dbfc514

History | View | Annotate | Download (5.4 kB)

1
package com.rackspace.cloud.android;
2

    
3
import java.util.ArrayList;
4
import java.util.Arrays;
5
import java.util.regex.Matcher;
6
import java.util.regex.Pattern;
7

    
8
import org.apache.http.HttpResponse;
9

    
10
import android.app.Activity;
11
import android.os.AsyncTask;
12
import android.os.Bundle;
13
import android.text.Editable;
14
import android.text.TextWatcher;
15
import android.view.View;
16
import android.view.View.OnClickListener;
17
import android.widget.AdapterView;
18
import android.widget.AdapterView.OnItemSelectedListener;
19
import android.widget.ArrayAdapter;
20
import android.widget.Button;
21
import android.widget.EditText;
22
import android.widget.Spinner;
23

    
24
import com.rackspace.cloud.android.R;
25
import com.rackspace.cloud.loadbalancer.api.client.LoadBalancer;
26
import com.rackspace.cloud.loadbalancer.api.client.NetworkItem;
27
import com.rackspace.cloud.loadbalancer.api.client.NetworkItemManager;
28
import com.rackspace.cloud.servers.api.client.CloudServersException;
29
import com.rackspace.cloud.servers.api.client.http.HttpBundle;
30

    
31
public class AddAccessRuleActivity extends CloudActivity{
32

    
33
        private final String[] ACTIONS = {"Deny", "Allow"};
34
        
35
        private LoadBalancer loadBalancer;
36
        private String selectedAction;
37
        private String selectedAddresses;
38
        
39
        @Override
40
        public void onCreate(Bundle savedInstanceState) {
41
                super.onCreate(savedInstanceState);
42
                loadBalancer = (LoadBalancer) this.getIntent().getExtras().get("loadBalancer");
43
                setContentView(R.layout.addaccessrule);
44
                restoreState(savedInstanceState);
45
        }
46

    
47
        @Override
48
        protected void onSaveInstanceState(Bundle outState) {
49
                super.onSaveInstanceState(outState);
50
        }
51

    
52
        protected void restoreState(Bundle state) {
53
                super.restoreState(state);
54
                setupInputs();
55
        }
56
        
57
        private void setupInputs(){
58
                Spinner actionSpinner = (Spinner)findViewById(R.id.rule_action_spinner);
59
                
60
                ArrayAdapter<String> actionAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, ACTIONS);
61
                actionAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
62
                actionSpinner.setAdapter(actionAdapter);
63

    
64
                actionSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
65

    
66
                        @Override
67
                        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
68
                                selectedAction = ACTIONS[pos];        
69
                        }
70

    
71
                        @Override
72
                        public void onNothingSelected(AdapterView<?> arg0) {
73

    
74
                        }
75

    
76
                });
77
                
78
                EditText address = (EditText)findViewById(R.id.rule_address);
79
                address.addTextChangedListener(new TextWatcher() {
80
                        
81
                        @Override
82
                        public void onTextChanged(CharSequence s, int start, int before, int count) {
83
                                selectedAddresses = s.toString();
84
                        }
85
                        
86
                        @Override
87
                        public void beforeTextChanged(CharSequence s, int start, int count,
88
                                        int after) {
89
                                //do nothing
90
                        }
91
                        
92
                        @Override
93
                        public void afterTextChanged(Editable s) {
94
                                //do nothing
95
                        }
96
                });
97
                
98
                Button addRule = (Button)findViewById(R.id.add_rule_button);
99
                addRule.setOnClickListener(new OnClickListener() {
100
                        
101
                        @SuppressWarnings("unchecked")
102
                        @Override
103
                        public void onClick(View v) {
104
                                if(!validAddress(selectedAddresses)){
105
                                        showAlert("Error", "Please enter a valid IP address.");
106
                                } else if(!validAction(selectedAction)) {
107
                                        showAlert("Error", "Please select an action type.");
108
                                } else{
109
                                        ArrayList<NetworkItem> networkItems = new ArrayList<NetworkItem>();
110
                                        String[] networkAddresses = selectedAddresses.split(",");
111
                                        for(int i = 0; i < networkAddresses.length; i++){
112
                                                NetworkItem networkItem = new NetworkItem();
113
                                                networkItem.setAddress(networkAddresses[i].trim());
114
                                                networkItem.setType(selectedAction);
115
                                                networkItems.add(networkItem);
116
                                        }
117
                                        new AddNetworkItemTask().execute(networkItems);
118
                                }
119
                        }
120
                });
121
        }
122
        
123
        //basic ip validation just checks that the string
124
        //is only composed of letters, numbers, ., : and , 
125
        private static boolean validAddress(String address){
126
                //if just white space return false;
127
                //check regex
128
                if(address != null && !address.trim().equals("")){
129
                        Pattern pattern = Pattern.compile("[a-zA-Z0-9.:/, ]+");
130
                        Matcher match = pattern.matcher(address);
131
                        return match.matches();
132
                } else {
133
                        return false;
134
                }
135
        }
136
        
137
        private Boolean validAction(String action){
138
                return action != null && Arrays.asList(ACTIONS).contains(action);
139
        }
140
        
141
        private class AddNetworkItemTask extends AsyncTask<ArrayList<NetworkItem>, Void, HttpBundle> {
142

    
143
                private CloudServersException exception;
144

    
145
                @Override
146
                protected void onPreExecute(){
147
                        showDialog();
148
                }
149
                @Override
150
                protected HttpBundle doInBackground(ArrayList<NetworkItem>... networkItems) {
151
                        HttpBundle bundle = null;
152
                        try {
153
                                bundle = new NetworkItemManager(getContext()).create(loadBalancer, networkItems[0]);
154
                        } catch (CloudServersException e) {
155
                                exception = e;
156
                        }
157
                        return bundle;
158
                }
159

    
160
                @Override
161
                protected void onPostExecute(HttpBundle bundle) {
162
                        hideDialog();
163
                        HttpResponse response = bundle.getResponse();
164
                        if (response != null) {
165
                                int statusCode = response.getStatusLine().getStatusCode();
166
                                if (statusCode == 202 || statusCode == 200) {
167
                                        setResult(Activity.RESULT_OK);
168
                                        finish();
169
                                } else {
170
                                        CloudServersException cse = parseCloudServersException(response);
171
                                        if ("".equals(cse.getMessage())) {
172
                                                showError("There was a problem creating your rule.", bundle);
173
                                        } else {
174
                                                showError("There was a problem creating your rule: " + cse.getMessage(), bundle);
175
                                        }
176
                                }
177
                        } else if (exception != null) {
178
                                showError("There was a problem creating your rule: " + exception.getMessage(), bundle);                                
179
                        }                        
180
                }
181
        }
182
}