/*******************************************************************************
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* 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
*******************************************************************************/
package gov.redhawk.sca.observables.strategy;
import gov.redhawk.model.sca.ScaSimpleProperty;
import gov.redhawk.sca.observables.SCAObservables;
import java.math.BigDecimal;
import java.math.BigInteger;
import mil.jpeojtrs.sca.prf.PropertyValueType;
import mil.jpeojtrs.sca.util.math.ComplexNumber;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.conversion.StringToNumberConverter;
import org.eclipse.core.databinding.validation.IValidator;
import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.core.internal.databinding.validation.ReadOnlyValidator;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EcorePackage;
public class ScaNumberUpdateValueStrategy extends UpdateValueStrategy {
private static class NumberValidator implements IValidator {
private final PropertyValueType dataType;
private final boolean complex;
public NumberValidator(PropertyValueType dataType, boolean complex) {
this.dataType = dataType;
this.complex = complex;
}
@Override
public IStatus validate(Object value) {
String s = String.valueOf(value);
try {
if (complex) {
ComplexNumber.valueOf(dataType.getLiteral(), s);
} else {
switch (dataType.toEDataType(complex).getClassifierID()) {
case EcorePackage.EDOUBLE:
case EcorePackage.EDOUBLE_OBJECT:
Double.parseDouble(s);
break;
case EcorePackage.EFLOAT:
case EcorePackage.EFLOAT_OBJECT:
Float.parseFloat(s);
break;
case EcorePackage.EINTEGER_OBJECT:
case EcorePackage.EINT:
Integer.parseInt(s);
break;
case EcorePackage.ELONG:
case EcorePackage.ELONG_OBJECT:
Long.parseLong(s);
break;
case EcorePackage.ESHORT:
case EcorePackage.ESHORT_OBJECT:
Short.parseShort(s);
break;
case EcorePackage.EBYTE:
case EcorePackage.EBYTE_OBJECT:
Byte.parseByte(s);
break;
case EcorePackage.EBIG_INTEGER:
new BigInteger(s);
break;
case EcorePackage.EBIG_DECIMAL:
new BigDecimal(s);
break;
default:
throw new IllegalArgumentException("Unknown number format: " + dataType);
}
}
} catch (NumberFormatException e) {
return ValidationStatus.error("Non-number detected.", e);
}
return ValidationStatus.ok();
}
};
public ScaNumberUpdateValueStrategy(ScaSimpleProperty prop) {
boolean complex;
EDataType type;
if (prop.getDefinition() == null) {
this.beforeSetValidator = ReadOnlyValidator.getDefault();
this.afterGetValidator = ReadOnlyValidator.getDefault();
type = SCAObservables.toType(prop.getValue());
complex = prop.getValue() instanceof ComplexNumber;
} else {
complex = prop.getDefinition().isComplex();
type = prop.getDefinition().getType().toEDataType(complex);
NumberValidator validator = new NumberValidator(prop.getDefinition().getType(), complex);
this.beforeSetValidator = validator;
this.afterGetValidator = validator;
}
if (complex) {
setConverter(new StringToComplexNumberConverter(prop.getDefinition().getType()));
} else {
switch (type.getClassifierID()) {
case EcorePackage.EDOUBLE:
case EcorePackage.EDOUBLE_OBJECT:
setConverter(StringToNumberConverter.toFloat(true));
break;
case EcorePackage.EFLOAT:
case EcorePackage.EFLOAT_OBJECT:
setConverter(StringToNumberConverter.toDouble(true));
break;
case EcorePackage.EINTEGER_OBJECT:
case EcorePackage.EINT:
setConverter(StringToNumberConverter.toInteger(true));
break;
case EcorePackage.ELONG:
case EcorePackage.ELONG_OBJECT:
setConverter(StringToNumberConverter.toLong(true));
break;
case EcorePackage.ESHORT:
case EcorePackage.ESHORT_OBJECT:
setConverter(StringToNumberConverter.toShort(true));
break;
case EcorePackage.EBYTE:
case EcorePackage.EBYTE_OBJECT:
setConverter(StringToNumberConverter.toByte(true));
break;
case EcorePackage.EBIG_INTEGER:
setConverter(StringToNumberConverter.toBigInteger());
break;
case EcorePackage.EBIG_DECIMAL:
setConverter(StringToNumberConverter.toBigDecimal());
break;
default:
throw new IllegalArgumentException("Unknown number format: " + type.getInstanceClassName());
}
}
}
}