package sushi.application.pages.correlation;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.ajax.markup.html.form.AjaxCheckBox;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.RadioChoice;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.resource.PackageResourceReference;
import org.apache.wicket.request.resource.ResourceReference;
import sushi.application.components.form.ConditionInputPanel;
import sushi.application.components.form.WarnOnExitForm;
import sushi.correlation.TimeCondition;
import sushi.event.SushiEventType;
/**
* Panel representing the content panel for the first tab.
*/
public class AdvancedCorrelationPanel extends Panel {
private static final long serialVersionUID = 1L;
private List<String> timeCorrelationRadioValues = new ArrayList<String>(Arrays.asList("after","before"));
private String selectedTimeRadioOption = timeCorrelationRadioValues.get(0);
private final AjaxCheckBox timeCorrelationCheckBox;
private boolean timeCorrelationSelected = false;
private String timeCorrelationMinutes = new String();
private SushiEventType selectedEventType;
private final TextField<String> timeCorrelationMinutesInput;
private final DropDownChoice<SushiEventType> timeCorrelationEventTypeSelect;
private final RadioChoice<String> timeCorrelationAfterOrBeforeType;
private ConditionInputPanel conditionPanel;
private TextField<String> multipleConditionsTextField;
private static final ResourceReference Label_CSS = new PackageResourceReference(AdvancedCorrelationPanel.class, "label.css");
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.render(CssHeaderItem.forReference(Label_CSS));
}
public AdvancedCorrelationPanel(String id) {
super(id);
Form<Void> advancedCorrelationForm = new WarnOnExitForm("advancedCorrelationForm");
add(advancedCorrelationForm);
timeCorrelationCheckBox = new AjaxCheckBox("timeCheckBox", Model.of(Boolean.FALSE)) {
@Override
protected void onUpdate(AjaxRequestTarget target) {
timeCorrelationSelected = timeCorrelationSelected ? false : true;
}
};
timeCorrelationCheckBox.setOutputMarkupId(true);
advancedCorrelationForm.add(timeCorrelationCheckBox);
timeCorrelationEventTypeSelect = new DropDownChoice<SushiEventType>("timeEventTypeSelect", new PropertyModel<SushiEventType>(this, "selectedEventType"), new ArrayList<SushiEventType>());
timeCorrelationEventTypeSelect.setOutputMarkupId(true);
timeCorrelationEventTypeSelect.add(new AjaxFormComponentUpdatingBehavior("onChange"){
@Override
protected void onUpdate(AjaxRequestTarget target) {
if (selectedEventType != null) {
conditionPanel.setSelectedEventTypes(Arrays.asList((selectedEventType)));
conditionPanel.updateAttributesValues();
} else {
conditionPanel.getConditionAttributeSelect().setChoices(new ArrayList<String>());
conditionPanel.getConditionValueSelect().setChoices(new ArrayList<Serializable>());
}
target.add(conditionPanel.getConditionAttributeSelect());
target.add(conditionPanel.getConditionValueSelect());
}
});
advancedCorrelationForm.add(timeCorrelationEventTypeSelect);
timeCorrelationMinutesInput = new TextField<String>("timeMinutesInput", Model.of(""));
timeCorrelationMinutesInput.setOutputMarkupId(true);
timeCorrelationMinutesInput.add(new AjaxFormComponentUpdatingBehavior("onChange"){
@Override
protected void onUpdate(AjaxRequestTarget target) {
timeCorrelationMinutes = timeCorrelationMinutesInput.getValue();
}
});
advancedCorrelationForm.add(timeCorrelationMinutesInput);
timeCorrelationAfterOrBeforeType = new RadioChoice<String>("afterOrBeforeRadioGroup", new PropertyModel<String>(this, "selectedTimeRadioOption"), timeCorrelationRadioValues) {
public String getSuffix() {
return " ";
}
};
advancedCorrelationForm.add(timeCorrelationAfterOrBeforeType);
conditionPanel = new ConditionInputPanel("conditionInput", true);
advancedCorrelationForm.add(conditionPanel);
multipleConditionsTextField = new TextField<String>("multipleConditionsTextField", new Model<String>());
multipleConditionsTextField.setOutputMarkupId(true);
OnChangeAjaxBehavior onChangeAjaxBehavior = new OnChangeAjaxBehavior() {
private static final long serialVersionUID = -5737941362786901904L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
if (isMultipleConditionsTextFieldFilled()) {
conditionPanel.disableAllComponents(target);
} else {
conditionPanel.enableAllComponents(target);
}
}
};
multipleConditionsTextField.add(onChangeAjaxBehavior);
advancedCorrelationForm.add(multipleConditionsTextField);
}
private boolean isMultipleConditionsTextFieldFilled() {
return multipleConditionsTextField.getModelObject() != null && !multipleConditionsTextField.getModelObject().isEmpty();
}
public String getSelectedTimeRadioOption() {
return selectedTimeRadioOption;
}
public void setSelectedTimeRadioOption(String selectedTimeRadioOption) {
this.selectedTimeRadioOption = selectedTimeRadioOption;
}
public TextField<String> getMultipleConditionsTextField() {
return multipleConditionsTextField;
}
public void setMultipleConditionsTextField(
TextField<String> multipleConditionsTextField) {
this.multipleConditionsTextField = multipleConditionsTextField;
}
public CheckBox getTimeCorrelationCheckBox() {
return timeCorrelationCheckBox;
}
public TextField<String> getTimeCorrelationMinutesInput() {
return timeCorrelationMinutesInput;
}
public DropDownChoice<SushiEventType> getTimeCorrelationEventTypeSelect() {
return timeCorrelationEventTypeSelect;
}
public RadioChoice<String> getTimeCorrelationAfterOrBeforeType() {
return timeCorrelationAfterOrBeforeType;
}
public TimeCondition getTimeCondition() {
int minutes;
String conditionString;
if(!timeCorrelationMinutes.isEmpty()){
minutes = Integer.valueOf(timeCorrelationMinutes);
} else {
minutes = 0;
}
boolean isAfter = selectedTimeRadioOption.equals("after") ? true : false;
if (isMultipleConditionsTextFieldFilled()) {
conditionString = multipleConditionsTextField.getModelObject();
} else {
conditionString = conditionPanel.getCondition().getConditionString();
}
// System.out.println(conditionString);
TimeCondition timeCondition = new TimeCondition(selectedEventType, minutes, isAfter, conditionString);
return timeCondition;
}
public boolean isTimeCorrelationSelected() {
return timeCorrelationSelected;
}
public DropDownChoice<String> getTimeCorrelationConditionAttributeSelect() {
return conditionPanel.getConditionAttributeSelect();
}
public DropDownChoice<Serializable> getTimeCorrelationConditionValueSelect() {
return conditionPanel.getConditionValueSelect();
}
};