Skip to content

Commit d097b37

Browse files
author
a-shokri
committed
Adding supports for ArCode Plugin
1 parent b16b8c1 commit d097b37

26 files changed

Lines changed: 869 additions & 407 deletions

Implementation/arcode/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<groupId>edu.rit.se.design.programsynthesis</groupId>
88
<artifactId>arcode</artifactId>
99
<packaging>jar</packaging>
10-
<version>1.0-SNAPSHOT</version>
10+
<version>1.1.1-SNAPSHOT</version>
1111

1212
<properties>
1313
<maven.compiler.source>8</maven.compiler.source>
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package edu.rit.se.design.arcode.fspec2code;
2+
3+
import edu.rit.se.design.arcode.fspecminer.util.graph.DirectedGraph;
4+
import edu.rit.se.design.arcode.fspecminer.util.graph.DirectedGraphNode;
5+
import org.apache.commons.lang3.tuple.Pair;
6+
7+
import java.util.HashSet;
8+
import java.util.Set;
9+
10+
/**
11+
* @author Ali Shokri (as8308@rit.edu)
12+
*/
13+
14+
public abstract class AbstractCodeGenerator<T extends DirectedGraph, E extends DirectedGraphNode> {
15+
static final String TAB = " ";
16+
protected ClassHierarchyUtil classHierarchyUtil;
17+
18+
public AbstractCodeGenerator(ClassHierarchyUtil classHierarchyUtil ){
19+
this.classHierarchyUtil = classHierarchyUtil;
20+
}
21+
22+
public StringBuilder generateCode(String classComments, String methodName, T directedGraph, E graphNode) throws CodeGenerationException {
23+
SymbolTable symbolTable = new SymbolTable();
24+
StringBuilder classSignature = generateClassSignature( "", classComments );
25+
StringBuilder methodBody = generateMethodBody(TAB, directedGraph, graphNode, symbolTable);
26+
StringBuilder methodSignature = generateMethodSignature("", classComments,/*"_" + (++generatedCodeCounter)*/ methodName, symbolTable );
27+
28+
StringBuilder generatedCode = new StringBuilder();
29+
// generatedCode.append( classSignature );
30+
generatedCode.append( methodSignature ).append( methodBody );
31+
generatedCode.append( "}\n" );
32+
33+
return generatedCode;
34+
}
35+
36+
StringBuilder generateClassSignature( String indention, String classComments ){
37+
StringBuilder classSignature = new StringBuilder();
38+
classSignature.append( indention + "/*" + classComments + "*/\n");
39+
classSignature.append( indention + "public class JaasPractice{\n");
40+
return classSignature;
41+
}
42+
43+
StringBuilder generateMethodSignature( String indention, String methodComment, String methodName, SymbolTable symbolTable){
44+
StringBuilder methodSignature = new StringBuilder("/*" + methodComment + "*/\n" + indention +
45+
"public void " + methodName + "(");
46+
StringBuilder arguments = new StringBuilder();
47+
symbolTable.getAllObjects().forEach( o -> {
48+
Pair<String, String> classNameVarName = getClassNameVarName( o, symbolTable );
49+
String className = classNameVarName.getLeft();
50+
String varName = classNameVarName.getRight();
51+
if( className != null ){
52+
if( arguments.length() > 0 )
53+
arguments.append( ", " );
54+
arguments.append( className + " " + varName );
55+
}
56+
} );
57+
58+
methodSignature.append( arguments );
59+
methodSignature.append("){\n");
60+
return methodSignature ;
61+
}
62+
63+
abstract protected Pair getClassNameVarName(Object object, SymbolTable symbolTable );
64+
65+
StringBuilder generateMethodBody( String indention, T directedGraph, E graphNode, SymbolTable symbolTable) throws CodeGenerationException {
66+
StringBuilder generatedCode = new StringBuilder( indention + "try{\n");
67+
68+
Set<E> generatedDirectedGraphNodes = new HashSet<>();
69+
generateCode( generatedCode, indention + TAB, directedGraph, graphNode, symbolTable, generatedDirectedGraphNodes );
70+
generatedCode.append( indention + "} catch(Exception e){\n" + indention + TAB + "e.printStackTrace();\n" + indention + "}\n" );
71+
72+
return generatedCode;
73+
}
74+
75+
void generateCode( StringBuilder generatedCode, String indention, T directedGraph, E graphNode, SymbolTable symbolTable, Set<E> generatedDirectedGraphNodes ) throws CodeGenerationException {
76+
if( generatedDirectedGraphNodes.contains( graphNode ) )
77+
return;
78+
for( Object graphNodePredObj : directedGraph.getPredNodes( graphNode ) ){
79+
E graphNodePred = (E) graphNodePredObj;
80+
generateCode( generatedCode, indention, directedGraph, graphNodePred, symbolTable, generatedDirectedGraphNodes );
81+
}
82+
String line = "";
83+
84+
AbstractNodeCodeGenerator nodeCodeGenerator = NodeCodeGeneratorFactory.getNodeCodeGenerator( graphNode );
85+
86+
line += nodeCodeGenerator.generateCode( directedGraph, graphNode, symbolTable, classHierarchyUtil );
87+
88+
generatedCode.append( (line.length() > 0 ? indention : "" ) + line + (line.length() > 0 ? ";\n" : "" ) );
89+
generatedDirectedGraphNodes.add( graphNode );
90+
}
91+
92+
93+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package edu.rit.se.design.arcode.fspec2code;
2+
3+
import edu.rit.se.design.arcode.fspecminer.util.graph.DirectedGraph;
4+
import edu.rit.se.design.arcode.fspecminer.util.graph.DirectedGraphNode;
5+
import java.util.HashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
import java.util.stream.Collectors;
9+
import java.util.stream.StreamSupport;
10+
11+
/**
12+
* @author Ali Shokri (as8308@rit.edu)
13+
*/
14+
15+
// T: FSpec, GRAAM
16+
// G: FSpecNode, DirectedGraphNode
17+
// E: FSPecAPINode, FSpecInitNode, ...
18+
public abstract class AbstractNodeCodeGenerator<T extends DirectedGraph, G extends DirectedGraphNode, E extends DirectedGraphNode> {
19+
public abstract String generateCode(T directedGraph, E directedGraphNode, SymbolTable symbolTable, ClassHierarchyUtil classHierarchyUtil) throws CodeGenerationException;
20+
protected abstract String findDirectedGraphNodeClassName(G node);
21+
protected abstract boolean definesSymbol(E directedGraphNode );
22+
protected abstract boolean considerDirectedGraphNodeForArgumentMap( G node );
23+
24+
protected String getTypeSimpleName(String type ){
25+
if( type.equals("I") )
26+
return "int";
27+
if( type.equals("Z") )
28+
return "boolean";
29+
30+
String simpleName = type.substring(1).replaceAll("/", ".");
31+
return simpleName;
32+
}
33+
34+
35+
protected String createArgumentVariable( String argumentType, SymbolTable symbolTable ) {
36+
try {
37+
argumentType = getTypeSimpleName( argumentType );
38+
// Object object = Class.forName(argumentType).newInstance();
39+
String variableName = symbolTable.createSymbol(argumentType);
40+
/*if( argumentType.replaceAll("/", ".").equals( "L" + "".getClass().getName() ) )
41+
return "\"to_be_provided_by_user\"";*/
42+
return variableName;
43+
}catch (Exception e){
44+
return null;
45+
}
46+
}
47+
48+
protected Map<String, G> createArgumentsMap(List<String> arguments, Iterable<G> candidateDirectedGraphNodes, ClassHierarchyUtil classHierarchyUtil ){
49+
Map<String, G> map = new HashMap<>();
50+
// classHierarchyUtil.isSubclassOf("Ljava/rmi/server/UnicastRemoteObject", "Ljava/rmi/Remote");
51+
List<G> candidateGraphNodeList = StreamSupport.stream( candidateDirectedGraphNodes.spliterator(), false ).collect(Collectors.toList());
52+
arguments.forEach( argument -> {
53+
for( int i = 0; i < candidateGraphNodeList.size(); i++ ){
54+
G candidateDirectedGraphNode = candidateGraphNodeList.get(i);
55+
if( !considerDirectedGraphNodeForArgumentMap(candidateDirectedGraphNode) )
56+
continue;
57+
58+
String candidateDirectedGraphNodeClass = findDirectedGraphNodeClassName( candidateDirectedGraphNode );
59+
if( candidateDirectedGraphNodeClass.equals( argument ) ){
60+
map.put(argument, candidateGraphNodeList.get(i));
61+
break;
62+
}
63+
}
64+
if( map.get( argument ) != null )
65+
candidateGraphNodeList.remove(map.get(argument));
66+
67+
} );
68+
69+
//If there is an argument unmapped, then, if its type is object and there exists a candidateNodes, then, map them together.
70+
arguments.forEach( argument -> {
71+
if( !map.keySet().contains( argument ) ){
72+
for( int i = 0; i < candidateGraphNodeList.size(); i++ ){
73+
G candidateDirectedGraphNode = candidateGraphNodeList.get(i);
74+
if( !considerDirectedGraphNodeForArgumentMap(candidateDirectedGraphNode) )
75+
continue;
76+
77+
String candidateDirectedGraphNodeClass = findDirectedGraphNodeClassName(candidateDirectedGraphNode);
78+
if( classHierarchyUtil.isSubclassOf( candidateDirectedGraphNodeClass , argument ) ){
79+
map.put(argument, candidateGraphNodeList.get(i));
80+
break;
81+
}
82+
}
83+
if( map.get( argument ) != null )
84+
candidateGraphNodeList.remove(map.get(argument));
85+
}
86+
} );
87+
return map;
88+
}
89+
90+
}

Implementation/arcode/src/main/java/edu/rit/se/design/arcode/fspec2code/CodeGenerator.java

Lines changed: 0 additions & 194 deletions
This file was deleted.

0 commit comments

Comments
 (0)