Search in sources :

Example 16 with AbstractNamedValue

use of org.osate.aadl2.AbstractNamedValue in project AGREE by loonwerks.

the class AgreeTypeSystem method hasFloatDataRepresentation.

public static boolean hasFloatDataRepresentation(Classifier classifier) {
    boolean result = false;
    EList<PropertyAssociation> propertyAssociations = classifier.getAllPropertyAssociations();
    for (PropertyAssociation propertyAssociation : propertyAssociations) {
        Property property = propertyAssociation.getProperty();
        try {
            PropertyExpression propertyExpr = classifier.getSimplePropertyValue(property);
            if ("Data_Model::Data_Representation".equals(property.getQualifiedName()) && propertyExpr instanceof NamedValue) {
                AbstractNamedValue abstractNamedValue = ((NamedValue) propertyExpr).getNamedValue();
                if (abstractNamedValue instanceof EnumerationLiteral && "Float".equals(((EnumerationLiteral) abstractNamedValue).getName())) {
                    result = true;
                }
            }
        } catch (Exception e) {
            continue;
        }
    }
    return result;
}
Also used : PropertyAssociation(org.osate.aadl2.PropertyAssociation) AbstractNamedValue(org.osate.aadl2.AbstractNamedValue) PropertyExpression(org.osate.aadl2.PropertyExpression) AbstractNamedValue(org.osate.aadl2.AbstractNamedValue) NamedValue(org.osate.aadl2.NamedValue) ArraySizeProperty(org.osate.aadl2.ArraySizeProperty) Property(org.osate.aadl2.Property) EnumerationLiteral(org.osate.aadl2.EnumerationLiteral)

Example 17 with AbstractNamedValue

use of org.osate.aadl2.AbstractNamedValue in project AGREE by loonwerks.

the class AgreeTypeSystem method typeDefFromClassifier.

