/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.query.ui.builder.model;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.core.designer.util.I18nUtil;
import org.teiid.designer.query.sql.lang.ICriteria;
import org.teiid.designer.query.sql.lang.IExpression;
/**
* CriteriaEditorModel
*
* @since 8.0
*/
public class CriteriaEditorModel extends CompositeLanguageObjectEditorModel {
// /////////////////////////////////////////////////////////////////////////////////////////////
// CONSTANTS
// /////////////////////////////////////////////////////////////////////////////////////////////
/** Properties key prefix. */
private static final String PREFIX = I18nUtil.getPropertyPrefix(CriteriaEditorModel.class);
// event types
public static final String OPERATOR = "OPERATOR"; //$NON-NLS-1$
// /////////////////////////////////////////////////////////////////////////////////////////////
// FIELDS
// /////////////////////////////////////////////////////////////////////////////////////////////
private CompareCriteriaEditorModel compareModel;
private IsNullCriteriaEditorModel isNullModel;
private MatchCriteriaEditorModel matchModel;
private SetCriteriaEditorModel setModel;
private Class criteriaType;
private Map typeModelMap;
private Map typeOperatorMap;
/** The default operator. Not set until a model is added. */
private String defaultOperator;
/** The current operator. */
private String operator;
/** The collection of all valid operators. */
private String[] operators;
// /////////////////////////////////////////////////////////////////////////////////////////////
// CONSTRUCTORS
// /////////////////////////////////////////////////////////////////////////////////////////////
public CriteriaEditorModel() {
this(new CompareCriteriaEditorModel(), new IsNullCriteriaEditorModel(), new MatchCriteriaEditorModel(),
new SetCriteriaEditorModel());
}
public CriteriaEditorModel( CompareCriteriaEditorModel theCompareCriteriaModel,
IsNullCriteriaEditorModel theIsNullCriteriaModel,
MatchCriteriaEditorModel theMatchCriteriaModel,
SetCriteriaEditorModel theSetCriteriaModel ) {
super(ICriteria.class);
typeModelMap = new HashMap();
typeOperatorMap = new HashMap();
compareModel = theCompareCriteriaModel;
addModel(compareModel);
isNullModel = theIsNullCriteriaModel;
addModel(isNullModel);
matchModel = theMatchCriteriaModel;
addModel(matchModel);
setModel = theSetCriteriaModel;
addModel(setModel);
}
// /////////////////////////////////////////////////////////////////////////////////////////////
// METHODS
// /////////////////////////////////////////////////////////////////////////////////////////////
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.model.CompositeLanguageObjectEditorModel#addModel(org.teiid.query.ui.builder.model.ILanguageObjectEditorModel)
*/
@Override
public void addModel( ILanguageObjectEditorModel theModel ) {
super.addModel(theModel);
// cache operators and type for each model
AbstractPredicateCriteriaTypeEditorModel model = (AbstractPredicateCriteriaTypeEditorModel)theModel;
typeModelMap.put(model.getModelType(), model);
addOperators(model);
}
private void addOperators( AbstractPredicateCriteriaTypeEditorModel theModel ) {
String[] modelOperators = theModel.getOperators();
typeOperatorMap.put(theModel.getModelType(), modelOperators);
if (operators == null) {
operators = new String[0];
}
String[] temp = new String[operators.length + modelOperators.length];
// modify array to include new operators
System.arraycopy(operators, 0, temp, 0, operators.length);
System.arraycopy(modelOperators, 0, temp, operators.length, modelOperators.length);
operators = temp;
// if default operator and/or operator not set set them
if (defaultOperator == null) {
defaultOperator = modelOperators[0];
setOperator(defaultOperator);
}
}
public CompareCriteriaEditorModel getCompareCriteriaEditorModel() {
return compareModel;
}
public ICriteria getCriteria() {
return (ICriteria)getLanguageObject();
}
public Class getCriteriaType() {
return criteriaType;
}
private Class getCriteriaType( String theOperator ) {
Class result = null;
Iterator itr = typeOperatorMap.entrySet().iterator();
while (itr.hasNext()) {
Map.Entry entry = (Map.Entry)itr.next();
String[] operators = (String[])entry.getValue();
if (Arrays.asList(operators).contains(theOperator)) {
result = (Class)entry.getKey();
break;
}
}
return result;
}
private AbstractPredicateCriteriaTypeEditorModel getModel( String theOperator ) {
Class type = getCriteriaType(theOperator);
return (AbstractPredicateCriteriaTypeEditorModel)typeModelMap.get(type);
}
public IsNullCriteriaEditorModel getIsNullCriteriaEditorModel() {
return isNullModel;
}
public MatchCriteriaEditorModel getMatchCriteriaEditorModel() {
return matchModel;
}
public String getOperator() {
AbstractPredicateCriteriaTypeEditorModel model = (AbstractPredicateCriteriaTypeEditorModel)getCurrentModel();
operator = model.getCurrentOperator();
return operator;
}
public String[] getOperators() {
return operators;
}
public SetCriteriaEditorModel getSetCriteriaEditorModel() {
return setModel;
}
private boolean isValidOperator( String theOperator ) {
CoreArgCheck.isNotNull(theOperator); // should never fail
CoreArgCheck.isNotEqual(0, theOperator.length()); // should never fail
boolean result = false;
Iterator itr = typeOperatorMap.entrySet().iterator();
while (itr.hasNext()) {
Map.Entry entry = (Map.Entry)itr.next();
String[] operators = (String[])entry.getValue();
if (Arrays.asList(operators).contains(theOperator)) {
result = true;
break;
}
}
return result;
}
/* (non-Javadoc)
* @see org.teiid.query.ui.builder.model.CompositeLanguageObjectEditorModel#setCurrentModel(org.teiid.query.ui.builder.model.ILanguageObjectEditorModel)
*/
@Override
public void setCurrentModel( ILanguageObjectEditorModel theModel ) {
// AbstractPredicateCriteriaTypeEditorModel currentModel = (AbstractPredicateCriteriaTypeEditorModel)getCurrentModel();
// Expression leftExpression = currentModel.getLeftExpression();
// Expression rightExpression = currentModel.getRightExpression();
super.setCurrentModel(theModel);
// if (currentModel != theModel) {
// theModel.setLeftExpression(leftExpression);
// theModel.setRightExpression(rightExpression);
// }
}
public void setOperator( String theOperator ) {
if (isValidOperator(theOperator)) {
if ((getOperator() == null) || !operator.equals(theOperator)) {
operator = theOperator;
// need to set current model type if necessary
AbstractPredicateCriteriaTypeEditorModel newModel = getModel(theOperator);
AbstractPredicateCriteriaTypeEditorModel currentModel = (AbstractPredicateCriteriaTypeEditorModel)getCurrentModel();
if (currentModel != newModel) {
// save expressions from model being swapped out
IExpression leftExpression = currentModel.getLeftExpression();
IExpression rightExpression = currentModel.getRightExpression();
setCurrentModel(newModel); // newModel is now the current model
// copy old models expressions
newModel.setLeftExpression(leftExpression);
newModel.setRightExpression(rightExpression);
}
newModel.setCurrentOperator(theOperator);
}
} else {
CoreArgCheck.isTrue(false, Util.getString(PREFIX + "invalidOperator", //$NON-NLS-1$
new Object[] {theOperator}));
}
}
}