Statistics
| Branch: | Revision:

root / src / com / rackspacecloud / android / AddNodesActivity.java @ b5f66d0e

History | View | Annotate | Download (10.2 kB)

1
package com.rackspacecloud.android;
2

    
3
import java.util.ArrayList;
4

    
5
import com.rackspace.cloud.loadbalancer.api.client.Node;
6
import com.rackspace.cloud.servers.api.client.CloudServersException;
7
import com.rackspace.cloud.servers.api.client.Server;
8
import com.rackspace.cloud.servers.api.client.ServerManager;
9

    
10
import android.content.Intent;
11
import android.os.AsyncTask;
12
import android.os.Bundle;
13
import android.view.LayoutInflater;
14
import android.view.View;
15
import android.view.View.OnClickListener;
16
import android.view.ViewGroup;
17
import android.widget.ArrayAdapter;
18
import android.widget.Button;
19
import android.widget.CheckBox;
20
import android.widget.CompoundButton;
21
import android.widget.LinearLayout;
22
import android.widget.ListView;
23
import android.widget.CompoundButton.OnCheckedChangeListener;
24
import android.widget.TextView;
25

    
26
public class AddNodesActivity extends CloudListActivity {
27

    
28
        private static final int ADD_NODE_CODE = 178;
29
        private static final int ADD_EXTERNAL_NODE_CODE = 188;
30

    
31
        private ArrayList<Server> servers;
32
        private int lastCheckedPos;
33
        private ArrayList<Node> nodes;
34

    
35
        @SuppressWarnings("unchecked")
36
        @Override
37
        public void onCreate(Bundle savedInstanceState) {
38
                super.onCreate(savedInstanceState);
39
                nodes = (ArrayList<Node>) this.getIntent().getExtras().get("nodes");
40
                setContentView(R.layout.addnodes);
41
                restoreState(savedInstanceState);
42
        }
43

    
44
        @Override
45
        protected void onSaveInstanceState(Bundle outState) {
46
                super.onSaveInstanceState(outState);
47
                outState.putSerializable("nodes", nodes);
48
                outState.putSerializable("servers", servers);
49
        }
50

    
51
        @SuppressWarnings("unchecked")
52
        protected void restoreState(Bundle state) {
53
                super.restoreState(state);
54

    
55
                if (state != null && state.containsKey("nodes")){
56
                        nodes = (ArrayList<Node>) state.getSerializable("nodes");
57
                        if(nodes == null){
58
                                nodes = new ArrayList<Node>();
59
                        }
60
                }
61

    
62
                if (state != null && state.containsKey("servers")) {
63
                        servers = (ArrayList<Server>) state.getSerializable("servers");
64
                        if (servers.size() == 0) {
65
                                displayNoServersCell();
66
                        } else {
67
                                getListView().setDividerHeight(1); // restore divider lines
68
                                setListAdapter(new ServerAdapter());
69
                        }
70
                } else {
71
                        loadServers();
72
                }
73

    
74
                Button submitNodes = (Button) findViewById(R.id.submit_nodes_button);
75
                submitNodes.setOnClickListener(new OnClickListener() {
76

    
77
                        @Override
78
                        public void onClick(View v) {
79
                                Intent viewIntent = new Intent();
80
                                viewIntent.putExtra("nodes", nodes);
81
                                setResult(RESULT_OK, viewIntent);
82
                                finish();
83
                        }
84
                });
85

    
86
                Button addExternalNode = (Button) findViewById(R.id.add_external_node);
87
                addExternalNode.setOnClickListener(new OnClickListener() {
88

    
89
                        @Override
90
                        public void onClick(View v) {
91
                                Intent viewIntent = new Intent(getContext(), AddExternalNodeActivity.class);
92
                                viewIntent.putExtra("weighted", false);
93
                                startActivityForResult(viewIntent, ADD_EXTERNAL_NODE_CODE);
94
                        }
95
                });
96
        }
97

    
98
        @Override
99
        public void onBackPressed(){
100
                setResult(RESULT_CANCELED);
101
                finish();
102
        }
103

    
104
        private void displayNoServersCell() {
105
                String a[] = new String[1];
106
                a[0] = "No Nodes";
107
                setListAdapter(new ArrayAdapter<String>(this, R.layout.noserverscell, R.id.no_servers_label, a));
108
                getListView().setTextFilterEnabled(true);
109
                getListView().setDividerHeight(0); // hide the dividers so it won't look like a list row
110
                getListView().setItemsCanFocus(false);
111
        }
112

    
113
        private void setServerList(ArrayList<Server> servers) {
114
                if (servers == null) {
115
                        servers = new ArrayList<Server>();
116
                }
117
                String[] serverNames = new String[servers.size()];
118
                this.servers = new ArrayList<Server>();
119

    
120
                if (servers != null) {
121
                        for (int i = 0; i < servers.size(); i++) {
122
                                Server server = servers.get(i);
123
                                this.servers.add(i, server);
124
                                serverNames[i] = server.getName();
125
                        }
126
                }
127

    
128
                if (serverNames.length == 0) {
129
                        displayNoServersCell();
130
                } else {
131
                        getListView().setDividerHeight(1); // restore divider lines 
132
                        setListAdapter(new ServerAdapter());
133
                }
134
        }
135

    
136
        private void loadServers() {
137
                new LoadServersTask().execute((Void[]) null);
138
        }
139

    
140
        private class LoadServersTask extends AsyncTask<Void, Void, ArrayList<Server>> {
141
                private CloudServersException exception;
142

    
143
                @Override
144
                protected void onPreExecute(){
145
                        showDialog();
146
                }
147

    
148
                @Override
149
                protected ArrayList<Server> doInBackground(Void... arg0) {
150
                        ArrayList<Server> servers = null;
151
                        try {
152
                                servers = (new ServerManager()).createList(true, getContext());
153
                        } catch (CloudServersException e) {
154
                                exception = e;                                
155
                        }
156
                        return servers;
157
                }
158

    
159
                @Override
160
                protected void onPostExecute(ArrayList<Server> result) {
161
                        hideDialog();
162
                        if (exception != null) {
163
                                showAlert("Error", exception.getMessage());
164
                        }
165

    
166
                        //Add the external nodes
167
                        for(int i = 0; i < nodes.size(); i++){
168
                                if(nodes.get(i).getName().equals("External Node")){
169
                                        Server server = new Server();
170
                                        server.setName("External Node");
171
                                        String[] ip = {nodes.get(i).getAddress()};
172
                                        server.setPrivateIpAddresses(ip);
173
                                        result.add(server);
174
                                }
175
                        }
176
                        setServerList(result);
177
                }
178
        }
179

    
180
        // * Adapter/
181
        class ServerAdapter extends ArrayAdapter<Server> {
182
                ServerAdapter() {
183
                        super(AddNodesActivity.this, R.layout.listservernodecell, servers);
184
                }
185

    
186
                public View getView(int position, View convertView, ViewGroup parent) {
187

    
188
                        final Server server = servers.get(position);
189
                        LayoutInflater inflater = getLayoutInflater();
190
                        View row = inflater.inflate(R.layout.listservernodecell, parent, false);
191

    
192
                        TextView label = (TextView) row.findViewById(R.id.label);
193
                        label.setText(server.getName());
194

    
195
                        TextView sublabel = (TextView) row.findViewById(R.id.sublabel);
196
                        if(server.getName().equals("External Node")){
197
                                sublabel.setText(server.getPrivateIpAddresses()[0]);
198
                        } else {
199
                                sublabel.setText(server.getFlavor().getName() + " - " + server.getImage().getName());
200
                        }
201

    
202
                        String[] publicIp = server.getPublicIpAddresses();
203
                        String[] privateIp = server.getPrivateIpAddresses();
204

    
205
                        if(publicIp == null){
206
                                publicIp = new String[0];
207
                        }
208

    
209
                        if(privateIp == null){
210
                                privateIp = new String[0];
211
                        }
212

    
213
                        final String[] ipAddresses = new String[privateIp.length + publicIp.length];
214
                        for(int i = 0; i < privateIp.length; i++){
215
                                ipAddresses[i] = privateIp[i];
216
                        }
217
                        for(int i = 0; i < publicIp.length; i++){
218
                                ipAddresses[i+privateIp.length] = publicIp[i];
219
                        }
220

    
221
                        final int pos = position;
222
                        CheckBox add = (CheckBox) row.findViewById(R.id.add_node_checkbox);
223

    
224
                        if(inNodeList(server)){
225
                                add.setChecked(true);
226
                        }
227

    
228
                        add.setOnCheckedChangeListener(new OnCheckedChangeListener() {
229

    
230
                                @Override
231
                                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
232
                                        if(isChecked){
233
                                                lastCheckedPos = pos;
234
                                                Intent viewIntent = new Intent(getContext(), AddNodeActivity.class);
235
                                                viewIntent.putExtra("ipAddresses", ipAddresses);
236
                                                viewIntent.putExtra("name", server.getName());
237
                                                //weighted is false, because on initial node add
238
                                                //weight is not option
239
                                                viewIntent.putExtra("weighted", false);
240
                                                startActivityForResult(viewIntent, ADD_NODE_CODE);
241
                                        }
242
                                        else{
243
                                                removeNodeFromList(server);
244
                                                if(server.getName().equals("External Node")){
245
                                                        servers.remove(server);
246
                                                        setServerList(servers);
247
                                                }
248
                                        }
249
                                }
250
                        });
251

    
252
                        return(row);
253
                }
254

    
255
                private boolean inNodeList(Server server){
256
                        for(Node node : nodes){
257
                                String nodeIp = node.getAddress();
258
                                if(serverHasIp(server, nodeIp)){
259
                                        return true;
260
                                }
261
                        }
262
                        return false;
263
                }
264

    
265
                /*
266
                 *  need to remove by id because that is 
267
                 *  what is unique
268
                 */
269
                private void removeNodeFromList(Server server){
270
                        for(int i = 0; i < nodes.size(); i++){
271
                                Node node = nodes.get(i);
272
                                if(serverHasIp(server, node.getAddress())){
273
                                        nodes.remove(i);
274
                                        break;
275
                                }
276
                        }
277
                }
278
        }
