blob: d3d2403ae3494ddcf7ed14b196ead322f8362468 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2010 Jesper Steen Moller, 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:
* Jesper Steen Moller - initial API and implementation
* Jesper Steen Moller - bug 281028 - avg/min/max/sum work
* Mukul Gandhi - bug 280798 - PsychoPath support for JDK 1.4
*******************************************************************************/
package org.eclipse.wst.xml.xpath2.processor.internal.utils;
import org.eclipse.wst.xml.xpath2.processor.DynamicError;
import org.eclipse.wst.xml.xpath2.processor.internal.types.AnyAtomicType;
import org.eclipse.wst.xml.xpath2.processor.internal.types.XSDecimal;
import org.eclipse.wst.xml.xpath2.processor.internal.types.XSDouble;
import org.eclipse.wst.xml.xpath2.processor.internal.types.XSFloat;
import org.eclipse.wst.xml.xpath2.processor.internal.types.XSInteger;
import org.eclipse.wst.xml.xpath2.processor.internal.types.XSUntypedAtomic;
public class NumericTypePromoter extends TypePromoter {
protected boolean checkCombination(Class newType) {
// Note: Double or float will override everything
if (newType == XSDouble.class || getTargetType() == XSDouble.class) {
setTargetType(XSDouble.class);
} else if (newType == XSFloat.class || getTargetType() == XSFloat.class) {
setTargetType(XSFloat.class);
// If we're still with integers, stick with it
} else if (newType == XSInteger.class && getTargetType() == XSInteger.class) {
setTargetType(XSInteger.class);
} else {
// Otherwise, switch to decimals
setTargetType(XSDecimal.class);
}
return true;
}
public AnyAtomicType doPromote(AnyAtomicType value) throws DynamicError {
if (getTargetType() == XSFloat.class) {
return new XSFloat(value.getStringValue());
} else if (getTargetType() == XSDouble.class) {
return new XSDouble(value.getStringValue());
} else if (getTargetType() == XSInteger.class) {
return new XSInteger(value.getStringValue());
} else if (getTargetType() == XSDecimal.class) {
return new XSDecimal(value.getStringValue());
}
return null;
}
protected Class substitute(Class typeToConsider) {
if (typeToConsider == XSUntypedAtomic.class) return XSDouble.class;
if (isDerivedFrom(typeToConsider, XSFloat.class)) return XSFloat.class;
if (isDerivedFrom(typeToConsider, XSDouble.class)) return XSDouble.class;
if (isDerivedFrom(typeToConsider, XSInteger.class)) return XSInteger.class;
if (isDerivedFrom(typeToConsider, XSDecimal.class)) return XSDecimal.class;
return null;
}
private boolean isDerivedFrom(Class typeToConsider, Class superType) {
return superType.isAssignableFrom(typeToConsider);
}
}