blob: 0e0b4e6bcd4c4271946dda74b9bb473eebf9ae08 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 Soyatec (http://www.soyatec.com) and others.
* 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:
* Soyatec - initial API and implementation
*******************************************************************************/
package org.eclipse.xwt.core;
import java.math.BigDecimal;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.xwt.XWTException;
import org.eclipse.xwt.utils.OperatorExceptionMessage;
public enum Operator {
EQ, NE, GT, LT, GE, LE, LIKE, IS_A, IS_KIND_OF;
/**
* The utility helper method, to implement the compare between two objects
*
* @param operant1
* @param operator
* @param operant2
* @return
* @throws XWTException
*/
public static boolean compare(Object operant1, Operator operator,
Object operant2) throws XWTException {
boolean result = false;
switch (operator) {
case EQ:
result = objectCompare(operant1, operant2);
break;
case NE:
if (!objectCompare(operant1, operant2))
result = true;
break;
case GT:
if (numberCompare(operant1, operant2) == 1)
return true;
break;
case LT:
if (numberCompare(operant1, operant2) == -1) {
result = true;
}
break;
case GE:
if (numberCompare(operant1, operant2) == 1
|| numberCompare(operant1, operant2) == 0) {
result = true;
}
break;
case LE:
if (numberCompare(operant1, operant2) == -1
|| numberCompare(operant1, operant2) == 0) {
result = true;
}
break;
case LIKE:
return LikeCompare(operant1, operant2);
case IS_A:
if(operant2 instanceof Class<?>){
return ISACompare(operant1,(Class<?>) operant2);
}else{
throw new XWTException(OperatorExceptionMessage.TYPE_WRONG);
}
case IS_KIND_OF:
return isKindOfCompare(operant1, operant2);
}
return result;
}
private static boolean isKindOfCompare(Object operant1, Object operant2) {
return operant2.getClass().isInstance(operant1);
}
/**
* @param operant1
* @param operant2
* @return
* @throws XWTException
*/
private static int numberCompare(Object operant1, Object operant2)
throws XWTException {
if (operant1 == null || operant2 == null) {
throw new XWTException(OperatorExceptionMessage.OPRERANR_NULL);
}
Double longoperant1 = convertToDouble(operant1);
Double longoperant2 = convertToDouble(operant2);
return DoubleCompare(longoperant1, longoperant2);
}
/**
* convert the type of operant to the Double
*
* @param operant
* @return
* @throws XWTException
*/
private static Double convertToDouble(Object operant) throws XWTException {
if (operant instanceof Double) {
return (Double) operant;
}
if(operant instanceof Float){
Float floatvalue = (Float) operant;
return Double.parseDouble(String.valueOf(floatvalue));
}
if (operant instanceof Integer) {
Integer integer = (Integer) operant;
return Double.parseDouble(String.valueOf(integer));
}
if (operant instanceof Character) {
Character character = (Character) operant;
if (Character.isDigit(character)) {
int numericValue = Character.getNumericValue(character);
return Double.parseDouble(String.valueOf(numericValue));
}
}
if (operant instanceof Short) {
Short shortvalue = (Short) operant;
return Double.parseDouble(String.valueOf(shortvalue));
}
if (operant instanceof Byte) {
Byte bytevalue = (Byte) operant;
return Double.parseDouble(String.valueOf(bytevalue));
}
if (operant instanceof Long) {
Long floatvalue = (Long) operant;
return Double.parseDouble(String.valueOf(floatvalue));
}
if (operant instanceof BigDecimal) {
BigDecimal bigdecimalvalue = (BigDecimal) operant;
return Double.parseDouble(String.valueOf(bigdecimalvalue));
} else
throw new XWTException(OperatorExceptionMessage.TYPE_WRONG);
}
/**
* the compare of two object for NE,EQ
*
* @param operant1
* @param operant2
* @return
*/
private static boolean objectCompare(Object operant1, Object operant2) {
if (operant1 == operant2) {
return true;
}
if (operant1 != null) {
return operant1.equals(operant2);
}
else if (operant1 != null) {
return operant2.equals(operant1);
}
return false;
}
/**
* the compare of two object for ISA
*
* @param operant1
* @param operant2
* @return
* @throws XWTException
*/
private static boolean ISACompare(Object operant1, Class<?> clazz) {
return clazz.isInstance(operant1);
}
/**
* the compare of two Double
*
* @param operant1
* @param operant2
* @return
*/
private static int DoubleCompare(Double operant1, Double operant2) {
return (operant1.compareTo(operant2) < 0 ? -1 : (operant1
.compareTo(operant2) == 0 ? 0 : 1));
}
/**
* the compare of two String for Like
*
* @param operant1
* @param operant2
* @return
* @throws XWTException
*/
private static boolean LikeCompare(Object operant1, Object operant2)
throws XWTException {
if (operant1 == null || operant2 == null) {
throw new XWTException(OperatorExceptionMessage.OPRERANR_NULL);
}
if (operant1 instanceof String && operant2 instanceof String) {
String operant1String = (String) operant1;
String operant2String = (String) operant2;
String queryString = parseRegularExpressionString(operant1String);
Pattern pattern = Pattern.compile(queryString);
Matcher matcher = pattern.matcher(operant2String);
return matcher.find();
}
throw new XWTException(OperatorExceptionMessage.TYPE_WRONG);
}
/**
* build the regular expressions
*
* @param queryString
* @return
*/
public static String parseRegularExpressionString(String queryString) {
String result = queryString;
result = result.replace("?", ".");
result = result.replace("*", ".*");
return result;
}
}