279

    
280
        private String getNameFromIp(String address){
281
                for(Server s: servers){
282
                        if(serverHasIp(s, address)){
283
                                return s.getName();
284
                        }
285
                }
286
                return "";
287
        }
288

    
289
        private boolean isCloudServerIp(String address){
290
                for(Server s : servers){
291
                        if(serverHasIp(s, address)){
292
                                return true;
293
                        }
294
                }
295
                return false;
296
        }
297

    
298
        private boolean serverHasIp(Server server, String address){
299
                String[] addresses = server.getPrivateIpAddresses();
300
                if(addresses != null){
301
                        for(int i = 0; i < addresses.length; i++){
302
                                if(addresses[i].equals(address)){
303
                                        return true;
304
                                }
305
                        }
306
                }
307
                addresses = server.getPublicIpAddresses();
308
                if(addresses != null){
309
                        for(int i = 0; i < addresses.length; i++){
310
                                if(addresses[i].equals(address)){
311
                                        return true;
312
                                }
313
                        }
314
                }
315
                return false;
316
        }
317

    
318
        protected void onActivityResult(int requestCode, int resultCode, Intent data){
319
                int pos = lastCheckedPos;
320
                if(requestCode == ADD_NODE_CODE && resultCode == RESULT_OK){
321
                        Node node = new Node();
322
                        node.setAddress(data.getStringExtra("nodeIp"));
323
                        node.setCondition(data.getStringExtra("nodeCondition"));
324
                        node.setName(servers.get(pos).getName());
325
                        node.setPort(data.getStringExtra("nodePort"));
326
                        node.setWeight(data.getStringExtra("nodeWeight"));
327
                        nodes.add(node);
328
                }
329
                else if(requestCode == ADD_NODE_CODE && resultCode == RESULT_CANCELED){
330
                        //uncheck the node at lastCheckedPos
331
                        LinearLayout linear = (LinearLayout) findViewById(R.id.nodes_linear_layout); 
332
                        ListView serversList = (ListView) linear.findViewById(android.R.id.list);
333
                        View row = serversList.getChildAt(pos);
334
                        CheckBox checkBox = (CheckBox)row.findViewById(R.id.add_node_checkbox);
335
                        checkBox.setChecked(false);
336
                }
337

    
338
                else if(requestCode == ADD_EXTERNAL_NODE_CODE && resultCode == RESULT_OK){
339
                        Node node = new Node();
340
                        node.setAddress(data.getStringExtra("nodeIp"));
341
                        node.setCondition(data.getStringExtra("nodeCondition"));
342
                        node.setName("External Node");
343
                        node.setPort(data.getStringExtra("nodePort"));
344
                        node.setWeight(data.getStringExtra("nodeWeight"));
345

    
346
                        /*
347
                         * If the ip is from a cloud server, alert to user
348
                         * so they can select it from there
349
                         */        
350
                        if(!isCloudServerIp(node.getAddress())){
351
                                nodes.add(node);
352
                                //Add it to server list so it display in the listview
353
                                Server server = new Server();
354
                                server.setName("External Node");
355
                                String[] ip = {data.getStringExtra("nodeIp")};
356
                                server.setPrivateIpAddresses(ip);
357
                                servers.add(server);
358
                        } else {
359
                                showAlert("Error", "This IP belongs to a cloud server: \"" + getNameFromIp(node.getAddress()) 
360
                                                + "\", please select it from the list.");
361
                        }
362
                }
363
        }
364

    
365

    
366
}