public static TypeDef typeDefFromClassifier(Classifier c) {
    if (c instanceof DataType || (c instanceof DataImplementation && ((DataImplementation) c).getAllSubcomponents().isEmpty() && ((DataImplementation) c).getType() != null)) {
        // Includes special case for data implementations implementing extensions of primitive types
        Classifier classifierType = c instanceof DataImplementation ? ((DataImplementation) c).getType() : c;
        List<PropertyAssociation> pas = classifierType.getAllPropertyAssociations();
        for (Classifier classType : classifierType.getSelfPlusAllExtended()) {
            if (classType != null && hasIntegerDataRepresentation(classType)) {
                for (PropertyAssociation choice : pas) {
                    Property p = choice.getProperty();
                    PropertyExpression v = choice.getOwnedValues().get(0).getOwnedValue();
                    String key = p.getQualifiedName();
                    if (key.equals("Data_Model::Integer_Range")) {
                        if (v instanceof RangeValue) {
                            try {
                                RangeValue rangeValue = (RangeValue) v;
                                long min = intFromPropExp(rangeValue.getMinimum()).get();
                                long max = intFromPropExp(rangeValue.getMaximum()).get();
                                return new RangeIntTypeDef(min, max);
                            } catch (Exception e) {
                                return Prim.ErrorTypeDef;
                            }
                        }
                    }
                }
                return Prim.IntTypeDef;
            } else if (classType != null && hasFloatDataRepresentation(classType)) {
                for (PropertyAssociation choice : pas) {
                    Property p = choice.getProperty();
                    PropertyExpression v = choice.getOwnedValues().get(0).getOwnedValue();
                    String key = p.getQualifiedName();
                    if (key.equals("Data_Model::Real_Range")) {
                        if (v instanceof RangeValue) {
                            try {
                                RangeValue rangeValue = (RangeValue) v;
                                double min = realFromPropExp(rangeValue.getMinimum()).get();
                                double max = realFromPropExp(rangeValue.getMaximum()).get();
                                return new RangeRealTypeDef(min, max);
                            } catch (Exception e) {
                                return Prim.ErrorTypeDef;
                            }
                        }
                    }
                }
                return Prim.RealTypeDef;
            } else if (classType != null && hasBooleanDataRepresentation(classType)) {
                return Prim.BoolTypeDef;
            }
        }
        boolean prop_isArray = false;
        int prop_arraySize = 0;
        TypeDef prop_arrayBaseType = null;
        boolean prop_isEnum = false;
        List<String> prop_enumValues = null;
        for (PropertyAssociation choice : pas) {
            Property p = choice.getProperty();
            PropertyExpression v = choice.getOwnedValues().get(0).getOwnedValue();
            String key = p.getQualifiedName();
            key = key == null ? p.getName() : key;
            if (key == null) {
                return Prim.ErrorTypeDef;
            }
            if (key.equalsIgnoreCase("Data_Model::Data_Representation")) {
                if (v instanceof NamedValue) {
                    AbstractNamedValue anv = ((NamedValue) v).getNamedValue();
                    if (anv instanceof EnumerationLiteral) {
                        EnumerationLiteral el = (EnumerationLiteral) anv;
                        prop_isArray = el.getName().equals("Array");
                        prop_isEnum = el.getName().equals("Enum");
                    }
                }
            } else if (key.equalsIgnoreCase("Data_Model::Enumerators")) {
                if (v instanceof ListValue) {
                    EList<PropertyExpression> peList = ((ListValue) v).getOwnedListElements();
                    String prefix = c.getQualifiedName() + "_";
                    prop_enumValues = new ArrayList<>();
                    for (PropertyExpression pe : peList) {
                        if (pe instanceof StringLiteral) {
                            String enumString = prefix + ((StringLiteral) pe).getValue();
                            prop_enumValues.add(enumString);
                        }
                    }
                }
            } else if (key.equalsIgnoreCase("Data_Model::Base_Type")) {
                if (v instanceof ListValue) {
                    ListValue l = (ListValue) v;
                    PropertyExpression pe = l.getOwnedListElements().get(0);
                    if (pe instanceof ClassifierValue) {
                        prop_arrayBaseType = typeDefFromClassifier(((ClassifierValue) pe).getClassifier());
                    }
                }
            } else if (key.equalsIgnoreCase("Data_Model::Dimension")) {
                if (v instanceof ListValue) {
                    ListValue l = (ListValue) v;
                    PropertyExpression pe = l.getOwnedListElements().get(0);
                    prop_arraySize = Math.toIntExact(intFromPropExp(pe).orElse((long) -1).longValue());
                }
            }
        }
        if (prop_isArray && prop_arraySize > 0 && prop_arrayBaseType != null) {
            return new ArrayTypeDef(prop_arrayBaseType, prop_arraySize, Optional.of(c));
        } else if (prop_isEnum && prop_enumValues != null) {
            String name = c.getQualifiedName();
            return new EnumTypeDef(name, prop_enumValues, c);
        }
    } else if (c instanceof ComponentClassifier) {
        Map<String, TypeDef> fields = new HashMap<>();
        Classifier currClsfr = c;
        while (currClsfr != null) {
            ComponentType ct = null;
            if (currClsfr instanceof ComponentImplementation) {
                EList<Subcomponent> subcomps = ((ComponentImplementation) currClsfr).getAllSubcomponents();
                for (Subcomponent sub : subcomps) {
                    String fieldName = sub.getName();
                    if (sub.getClassifier() != null) {
                        boolean prop_isArray = false;
                        int prop_arraySize = 0;
                        boolean prop_isEnum = false;
                        List<String> prop_enumValues = null;
                        for (PropertyAssociation pa : sub.getOwnedPropertyAssociations()) {
                            Property p = pa.getProperty();
                            String key = p.getQualifiedName();
                            key = key == null ? p.getName() : key;
                            PropertyExpression v = null;
                            if (!pa.getOwnedValues().isEmpty()) {
                                v = pa.getOwnedValues().get(0).getOwnedValue();
                            } else {
                                continue;
                            }
                            if (key.equals("Data_Model::Data_Representation")) {
                                if (v instanceof NamedValue) {
                                    AbstractNamedValue anv = ((NamedValue) v).getNamedValue();
                                    if (anv instanceof EnumerationLiteral) {
                                        EnumerationLiteral el = (EnumerationLiteral) anv;
                                        prop_isArray = el.getName().equals("Array");
                                        prop_isEnum = el.getName().equals("Enum");
                                    }
                                }
                            } else if (key.equals("Data_Model::Dimension")) {
                                if (v instanceof ListValue) {
                                    ListValue l = (ListValue) v;
                                    PropertyExpression pe = l.getOwnedListElements().get(0);
                                    prop_arraySize = Math.toIntExact(intFromPropExp(pe).orElse((long) -1).longValue());
                                }
                            } else if (key.equals("Data_Model::Enumerators")) {
                                if (v instanceof ListValue) {
                                    EList<PropertyExpression> peList = ((ListValue) v).getOwnedListElements();
                                    String prefix = c.getQualifiedName() + "_";
                                    prop_enumValues = new ArrayList<>();
                                    for (PropertyExpression pe : peList) {
                                        if (pe instanceof StringLiteral) {
                                            String enumString = prefix + ((StringLiteral) pe).getValue();
                                            prop_enumValues.add(enumString);
                                        }
                                    }
                                }
                            }
                        }
                        if (prop_isArray && prop_arraySize > 0) {
                            TypeDef typeDef = new ArrayTypeDef(typeDefFromClassifier(sub.getClassifier()), prop_arraySize, Optional.empty());
                            fields.putIfAbsent(fieldName, typeDef);
                        } else if (prop_isEnum && prop_enumValues != null) {
                            String name = c.getQualifiedName();
                            TypeDef typeDef = new EnumTypeDef(name, prop_enumValues, c);
                            fields.putIfAbsent(fieldName, typeDef);
                        } else if (sub.getArrayDimensions().size() == 0) {
                            TypeDef typeDef = typeDefFromClassifier(sub.getClassifier());
                            fields.putIfAbsent(fieldName, typeDef);
                        } else if (sub.getArrayDimensions().size() == 1) {
                            ArrayDimension ad = sub.getArrayDimensions().get(0);
                            int size = Math.toIntExact(getArraySize(ad));
                            TypeDef stem = typeDefFromClassifier(sub.getClassifier());
                            TypeDef typeDef = new ArrayTypeDef(stem, size, Optional.empty());
                            fields.putIfAbsent(fieldName, typeDef);
                        }
                    }
                }
                ct = ((ComponentImplementation) currClsfr).getType();
            } else if (c instanceof ComponentType) {
                ct = (ComponentType) currClsfr;
            }
            if (ct != null) {
                EList<Feature> features = ct.getAllFeatures();
                for (Feature feature : features) {
                    String fieldName = feature.getName();
                    if (feature.getClassifier() != null) {
                        if (feature.getArrayDimensions().size() == 0) {
                            TypeDef typeDef = typeDefFromClassifier(feature.getClassifier());
                            fields.putIfAbsent(fieldName, typeDef);
                        } else if (feature.getArrayDimensions().size() == 1) {
                            ArrayDimension ad = feature.getArrayDimensions().get(0);
                            int size = Math.toIntExact(getArraySize(ad));
                            TypeDef stem = typeDefFromClassifier(feature.getClassifier());
                            TypeDef typeDef = new ArrayTypeDef(stem, size, Optional.empty());
                            fields.putIfAbsent(fieldName, typeDef);
                        }
                    }
                }
                for (AnnexSubclause annex : AnnexUtil.getAllAnnexSubclauses(currClsfr, AgreePackage.eINSTANCE.getAgreeContractSubclause())) {
                    AgreeContract contract = (AgreeContract) ((AgreeContractSubclause) annex).getContract();
                    for (SpecStatement spec : contract.getSpecs()) {
                        List<Arg> args = new ArrayList<>();
                        if (spec instanceof EqStatement) {
                            args = ((EqStatement) spec).getLhs();
                        } else if (spec instanceof InputStatement) {
                            args = ((InputStatement) spec).getLhs();
                        }
                        for (Arg arg : args) {
                            String fieldName = arg.getName();
                            TypeDef typeDef = typeDefFromNE(arg);
                            fields.putIfAbsent(fieldName, typeDef);
                        }
                        if (spec instanceof ConstStatement) {
                            String fieldName = ((ConstStatement) spec).getName();
                            TypeDef typeDef = AgreeTypeSystem.typeDefFromType(((ConstStatement) spec).getType());
                            fields.putIfAbsent(fieldName, typeDef);
                        }
                    }
                }
            }
            currClsfr = currClsfr.getExtended();
        }
        String name = c.getQualifiedName();
        return new RecordTypeDef(name, fields, c);
    }
    return Prim.ErrorTypeDef;
}
Also used : ComponentImplementation(org.osate.aadl2.ComponentImplementation) ComponentClassifier(org.osate.aadl2.ComponentClassifier) ClassifierValue(org.osate.aadl2.ClassifierValue) PropertyAssociation(org.osate.aadl2.PropertyAssociation) ArrayList(java.util.ArrayList) AbstractNamedValue(org.osate.aadl2.AbstractNamedValue) AbstractNamedValue(org.osate.aadl2.AbstractNamedValue) NamedValue(org.osate.aadl2.NamedValue) ComponentClassifier(org.osate.aadl2.ComponentClassifier) Classifier(org.osate.aadl2.Classifier) AadlString(org.osate.aadl2.AadlString) Feature(org.osate.aadl2.Feature) RangeValue(org.osate.aadl2.RangeValue) Subcomponent(org.osate.aadl2.Subcomponent) DataType(org.osate.aadl2.DataType) PropertyExpression(org.osate.aadl2.PropertyExpression) ArrayList(java.util.ArrayList) List(java.util.List) EList(org.eclipse.emf.common.util.EList) InputStatement(com.rockwellcollins.atc.agree.agree.InputStatement) ArraySizeProperty(org.osate.aadl2.ArraySizeProperty) Property(org.osate.aadl2.Property) EnumerationLiteral(org.osate.aadl2.EnumerationLiteral) AgreeContract(com.rockwellcollins.atc.agree.agree.AgreeContract) ComponentType(org.osate.aadl2.ComponentType) ListValue(org.osate.aadl2.ListValue) DataImplementation(org.osate.aadl2.DataImplementation) SpecStatement(com.rockwellcollins.atc.agree.agree.SpecStatement) AgreeContractSubclause(com.rockwellcollins.atc.agree.agree.AgreeContractSubclause) ConstStatement(com.rockwellcollins.atc.agree.agree.ConstStatement) EList(org.eclipse.emf.common.util.EList) StringLiteral(org.osate.aadl2.StringLiteral) Arg(com.rockwellcollins.atc.agree.agree.Arg) EqStatement(com.rockwellcollins.atc.agree.agree.EqStatement) Map(java.util.Map) HashMap(java.util.HashMap) ArrayDimension(org.osate.aadl2.ArrayDimension) AnnexSubclause(org.osate.aadl2.AnnexSubclause)

