Skip to content
Snippets Groups Projects
Commit 32f2d467 authored by Johannes Ohlemacher's avatar Johannes Ohlemacher
Browse files

splitted pattern into modules

parent deb7890c
Branches
No related tags found
No related merge requests found
...@@ -12,457 +12,94 @@ ...@@ -12,457 +12,94 @@
NOT EXISTS(mc1-[:AGGREGATED_CALLS|CALLS*]->()-[:AGGREGATED_FIELD_WRITE]->(:Field)<-[:AGGREGATED_FIELD_WRITE|AGGREGATED_FIELD_READ]-()<-[:AGGREGATED_CALLS|CALLS*]-(mc2)) AND NOT EXISTS(mc1-[:AGGREGATED_CALLS|CALLS*]->()-[:AGGREGATED_FIELD_WRITE]->(:Field)<-[:AGGREGATED_FIELD_WRITE|AGGREGATED_FIELD_READ]-()<-[:AGGREGATED_CALLS|CALLS*]-(mc2)) AND
NOT EXISTS(mc2-[:AGGREGATED_CALLS|CALLS*]->()-[:AGGREGATED_FIELD_WRITE]->(:Field)<-[:AGGREGATED_FIELD_WRITE|AGGREGATED_FIELD_READ]-()<-[:AGGREGATED_CALLS|CALLS*]-(mc1)) NOT EXISTS(mc2-[:AGGREGATED_CALLS|CALLS*]->()-[:AGGREGATED_FIELD_WRITE]->(:Field)<-[:AGGREGATED_FIELD_WRITE|AGGREGATED_FIELD_READ]-()<-[:AGGREGATED_CALLS|CALLS*]-(mc1))
MATCH (class:Class)-[:CONTAINS_METHOD]->(:Method)-[:CONTROL_FLOW*]->(mc1) MATCH (class:Class)-[:CONTAINS_METHOD]->(:Method)-[:CONTROL_FLOW*]->(mc1)
return ID(mc1) as mc1ID, ID(ma1) as ma1ID, ID(mc2) as mc2ID, class as display return ID(mc1) as mc1ID, ID(ma1) as ma1ID, ID(mc2) as mc2ID, ID(class) as classID, class as display
]]> ]]>
</query> </query>
</cp> </cp>
<ppversions> <ppversions>
<pp java="1.7" name="java 1.7 johl"> <pp java="1.7" name="java 1.7 johl">
<!-- declare task class type -->
<query src="subpatterns/declare_task.xml"/>
<!-- mark pervious node (before method call), to create fork join pool -->
<query> <query>
<![CDATA[ <![CDATA[
//get parent class and parent package MATCH ()-[c:CONTROL_FLOW]->(mc1) where ID(mc1)={mc1ID}
MATCH (mc1:MethodCall)-[:CALLS]->(:Method)<-[CONTAINS_METHOD]-(parentClass:Class)<-[:CONTAINS_TYPE]-(parentPackage:Package) where ID(mc1)={mc1ID} SET c.createForkJoinPool = true
]]>
MATCH (class:Class)-[:CONTAINS_METHOD]->(:Method)-[:CONTROL_FLOW*]->(mc1) </query>
<query src="subpatterns/create_forkjoinpool_java7.xml"/>
MATCH (mc2) where ID(mc2)={mc2ID}
MATCH (prev)-[in:CONTROL_FLOW]->(mc1)
MATCH (mc1)-[in2:CONTROL_FLOW]->(ma1)
MATCH (ma1)-[in3:CONTROL_FLOW]->(mc2)
MATCH (ma1)-[in4:DATA_FLOW]->(nextUsage)
MATCH (prevNextUsage)-[nextUsageCF:CONTROL_FLOW]->(nextUsage)
MATCH (nextUsage)-[:CONTROL_FLOW]->(nextNextUsage)
match (javaObjectConstructor:Constructor) where javaObjectConstructor.fqn='java.lang.Object.<init>()'
//The Java Runnable node does propably already exist.
MERGE (javaCallableInterface:Class {
fqn : 'java.util.concurrent.Callable',
origin : 'JAVA',
name : 'Callable',
type : 'Interface',
visibility: 'public'
})
//============================================================
// Declare Task Type
//============================================================
//==================== Task Class ============================
CREATE (taskClass:Class {
fqn : parentClass.fqn + '$%{Task}',
name : parentClass.name + '$%{Task}',
visibility: 'public',
origin: 'APP',
type: 'Class'
})
CREATE (parentPackage)-[:CONTAINS_TYPE]->(taskClass)
CREATE (parentClass)-[:CONTAINS]->(taskClass)
CREATE (taskClass)-[:IMPLEMENTS]->(javaCallableInterface)
//==================== Constructor 1 ==========================
CREATE (ctorMethod:Method:Constructor {
fqn : parentClass.fqn + '$%{Task}.<init>()',
visibility : 'private',
returntype : 'void',
parameterscount : 0,
isabstract : false,
isnative : false,
throws : [],
type : 'Method',
istatic : false,
isfinal : false,
isdeclared : true,
displayname : 'ctor()',
name : 'ctor'
})
CREATE (taskClass)-[:CONTAINS_CONSTRUCTOR]->(ctorMethod)
CREATE (ctor_1:Assignment {
vartype : parentClass.fqn + '$%{Task}',
var : 'this',
rightValue : '@this: ' + parentClass.fqn + '$%{Task}',
displayname : '@this: ' + parentClass.fqn + '$%{Task}',
name : 'this = @this: ' + parentClass.fqn + '$%{Task}',
type : 'Assignment',
operation : 'thisdeclaration'
})
CREATE (ctorMethod)-[:CONTROL_FLOW]->(ctor_1)
CREATE (ctor_2:MethodCall:ConstructorCall {
args : [],
caller : 'this',
fqn : 'java.lang.Object.<init>()',
argumentscount : 0,
displayname : '<init>()',
returntype : 'void',
name : 'super',
type : 'MethodCall'
})
CREATE (ctor_1)-[:CONTROL_FLOW]->(ctor_2)
CREATE (ctor_2)-[:CALLS]->(javaObjectConstructor)
CREATE( ctor_3:ReturnStmt {
displayname : 'return',
type : 'ReturnStmt'
})
CREATE (ctor_2)-[:CONTROL_FLOW]->(ctor_3)
//==================== Constructor 2 ==========================
//WTF? why do we need this?
CREATE (ctorMethod2:Method:Constructor {
p0 : parentClass.fqn + '$%{Task}$0',
fqn : parentClass.fqn + '$%{Task__.<init>(' + parentClass.fqn + '$__Task}$0)',
visibility : 'public',
returntype : 'void',
isabstract : false,
isnative : false,
parameterscount : 1,
throws : [],
type : 'Method',
istatic : false,
isdeclared : true,
isfinal : false,
displayname : 'ctor(' + parentClass.fqn + '$%{Task}$0)',
name : 'ctor',
returntype: 'void'
})
CREATE (taskClass)-[:CONTAINS_CONSTRUCTOR]->(ctorMethod2)
CREATE (ctor1:Assignment {
vartype : parentClass.fqn + '$%{Task}',
var : 'this',
rightValue : '@this: ' + parentClass.fqn + '$%{Task}',
displayname : 'this = @this: ' + parentClass.fqn + '$%{Task}',
type : 'Assignment',
operation : 'thisdeclaration'
})
CREATE (ctorMethod2)-[:CONTROL_FLOW]->(ctor1)
CREATE (ctor2:Assignment {
vartype : parentClass.fqn + '$%{Task}$0',
var : 'p0',
displayname : 'p0 = @parameter0: ' + parentClass.fqn + '$%{Task}$0',
rightValue : '@parameter0: ' + parentClass.fqn + '$%{Task}$0',
name : 'p0 = @parameter0: ' + parentClass.fqn + '$%{Task}',
type : 'Assignment',
operation : 'parameterdeclaration'
})
CREATE (ctor1)-[:CONTROL_FLOW]->(ctor2)
CREATE (ctor3:MethodCall:ConstructorCall {
args : [],
fqn : parentClass.fqn + '$%{Task}.<init>()',
caller : 'this',
argumentscount : 0,
displayname : '<init>()',
returntype : 'void',
name : 'this',
type : 'MethodCall'
})
CREATE (ctor2)-[:CONTROL_FLOW]->(ctor3)
CREATE (ctor3)-[:CALLS]->(ctorMethod)
CREATE( ctor4:ReturnStmt {
displayname : 'return',
type : 'ReturnStmt'
})
CREATE (ctor3)-[:CONTROL_FLOW]->(ctor4)
//==================== Call1 Method ==========================
CREATE (taskCall1:Method {
fqn : parentClass.fqn + '$%{Task}.call()',
name : 'call' ,
displayname : 'call()',
visibility : 'public',
returntype : mc1.returntype,
isabstract : false,
isnative : false,
istatic : false,
isdeclared: true,
parameterscount : 0,
throws : '',
type : 'Method'
})
CREATE (taskClass)-[:CONTAINS_METHOD]->(taskCall1)
CREATE (call1_1:Assignment {
vartype : parentClass.fqn + '$%{Task}',
var : 'this',
displayname : 'this = @this: ' + parentClass.fqn + '$%{Task}',
rightValue : '@this: ' + parentClass.fqn + '$%{Task}',
type : 'Assignment',
operation : 'thisdeclaration'
})
CREATE (taskCall1)-[:CONTROL_FLOW]->(call1_1)
CREATE( call1_2:Assignment:MethodCall {
args : [],
fqn : mc1.fqn,
caller : parentClass.fqn,
vartype : mc1.vartype,
argumentscount : 0,
var : mc1.var,
displayname : mc1.displayname,
returntype : mc1.returntype,
name : mc1.name,
type : 'Assignment',
operation : 'MethodCall',
rightValue : 'staticInvoke <' + parentClass.fqn + ': ' + mc1.returntype + ' ' + mc1.name + '()>()'
})
CREATE (call1_1)-[:CONTROL_FLOW]->(call1_2)
CREATE( call1_3:ReturnStmt {
name : 'return',
type : 'ReturnStmt'
})
CREATE (call1_2)-[:CONTROL_FLOW]->(call1_3)
//==================== Call2 Method ==========================
CREATE (taskCall2:Method {
fqn : parentClass.fqn + '$%{Task}.call()',
name : 'call' ,
displayname : 'call()',
visibility : 'public',
returntype : 'java.lang.Object',
isabstract : false,
isnative : false,
istatic : false,
isdeclared: true,
parameterscount : 0,
throws : 'java.lang.Exception',
type : 'Method'
})
CREATE (taskClass)-[:CONTAINS_METHOD]->(taskCall2)
CREATE (call2_1:Assignment {
vartype : parentClass.fqn + '$%{Task}',
var : 'this',
displayname : 'this = @this: ' + parentClass.fqn + '$%{Task}',
rightValue : '@this: ' + parentClass.fqn + '$%{Task}',
type : 'Assignment',
operation : 'thisdeclaration'
})
CREATE (taskCall2)-[:CONTROL_FLOW]->(call2_1)
CREATE( call2_2:Assignment:MethodCall {
args : [],
fqn : parentClass.fqn + '$%{Task}.call()',
caller : parentClass.fqn,
vartype : mc1.vartype,
argumentscount : 0,
var : 'temp$0',
displayname : 'temp$0 = call()',
returntype : mc1.returntype,
name : 'call',
type : 'Assignment',
operation : 'MethodCall',
rightValue : 'virtualinvoke this.<' + parentClass.fqn + ' ' + mc1.returntype + ' call()>()'
})
CREATE (call2_1)-[:CONTROL_FLOW]->(call2_2)
CREATE (call2_2)-[:CALLS]->(taskCall1)
CREATE( call2_3:ReturnStmt {
name : 'return temp$0',
type : 'ReturnStmt',
rightValue : 'temp$0'
})
CREATE (call2_2)-[:CONTROL_FLOW]->(call2_3)
//============================================================
// Create Pool Object
//============================================================
CREATE (poolTempAssign:Assignment {
operation : 'new',
var : 'temp$1',
vartype : 'java.util.concurrent.ForkJoinPool',
type : 'Assignment',
rightValue : 'new java.util.concurrent.ForkJoinPool',
displayname : 'temp$1 = new java.util.concurrent.ForkJoinPool'
})
CREATE (prev)-[:CONTROL_FLOW]->(poolTempAssign)
CREATE( poolTempCtor:MethodCall:ConstructorCall {
fqn : 'java.util.concurrent.ForkJoinPool.<init>()',
caller : 'temp$1',
args: [],
argumentscount : 0,
name : '<init>',
type : 'MethodCall',
displayname : '<init>()',
returntype : 'void'
})
CREATE (poolTempAssign)-[:CONTROL_FLOW]->(poolTempCtor)
CREATE( poolVarAssign:Assignment {
vartype : 'java.util.concurrent.ForkJoinPool',
var : '%{PoolVar}',
rightValue : 'temp$1',
type : 'Assignment',
operation : 'value',
isdeclaration: true,
displayname : '%{PoolVar} = temp$1'
})
CREATE (poolTempCtor)-[:CONTROL_FLOW]->(poolVarAssign)
//============================================================
// Create Task Object
//============================================================
CREATE (taskTempAssign:Assignment {
operation : 'new',
var : 'temp$0',
vartype : parentClass.fqn + '$%{Task}',
type : 'Assignment',
rightValue : 'new ' + parentClass.fqn + '$%{Task}',
displayname : 'temp$0 = new ' + parentClass.fqn + '$%{Task}'
})
CREATE (poolVarAssign)-[:CONTROL_FLOW]->(taskTempAssign)
CREATE( taskTempCtor:MethodCall:ConstructorCall {
fqn : parentClass.fqn + '$%{Task__.<init>(' + parentClass.fqn + '$__Task}',
caller : 'temp$0',
argumentscount : 1,
args: [],
name : '<init>',
type : 'MethodCall',
displayname : '<init>(null)',
returntype : 'void'
})
CREATE (taskTempAssign)-[:CONTROL_FLOW]->(taskTempCtor)
CREATE (taskTempCtor)-[:CALLS]->(ctorMethod2)
CREATE( taskVarAssign:Assignment {
vartype : parentClass.fqn + '$%{Task}',
var : '%{TaskVar}',
rightValue : 'temp$0',
type : 'Assignment',
operation : 'value',
isdeclaration: true,
displayname : '%{TaskVar} = temp$0'
})
CREATE (taskTempCtor)-[:CONTROL_FLOW]->(taskVarAssign)
//============================================================
// Submit task to pool
//============================================================
CREATE( submitTemp:Assignment:MethodCall {
caller : '%{PoolVar}',
fqn : 'java.util.concurrent.ForkJoinPool.submit(java.lang.Runnable)',
operation : 'MethodCall',
var : 'temp$2',
args : [ '%{TaskVar}' ],
name : 'submit',
vartype : 'java.util.concurrent.ForkJoinTask',
type : 'Assignment',
rightValue : 'virtualinvoke pool.<java.util.concurrent.ForkJoinPool: java.util.concurrent.ForkJoinTask submit(java.lang.Runnable)>(%{TaskVar})',
argumentscount : 1,
displayname : '%{PoolVar} = temp$1',
returntype : 'java.util.concurrent.ForkJoinTask'
})
CREATE (taskVarAssign)-[:CONTROL_FLOW]->(submitTemp)
CREATE( submitVar:Assignment {
operation : 'value',
var : '%{SubmitVar}',
vartype: 'java.util.concurrent.ForkJoinTask',
isdeclaration : true,
type : 'Assignment',
rightValue: 'temp$2',
lefttypearguments: [ '?' ],
displayname : '%{SubmitVar} = temp$2'
})
CREATE (submitTemp)-[:CONTROL_FLOW]->(submitVar)
CREATE (submitVar)-[:CONTROL_FLOW]->(mc2) <!-- mark pervious node (before method call), to create task instance -->
<query>
<![CDATA[
MATCH ()-[c:CONTROL_FLOW]->(mc1) where ID(mc1)={mc1ID}
SET c.createTask = true
]]>
</query>
<query src="subpatterns/create_task.xml"/>
<query>
<![CDATA[
MATCH ()-[c:CONTROL_FLOW]->(mc1) where ID(mc1)={mc1ID}
SET c.submitTask = true
]]>
</query>
<query src="subpatterns/submit_task.xml"/>
<query>
<![CDATA[
MATCH (mc1) where ID(mc1)={mc1ID}
MATCH (ma1) where ID(ma1)={ma1ID}
MATCH (mc2) where ID(mc2)={mc2ID}
MATCH ()-[in_mc1:CONTROL_FLOW]->(mc1)
MATCH ()-[in_mc2:CONTROL_FLOW]->(mc2)
//============================================================ MATCH (ma1)-[:DATA_FLOW]->()<-[nextUsageCF:CONTROL_FLOW]-()
// Join submitted task
//============================================================
WITH mc1, mc2, ma1, nextUsageCF, in_mc1, in_mc2
CREATE( join:MethodCall:Assignment { MATCH (submit:Assignment) where submit.submitEnd=true
caller : '%{SubmitVar}',
fqn : 'java.util.concurrent.ForkJoinTask.join()',
args : [],
name : 'join',
type : 'MethodCall',
argumentscount : 0,
displayname : mc1.var + ' = join()',
returntype : 'java.lang.Object',
operation : 'MethodCall' ,
var : mc1.var,
vartype : 'java.lang.Object',
type : 'Assignment',
rightValue : 'virtualinvoke %{SubmitVar}.<java.util.concurrent.ForkJoinTask: java.lang.Object join()>()'
})
CREATE( joinCast:MethodCall:Assignment { CREATE (submit)-[:CONTROL_FLOW]->(mc2)
operation : 'cast', SET nextUsageCF.joinTask = true
var : 'temp$%{unique1}',
vartype : ma1.vartype,
type : 'Assignment',
rightValue : '(java.lang.Integer) ' + mc1.var,
displayname : ma1.var + ' = (java.lang.Integer)' + mc1.var
})
CREATE( joinAssign:Assignment { DELETE in_mc1, in_mc2
operation : 'value', ]]>
var : ma1.var, </query>
vartype : ma1.vartype,
type : 'Assignment',
rightValue : 'temp$%{unique1}',
displayname : ma1.var + ' = temp$%{unique1}',
isdeclaration : ma1.isdeclaration
})
CREATE (prevNextUsage)-[:CONTROL_FLOW]->(join) <query src="subpatterns/join_task.xml"/>
CREATE (join)-[:CONTROL_FLOW]->(joinCast)
CREATE (joinCast)-[:CONTROL_FLOW]->(joinAssign)
CREATE (joinAssign)-[:CONTROL_FLOW]->(nextUsage)
delete nextUsageCF, in, in, in3, in4 <query>
<![CDATA[
OPTIONAL MATCH ()-[createPool]->() where createPool.createForkJoinPool=true REMOVE createPool.createForkJoinPool
WITH createPool
OPTIONAL MATCH ()-[createTask]->() where createTask.createTask=true REMOVE createTask.createTask
WITH createTask
OPTIONAL MATCH ()-[submitTask]->() where submitTask.submitTask=true REMOVE submitTask.submitTask
WITH submitTask
OPTIONAL MATCH ()-[joinTask]->() where joinTask.joinTask=true REMOVE joinTask.joinTask
WITH joinTask
OPTIONAL MATCH (classDecl) where classDecl.generatedTaskClassType=true REMOVE classDecl.generatedTaskClassType
WITH classDecl
OPTIONAL MATCH (classCtor) where classCtor.generatedTaskClassCtor=true REMOVE classCtor.generatedTaskClassCtor
WITH classCtor
OPTIONAL MATCH (task) where task.taskEnd=true REMOVE task.taskEnd
WITH task
OPTIONAL MATCH (pool) where pool.forkJoinPoolEnd=true REMOVE pool.forkJoinPoolEnd
WITH pool
OPTIONAL MATCH (submit) where submit.submitEnd=true REMOVE submit.submitEnd
WITH submit
OPTIONAL MATCH (join) where join.joinEnd=true REMOVE join.joinEnd
]]>
</query>
return mc1 as display <query>
<![CDATA[
MATCH (class)
WHERE id(class) = {classID}
return class as display
]]> ]]>
</query> </query>
</pp> </pp>
......
<?xml version="1.0" encoding="UTF-8"?>
<pattern>
<name>Parallel Methods (Value)</name>
<description>No return value, no arguments</description>
<cp>
<query>
<![CDATA[
//just for debugging, find control flow starting at main: MATCH (n)-[cf:CONTROL_FLOW*]->() where n.fqn=~'.*main.*' return n, cf
match (mc1:Assignment:MethodCall)-[:CONTROL_FLOW]->(ma1:Assignment)-[:CONTROL_FLOW]->(mc2:MethodCall)
WHERE
NOT EXISTS(mc1-[:AGGREGATED_CALLS|CALLS*]->()-[:AGGREGATED_FIELD_WRITE]->(:Field)<-[:AGGREGATED_FIELD_WRITE|AGGREGATED_FIELD_READ]-()<-[:AGGREGATED_CALLS|CALLS*]-(mc2)) AND
NOT EXISTS(mc2-[:AGGREGATED_CALLS|CALLS*]->()-[:AGGREGATED_FIELD_WRITE]->(:Field)<-[:AGGREGATED_FIELD_WRITE|AGGREGATED_FIELD_READ]-()<-[:AGGREGATED_CALLS|CALLS*]-(mc1))
MATCH (class:Class)-[:CONTAINS_METHOD]->(:Method)-[:CONTROL_FLOW*]->(mc1)
return ID(mc1) as mc1ID, ID(ma1) as ma1ID, ID(mc2) as mc2ID, class as display
]]>
</query>
</cp>
<ppversions>
<pp java="1.7" name="java 1.7 johl">
<query>
<![CDATA[
//get parent class and parent package //get parent class and parent package
MATCH (mc1:MethodCall)-[:CALLS]->(:Method)<-[CONTAINS_METHOD]-(parentClass:Class)<-[:CONTAINS_TYPE]-(parentPackage:Package) where ID(mc1)=24 MATCH (mc1:MethodCall)-[:CALLS]->(:Method)<-[CONTAINS_METHOD]-(parentClass:Class)<-[:CONTAINS_TYPE]-(parentPackage:Package) where ID(mc1)={mc1ID}
MATCH (class:Class)-[:CONTAINS_METHOD]->(:Method)-[:CONTROL_FLOW*]->(mc1) MATCH (class:Class)-[:CONTAINS_METHOD]->(:Method)-[:CONTROL_FLOW*]->(mc1)
MATCH (mc2) where ID(mc2)=26 MATCH (mc2) where ID(mc2)={mc2ID}
MATCH (prev)-[in:CONTROL_FLOW]->(mc1) MATCH (prev)-[in:CONTROL_FLOW]->(mc1)
MATCH (mc1)-[in2:CONTROL_FLOW]->(ma1) MATCH (mc1)-[in2:CONTROL_FLOW]->(ma1)
MATCH (ma1)-[in3:CONTROL_FLOW]->(mc2) MATCH (ma1)-[in3:CONTROL_FLOW]->(mc2)
...@@ -28,8 +51,8 @@ MERGE (javaCallableInterface:Class { ...@@ -28,8 +51,8 @@ MERGE (javaCallableInterface:Class {
//==================== Task Class ============================ //==================== Task Class ============================
CREATE (taskClass:Class { CREATE (taskClass:Class {
fqn : parentClass.fqn + '$__Task__', fqn : parentClass.fqn + '$%{Task}',
name : parentClass.name + '$__Task__', name : parentClass.name + '$%{Task}',
visibility: 'public', visibility: 'public',
origin: 'APP', origin: 'APP',
type: 'Class' type: 'Class'
...@@ -40,7 +63,7 @@ CREATE (taskClass)-[:IMPLEMENTS]->(javaCallableInterface) ...@@ -40,7 +63,7 @@ CREATE (taskClass)-[:IMPLEMENTS]->(javaCallableInterface)
//==================== Constructor 1 ========================== //==================== Constructor 1 ==========================
CREATE (ctorMethod:Method:Constructor { CREATE (ctorMethod:Method:Constructor {
fqn : parentClass.fqn + '$__Task__.<init>()', fqn : parentClass.fqn + '$%{Task}.<init>()',
visibility : 'private', visibility : 'private',
returntype : 'void', returntype : 'void',
parameterscount : 0, parameterscount : 0,
...@@ -58,11 +81,11 @@ CREATE (ctorMethod:Method:Constructor { ...@@ -58,11 +81,11 @@ CREATE (ctorMethod:Method:Constructor {
CREATE (taskClass)-[:CONTAINS_CONSTRUCTOR]->(ctorMethod) CREATE (taskClass)-[:CONTAINS_CONSTRUCTOR]->(ctorMethod)
CREATE (ctor_1:Assignment { CREATE (ctor_1:Assignment {
vartype : parentClass.fqn + '$__Task__', vartype : parentClass.fqn + '$%{Task}',
var : 'this', var : 'this',
rightValue : '@this: ' + parentClass.fqn + '$__Task__', rightValue : '@this: ' + parentClass.fqn + '$%{Task}',
displayname : '@this: ' + parentClass.fqn + '$__Task__', displayname : '@this: ' + parentClass.fqn + '$%{Task}',
name : 'this = @this: ' + parentClass.fqn + '$__Task__', name : 'this = @this: ' + parentClass.fqn + '$%{Task}',
type : 'Assignment', type : 'Assignment',
operation : 'thisdeclaration' operation : 'thisdeclaration'
}) })
...@@ -94,8 +117,8 @@ CREATE (ctor_2)-[:CONTROL_FLOW]->(ctor_3) ...@@ -94,8 +117,8 @@ CREATE (ctor_2)-[:CONTROL_FLOW]->(ctor_3)
//==================== Constructor 2 ========================== //==================== Constructor 2 ==========================
//WTF? why do we need this? //WTF? why do we need this?
CREATE (ctorMethod2:Method:Constructor { CREATE (ctorMethod2:Method:Constructor {
p0 : parentClass.fqn + '$__Task__$0', p0 : parentClass.fqn + '$%{Task}$0',
fqn : parentClass.fqn + '$__Task__.<init>(' + parentClass.fqn + '$__Task__$0)', fqn : parentClass.fqn + '$%{Task__.<init>(' + parentClass.fqn + '$__Task}$0)',
visibility : 'public', visibility : 'public',
returntype : 'void', returntype : 'void',
isabstract : false, isabstract : false,
...@@ -106,7 +129,7 @@ CREATE (ctorMethod2:Method:Constructor { ...@@ -106,7 +129,7 @@ CREATE (ctorMethod2:Method:Constructor {
istatic : false, istatic : false,
isdeclared : true, isdeclared : true,
isfinal : false, isfinal : false,
displayname : 'ctor(' + parentClass.fqn + '$__Task__$0)', displayname : 'ctor(' + parentClass.fqn + '$%{Task}$0)',
name : 'ctor', name : 'ctor',
returntype: 'void' returntype: 'void'
}) })
...@@ -114,10 +137,10 @@ CREATE (ctorMethod2:Method:Constructor { ...@@ -114,10 +137,10 @@ CREATE (ctorMethod2:Method:Constructor {
CREATE (taskClass)-[:CONTAINS_CONSTRUCTOR]->(ctorMethod2) CREATE (taskClass)-[:CONTAINS_CONSTRUCTOR]->(ctorMethod2)
CREATE (ctor1:Assignment { CREATE (ctor1:Assignment {
vartype : parentClass.fqn + '$__Task__', vartype : parentClass.fqn + '$%{Task}',
var : 'this', var : 'this',
rightValue : '@this: ' + parentClass.fqn + '$__Task__', rightValue : '@this: ' + parentClass.fqn + '$%{Task}',
displayname : 'this = @this: ' + parentClass.fqn + '$__Task__', displayname : 'this = @this: ' + parentClass.fqn + '$%{Task}',
type : 'Assignment', type : 'Assignment',
operation : 'thisdeclaration' operation : 'thisdeclaration'
}) })
...@@ -125,11 +148,11 @@ CREATE (ctor1:Assignment { ...@@ -125,11 +148,11 @@ CREATE (ctor1:Assignment {
CREATE (ctorMethod2)-[:CONTROL_FLOW]->(ctor1) CREATE (ctorMethod2)-[:CONTROL_FLOW]->(ctor1)
CREATE (ctor2:Assignment { CREATE (ctor2:Assignment {
vartype : parentClass.fqn + '$__Task__$0', vartype : parentClass.fqn + '$%{Task}$0',
var : 'p0', var : 'p0',
displayname : 'p0 = @parameter0: ' + parentClass.fqn + '$__Task__$0', displayname : 'p0 = @parameter0: ' + parentClass.fqn + '$%{Task}$0',
rightValue : '@parameter0: ' + parentClass.fqn + '$__Task__$0', rightValue : '@parameter0: ' + parentClass.fqn + '$%{Task}$0',
name : 'p0 = @parameter0: ' + parentClass.fqn + '$__Task__', name : 'p0 = @parameter0: ' + parentClass.fqn + '$%{Task}',
type : 'Assignment', type : 'Assignment',
operation : 'parameterdeclaration' operation : 'parameterdeclaration'
}) })
...@@ -138,7 +161,7 @@ CREATE (ctor1)-[:CONTROL_FLOW]->(ctor2) ...@@ -138,7 +161,7 @@ CREATE (ctor1)-[:CONTROL_FLOW]->(ctor2)
CREATE (ctor3:MethodCall:ConstructorCall { CREATE (ctor3:MethodCall:ConstructorCall {
args : [], args : [],
fqn : parentClass.fqn + '$__Task__.<init>()', fqn : parentClass.fqn + '$%{Task}.<init>()',
caller : 'this', caller : 'this',
argumentscount : 0, argumentscount : 0,
displayname : '<init>()', displayname : '<init>()',
...@@ -160,7 +183,7 @@ CREATE (ctor3)-[:CONTROL_FLOW]->(ctor4) ...@@ -160,7 +183,7 @@ CREATE (ctor3)-[:CONTROL_FLOW]->(ctor4)
//==================== Call1 Method ========================== //==================== Call1 Method ==========================
CREATE (taskCall1:Method { CREATE (taskCall1:Method {
fqn : parentClass.fqn + '$__Task__.call()', fqn : parentClass.fqn + '$%{Task}.call()',
name : 'call' , name : 'call' ,
displayname : 'call()', displayname : 'call()',
visibility : 'public', visibility : 'public',
...@@ -177,10 +200,10 @@ CREATE (taskCall1:Method { ...@@ -177,10 +200,10 @@ CREATE (taskCall1:Method {
CREATE (taskClass)-[:CONTAINS_METHOD]->(taskCall1) CREATE (taskClass)-[:CONTAINS_METHOD]->(taskCall1)
CREATE (call1_1:Assignment { CREATE (call1_1:Assignment {
vartype : parentClass.fqn + '$__Task__', vartype : parentClass.fqn + '$%{Task}',
var : 'this', var : 'this',
displayname : 'this = @this: ' + parentClass.fqn + '$__Task__', displayname : 'this = @this: ' + parentClass.fqn + '$%{Task}',
rightValue : '@this: ' + parentClass.fqn + '$__Task__', rightValue : '@this: ' + parentClass.fqn + '$%{Task}',
type : 'Assignment', type : 'Assignment',
operation : 'thisdeclaration' operation : 'thisdeclaration'
}) })
...@@ -214,7 +237,7 @@ CREATE (call1_2)-[:CONTROL_FLOW]->(call1_3) ...@@ -214,7 +237,7 @@ CREATE (call1_2)-[:CONTROL_FLOW]->(call1_3)
//==================== Call2 Method ========================== //==================== Call2 Method ==========================
CREATE (taskCall2:Method { CREATE (taskCall2:Method {
fqn : parentClass.fqn + '$__Task__.call()', fqn : parentClass.fqn + '$%{Task}.call()',
name : 'call' , name : 'call' ,
displayname : 'call()', displayname : 'call()',
visibility : 'public', visibility : 'public',
...@@ -231,10 +254,10 @@ CREATE (taskCall2:Method { ...@@ -231,10 +254,10 @@ CREATE (taskCall2:Method {
CREATE (taskClass)-[:CONTAINS_METHOD]->(taskCall2) CREATE (taskClass)-[:CONTAINS_METHOD]->(taskCall2)
CREATE (call2_1:Assignment { CREATE (call2_1:Assignment {
vartype : parentClass.fqn + '$__Task__', vartype : parentClass.fqn + '$%{Task}',
var : 'this', var : 'this',
displayname : 'this = @this: ' + parentClass.fqn + '$__Task__', displayname : 'this = @this: ' + parentClass.fqn + '$%{Task}',
rightValue : '@this: ' + parentClass.fqn + '$__Task__', rightValue : '@this: ' + parentClass.fqn + '$%{Task}',
type : 'Assignment', type : 'Assignment',
operation : 'thisdeclaration' operation : 'thisdeclaration'
}) })
...@@ -243,7 +266,7 @@ CREATE (taskCall2)-[:CONTROL_FLOW]->(call2_1) ...@@ -243,7 +266,7 @@ CREATE (taskCall2)-[:CONTROL_FLOW]->(call2_1)
CREATE( call2_2:Assignment:MethodCall { CREATE( call2_2:Assignment:MethodCall {
args : [], args : [],
fqn : parentClass.fqn + '$__Task__.call()', fqn : parentClass.fqn + '$%{Task}.call()',
caller : parentClass.fqn, caller : parentClass.fqn,
vartype : mc1.vartype, vartype : mc1.vartype,
argumentscount : 0, argumentscount : 0,
...@@ -300,12 +323,12 @@ CREATE (poolTempAssign)-[:CONTROL_FLOW]->(poolTempCtor) ...@@ -300,12 +323,12 @@ CREATE (poolTempAssign)-[:CONTROL_FLOW]->(poolTempCtor)
CREATE( poolVarAssign:Assignment { CREATE( poolVarAssign:Assignment {
vartype : 'java.util.concurrent.ForkJoinPool', vartype : 'java.util.concurrent.ForkJoinPool',
var : '__PoolVar__', var : '%{PoolVar}',
rightValue : 'temp$1', rightValue : 'temp$1',
type : 'Assignment', type : 'Assignment',
operation : 'value', operation : 'value',
isdeclaration: true, isdeclaration: true,
displayname : '__PoolVar__ = temp$1' displayname : '%{PoolVar} = temp$1'
}) })
CREATE (poolTempCtor)-[:CONTROL_FLOW]->(poolVarAssign) CREATE (poolTempCtor)-[:CONTROL_FLOW]->(poolVarAssign)
...@@ -318,16 +341,16 @@ CREATE (poolTempCtor)-[:CONTROL_FLOW]->(poolVarAssign) ...@@ -318,16 +341,16 @@ CREATE (poolTempCtor)-[:CONTROL_FLOW]->(poolVarAssign)
CREATE (taskTempAssign:Assignment { CREATE (taskTempAssign:Assignment {
operation : 'new', operation : 'new',
var : 'temp$0', var : 'temp$0',
vartype : parentClass.fqn + '$__Task__', vartype : parentClass.fqn + '$%{Task}',
type : 'Assignment', type : 'Assignment',
rightValue : 'new ' + parentClass.fqn + '$__Task__', rightValue : 'new ' + parentClass.fqn + '$%{Task}',
displayname : 'temp$0 = new ' + parentClass.fqn + '$__Task__' displayname : 'temp$0 = new ' + parentClass.fqn + '$%{Task}'
}) })
CREATE (poolVarAssign)-[:CONTROL_FLOW]->(taskTempAssign) CREATE (poolVarAssign)-[:CONTROL_FLOW]->(taskTempAssign)
CREATE( taskTempCtor:MethodCall:ConstructorCall { CREATE( taskTempCtor:MethodCall:ConstructorCall {
fqn : parentClass.fqn + '$__Task__.<init>(' + parentClass.fqn + '$__Task__', fqn : parentClass.fqn + '$%{Task__.<init>(' + parentClass.fqn + '$__Task}',
caller : 'temp$0', caller : 'temp$0',
argumentscount : 1, argumentscount : 1,
args: [], args: [],
...@@ -341,13 +364,13 @@ CREATE (taskTempAssign)-[:CONTROL_FLOW]->(taskTempCtor) ...@@ -341,13 +364,13 @@ CREATE (taskTempAssign)-[:CONTROL_FLOW]->(taskTempCtor)
CREATE (taskTempCtor)-[:CALLS]->(ctorMethod2) CREATE (taskTempCtor)-[:CALLS]->(ctorMethod2)
CREATE( taskVarAssign:Assignment { CREATE( taskVarAssign:Assignment {
vartype : parentClass.fqn + '$__Task__', vartype : parentClass.fqn + '$%{Task}',
var : '__TaskVar__', var : '%{TaskVar}',
rightValue : 'temp$0', rightValue : 'temp$0',
type : 'Assignment', type : 'Assignment',
operation : 'value', operation : 'value',
isdeclaration: true, isdeclaration: true,
displayname : '__TaskVar__ = temp$0' displayname : '%{TaskVar} = temp$0'
}) })
CREATE (taskTempCtor)-[:CONTROL_FLOW]->(taskVarAssign) CREATE (taskTempCtor)-[:CONTROL_FLOW]->(taskVarAssign)
...@@ -358,17 +381,17 @@ CREATE (taskTempCtor)-[:CONTROL_FLOW]->(taskVarAssign) ...@@ -358,17 +381,17 @@ CREATE (taskTempCtor)-[:CONTROL_FLOW]->(taskVarAssign)
//============================================================ //============================================================
CREATE( submitTemp:Assignment:MethodCall { CREATE( submitTemp:Assignment:MethodCall {
caller : '__PoolVar__', caller : '%{PoolVar}',
fqn : 'java.util.concurrent.ForkJoinPool.submit(java.lang.Runnable)', fqn : 'java.util.concurrent.ForkJoinPool.submit(java.lang.Runnable)',
operation : 'MethodCall', operation : 'MethodCall',
var : 'temp$2', var : 'temp$2',
args : [ '__TaskVar__' ], args : [ '%{TaskVar}' ],
name : 'submit', name : 'submit',
vartype : 'java.util.concurrent.ForkJoinTask', vartype : 'java.util.concurrent.ForkJoinTask',
type : 'Assignment', type : 'Assignment',
rightValue : 'virtualinvoke pool.<java.util.concurrent.ForkJoinPool: java.util.concurrent.ForkJoinTask submit(java.lang.Runnable)>(__TaskVar__)', rightValue : 'virtualinvoke pool.<java.util.concurrent.ForkJoinPool: java.util.concurrent.ForkJoinTask submit(java.lang.Runnable)>(%{TaskVar})',
argumentscount : 1, argumentscount : 1,
displayname : '__PoolVar__ = temp$1', displayname : '%{PoolVar} = temp$1',
returntype : 'java.util.concurrent.ForkJoinTask' returntype : 'java.util.concurrent.ForkJoinTask'
}) })
...@@ -376,13 +399,13 @@ CREATE (taskVarAssign)-[:CONTROL_FLOW]->(submitTemp) ...@@ -376,13 +399,13 @@ CREATE (taskVarAssign)-[:CONTROL_FLOW]->(submitTemp)
CREATE( submitVar:Assignment { CREATE( submitVar:Assignment {
operation : 'value', operation : 'value',
var : '__SubmitVar__', var : '%{SubmitVar}',
vartype: 'java.util.concurrent.ForkJoinTask', vartype: 'java.util.concurrent.ForkJoinTask',
isdeclaration : true, isdeclaration : true,
type : 'Assignment', type : 'Assignment',
rightValue: 'temp$2', rightValue: 'temp$2',
lefttypearguments: [ '?' ], lefttypearguments: [ '?' ],
displayname : '__SubmitVar__ = temp$2' displayname : '%{SubmitVar} = temp$2'
}) })
CREATE (submitTemp)-[:CONTROL_FLOW]->(submitVar) CREATE (submitTemp)-[:CONTROL_FLOW]->(submitVar)
...@@ -398,7 +421,7 @@ CREATE (submitVar)-[:CONTROL_FLOW]->(mc2) ...@@ -398,7 +421,7 @@ CREATE (submitVar)-[:CONTROL_FLOW]->(mc2)
CREATE( join:MethodCall:Assignment { CREATE( join:MethodCall:Assignment {
caller : '__SubmitVar__', caller : '%{SubmitVar}',
fqn : 'java.util.concurrent.ForkJoinTask.join()', fqn : 'java.util.concurrent.ForkJoinTask.join()',
args : [], args : [],
name : 'join', name : 'join',
...@@ -410,12 +433,12 @@ CREATE( join:MethodCall:Assignment { ...@@ -410,12 +433,12 @@ CREATE( join:MethodCall:Assignment {
var : mc1.var, var : mc1.var,
vartype : 'java.lang.Object', vartype : 'java.lang.Object',
type : 'Assignment', type : 'Assignment',
rightValue : 'virtualinvoke __SubmitVar__.<java.util.concurrent.ForkJoinTask: java.lang.Object join()>()' rightValue : 'virtualinvoke %{SubmitVar}.<java.util.concurrent.ForkJoinTask: java.lang.Object join()>()'
}) })
CREATE( joinCast:MethodCall:Assignment { CREATE( joinCast:MethodCall:Assignment {
operation : 'cast', operation : 'cast',
var : 'temp$__unique1__', var : 'temp$%{unique1}',
vartype : ma1.vartype, vartype : ma1.vartype,
type : 'Assignment', type : 'Assignment',
rightValue : '(java.lang.Integer) ' + mc1.var, rightValue : '(java.lang.Integer) ' + mc1.var,
...@@ -427,8 +450,8 @@ CREATE( joinAssign:Assignment { ...@@ -427,8 +450,8 @@ CREATE( joinAssign:Assignment {
var : ma1.var, var : ma1.var,
vartype : ma1.vartype, vartype : ma1.vartype,
type : 'Assignment', type : 'Assignment',
rightValue : 'temp$__unique1__', rightValue : 'temp$%{unique1}',
displayname : ma1.var + ' = temp$__unique1__', displayname : ma1.var + ' = temp$%{unique1}',
isdeclaration : ma1.isdeclaration isdeclaration : ma1.isdeclaration
}) })
...@@ -438,3 +461,10 @@ CREATE (joinCast)-[:CONTROL_FLOW]->(joinAssign) ...@@ -438,3 +461,10 @@ CREATE (joinCast)-[:CONTROL_FLOW]->(joinAssign)
CREATE (joinAssign)-[:CONTROL_FLOW]->(nextUsage) CREATE (joinAssign)-[:CONTROL_FLOW]->(nextUsage)
delete nextUsageCF, in, in, in3, in4 delete nextUsageCF, in, in, in3, in4
return mc1 as display
]]>
</query>
</pp>
</ppversions>
</pattern>
\ No newline at end of file
<!--
Expected input:
CONTROL_FLOW relation with 'createForkJoinPool=true'. Will be replaced by a control flow that creates a ForkJoinPool instance
Provided ouput:
Assignment node marked with 'forkJoinPoolEnd=true', this node contains the variable name of the pool ('var' attribute)
-->
<query>
<![CDATA[
//============================================================
// Create Pool Object
//============================================================
MATCH (prev)-[c:CONTROL_FLOW]->(next) WHERE c.createForkJoinPool=true
DELETE c
CREATE (poolTempAssign:Assignment {
operation : 'new',
var : 'temp$1',
vartype : 'java.util.concurrent.ForkJoinPool',
type : 'Assignment',
rightValue : 'new java.util.concurrent.ForkJoinPool',
displayname : 'temp$1 = new java.util.concurrent.ForkJoinPool'
})
CREATE (prev)-[:CONTROL_FLOW]->(poolTempAssign)
CREATE( poolTempCtor:MethodCall:ConstructorCall {
fqn : 'java.util.concurrent.ForkJoinPool.<init>()',
caller : 'temp$1',
args: [],
argumentscount : 0,
name : '<init>',
type : 'MethodCall',
displayname : '<init>()',
returntype : 'void'
})
CREATE (poolTempAssign)-[:CONTROL_FLOW]->(poolTempCtor)
CREATE( poolVarAssign:Assignment {
vartype : 'java.util.concurrent.ForkJoinPool',
var : '%{PoolVar}',
rightValue : 'temp$1',
type : 'Assignment',
operation : 'value',
isdeclaration: true,
displayname : '%{PoolVar} = temp$1',
forkJoinPoolEnd : true
})
CREATE (poolTempCtor)-[:CONTROL_FLOW]->(poolVarAssign)
CREATE (poolVarAssign)-[:CONTROL_FLOW]->(next)
]]>
</query>
\ No newline at end of file
<!--
Expected input:
CONTROL_FLOW relation with 'createTask=true'. Will be replaced by a control flow that creates a Task instance
Class Declaration node marked with 'generatedTaskClassType=true'
Class Constructor node marked with 'generatedTaskClassCtor=true'
Provided ouput:
Assignment node marked with 'taskEnd=true', this node contains the variable name of the task ('var' attribute)
-->
<query>
<![CDATA[
MATCH (prev)-[c:CONTROL_FLOW]->(next) WHERE c.createTask=true
MATCH (taskClassType:Class) WHERE taskClassType.generatedTaskClassType=true
MATCH (taskClassCtor:Method) WHERE taskClassCtor.generatedTaskClassCtor=true
DELETE c
CREATE (taskTempAssign:Assignment {
operation : 'new',
var : 'temp$0',
vartype : taskClassType.fqn,
type : 'Assignment',
rightValue : 'new ' + taskClassType.fqn,
displayname : 'temp$0 = new ' + taskClassType.fqn
})
CREATE (prev)-[:CONTROL_FLOW]->(taskTempAssign)
CREATE( taskTempCtor:MethodCall:ConstructorCall {
fqn : taskClassType.fqn + '.<init>(' + taskClassType.fqn + ')',
caller : 'temp$0',
argumentscount : 1,
args: [],
name : '<init>',
type : 'MethodCall',
displayname : '<init>(null)',
returntype : 'void'
})
CREATE (taskTempAssign)-[:CONTROL_FLOW]->(taskTempCtor)
CREATE (taskTempCtor)-[:CALLS]->(taskClassCtor)
CREATE( taskVarAssign:Assignment {
vartype : taskClassType.fqn,
var : '%{TaskVar}',
rightValue : 'temp$0',
type : 'Assignment',
operation : 'value',
isdeclaration: true,
displayname : '%{TaskVar} = temp$0',
taskEnd : true
})
CREATE (taskTempCtor)-[:CONTROL_FLOW]->(taskVarAssign)
CREATE (taskVarAssign)-[:CONTROL_FLOW]->(next)
]]>
</query>
\ No newline at end of file
<!--
Expected input: None (yet)
Provided ouput:
Class Declaration Node is marked with 'generatedTaskClassType=true'
Class Constructor Node is marked with 'generatedTaskClassCtor=true'
-->
<query>
<![CDATA[
//get parent class and parent package
MATCH (mc1:MethodCall)-[:CALLS]->(:Method)<-[CONTAINS_METHOD]-(parentClass:Class)<-[:CONTAINS_TYPE]-(parentPackage:Package) where ID(mc1)={mc1ID}
match (javaObjectConstructor:Constructor) where javaObjectConstructor.fqn='java.lang.Object.<init>()'
MERGE (javaCallableInterface:Class {
fqn : 'java.util.concurrent.Callable',
origin : 'JAVA',
name : 'Callable',
type : 'Interface',
visibility: 'public'
})
//============================================================
// Declare Task Type
//============================================================
//==================== Task Class ============================
CREATE (taskClass:Class {
fqn : parentClass.fqn + '$%{Task}',
name : parentClass.name + '$%{Task}',
visibility: 'public',
origin: 'APP',
type: 'Class',
generatedTaskClassType : true
})
CREATE (parentPackage)-[:CONTAINS_TYPE]->(taskClass)
CREATE (parentClass)-[:CONTAINS]->(taskClass)
CREATE (taskClass)-[:IMPLEMENTS]->(javaCallableInterface)
//==================== Constructor 1 ==========================
CREATE (ctorMethod:Method:Constructor {
fqn : parentClass.fqn + '$%{Task}.<init>()',
visibility : 'private',
returntype : 'void',
parameterscount : 0,
isabstract : false,
isnative : false,
throws : [],
type : 'Method',
istatic : false,
isfinal : false,
isdeclared : true,
displayname : 'ctor()',
name : 'ctor'
})
CREATE (taskClass)-[:CONTAINS_CONSTRUCTOR]->(ctorMethod)
CREATE (ctor_1:Assignment {
vartype : parentClass.fqn + '$%{Task}',
var : 'this',
rightValue : '@this: ' + parentClass.fqn + '$%{Task}',
displayname : '@this: ' + parentClass.fqn + '$%{Task}',
name : 'this = @this: ' + parentClass.fqn + '$%{Task}',
type : 'Assignment',
operation : 'thisdeclaration'
})
CREATE (ctorMethod)-[:CONTROL_FLOW]->(ctor_1)
CREATE (ctor_2:MethodCall:ConstructorCall {
args : [],
caller : 'this',
fqn : 'java.lang.Object.<init>()',
argumentscount : 0,
displayname : '<init>()',
returntype : 'void',
name : 'super',
type : 'MethodCall'
})
CREATE (ctor_1)-[:CONTROL_FLOW]->(ctor_2)
CREATE (ctor_2)-[:CALLS]->(javaObjectConstructor)
CREATE( ctor_3:ReturnStmt {
displayname : 'return',
type : 'ReturnStmt'
})
CREATE (ctor_2)-[:CONTROL_FLOW]->(ctor_3)
//==================== Constructor 2 ==========================
//WTF? why do we need this?
CREATE (ctorMethod2:Method:Constructor {
p0 : parentClass.fqn + '$%{Task}$0',
fqn : parentClass.fqn + '$%{Task__.<init>(' + parentClass.fqn + '$__Task}$0)',
visibility : 'public',
returntype : 'void',
isabstract : false,
isnative : false,
parameterscount : 1,
throws : [],
type : 'Method',
istatic : false,
isdeclared : true,
isfinal : false,
displayname : 'ctor(' + parentClass.fqn + '$%{Task}$0)',
name : 'ctor',
returntype: 'void',
generatedTaskClassCtor : true
})
CREATE (taskClass)-[:CONTAINS_CONSTRUCTOR]->(ctorMethod2)
CREATE (ctor1:Assignment {
vartype : parentClass.fqn + '$%{Task}',
var : 'this',
rightValue : '@this: ' + parentClass.fqn + '$%{Task}',
displayname : 'this = @this: ' + parentClass.fqn + '$%{Task}',
type : 'Assignment',
operation : 'thisdeclaration'
})
CREATE (ctorMethod2)-[:CONTROL_FLOW]->(ctor1)
CREATE (ctor2:Assignment {
vartype : parentClass.fqn + '$%{Task}$0',
var : 'p0',
displayname : 'p0 = @parameter0: ' + parentClass.fqn + '$%{Task}$0',
rightValue : '@parameter0: ' + parentClass.fqn + '$%{Task}$0',
name : 'p0 = @parameter0: ' + parentClass.fqn + '$%{Task}',
type : 'Assignment',
operation : 'parameterdeclaration'
})
CREATE (ctor1)-[:CONTROL_FLOW]->(ctor2)
CREATE (ctor3:MethodCall:ConstructorCall {
args : [],
fqn : parentClass.fqn + '$%{Task}.<init>()',
caller : 'this',
argumentscount : 0,
displayname : '<init>()',
returntype : 'void',
name : 'this',
type : 'MethodCall'
})
CREATE (ctor2)-[:CONTROL_FLOW]->(ctor3)
CREATE (ctor3)-[:CALLS]->(ctorMethod)
CREATE( ctor4:ReturnStmt {
displayname : 'return',
type : 'ReturnStmt'
})
CREATE (ctor3)-[:CONTROL_FLOW]->(ctor4)
//==================== Call1 Method ==========================
CREATE (taskCall1:Method {
fqn : parentClass.fqn + '$%{Task}.call()',
name : 'call' ,
displayname : 'call()',
visibility : 'public',
returntype : mc1.returntype,
isabstract : false,
isnative : false,
istatic : false,
isdeclared: true,
parameterscount : 0,
throws : '',
type : 'Method'
})
CREATE (taskClass)-[:CONTAINS_METHOD]->(taskCall1)
CREATE (call1_1:Assignment {
vartype : parentClass.fqn + '$%{Task}',
var : 'this',
displayname : 'this = @this: ' + parentClass.fqn + '$%{Task}',
rightValue : '@this: ' + parentClass.fqn + '$%{Task}',
type : 'Assignment',
operation : 'thisdeclaration'
})
CREATE (taskCall1)-[:CONTROL_FLOW]->(call1_1)
CREATE( call1_2:Assignment:MethodCall {
args : [],
fqn : mc1.fqn,
caller : parentClass.fqn,
vartype : mc1.vartype,
argumentscount : 0,
var : mc1.var,
displayname : mc1.displayname,
returntype : mc1.returntype,
name : mc1.name,
type : 'Assignment',
operation : 'MethodCall',
rightValue : 'staticInvoke <' + parentClass.fqn + ': ' + mc1.returntype + ' ' + mc1.name + '()>()'
})
CREATE (call1_1)-[:CONTROL_FLOW]->(call1_2)
CREATE( call1_3:ReturnStmt {
name : 'return',
type : 'ReturnStmt'
})
CREATE (call1_2)-[:CONTROL_FLOW]->(call1_3)
//==================== Call2 Method ==========================
CREATE (taskCall2:Method {
fqn : parentClass.fqn + '$%{Task}.call()',
name : 'call' ,
displayname : 'call()',
visibility : 'public',
returntype : 'java.lang.Object',
isabstract : false,
isnative : false,
istatic : false,
isdeclared: true,
parameterscount : 0,
throws : 'java.lang.Exception',
type : 'Method'
})
CREATE (taskClass)-[:CONTAINS_METHOD]->(taskCall2)
CREATE (call2_1:Assignment {
vartype : parentClass.fqn + '$%{Task}',
var : 'this',
displayname : 'this = @this: ' + parentClass.fqn + '$%{Task}',
rightValue : '@this: ' + parentClass.fqn + '$%{Task}',
type : 'Assignment',
operation : 'thisdeclaration'
})
CREATE (taskCall2)-[:CONTROL_FLOW]->(call2_1)
CREATE( call2_2:Assignment:MethodCall {
args : [],
fqn : parentClass.fqn + '$%{Task}.call()',
caller : parentClass.fqn,
vartype : mc1.vartype,
argumentscount : 0,
var : 'temp$0',
displayname : 'temp$0 = call()',
returntype : mc1.returntype,
name : 'call',
type : 'Assignment',
operation : 'MethodCall',
rightValue : 'virtualinvoke this.<' + parentClass.fqn + ' ' + mc1.returntype + ' call()>()'
})
CREATE (call2_1)-[:CONTROL_FLOW]->(call2_2)
CREATE (call2_2)-[:CALLS]->(taskCall1)
CREATE( call2_3:ReturnStmt {
name : 'return temp$0',
type : 'ReturnStmt',
rightValue : 'temp$0'
})
CREATE (call2_2)-[:CONTROL_FLOW]->(call2_3)
]]>
</query>
<!--
Expected input:
CONTROL_FLOW relation with 'joinTask=true'. Will be replaced by a control flow that joins the task
Assignment node with 'submitEnd=true'. Holds the variable of the task to submit
Query parameter {ma1ID} that contains the ID of the assignment node of the first method call
Provided output:
Assignment node marked with 'joinEnd=true', this node contains the variable name of the result
-->
<query>
<![CDATA[
MATCH (mc1) WHERE ID(mc1)={mc1ID}
MATCH (ma1) WHERE ID(ma1)={ma1ID}
MATCH (prev)-[c:CONTROL_FLOW]->(next) WHERE c.joinTask=true
MATCH (submit:Assignment) WHERE submit.submitEnd=true
DELETE c
CREATE( join:MethodCall:Assignment {
caller : submit.var,
fqn : 'java.util.concurrent.ForkJoinTask.join()',
args : [],
name : 'join',
type : 'MethodCall',
argumentscount : 0,
displayname : mc1.var + ' = join()',
returntype : 'java.lang.Object',
operation : 'MethodCall' ,
var : mc1.var,
vartype : 'java.lang.Object',
type : 'Assignment',
rightValue : 'virtualinvoke ' + submit.var + '.<java.util.concurrent.ForkJoinTask: java.lang.Object join()>()'
})
CREATE( joinCast:MethodCall:Assignment {
operation : 'cast',
var : 'temp$%{unique1}',
vartype : ma1.vartype,
type : 'Assignment',
rightValue : '(java.lang.Integer) ' + mc1.var,
displayname : ma1.var + ' = (java.lang.Integer)' + mc1.var
})
CREATE( joinAssign:Assignment {
operation : 'value',
var : ma1.var,
vartype : ma1.vartype,
type : 'Assignment',
rightValue : 'temp$%{unique1}',
displayname : ma1.var + ' = temp$%{unique1}',
isdeclaration : ma1.isdeclaration,
joinEnd : true
})
CREATE (prev)-[:CONTROL_FLOW]->(join)
CREATE (join)-[:CONTROL_FLOW]->(joinCast)
CREATE (joinCast)-[:CONTROL_FLOW]->(joinAssign)
CREATE (joinAssign)-[:CONTROL_FLOW]->(next)
//DELETE ma1
//DELETE mc1
]]>
</query>
\ No newline at end of file
<!--
Expected input:
CONTROL_FLOW relation with 'submitTask=true'. Will be replaced by a control flow that submits the task
Assignment node with 'taskEnd=true'. Holds the variable of the task to submit
Assignment node with 'forkJoinPoolEnd=true'. Holds the variable of the ForkJoinPool to submit the task to
Provided output:
Assignment node marked with 'submitEnd=true', this node contains the variable name of the joinable ForkJoinTask ('var' attribute)
-->
<query>
<![CDATA[
MATCH (prev)-[c:CONTROL_FLOW]->(next) WHERE c.submitTask=true
MATCH (forkjoinpool:Assignment) WHERE forkjoinpool.forkJoinPoolEnd=true
MATCH (task:Assignment) WHERE task.taskEnd=true
DELETE c
CREATE( submitTemp:Assignment:MethodCall {
caller : forkjoinpool.var,
fqn : 'java.util.concurrent.ForkJoinPool.submit(java.lang.Runnable)',
operation : 'MethodCall',
var : 'temp$2',
args : [ '+ task.var +' ],
name : 'submit',
vartype : 'java.util.concurrent.ForkJoinTask',
type : 'Assignment',
rightValue : 'virtualinvoke pool.<java.util.concurrent.ForkJoinPool: java.util.concurrent.ForkJoinTask submit(java.lang.Runnable)>('+ task.var +')',
argumentscount : 1,
displayname : forkjoinpool.var + ' = temp$1',
returntype : 'java.util.concurrent.ForkJoinTask'
})
CREATE (prev)-[:CONTROL_FLOW]->(submitTemp)
CREATE( submitVar:Assignment {
operation : 'value',
var : '%{SubmitVar}',
vartype: 'java.util.concurrent.ForkJoinTask',
isdeclaration : true,
type : 'Assignment',
rightValue: 'temp$2',
lefttypearguments: [ '?' ],
displayname : '%{SubmitVar} = temp$2',
submitEnd : true
})
CREATE (submitTemp)-[:CONTROL_FLOW]->(submitVar)
CREATE (submitVar)-[:CONTROL_FLOW]->(next)
]]>
</query>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment