use of org.lara.language.specification.dsl.JoinPointClass in project lara-framework by specs-feup.
the class LanguageSpecificationSideBar method initJoinPoints.
private void initJoinPoints() {
joinPoints.addItem(langSpec.getGlobal());
for (JoinPointClass joinPoint : langSpec.getJoinPoints().values()) {
joinPoints.addItem(joinPoint);
}
joinPoints.addActionListener(new GenericActionListener(e -> updateJPInfo((JoinPointClass) joinPoints.getSelectedItem())));
}
use of org.lara.language.specification.dsl.JoinPointClass in project lara-framework by specs-feup.
the class WeaverSpecification method getJoinPoint.
private JoinPointClass getJoinPoint(String joinPointName) {
boolean isGlobal = joinPointName.equals(JoinPointClass.getGlobalName());
JoinPointClass joinPoint = isGlobal ? ls.getGlobal() : ls.getJoinPoint(joinPointName);
return joinPoint;
}
use of org.lara.language.specification.dsl.JoinPointClass in project lara-framework by specs-feup.
the class LangSpecsXmlParser method parse.
public static LanguageSpecificationV2 parse(InputStream joinPointModel, InputStream attributeModel, InputStream actionModel, boolean validate) {
// System.out.println("JP SCHEMA: " + SchemaResource.JOIN_POINT_SCHEMA.read());
// System.out.println("JP SCHEMA: " + SchemaResource.JOIN_POINT_SCHEMA.getResource());
var jpSchema = validate ? SchemaResource.JOIN_POINT_SCHEMA.toStream() : null;
var attrSchema = validate ? SchemaResource.ATTRIBUTE_SCHEMA.toStream() : null;
var actionSchema = validate ? SchemaResource.ACTION_SCHEMA.toStream() : null;
var joinPointModelNode = XmlDocument.newInstance(joinPointModel, jpSchema);
var attributeModelNode = XmlDocument.newInstance(attributeModel, attrSchema);
var actionModelNode = XmlDocument.newInstance(actionModel, actionSchema);
// Setup global JoinPointClass
LanguageSpecificationV2 langSpecV2 = new LanguageSpecificationV2();
JoinPointClass global = JoinPointClass.globalJoinPoint(langSpecV2);
langSpecV2.setGlobal(global);
// Initialize types (typedef, enums), to have access to available names
for (var type : attributeModelNode.getElementsByName("object")) {
var typeDef = new TypeDef(type.getAttribute("name"));
langSpecV2.add(typeDef);
setOptional(type.getAttribute("tooltip"), typeDef::setToolTip);
}
for (var type : attributeModelNode.getElementsByName("enum")) {
var enumDef = new EnumDef(type.getAttribute("name"));
langSpecV2.add(enumDef);
setOptional(type.getAttribute("tooltip"), enumDef::setToolTip);
List<EnumValue> valuesList = toEnumValues(type.getElementsByName("value"), langSpecV2);
enumDef.setValues(valuesList);
}
List<JoinPointClass> jps = new ArrayList<>();
for (var jpNode : joinPointModelNode.getElementsByName("joinpoint")) {
var jp = new JoinPointClass(jpNode.getAttribute("class"), langSpecV2);
setOptional(jpNode.getAttribute("tooltip"), jp::setToolTip);
jps.add(jp);
}
Collections.sort(jps);
jps.stream().forEach(langSpecV2::add);
var joinpoints = joinPointModelNode.getElementsByName("joinpoints").get(0);
langSpecV2.setRoot(joinpoints.getAttribute("root_class"));
setOptional(joinpoints.getAttribute("root_alias"), langSpecV2::setRootAlias);
// Map of actions according to class
MultiMap<String, XmlElement> joinPointActions = new MultiMap<>();
List<XmlElement> globalActions = new ArrayList<>();
for (var actionNode : actionModelNode.getElementsByName("action")) {
var classNames = actionNode.getAttribute("class");
// Global actions do not have a class value, or its value is '*'
if (classNames.isEmpty() || classNames.equals("*")) {
globalActions.add(actionNode);
continue;
}
// System.out.println("CLASS NAMES: " + classNames);
for (String className : classNames.split(",")) {
// System.out.println("NAME: " + className);
joinPointActions.add(className.strip(), actionNode);
}
}
populateGlobal(joinPointModelNode, attributeModelNode, actionModelNode, langSpecV2, global, globalActions);
// Populate TypeDef
for (var typeNode : attributeModelNode.getElementsByName("object")) {
TypeDef typeDef = langSpecV2.getTypeDefs().get(typeNode.getAttribute("name"));
List<Attribute> attributesList = convertAttributes(typeNode.getElementsByName("attribute"), langSpecV2);
typeDef.setFields(attributesList);
}
for (var jpNode : joinPointModelNode.getElementsByName("joinpoint")) {
String jpClass = jpNode.getAttribute("class");
JoinPointClass jp = langSpecV2.getJoinPoint(jpClass);
String extendsType = jpNode.getAttribute("extends");
if (!extendsType.isEmpty()) {
jp.setExtend(langSpecV2.getJoinPoint(extendsType));
} else {
jp.setExtend(global);
}
// Obtain attribute nodes from artifacts
List<XmlElement> artifactNodes = attributeModelNode.getElementsByName("artifact").stream().filter(attribute -> attribute.getAttribute("class").equals(jpClass)).collect(Collectors.toList());
var attributeNodes = artifactNodes.stream().flatMap(art -> art.getElementsByName("attribute").stream()).collect(Collectors.toList());
// Add attributes
jp.setAttributes(convertAttributes(attributeNodes, langSpecV2));
// Add selects
jp.setSelects(convertSelects(langSpecV2, jpNode.getElementsByName("select")));
// Add actions
jp.setActions(convertActions(langSpecV2, joinPointActions.get(jpClass)));
// Set default attributes
for (var artifact : attributeModelNode.getElementsByName("artifact")) {
var defaultValue = artifact.getAttribute("default");
if (defaultValue.isEmpty()) {
continue;
}
// Get corresponding join point and set default
// System.out.println("ARTIFACT CLASS: " + artifact.getAttribute("class"));
// System.out.println("JP: " + langSpecV2.getJoinPoint(artifact.getAttribute("class")));
var artifactJp = langSpecV2.getJoinPoint(artifact.getAttribute("class"));
if (artifactJp == null) {
SpecsLogs.info("Artifact without join point: " + artifact.getAttribute("class"));
continue;
}
artifactJp.setDefaultAttribute(defaultValue);
// System.out.println("SETTING DEFAULT '" + defaultValue + "' for JP " +
// artifact.getAttribute("class"));
}
}
// Add default global attributes (e.g., joinPointType, instanceOf)
addDefaultGlobalAttributes(langSpecV2);
return langSpecV2;
}
use of org.lara.language.specification.dsl.JoinPointClass in project lara-framework by specs-feup.
the class Selector method selectWithMiddlePath.
private Stack<Select> selectWithMiddlePath(String targetJP, JoinPointClass source, SelectionPathV2 selPath) {
Stack<Select> path = new Stack<>();
final Set<JoinPointClass> ignoreSet = new HashSet<>();
ignoreSet.add(source);
// for (final Select select : source.getSelect()) {
for (final Select select : source.getSelects()) {
// final JoinPointType next = select.getClazz();
final JoinPointClass next = select.getClazz();
final Stack<Select> pathAux = selectionPathAux(next, targetJP, new ArrayList<JoinPointClass>(), ignoreSet, selPath);
if (!pathAux.isEmpty()) {
pathAux.push(select);
if (!path.isEmpty()) {
if (!alreadyFound) {
// System.out.println(
// "More than one path for inital join point '" + targetJP + "'. Two of then are: ");
// System.out.println("\t1. " + path + "->" + targetJP);
// System.out.println("\t2. " + pathAux + "->" + targetJP);
int pos = 1;
Select first = path.get(0);
Select second = pathAux.get(0);
while (first.equals(second)) {
// && pos < max) { <-- this should not happen in these conditions
first = path.get(pos);
second = pathAux.get(pos);
pos++;
}
// boolean firstWOalias = first.getAlias().equals(first.getClazz().getClazz());
// boolean secondWOAlias = second.getAlias().equals(second.getClazz().getClazz());
boolean firstWOalias = first.getSelectName().equals(first.getClazz().getName());
boolean secondWOAlias = second.getSelectName().equals(second.getClazz().getName());
if (first.getClazz().equals(second.getClazz())) {
selPath.setTieBreakReason("use the one with specific join point type (i.e. without label)");
if (!firstWOalias && secondWOAlias) {
selPath.setSecondaryPath(path);
path = pathAux;
} else {
selPath.setSecondaryPath(pathAux);
}
} else {
selPath.setTieBreakReason("use the first path found as primary (from a depth first search)");
selPath.setSecondaryPath(pathAux);
}
alreadyFound = true;
}
break;
}
path = pathAux;
} else {
ignoreSet.add(next);
}
}
// If extends another join point
if (path.isEmpty() && source.getExtend().isPresent()) {
// source = (JoinPointType) source.getExtends();
source = source.getExtend().get();
return selectWithMiddlePath(targetJP, source, selPath);
}
return path;
}
use of org.lara.language.specification.dsl.JoinPointClass in project lara-framework by specs-feup.
the class LanguageSpecificationSideBar method initRoot.
private void initRoot() {
JLabel jLabel = new JLabel("Root: ");
JoinPointClass root = langSpec.getRoot();
String name = root.getName();
if (!langSpec.getRootAlias().isEmpty()) {
name = langSpec.getRootAlias() + "(" + name + ")";
}
JButton button = new JButton(" " + name + " ");
button.setContentAreaFilled(false);
button.setBorder(BorderFactory.createEtchedBorder());
button.addActionListener(new GenericActionListener(e -> joinPoints.setSelectedItem(root)));
rootPanel.add(jLabel);
rootPanel.add(button);
// rootPanel.setPreferredSize(new Dimension(50, 50));
}
Aggregations