Example 18 with AbstractNamedValue

use of org.osate.aadl2.AbstractNamedValue in project AGREE by loonwerks.

the class AgreeTypeSystem method hasIntegerDataRepresentation.

public static boolean hasIntegerDataRepresentation(Classifier classifier) {
    boolean result = false;
    EList<PropertyAssociation> propertyAssociations = classifier.getAllPropertyAssociations();
    for (PropertyAssociation propertyAssociation : propertyAssociations) {
        Property property = propertyAssociation.getProperty();
        try {
            PropertyExpression propertyExpr = classifier.getSimplePropertyValue(property);
            if ("Data_Model::Data_Representation".equals(property.getQualifiedName()) && propertyExpr instanceof NamedValue) {
                AbstractNamedValue abstractNamedValue = ((NamedValue) propertyExpr).getNamedValue();
                if (abstractNamedValue instanceof EnumerationLiteral && "Integer".equals(((EnumerationLiteral) abstractNamedValue).getName())) {
                    result = true;
                }
            }
        } catch (Exception e) {
            continue;
        }
    }
    return result;
}
Also used : PropertyAssociation(org.osate.aadl2.PropertyAssociation) AbstractNamedValue(org.osate.aadl2.AbstractNamedValue) PropertyExpression(org.osate.aadl2.PropertyExpression) AbstractNamedValue(org.osate.aadl2.AbstractNamedValue) NamedValue(org.osate.aadl2.NamedValue) ArraySizeProperty(org.osate.aadl2.ArraySizeProperty) Property(org.osate.aadl2.Property) EnumerationLiteral(org.osate.aadl2.EnumerationLiteral)

