use of org.osate.aadl2.PropertyExpression in project osate2 by osate.
the class NumericRangeImpl method createLowerBound.
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public PropertyExpression createLowerBound(EClass eClass) {
PropertyExpression newLowerBound = (PropertyExpression) create(eClass);
setLowerBound(newLowerBound);
return newLowerBound;
}
use of org.osate.aadl2.PropertyExpression in project osate2 by osate.
the class NumericRangeImpl method createUpperBound.
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public PropertyExpression createUpperBound(EClass eClass) {
PropertyExpression newUpperBound = (PropertyExpression) create(eClass);
setUpperBound(newUpperBound);
return newUpperBound;
}
use of org.osate.aadl2.PropertyExpression in project osate2 by osate.
the class PropertiesValidator method typeCheckPropertyValues.
/**
* checks and report mismatch in type of value and type
*
* @param pt:
* PropertyType or unresolved proxy or null
* @param pv:
* PropertyExpression or null
* @param prefix:
* String prefix to error message used for lists
* @since 2.0
*/
protected void typeCheckPropertyValues(PropertyType pt, PropertyExpression pv, String prefix, Element holder, String defName, int depth) {
if (Aadl2Util.isNull(pt) || pv == null || holder == null) {
return;
}
if (depth > 50) {
error(holder, "Cyclic value discovered for '" + defName + "'");
return;
}
depth++;
String msg = " to property '" + defName + "' of type '" + pt.eClass().getName() + "'";
if (!prefix.isEmpty() && !prefix.startsWith(" ")) {
prefix = prefix + " ";
}
if (pv instanceof ListValue) {
if (pt instanceof ListType) {
typeMatchListElements(((ListType) pt).getElementType(), ((ListValue) pv).getOwnedListElements(), holder, defName, depth);
} else {
error(holder, prefix + "Assigning a list of values" + msg);
}
} else if (pv instanceof Operation || pv instanceof BooleanLiteral) {
if (!(pt instanceof AadlBoolean)) {
error(holder, prefix + "Assigning a Boolean value" + msg);
}
} else if (pv instanceof StringLiteral) {
if (!(pt instanceof AadlString)) {
error(prefix + "Assigning String value" + msg, holder, null, ValidationMessageAcceptor.INSIGNIFICANT_INDEX, Diagnostic.LINKING_DIAGNOSTIC);
}
} else if (pv instanceof EnumerationLiteral || (pv instanceof NamedValue && ((NamedValue) pv).getNamedValue() instanceof EnumerationLiteral)) {
if (!(pt instanceof EnumerationType)) {
error(holder, prefix + "Assigning Enumeration literal" + msg);
}
} else if (pv instanceof UnitLiteral || (pv instanceof NamedValue && ((NamedValue) pv).getNamedValue() instanceof UnitLiteral)) {
if (!(pt instanceof UnitsType)) {
error(holder, prefix + "Assigning Unit literal" + msg);
}
} else if (pv instanceof IntegerLiteral) {
if (!(pt instanceof AadlInteger)) {
error(holder, prefix + "Assigning Integer value" + msg);
} else if (checkUnits((AadlInteger) pt, (IntegerLiteral) pv, holder)) {
checkInRange((AadlInteger) pt, (IntegerLiteral) pv);
}
} else if (pv instanceof RealLiteral) {
if (!(pt instanceof AadlReal)) {
error(holder, prefix + "Assigning Real value" + msg);
} else if (checkUnits((AadlReal) pt, (RealLiteral) pv, holder)) {
checkInRange((AadlReal) pt, (RealLiteral) pv);
}
} else if (pv instanceof RangeValue) {
if (!(pt instanceof RangeType)) {
error(holder, prefix + "Assigning Range value" + msg);
} else {
typeCheckPropertyValues(((RangeType) pt).getNumberType(), ((RangeValue) pv).getMinimumValue(), holder, defName, depth);
typeCheckPropertyValues(((RangeType) pt).getNumberType(), ((RangeValue) pv).getMaximumValue(), holder, defName, depth);
typeCheckPropertyValues(((RangeType) pt).getNumberType(), ((RangeValue) pv).getDeltaValue(), holder, defName, depth);
}
} else if (pv instanceof ClassifierValue) {
if (!(pt instanceof ClassifierType)) {
error(holder, prefix + "Assigning incorrect Classifier value" + msg);
return;
}
ClassifierValue cv = (ClassifierValue) pv;
ClassifierType ct = (ClassifierType) pt;
if (ct.getClassifierReferences().isEmpty()) {
return;
}
for (MetaclassReference mcri : ct.getClassifierReferences()) {
if (mcri.getMetaclass() != null && mcri.getMetaclass().isSuperTypeOf(cv.getClassifier().eClass())) {
return;
}
}
error(holder, prefix + "Assigning classifier value with incorrect Classifier" + msg);
} else if (pv instanceof RecordValue) {
if (!(pt instanceof RecordType)) {
error(holder, prefix + "Assigning Record value" + msg);
} else {
typeMatchRecordFields(((RecordValue) pv).getOwnedFieldValues(), holder, defName, depth);
}
} else if (pv instanceof ReferenceValue) {
if (!(pt instanceof ReferenceType)) {
error(holder, prefix + "Assigning incorrect reference value" + msg);
} else {
ReferenceType ptrt = (ReferenceType) pt;
if (ptrt.getNamedElementReferences().isEmpty()) {
return;
}
ReferenceValue pvrv = (ReferenceValue) pv;
EList<ContainmentPathElement> cpes = pvrv.getContainmentPathElements();
if (!cpes.isEmpty()) {
NamedElement ne = cpes.get(cpes.size() - 1).getNamedElement();
for (MetaclassReference mcri : ptrt.getNamedElementReferences()) {
if (mcri.getMetaclass().isSuperTypeOf(ne.eClass())) {
return;
}
}
error(holder, prefix + "Assigning reference value with incorrect Named Element class" + msg);
}
}
} else if (pv instanceof NamedValue) {
AbstractNamedValue nv = ((NamedValue) pv).getNamedValue();
if (nv instanceof PropertyConstant) {
final PropertyConstant propertyConstant = (PropertyConstant) nv;
final PropertyType pct = propertyConstant.getPropertyType();
if (!Aadl2Util.isNull(pct) && !Aadl2Util.arePropertyTypesEqual(pt, pct)) {
final String expected = getTypeName(pt);
final String actual = getTypeName(pct);
if (actual != null) {
if (expected != null) {
error(holder, "Property value of type " + actual + "; expected type " + expected);
} else {
error(holder, "Propery value of type " + actual + " does not match expected type");
}
} else {
if (expected != null) {
error(holder, "Property value is not of expected type " + expected);
} else {
error(holder, "Propery value is not of expected type");
}
}
} else {
// Issue 2222: is this still really necessary?
typeCheckPropertyValues(pt, propertyConstant.getConstantValue(), holder, defName, depth);
}
} else if (nv instanceof Property) {
PropertyType pvt = ((Property) nv).getPropertyType();
if (!Aadl2Util.isNull(pvt)) {
if (pvt.eClass() != pt.eClass() || !Aadl2Util.arePropertyTypesEqual(pt, pvt)) {
final String expected = getTypeName(pt);
final String actual = getTypeName(pvt);
if (actual != null) {
if (expected != null) {
error(holder, "Property value of type " + actual + "; expected type " + expected);
} else {
error(holder, "Propery value of type " + actual + " does not match expected type");
}
} else {
if (expected != null) {
error(holder, "Property value is not of expected type " + expected);
} else {
error(holder, "Propery value is not of expected type");
}
}
}
}
} else {
error(holder, "Enum/Unit literal validation should have happened before");
}
}
}
use of org.osate.aadl2.PropertyExpression in project osate2 by osate.
the class PropertiesValidator method checkInRange.
private void checkInRange(NumberType type, NumberValue value) {
NumericRange range = type.getRange();
if (range != null) {
PropertyExpression lowerExpression;
try {
MpvProxy modalProxy = range.getLowerBound().evaluate(null, 0).first();
lowerExpression = modalProxy == null ? null : modalProxy.getValue();
} catch (InvalidModelException e) {
lowerExpression = null;
}
PropertyExpression upperExpression;
try {
MpvProxy modalProxy = range.getUpperBound().evaluate(null, 0).first();
upperExpression = modalProxy == null ? null : modalProxy.getValue();
} catch (InvalidModelException e) {
upperExpression = null;
}
if (lowerExpression instanceof NumberValue && upperExpression instanceof NumberValue) {
NumberValue lower = (NumberValue) lowerExpression;
NumberValue upper = (NumberValue) upperExpression;
double valueScaled = value.getScaledValue();
if (valueScaled < lower.getScaledValue() || valueScaled > upper.getScaledValue()) {
error(value, "Value must be between " + lower + " and " + upper);
}
}
}
}
use of org.osate.aadl2.PropertyExpression in project osate2 by osate.
the class PropertiesValidator method checkArrayReference.
@Check(CheckType.FAST)
public void checkArrayReference(ContainmentPathElement pathElement) {
NamedElement element = pathElement.getNamedElement();
List<ArrayRange> providedRanges = pathElement.getArrayRanges();
if (element.eIsProxy() || providedRanges.isEmpty()) {
// Only validate if the name is resolvable and there really are array indicies.
return;
}
String name = element.getName();
if (element instanceof ArrayableElement) {
List<ArrayDimension> requiredDimensions = ((ArrayableElement) element).getArrayDimensions();
if (requiredDimensions.isEmpty()) {
error(providedRanges.get(0), "'" + name + "' is not an array");
} else if (providedRanges.size() < requiredDimensions.size()) {
error(providedRanges.get(providedRanges.size() - 1), "Too few array dimensions: '" + name + "' has " + requiredDimensions.size());
} else if (providedRanges.size() > requiredDimensions.size()) {
error(providedRanges.get(requiredDimensions.size()), "Too many array dimensions: '" + name + "' has " + requiredDimensions.size());
} else {
for (int i = 0; i < providedRanges.size(); i++) {
ArrayRange providedRange = providedRanges.get(i);
if (providedRange.getLowerBound() == 0) {
error("Array indices start at 1", providedRange, Aadl2Package.eINSTANCE.getArrayRange_LowerBound(), ARRAY_LOWER_BOUND_IS_ZERO);
}
// If the upper is zero, then we have an index. Otherwise, we have a range.
if (providedRange.getUpperBound() != 0) {
if (providedRange.getLowerBound() > providedRange.getUpperBound()) {
error("Range lower bound is greater than upper bound", providedRange, null, ARRAY_RANGE_UPPER_LESS_THAN_LOWER);
}
if (EcoreUtil2.getContainerOfType(pathElement, ReferenceValue.class) != null) {
warning(providedRange, "Array ranges in reference values are not property instantiated");
}
}
ArrayDimension requiredDimension = requiredDimensions.get(i);
if (requiredDimension.getSize() == null) {
error(providedRange, "'" + name + "' does not have an array size");
} else {
ArraySizeProperty sizeProperty = requiredDimension.getSize().getSizeProperty();
OptionalLong size = OptionalLong.empty();
/*
* If the size property is null, then an integer literal was specified for the size.
* If the size property is not null, but is a proxy, then the property could not be resolved.
*/
if (sizeProperty == null) {
size = OptionalLong.of(requiredDimension.getSize().getSize());
} else if (!sizeProperty.eIsProxy()) {
PropertyExpression constantValue = ((PropertyConstant) sizeProperty).getConstantValue();
if (constantValue instanceof IntegerLiteral) {
size = OptionalLong.of(((IntegerLiteral) constantValue).getValue());
}
}
size.ifPresent(requiredSize -> {
// If the upper is zero, then we have an index. Otherwise, we have a range.
if (providedRange.getUpperBound() == 0) {
long index = providedRange.getLowerBound();
if (index > requiredSize) {
error("Index is greater than array size " + requiredSize, providedRange, Aadl2Package.eINSTANCE.getArrayRange_LowerBound(), ARRAY_INDEX_GREATER_THAN_MAXIMUM, Long.toString(requiredSize));
}
} else if (providedRange.getUpperBound() > requiredSize) {
error("Upper bound is greater than array size " + requiredSize, providedRange, Aadl2Package.eINSTANCE.getArrayRange_UpperBound(), ARRAY_RANGE_UPPER_GREATER_THAN_MAXIMUM, Long.toString(requiredSize));
}
});
}
}
}
} else {
error(providedRanges.get(0), "'" + name + "' is not an array");
}
}
Aggregations