Revision 01340459 src/com/rackspacecloud/android/AddNodesActivity.java

b/src/com/rackspacecloud/android/AddNodesActivity.java
10 10
import android.content.Intent;
11 11
import android.os.AsyncTask;
12 12
import android.os.Bundle;
13
import android.util.Log;
13 14
import android.view.LayoutInflater;
14 15
import android.view.View;
15 16
import android.view.View.OnClickListener;
......
28 29
	private static final int ADD_NODE_CODE = 178;
29 30
	private static final int ADD_EXTERNAL_NODE_CODE = 188;
30 31

  
32
	//servers are what are displayed in the ListView
31 33
	private ArrayList<Server> servers;
32
	private int lastCheckedPos;
34
	//nodes are the nodes the user has selected
33 35
	private ArrayList<Node> nodes;
36
	private int lastCheckedPos;
34 37

  
35 38
	@SuppressWarnings("unchecked")
36 39
	@Override
......
89 92
			@Override
90 93
			public void onClick(View v) {
91 94
				Intent viewIntent = new Intent(getContext(), AddExternalNodeActivity.class);
95
				//when first creating a load balancer
96
				//weighting nodes in not an option
92 97
				viewIntent.putExtra("weighted", false);
93 98
				startActivityForResult(viewIntent, ADD_EXTERNAL_NODE_CODE);
94 99
			}
......
101 106
		finish();
102 107
	}
103 108

  
109
	protected void onListItemClick(ListView l, View v, int position, long id) {
110
		if (servers != null && servers.size() > 0) {
111
			LinearLayout linear = (LinearLayout) findViewById(R.id.nodes_linear_layout); 
112
			ListView serversList = (ListView) linear.findViewById(android.R.id.list);
113
			View row = serversList.getChildAt(position);
114
			CheckBox checkBox = (CheckBox)row.findViewById(R.id.add_node_checkbox);
115
			if(!checkBox.isChecked()){
116
				//if the checkbox was not previously checked, treat the listItemClick
117
				//the same as checking the checkbox
118
				checkBox.setChecked(!checkBox.isChecked());
119
			} else {
120
				//if the checkbox was already checked when the listItemClick occurred,
121
				//then treat it like an edit
122

  
123
				Server server = servers.get(position);
124

  
125
				//Need to put all the ip's of the server into one
126
				//list so they can all be displayed in one spinner
127
				String[] ipAddresses = getAllIpsOfServer(server);
128

  
129
				Node node = getNodeFromServer(server);
130

  
131
				lastCheckedPos = position;
132
				Intent viewIntent = new Intent(getContext(), AddNodeActivity.class);
133
				viewIntent.putExtra("ipAddresses", ipAddresses);
134
				viewIntent.putExtra("name", server.getName());
135
				if(node != null){
136
					viewIntent.putExtra("node", node);
137
				}
138
				//weighted is false, because on initial node add
139
				//weight is not option
140
				viewIntent.putExtra("weighted", false);
141
				startActivityForResult(viewIntent, ADD_NODE_CODE);
142
			}
143

  
144
		}
145
	}
146

  
104 147
	private void displayNoServersCell() {
105 148
		String a[] = new String[1];
106 149
		a[0] = "No Nodes";
......
137 180
		new LoadServersTask().execute((Void[]) null);
138 181
	}
139 182

  
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 183
	// * Adapter/
181 184
	class ServerAdapter extends ArrayAdapter<Server> {
182 185
		ServerAdapter() {
......
199 202
				sublabel.setText(server.getFlavor().getName() + " - " + server.getImage().getName());
200 203
			}
201 204

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

  
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
			}
206
			//Need to put all the ip's of the server into one
207
			//list so they can all be displayed in one spinner
208
			final String[] ipAddresses = getAllIpsOfServer(server);
220 209

  
221 210
			final int pos = position;
222 211
			CheckBox add = (CheckBox) row.findViewById(R.id.add_node_checkbox);
......
252 241
			return(row);
253 242
		}
254 243

  
244
		//returns true if an ip from server
245
		//is the address of one of the nodes
