package nl.amis.jsf.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.el.ValueExpression;
import javax.faces.application.Application;
import javax.faces.context.FacesContext;
import oracle.adf.view.rich.model.AttributeCriterion;
import oracle.adf.view.rich.model.AttributeDescriptor;
public class EntityCriterion extends AttributeCriterion {
private AttributeDescriptor.Operator operator;
private EntityAttributeDescriptor descriptor;
private Map<String, AttributeDescriptor.Operator> operators;
private List<Object> values;
public EntityCriterion() {
super();
}
public EntityCriterion(AttributeDescriptor descriptor) {
this.descriptor = (EntityAttributeDescriptor)descriptor;
}
public AttributeDescriptor getAttribute() {
return descriptor;
}
public AttributeDescriptor.Operator getOperator() {
if (null == operator) {
if (null != descriptor) {
operator = descriptor.getDefaultOperator();
}
}
return operator;
}
public void setOperator(AttributeDescriptor.Operator operator) {
this.operator = operator;
}
public void setOperator(EntityOperatorType type) {
this.operator = descriptor.getOperatorByType(type);
}
public Map<String, AttributeDescriptor.Operator> getOperators() {
if (null == operators) {
operators = new HashMap<String, AttributeDescriptor.Operator>();
Set<AttributeDescriptor.Operator> os = descriptor.getSupportedOperators();
for (AttributeDescriptor.Operator o : os) {
operators.put(o.getLabel(), o);
}
}
return operators;
}
public List<Object> getValues() {
if (null != descriptor.getValueExpression()) {
Object value = resolveExpression(descriptor.getValueExpression());
if (value instanceof List) {
values = (List)value;
} else {
values = new ArrayList<Object>();
values.add(value);
}
}
if (null == values) {
values = new ArrayList<Object>();
Object[] defaultValues = descriptor.getDefaultValues();
if (null != defaultValues && defaultValues.length > 0) {
values.addAll(Arrays.asList(descriptor.getDefaultValues()));
} else if (null != getOperator()) {
for (int i = 0; i < getOperator().getOperandCount(); i++) {
values.add(getOperator().getValue());
}
}
}
return values;
}
private static Object resolveExpression(String expression) {
FacesContext facesContext = FacesContext.getCurrentInstance();
Application app = facesContext.getApplication();
ExpressionFactory elFactory = app.getExpressionFactory();
ELContext elContext = facesContext.getELContext();
ValueExpression valueExp =elFactory.createValueExpression(elContext, expression, Object.class);
return valueExp.getValue(elContext);
}
public void setValue(Object value) {
this.values = new ArrayList<Object>();
this.values.add(value);
}
public boolean isRemovable() {
return descriptor.isRemovable();
}
public boolean isReadOnly() {
return descriptor.isReadOnly();
}
@Override
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (!(object instanceof EntityCriterion)) {
return false;
}
final EntityCriterion other = (EntityCriterion)object;
if (!(operator == null ? other.operator == null : operator.equals(other.operator))) {
return false;
}
if (!(descriptor == null ? other.descriptor == null : descriptor.equals(other.descriptor))) {
return false;
}
if (!(values == null ? other.values == null : values.equals(other.values))) {
return false;
}
return true;
}
@Override
public int hashCode() {
final int PRIME = 37;
int result = super.hashCode();
result = PRIME * result + ((operator == null) ? 0 : operator.hashCode());
result = PRIME * result + ((descriptor == null) ? 0 : descriptor.hashCode());
result = PRIME * result + ((values == null) ? 0 : values.hashCode());
return result;
}
}