use of org.osate.aadl2.Prototype in project osate2 by osate.
the class PrototypesModel method setPrototypeType.
@Override
public void setPrototypeType(final EditablePrototype prototype, final PrototypeType value) {
// Check if the type is different by comparing EClass values
final EClass currentEClass = prototype.prototype.eClass();
final EClass newEClass = prototypeTypeToEClass(value);
if (newEClass == currentEClass) {
return;
}
modifyOwningClassifier("Set Prototype Type", prototype, c -> {
getPrototypeByName(c, prototype.name).ifPresent(p -> {
// Store location in list
final int index = c.getOwnedPrototypes().indexOf(p);
if (index == -1) {
throw new RuntimeException("Unable to get index of prototype being modified");
}
// Store fields
final String name = p.getName();
final Prototype refined = p.getRefined();
ComponentClassifier cc = null;
FeatureGroupType fgt = null;
boolean in = false;
boolean out = false;
boolean array = false;
if (p instanceof ComponentPrototype) {
final ComponentPrototype cp = (ComponentPrototype) p;
cc = cp.getConstrainingClassifier();
array = cp.isArray();
} else if (p instanceof FeatureGroupPrototype) {
final FeatureGroupPrototype fp = (FeatureGroupPrototype) p;
fgt = fp.getConstrainingFeatureGroupType();
} else if (p instanceof FeaturePrototype) {
final FeaturePrototype fp = (FeaturePrototype) p;
cc = fp.getConstrainingClassifier();
in = fp.isIn();
out = fp.isOut();
}
// Create new prototype
final Prototype newPrototype = (Prototype) EcoreUtil.create(newEClass);
c.getOwnedPrototypes().add(index, newPrototype);
if (refined == null) {
newPrototype.setName(name);
} else {
newPrototype.setRefined(refined);
}
// Set fields
if (newPrototype instanceof ComponentPrototype) {
final ComponentPrototype cp = (ComponentPrototype) newPrototype;
cp.setConstrainingClassifier(cc);
cp.setArray(array);
} else if (newPrototype instanceof FeatureGroupPrototype) {
final FeatureGroupPrototype fp = (FeatureGroupPrototype) newPrototype;
fp.setConstrainingFeatureGroupType(fgt);
} else if (newPrototype instanceof FeaturePrototype) {
final FeaturePrototype fp = (FeaturePrototype) newPrototype;
fp.setConstrainingClassifier(cc);
fp.setIn(in);
fp.setOut(out);
}
// Move property associations
newPrototype.getOwnedPropertyAssociations().addAll(p.getOwnedPropertyAssociations());
// Remove old prototype
EcoreUtil.remove(p);
});
});
}
use of org.osate.aadl2.Prototype in project osate2 by osate.
the class SubcomponentPrototypeBindingsModel method flush.
@Override
public void flush() {
// Get any subcomponent. Will be used to resolve selected classifier
final Subcomponent currentSc = getBusinessObjectSelection().boStream(Subcomponent.class).findFirst().orElse(null);
if (currentSc == null) {
throw new RuntimeException("Unable to retrieve subcomponent");
}
// Get the actual object.
final NamedElementOrDescription classifier = getClassifier(null);
EObject classifierValue = classifier == null ? null : classifier.getResolvedValue(getResourceSet());
if (classifierValue != null && !(classifierValue instanceof SubcomponentType)) {
throw new RuntimeException("Unexpected value: " + classifierValue);
}
final SubcomponentType newSubcomponentType = (SubcomponentType) classifierValue;
getBusinessObjectSelection().modify(Subcomponent.class, sc -> {
// Set subcomponent type
AadlSubcomponentUtil.setClassifier(sc, newSubcomponentType);
// Update prototype bindings
sc.getOwnedPrototypeBindings().clear();
createNewBindings(null, newSubcomponentType, sc, sc.getOwnedPrototypeBindings());
});
}
use of org.osate.aadl2.Prototype in project osate2 by osate.
the class SubcomponentPrototypeBindingsModel method buildComparisonString.
/**
* Builds a string that can be used to compare a list of prototype bindings
* @param bindings for which to build a comparison string
* @return is the comparison string that was built.
*/
private String buildComparisonString(final List<PrototypeBinding> bindings) {
final StringBuilder sb = new StringBuilder();
bindings.stream().sorted((b1, b2) -> getPrototypeName(b1).compareToIgnoreCase(getPrototypeName(b2))).forEachOrdered(b -> {
sb.append(getPrototypeName(b));
sb.append(':');
if (b instanceof ComponentPrototypeBinding) {
final ComponentPrototypeBinding cpb = (ComponentPrototypeBinding) b;
cpb.getActuals().stream().forEachOrdered(a -> {
sb.append(a.getCategory());
sb.append(',');
addQualfiedNameIfNamedElement(sb, a.getSubcomponentType());
sb.append('(');
sb.append(buildComparisonString(a.getBindings()));
sb.append(')');
});
} else if (b instanceof FeatureGroupPrototypeBinding) {
final FeatureGroupPrototypeBinding fgpb = (FeatureGroupPrototypeBinding) b;
final FeatureGroupPrototypeActual a = fgpb.getActual();
if (a != null) {
addQualfiedNameIfNamedElement(sb, a.getFeatureType());
sb.append('(');
sb.append(buildComparisonString(a.getBindings()));
sb.append(')');
}
} else if (b instanceof FeaturePrototypeBinding) {
FeaturePrototypeBinding fpb = (FeaturePrototypeBinding) b;
final FeaturePrototypeActual a = fpb.getActual();
if (a instanceof AccessSpecification) {
final AccessSpecification as = (AccessSpecification) a;
sb.append(as.getCategory());
sb.append(',');
sb.append(as.getKind());
sb.append(',');
addQualfiedNameIfNamedElement(sb, as.getClassifier());
} else if (a instanceof PortSpecification) {
final PortSpecification ps = (PortSpecification) a;
sb.append(ps.getCategory());
sb.append(',');
sb.append(ps.getDirection());
sb.append(',');
addQualfiedNameIfNamedElement(sb, ps.getClassifier());
} else if (a instanceof FeaturePrototypeReference) {
final FeaturePrototypeReference r = (FeaturePrototypeReference) a;
sb.append(r.getDirection());
sb.append(',');
addQualfiedNameIfNamedElement(sb, r.getPrototype());
}
}
sb.append(';');
});
return sb.toString();
}
use of org.osate.aadl2.Prototype in project osate2 by osate.
the class FeatureReferenceBindingType method loadBindingData.
// Populate the model's data structure based on the specified bindings
protected void loadBindingData(final PrototypeBindingsModelNode parent, final Collection<PrototypeBinding> bindings) {
for (final PrototypeBinding b : bindings) {
// Create a new node for the binding
PrototypeBindingsModelNode newChild = new PrototypeBindingsModelNode(parent, b);
// Ignore null bindings
if (b == null) {
} else if (b instanceof ComponentPrototypeBinding) {
final List<ComponentPrototypeActual> actuals = ((ComponentPrototypeBinding) b).getActuals();
// If the actual specified multiple values, flag the model as having an unsupported value
if (actuals.size() == 1) {
final ComponentPrototypeActual actual = actuals.get(0);
if (actual != null) {
setNodeDataClassifier(newChild, actual.getSubcomponentType());
loadBindingData(newChild, actual.getBindings());
}
} else {
unsupportedValue = true;
return;
}
} else if (b instanceof FeatureGroupPrototypeBinding) {
final FeatureGroupPrototypeActual actual = ((FeatureGroupPrototypeBinding) b).getActual();
if (actual != null) {
setNodeDataClassifier(newChild, actual.getFeatureType());
loadBindingData(newChild, actual.getBindings());
}
} else if (b instanceof FeaturePrototypeBinding) {
final FeaturePrototypeActual actual = ((FeaturePrototypeBinding) b).getActual();
// Populate data based on the type of actual
if (actual == null) {
} else if (actual instanceof AccessSpecification) {
final AccessSpecification as = (AccessSpecification) actual;
data(newChild).direction = as.getKind();
data(newChild).type = new AccessSpecificationBindingType(as.getCategory());
setNodeDataClassifier(newChild, as.getClassifier());
} else if (actual instanceof FeaturePrototypeReference) {
final FeaturePrototypeReference fpr = (FeaturePrototypeReference) actual;
data(newChild).direction = fpr.getDirection();
data(newChild).type = new FeatureReferenceBindingType();
setNodeDataClassifier(newChild, fpr.getPrototype());
} else if (actual instanceof PortSpecification) {
final PortSpecification ps = (PortSpecification) actual;
data(newChild).direction = ps.getDirection();
data(newChild).type = new PortSpecificationBindingType(ps.getCategory());
setNodeDataClassifier(newChild, ps.getClassifier());
} else {
throw new RuntimeException("Unhandled feature prototype actual type: " + actual);
}
} else {
throw new RuntimeException("Unhandled prototype binding type: " + b);
}
}
}
use of org.osate.aadl2.Prototype in project osate2 by osate.
the class ClassifierPrototypeBindingsModel method getReferenceablePrototypes.
@Override
protected Stream<Prototype> getReferenceablePrototypes() {
// Get prototypes for the select classifier
final List<Classifier> classifiers = getBusinessObjectSelection().boStream(Classifier.class).collect(Collectors.toList());
if (classifiers.isEmpty()) {
return null;
}
final Classifier c = classifiers.iterator().next();
return AadlPrototypeUtil.getAllPrototypes(c);
}
Aggregations