255 246
		private boolean inNodeList(Server server){
256 247
			for(Node node : nodes){
257 248
				String nodeIp = node.getAddress();
......
286 277
		return "";
287 278
	}
288 279

  
280
	//returns true if address is an address of
281
	//one of the users cloud servers
289 282
	private boolean isCloudServerIp(String address){
290 283
		for(Server s : servers){
291 284
			if(serverHasIp(s, address)){
......
295 288
		return false;
296 289
	}
297 290

  
291
	//returns true if address is one of server's addresses
298 292
	private boolean serverHasIp(Server server, String address){
299 293
		String[] addresses = server.getPrivateIpAddresses();
300 294
		if(addresses != null){
......
315 309
		return false;
316 310
	}
317 311

  
312
	//returns the node that is using an ip from server
313
	private Node getNodeFromServer(Server server){
314
		for(Node node : nodes){
315
			if(serverHasIp(server, node.getAddress())){
316
				return node;
317
			}
318
		}
319
		return null;
320
	}
321

  
322
	//returns an array of all the ip's of server
323
	private String[] getAllIpsOfServer(Server server){
324
		String[] publicIp = server.getPublicIpAddresses();
325
		String[] privateIp = server.getPrivateIpAddresses();
326
		if(publicIp == null){
327
			publicIp = new String[0];
328
		}
329
		if(privateIp == null){
330
			privateIp = new String[0];
331
		}
332
		String[] ipAddresses = new String[privateIp.length + publicIp.length];
333
		for(int i = 0; i < privateIp.length; i++){
334
			ipAddresses[i] = privateIp[i];
335
		}
336
		for(int i = 0; i < publicIp.length; i++){
337
			ipAddresses[i+privateIp.length] = publicIp[i];
338
		}
339

  
340
		return ipAddresses;
341
	}
342

  
343
	private class LoadServersTask extends AsyncTask<Void, Void, ArrayList<Server>> {
344
		private CloudServersException exception;
345

  
346
		@Override
347
		protected void onPreExecute(){
348
			showDialog();
349
		}
350

  
351
		@Override
352
		protected ArrayList<Server> doInBackground(Void... arg0) {
353
			ArrayList<Server> servers = null;
354
			try {
355
				servers = (new ServerManager()).createList(true, getContext());
356
			} catch (CloudServersException e) {
357
				exception = e;				
358
			}
359
			return servers;
360
		}
361

  
362
		@Override
363
		protected void onPostExecute(ArrayList<Server> result) {
364
			hideDialog();
365
			if (exception != null) {
366
				showAlert("Error", exception.getMessage());
367
			}
368

  
369
			//Add the external nodes
370
			for(int i = 0; i < nodes.size(); i++){
371
				if(nodes.get(i).getName().equals("External Node")){
372
					Server server = new Server();
373
					server.setName("External Node");
374
					String[] ip = {nodes.get(i).getAddress()};
375
					server.setPrivateIpAddresses(ip);
376
					result.add(server);
377
				}
378
			}
379
			setServerList(result);
380
		}
381
	}
382

  
318 383
	protected void onActivityResult(int requestCode, int resultCode, Intent data){
319 384
		int pos = lastCheckedPos;
320 385
		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);
386
			//data will be null is user back out on edit
387
			//we dont need to do anything then
388
			//if new node added data won't be null
389
			//so create the new node and add it to the list
390
			if(data != null){
391
				Node node = new Node();
392
				node.setAddress(data.getStringExtra("nodeIp"));
393
				node.setCondition(data.getStringExtra("nodeCondition"));
394
				node.setName(servers.get(pos).getName());
395
				node.setPort(data.getStringExtra("nodePort"));
396
				node.setWeight(data.getStringExtra("nodeWeight"));
397
				nodes.add(node);
398
			}
328 399
		}
329 400
		else if(requestCode == ADD_NODE_CODE && resultCode == RESULT_CANCELED){
330 401
			//uncheck the node at lastCheckedPos
......
361 432
						+ "\", please select it from the list.");
362 433
			}
363 434
		}
435
		Log.d("info", "number of nodes is " + nodes.size());
364 436
	}
365 437

  
366 438

  

Also available in: Unified diff