Example 19 with AbstractNamedValue

use of org.osate.aadl2.AbstractNamedValue in project AGREE by loonwerks.

the class AgreeTypeSystem method getTypeDefFromFeatureOrSubcomp.

private static TypeDef getTypeDefFromFeatureOrSubcomp(NamedElement ne) {
    Classifier cl = null;
    if (ne instanceof Feature) {
        cl = ((Feature) ne).getClassifier();
    } else if (ne instanceof Subcomponent) {
        cl = ((Subcomponent) ne).getClassifier();
    }
    List<ArrayDimension> dims = null;
    if (ne instanceof ArrayableElement) {
        dims = ((ArrayableElement) ne).getArrayDimensions();
    }
    if (cl == null) {
        return Prim.ErrorTypeDef;
    }
    TypeDef clsTypeDef = typeDefFromClassifier(cl);
    if (dims == null || dims.size() == 0) {
        boolean prop_isArray = false;
        int prop_arraySize = 0;
        List<PropertyAssociation> pas = null;
        if (ne instanceof Feature) {
            pas = ((Feature) ne).getOwnedPropertyAssociations();
        } else if (ne instanceof Subcomponent) {
            pas = ((Subcomponent) ne).getOwnedPropertyAssociations();
        }
        if (pas != null) {
            for (PropertyAssociation pchoice : pas) {
                Property p = pchoice.getProperty();
                PropertyExpression v = pchoice.getOwnedValues().get(0).getOwnedValue();
                String key = p.getQualifiedName();
                if (key.equals("Data_Model::Data_Representation")) {
                    if (v instanceof NamedValue) {
                        AbstractNamedValue anv = ((NamedValue) v).getNamedValue();
                        if (anv instanceof EnumerationLiteral) {
                            EnumerationLiteral el = (EnumerationLiteral) anv;
                            prop_isArray = el.getName().equals("Array");
                        }
                    }
                } else if (key.equals("Data_Model::Dimension")) {
                    if (v instanceof ListValue) {
                        ListValue l = (ListValue) v;
                        PropertyExpression pe = l.getOwnedListElements().get(0);
                        prop_arraySize = Math.toIntExact(intFromPropExp(pe).orElse((long) -1).longValue());
                    }
                }
            }
        }
        if (prop_isArray && prop_arraySize > 0) {
            return new ArrayTypeDef(clsTypeDef, prop_arraySize, Optional.empty());
        } else if (prop_isArray && prop_arraySize <= 0) {
            return Prim.ErrorTypeDef;
        } else {
            return clsTypeDef;
        }
    } else if (dims.size() == 1) {
        long size = getArraySize(dims.get(0));
        return new ArrayTypeDef(clsTypeDef, Math.toIntExact(size), Optional.empty());
    }
    return Prim.ErrorTypeDef;
}
Also used : PropertyAssociation(org.osate.aadl2.PropertyAssociation) ListValue(org.osate.aadl2.ListValue) AbstractNamedValue(org.osate.aadl2.AbstractNamedValue) AbstractNamedValue(org.osate.aadl2.AbstractNamedValue) NamedValue(org.osate.aadl2.NamedValue) ComponentClassifier(org.osate.aadl2.ComponentClassifier) Classifier(org.osate.aadl2.Classifier) AadlString(org.osate.aadl2.AadlString) Feature(org.osate.aadl2.Feature) Subcomponent(org.osate.aadl2.Subcomponent) PropertyExpression(org.osate.aadl2.PropertyExpression) ArrayableElement(org.osate.aadl2.ArrayableElement) ArrayDimension(org.osate.aadl2.ArrayDimension) ArraySizeProperty(org.osate.aadl2.ArraySizeProperty) Property(org.osate.aadl2.Property) EnumerationLiteral(org.osate.aadl2.EnumerationLiteral)

