package com.rackspacecloud.android;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.http.HttpResponse;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import com.rackspace.cloud.android.R;
import com.rackspace.cloud.loadbalancer.api.client.LoadBalancer;
import com.rackspace.cloud.loadbalancer.api.client.NetworkItem;
import com.rackspace.cloud.loadbalancer.api.client.NetworkItemManager;
import com.rackspace.cloud.servers.api.client.CloudServersException;
import com.rackspace.cloud.servers.api.client.http.HttpBundle;
public class AddAccessRuleActivity extends CloudActivity{
private final String[] ACTIONS = {"Deny", "Allow"};
private LoadBalancer loadBalancer;
private String selectedAction;
private String selectedAddresses;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
loadBalancer = (LoadBalancer) this.getIntent().getExtras().get("loadBalancer");
setContentView(R.layout.addaccessrule);
restoreState(savedInstanceState);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
protected void restoreState(Bundle state) {
super.restoreState(state);
setupInputs();
}
private void setupInputs(){
Spinner actionSpinner = (Spinner)findViewById(R.id.rule_action_spinner);
ArrayAdapter<String> actionAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, ACTIONS);
actionAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
actionSpinner.setAdapter(actionAdapter);
actionSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
selectedAction = ACTIONS[pos];
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
EditText address = (EditText)findViewById(R.id.rule_address);
address.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
selectedAddresses = s.toString();
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
//do nothing
}
@Override
public void afterTextChanged(Editable s) {
//do nothing
}
});
Button addRule = (Button)findViewById(R.id.add_rule_button);
addRule.setOnClickListener(new OnClickListener() {
@SuppressWarnings("unchecked")
@Override
public void onClick(View v) {
if(!validAddress(selectedAddresses)){
showAlert("Error", "Please enter a valid IP address.");
} else if(!validAction(selectedAction)) {
showAlert("Error", "Please select an action type.");
} else{
ArrayList<NetworkItem> networkItems = new ArrayList<NetworkItem>();
String[] networkAddresses = selectedAddresses.split(",");
for(int i = 0; i < networkAddresses.length; i++){
NetworkItem networkItem = new NetworkItem();
networkItem.setAddress(networkAddresses[i].trim());
networkItem.setType(selectedAction);
networkItems.add(networkItem);
}
new AddNetworkItemTask().execute(networkItems);
}
}
});
}
//basic ip validation just checks that the string
//is only composed of letters, numbers, ., : and ,
private static boolean validAddress(String address){
//if just white space return false;
//check regex
if(address != null && !address.trim().equals("")){
Pattern pattern = Pattern.compile("[a-zA-Z0-9.:/, ]+");
Matcher match = pattern.matcher(address);
return match.matches();
} else {
return false;
}
}
private Boolean validAction(String action){
return action != null && Arrays.asList(ACTIONS).contains(action);
}
private class AddNetworkItemTask extends AsyncTask<ArrayList<NetworkItem>, Void, HttpBundle> {
private CloudServersException exception;
@Override
protected void onPreExecute(){
showDialog();
}
@Override
protected HttpBundle doInBackground(ArrayList<NetworkItem>... networkItems) {
HttpBundle bundle = null;
try {
bundle = new NetworkItemManager(getContext()).create(loadBalancer, networkItems[0]);
} catch (CloudServersException e) {
exception = e;
}
return bundle;
}
@Override
protected void onPostExecute(HttpBundle bundle) {
hideDialog();
HttpResponse response = bundle.getResponse();
if (response != null) {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 202 || statusCode == 200) {
setResult(Activity.RESULT_OK);
finish();
} else {
CloudServersException cse = parseCloudServersException(response);
if ("".equals(cse.getMessage())) {
showError("There was a problem creating your rule.", bundle);
} else {
showError("There was a problem creating your rule: " + cse.getMessage(), bundle);
}
}
} else if (exception != null) {
showError("There was a problem creating your rule: " + exception.getMessage(), bundle);
}
}
}
}