/*******************************************************************************
* Copyright (c) 2011 Subgraph.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Subgraph - initial API and implementation
******************************************************************************/
package com.subgraph.vega.ui.http.conditions;
import java.util.Collections;
import java.util.List;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.swt.widgets.Composite;
import com.subgraph.vega.api.model.conditions.IHttpCondition;
import com.subgraph.vega.api.model.conditions.IHttpConditionManager;
import com.subgraph.vega.api.model.conditions.IHttpConditionType;
import com.subgraph.vega.api.model.conditions.match.IHttpConditionIntegerMatchAction;
import com.subgraph.vega.api.model.conditions.match.IHttpConditionMatchAction;
import com.subgraph.vega.api.model.conditions.match.IHttpConditionRangeMatchAction;
import com.subgraph.vega.api.model.conditions.match.IHttpConditionStringMatchAction;
public class ConditionInput {
private final IHttpConditionManager conditionManager;
private ConditionTypeComboViewer conditionTypeViewer;
private MatchActionComboViewer matchActionViewer;
private MatchActionArgumentPanel matchActionArguments;
public ConditionInput(IHttpConditionManager conditionManager) {
this.conditionManager = conditionManager;
}
public ComboViewer createConditionTypeCombo(Composite parent) {
conditionTypeViewer = new ConditionTypeComboViewer(parent, getConditionTypes(conditionManager));
if(matchActionViewer != null)
conditionTypeViewer.setMatchTypeViewer(matchActionViewer);
return conditionTypeViewer;
}
private List<IHttpConditionType> getConditionTypes(IHttpConditionManager manager) {
if(manager == null)
return Collections.emptyList();
else
return manager.getConditionTypes();
}
public ComboViewer createConditionMatchCombo(Composite parent) {
matchActionViewer = new MatchActionComboViewer(parent);
if(conditionTypeViewer != null)
conditionTypeViewer.setMatchTypeViewer(matchActionViewer);
if(matchActionArguments != null)
matchActionViewer.setMatchActionArgumentPanel(matchActionArguments);
return matchActionViewer;
}
public Composite createInputPanel(Composite parent) {
matchActionArguments = new MatchActionArgumentPanel(parent);
if(matchActionViewer != null)
matchActionViewer.setMatchActionArgumentPanel(matchActionArguments);
return matchActionArguments;
}
public void reset() {
conditionTypeViewer.reset();
matchActionViewer.reset();
}
public IHttpCondition createConditionFromData() {
final IHttpConditionMatchAction matchAction = matchActionViewer.getSelectedMatchAction();
final IHttpConditionType conditionType = conditionTypeViewer.getSelectedConditionType();
if(matchAction == null || conditionType == null)
return null;
switch(matchAction.getArgumentType()) {
case ARGUMENT_STRING:
return createStringCondition(conditionType, matchAction, matchActionArguments.getStringText());
case ARGUMENT_REGEX:
return createStringCondition(conditionType, matchAction, matchActionArguments.getRegexText());
case ARGUMENT_INTEGER:
return createIntegerCondition(conditionType, matchAction, matchActionArguments.getIntegerText());
case ARGUMENT_RANGE:
return createRangeCondition(conditionType, matchAction, matchActionArguments.getRangeLowText(), matchActionArguments.getRangeHighText());
}
return null;
}
private IHttpCondition createStringCondition(IHttpConditionType type, IHttpConditionMatchAction matchAction, String value) {
if(!value.isEmpty() && (matchAction instanceof IHttpConditionStringMatchAction)) {
((IHttpConditionStringMatchAction) matchAction).setString(value);
return type.createConditionInstance(matchAction);
}
return null;
}
private IHttpCondition createIntegerCondition(IHttpConditionType type, IHttpConditionMatchAction matchAction, String integerString) {
if(integerString.isEmpty() || !(matchAction instanceof IHttpConditionIntegerMatchAction))
return null;
try {
final int value = Integer.parseInt(integerString);
((IHttpConditionIntegerMatchAction) matchAction).setInteger(value);
return type.createConditionInstance(matchAction);
} catch (NumberFormatException e) {
return null;
}
}
private IHttpCondition createRangeCondition(IHttpConditionType type, IHttpConditionMatchAction matchAction, String rangeLowText, String rangeHighText) {
if(rangeLowText.isEmpty() || rangeHighText.isEmpty() || !(matchAction instanceof IHttpConditionRangeMatchAction))
return null;
try {
final int low = Integer.parseInt(rangeLowText);
final int high = Integer.parseInt(rangeHighText);
if(low < 0 || high < 0 || low > high)
return null;
((IHttpConditionRangeMatchAction) matchAction).setRange(low, high);
return type.createConditionInstance(matchAction);
} catch (NumberFormatException e) {
return null;
}
}
}