Example 20 with AbstractNamedValue

use of org.osate.aadl2.AbstractNamedValue in project AGREE by loonwerks.

the class AgreeTypeSystem method inferPropExp.

private static TypeDef inferPropExp(PropertyExpression pe) {
    if (pe instanceof IntegerLiteral) {
        return Prim.IntTypeDef;
    } else if (pe instanceof RealLiteral) {
        return Prim.RealTypeDef;
    } else if (pe instanceof NamedValue) {
        NamedValue nv = (NamedValue) pe;
        AbstractNamedValue anv = nv.getNamedValue();
        if (anv instanceof PropertyConstant) {
            return inferPropExp(((PropertyConstant) anv).getConstantValue());
        }
    }
    return Prim.ErrorTypeDef;
}
Also used : RealLiteral(org.osate.aadl2.RealLiteral) AbstractNamedValue(org.osate.aadl2.AbstractNamedValue) AbstractNamedValue(org.osate.aadl2.AbstractNamedValue) NamedValue(org.osate.aadl2.NamedValue) IntegerLiteral(org.osate.aadl2.IntegerLiteral) PropertyConstant(org.osate.aadl2.PropertyConstant)

Aggregations

AbstractNamedValue (org.osate.aadl2.AbstractNamedValue)18 NamedValue (org.osate.aadl2.NamedValue)15 Property (org.osate.aadl2.Property)13 PropertyExpression (org.osate.aadl2.PropertyExpression)12 EnumerationLiteral (org.osate.aadl2.EnumerationLiteral)9 PropertyAssociation (org.osate.aadl2.PropertyAssociation)8 ArraySizeProperty (org.osate.aadl2.ArraySizeProperty)7 Classifier (org.osate.aadl2.Classifier)7 ContainmentPathElement (org.osate.aadl2.ContainmentPathElement)6 ListValue (org.osate.aadl2.ListValue)6 NamedElement (org.osate.aadl2.NamedElement)6 PropertyConstant (org.osate.aadl2.PropertyConstant)6 StringLiteral (org.osate.aadl2.StringLiteral)6 BasicPropertyAssociation (org.osate.aadl2.BasicPropertyAssociation)5 ClassifierValue (org.osate.aadl2.ClassifierValue)5 ContainedNamedElement (org.osate.aadl2.ContainedNamedElement)5 List (java.util.List)4 RangeValue (org.osate.aadl2.RangeValue)4 RecordValue (org.osate.aadl2.RecordValue)4 EList (org.eclipse.emf.common.util.EList)3