Commit a92b47c5 authored by Jaime Arias's avatar Jaime Arias
Browse files

feature: parsing adt2amas GRML file

parent e27eb603
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry excluding="**|target/generated-sources/annotations/|target/generated-sources/test-annotations/" kind="src" output="target/classes" path="target"> <classpathentry excluding="**|target/generated-sources/annotations/" kind="src" output="target/classes" path="target">
<attributes> <attributes>
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>
</attributes> </attributes>
...@@ -33,15 +33,18 @@ ...@@ -33,15 +33,18 @@
<attribute name="maven.pomderived" value="true"/> <attribute name="maven.pomderived" value="true"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="src" path="target/generated-sources/annotations"> <classpathentry kind="src" output="target/test-classes" path="target/generated-sources/test-annotations">
<attributes> <attributes>
<attribute name="optional" value="true"/> <attribute name="optional" value="true"/>
<attribute name="test" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="src" output="target/test-classes" path="target/generated-sources/test-annotations"> <classpathentry kind="src" path="target/generated-sources/annotations">
<attributes> <attributes>
<attribute name="optional" value="true"/> <attribute name="optional" value="true"/>
<attribute name="test" value="true"/>
</attributes> </attributes>
</classpathentry> </classpathentry>
<classpathentry kind="output" path="target/classes"/> <classpathentry kind="output" path="target/classes"/>
......
...@@ -18,8 +18,9 @@ You can use the ...@@ -18,8 +18,9 @@ You can use the
[Alligator](https://depot.lipn.univ-paris13.fr/cosyverif/alligator/alligator) [Alligator](https://depot.lipn.univ-paris13.fr/cosyverif/alligator/alligator)
Docker image as development environment. Docker image as development environment.
To run tests you can use the tool [soapui](https://www.soapui.org/). An To run tests you can use the tool [soapui](https://www.soapui.org/). The
example is shown below: initial WSDL is http://localhost:9000/services?wsdl. An example is shown
below:
```xml ```xml
......
...@@ -4,7 +4,12 @@ import java.io.BufferedWriter; ...@@ -4,7 +4,12 @@ import java.io.BufferedWriter;
import java.io.File; import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
...@@ -16,6 +21,7 @@ import lombok.experimental.Accessors; ...@@ -16,6 +21,7 @@ import lombok.experimental.Accessors;
import org.cosyverif.Configuration; import org.cosyverif.Configuration;
import org.cosyverif.model.Model; import org.cosyverif.model.Model;
import org.cosyverif.model.Node; import org.cosyverif.model.Node;
import org.cosyverif.model.Arc;
import org.cosyverif.model.Attribute; import org.cosyverif.model.Attribute;
@Getter(AccessLevel.PUBLIC) @Getter(AccessLevel.PUBLIC)
...@@ -25,7 +31,7 @@ import org.cosyverif.model.Attribute; ...@@ -25,7 +31,7 @@ import org.cosyverif.model.Attribute;
public class GrmlParser { public class GrmlParser {
private Model model; private Model model;
private Map<String, ADTreeNode> mapNodes = new HashMap<String, ADTreeNode>(); private HashMap<String, ADTreeNode> mapNodes = new HashMap<String, ADTreeNode>();
private GrmlParser(Model model) { private GrmlParser(Model model) {
this.model = model; this.model = model;
...@@ -46,28 +52,86 @@ public class GrmlParser { ...@@ -46,28 +52,86 @@ public class GrmlParser {
fw = new FileWriter(fileOutput); fw = new FileWriter(fileOutput);
bw = new BufferedWriter(fw); bw = new BufferedWriter(fw);
/* parsing */ /** Parsing root node */
String root = "";
for (Attribute attr : model.getAttribute()) {
if (attr.getName().equals("root") && attr.getContent().size() == 1) {
root = (String) attr.getContent().get(0);
}
}
/* parsing nodes */
for (Node node : model.getNode()) { for (Node node : model.getNode()) {
bw.write("Type: "); HashMap<String, String> attrs = new HashMap<String, String>();
bw.write(node.getNodeType()); String id = node.getId().toString();
bw.newLine();
// default values of attributes
attrs.put("time", "0");
attrs.put("cost", "0");
ADTreeNode adtreeNode = new ADTreeNode(node.getId().toString()); attrs.put("type", node.getNodeType());
// Parse attributes
for (Object content : node.getNodeContent()) { for (Object content : node.getNodeContent()) {
if (content instanceof Attribute) { if (content instanceof Attribute) {
val attr = Attribute.class.cast(content); val attr = Attribute.class.cast(content);
bw.write("name: ");
bw.write(attr.getName()); String attributeName = attr.getName();
bw.newLine(); List<Object> attributeContent = attr.getContent();
// bw.write(attr.getContent().toString());
if (attributeContent.size() == 0) {
throw new Exception("Empty Attribute");
} else if (attributeContent.size() == 1) {
String value = (String) attributeContent.get(0);
attrs.put(attributeName, value);
} else if (attributeName.equals("attributes")) {
attrs.putAll(getAttributes(attr));
}
} }
} }
bw.newLine(); // create ADTree Node
bw.newLine(); ADTreeNode adtreeNode = new ADTreeNode(id, attrs.get("type").toLowerCase(),
attrs.get("name").replaceAll("\\s+", "_"), attrs.get("role").toLowerCase(), attrs.get("time"),
attrs.get("cost"), new ArrayList<String>());
mapNodes.put(id, adtreeNode);
}
/* parsing arcs */
for (Arc arc : model.getArc()) {
if (arc.getArcType().equals("arc")) {
String source = arc.getSource().toString();
String target = arc.getTarget().toString();
mapNodes.get(source).addChild(target);
}
}
/** Create ADT2AMAS input file */
bw.write(mapNodes.get(root).name() + "\n");
for (Map.Entry element : mapNodes.entrySet()) {
ADTreeNode node = (ADTreeNode) element.getValue();
bw.write("\n" + node.name() + " " + node.type() + " " + node.role() + " " + node.cost() + " " + node.time());
} }
} catch (IOException e) { bw.newLine();
Queue<String> queue = new ArrayDeque<String>();
queue.add(root);
while (!queue.isEmpty()) {
String node = queue.remove();
ArrayList<String> children = mapNodes.get(node).chidlren();
if (!children.isEmpty()) {
queue.addAll(children);
bw.write("\n" + mapNodes.get(node).name());
for (String child : children) {
bw.write(" " + mapNodes.get(child).name());
}
}
}
bw.write("\n\n");
} catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
if (bw != null) bw.close(); if (bw != null) bw.close();
...@@ -76,29 +140,77 @@ public class GrmlParser { ...@@ -76,29 +140,77 @@ public class GrmlParser {
return fileOutput; return fileOutput;
} }
private HashMap<String, String> getAttributes(Attribute node) {
HashMap<String, String> attrs = new HashMap<String, String>();
// Group of attributes
for (Object object : node.getContent()) {
if (object instanceof Attribute) {
val attribute = Attribute.class.cast(object);
List<Object> attributeContent = attribute.getContent();
// it's a valid ADTree attribute
if (attribute.getName().equals("attribute")) {
HashMap<String, String> tmp = new HashMap<String, String>();
for (Object attrObject : attributeContent) {
if (attrObject instanceof Attribute) {
val attrInfo = Attribute.class.cast(attrObject);
List<Object> attrContent = attrInfo.getContent();
// well-formed attribute
if (attrContent.size() == 1) {
tmp.put(attrInfo.getName(), (String) attrContent.get(0));
}
}
}
// save attribute
if (tmp.containsKey("name") && tmp.containsKey("value")) {
attrs.put(tmp.get("name"), tmp.get("value"));
}
}
}
}
return attrs;
}
} }
@AllArgsConstructor @AllArgsConstructor
@Getter(AccessLevel.PUBLIC) @Getter(AccessLevel.PUBLIC)
@Setter(AccessLevel.PUBLIC) @Setter(AccessLevel.PUBLIC)
@Accessors(chain = true, @Accessors(chain = true,
fluent = true) fluent = true)
class ADTreeNode { class ADTreeNode {
/** Identifier of the node */ /** Identifier of the node */
private int id; private String id;
/** Type of the node */ /** Type of the node */
private String type; private String type;
/** Name of the node */ /** Name of the node */
private String name = ""; private String name;
/** Role of the node */ /** Role of the node */
private String role = "ATTACK"; private String role;
/** Cost attribute of the node */ /** Time attribute of the node */
private double time = 0; private String time;
/** Cost attribute of the node */ /** Cost attribute of the node */
private double cost = 0; private String cost;
/** Children of the node */
private ArrayList<String> chidlren;
/**
* Add a new child to the node
*
* @param child new child
*/
public void addChild(String child) {
this.chidlren.add(child);
}
} }
TS
b leaf attack 500 60
f leaf attack 100 120
h leaf attack 500 3
e leaf attack 0 10
p leaf defence 100 10
GA or attack 0 0
ST and attack 0 2
TF sand attack 0 0
TS nand attack 0 0
TS TF p
TF ST GA
ST b f
GA h e
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment