use of org.lara.language.specification.dsl.LanguageSpecificationV2 in project lara-framework by specs-feup.
the class ImportProcessor method importAndInitialize.
/**
*/
public void importAndInitialize() {
for (Class<?> importingClass : LaraApis.getImportableClasses()) {
importClassWithSimpleName(importingClass);
}
for (Class<?> importingClass : WeaverApis.getImportableClasses()) {
importClassWithSimpleName(importingClass);
}
for (Class<?> importingClass : CLASSES_TO_IMPORT) {
importClassWithSimpleName(importingClass);
}
final File jarDir = new File(LaraIUtils.getJarFoldername());
final String laraPath = "var " + LARASystem.LARAPATH + " = '" + jarDir.getAbsolutePath().replace('\\', '/') + "';\n";
final String attribute = "var " + Interpreter.ATTRIBUTES + " = { set: function(newReport){ mergeObjects(this,newReport);}};\n";
interpreter.evaluate(laraPath, "import_and_initialize");
interpreter.evaluate(attribute, "import_and_initialize");
LaraI laraI = interpreter.getLaraI();
if (laraI.getOptions().useStackTrace()) {
interpreter.put(CallStackTrace.STACKTRACE_NAME, interpreter.getStackStrace());
}
interpreter.put(MasterWeaver.WEAVER_NAME, laraI.getWeaver());
interpreter.put(LARASystem.LARA_SYSTEM_NAME, new LARASystem(laraI));
WeaverEngine engine = laraI.getWeaver().getEngine();
LanguageSpecificationV2 ls = engine.getLanguageSpecificationV2();
interpreter.put(MasterWeaver.LANGUAGE_SPECIFICATION_NAME, WeaverSpecification.newInstance(ls, engine.getScriptEngine()));
}
use of org.lara.language.specification.dsl.LanguageSpecificationV2 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;
}
Aggregations