Statistics
| Branch: | Revision:

root / src / com / rackspacecloud / android / AddAccessRuleActivity.java @ 1a79c76b

History | View | Annotate | Download (5.4 kB)

1
package com.rackspacecloud.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.ArrayAdapter;
19
import android.widget.Button;
20
import android.widget.EditText;
21
import android.widget.Spinner;
22
import android.widget.AdapterView.OnItemSelectedListener;
23

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

    
30
public class AddAccessRuleActivity extends CloudActivity{
31

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

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

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

    
63
                actionSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
64

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

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

    
73
                        }
74

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

    
142
                private CloudServersException exception;
143

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

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