Skip to content

Commit 27f40e0

Browse files
authored
Merge pull request #7007 from JLLeitschuh/feat/JLL/improve_ratpack_support
Java: Ratpack HTTP Framework Additional Modeling
2 parents d557f6f + 36bb84d commit 27f40e0

File tree

10 files changed

+925
-8
lines changed

10 files changed

+925
-8
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
lgtm,codescanning
2+
* Improved support for the [Ratpack](https://ratpack.io/) HTTP framework: added data-flow models of `ratpack.func.Pair` and `ratpack.exec.Result`, and improved models of `ratpack.exec.Promise`.

java/ql/lib/semmle/code/java/frameworks/ratpack/Ratpack.qll

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,5 +83,51 @@ private class RatpackModel extends SummaryModelCsv {
8383
"MultiValueMap;true;asMultimap;;;MapKey of Argument[-1];MapKey of ReturnValue;value",
8484
"MultiValueMap;true;asMultimap;;;MapValue of Argument[-1];MapValue of ReturnValue;value"
8585
]
86+
or
87+
exists(string left, string right |
88+
left = "Field[ratpack.func.Pair.left]" and
89+
right = "Field[ratpack.func.Pair.right]"
90+
|
91+
row =
92+
["ratpack.util;", "ratpack.func;"] + "Pair;true;" +
93+
[
94+
"of;;;Argument[0];" + left + " of ReturnValue;value",
95+
"of;;;Argument[1];" + right + " of ReturnValue;value",
96+
"pair;;;Argument[0];" + left + " of ReturnValue;value",
97+
"pair;;;Argument[1];" + right + " of ReturnValue;value",
98+
"left;();;" + left + " of Argument[-1];ReturnValue;value",
99+
"right;();;" + right + " of Argument[-1];ReturnValue;value",
100+
"getLeft;;;" + left + " of Argument[-1];ReturnValue;value",
101+
"getRight;;;" + right + " of Argument[-1];ReturnValue;value",
102+
"left;(Object);;Argument[0];" + left + " of ReturnValue;value",
103+
"left;(Object);;" + right + " of Argument[-1];" + right + " of ReturnValue;value",
104+
"right;(Object);;Argument[0];" + right + " of ReturnValue;value",
105+
"right;(Object);;" + left + " of Argument[-1];" + left + " of ReturnValue;value",
106+
"pushLeft;(Object);;Argument[-1];" + right + " of ReturnValue;value",
107+
"pushRight;(Object);;Argument[-1];" + left + " of ReturnValue;value",
108+
"pushLeft;(Object);;Argument[0];" + left + " of ReturnValue;value",
109+
"pushRight;(Object);;Argument[0];" + right + " of ReturnValue;value",
110+
// `nestLeft` Pair<A, B>.nestLeft(C) -> Pair<Pair<C, A>, B>
111+
"nestLeft;(Object);;Argument[0];" + left + " of " + left + " of ReturnValue;value",
112+
"nestLeft;(Object);;" + left + " of Argument[-1];" + right + " of " + left +
113+
" of ReturnValue;value",
114+
"nestLeft;(Object);;" + right + " of Argument[-1];" + right + " of ReturnValue;value",
115+
// `nestRight` Pair<A, B>.nestRight(C) -> Pair<A, Pair<C, B>>
116+
"nestRight;(Object);;Argument[0];" + left + " of " + right + " of ReturnValue;value",
117+
"nestRight;(Object);;" + left + " of Argument[-1];" + left + " of ReturnValue;value",
118+
"nestRight;(Object);;" + right + " of Argument[-1];" + right + " of " + right +
119+
" of ReturnValue;value",
120+
// `mapLeft` & `mapRight` map over their respective fields
121+
"mapLeft;;;" + left + " of Argument[-1];Parameter[0] of Argument[0];value",
122+
"mapLeft;;;" + right + " of Argument[-1];" + right + " of ReturnValue;value",
123+
"mapRight;;;" + right + " of Argument[-1];Parameter[0] of Argument[0];value",
124+
"mapRight;;;" + left + " of Argument[-1];" + left + " of ReturnValue;value",
125+
"mapLeft;;;ReturnValue of Argument[0];" + left + " of ReturnValue;value",
126+
"mapRight;;;ReturnValue of Argument[0];" + right + " of ReturnValue;value",
127+
// `map` maps over the `Pair`
128+
"map;;;Argument[-1];Parameter[0] of Argument[0];value",
129+
"map;;;ReturnValue of Argument[0];ReturnValue;value"
130+
]
131+
)
86132
}
87133
}

java/ql/lib/semmle/code/java/frameworks/ratpack/RatpackExec.qll

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ private class RatpackExecModel extends SummaryModelCsv {
1414
override predicate row(string row) {
1515
//"namespace;type;overrides;name;signature;ext;inputspec;outputspec;kind",
1616
row =
17-
["ratpack.exec;Promise;true;"] +
17+
"ratpack.exec;Promise;true;" +
1818
[
1919
// `Promise` creation methods
2020
"value;;;Argument[0];Element of ReturnValue;value",
@@ -31,13 +31,16 @@ private class RatpackExecModel extends SummaryModelCsv {
3131
"apply;;;Element of ReturnValue of Argument[0];Element of ReturnValue;value",
3232
// `Promise` termination method
3333
"then;;;Element of Argument[-1];Parameter[0] of Argument[0];value",
34-
// 'next' accesses qualfier the 'Promise' value and also returns the qualifier
34+
// 'next' accesses qualifier the 'Promise' value and also returns the qualifier
3535
"next;;;Element of Argument[-1];Parameter[0] of Argument[0];value",
36-
"next;;;Argument[-1];ReturnValue;value",
37-
// 'cacheIf' accesses qualfier the 'Promise' value and also returns the qualifier
36+
"nextOp;;;Element of Argument[-1];Parameter[0] of Argument[0];value",
37+
"flatOp;;;Element of Argument[-1];Parameter[0] of Argument[0];value",
38+
// `nextOpIf` accesses qualifier the 'Promise' value and also returns the qualifier
39+
"nextOpIf;;;Element of Argument[-1];Parameter[0] of Argument[0];value",
40+
"nextOpIf;;;Element of Argument[-1];Parameter[0] of Argument[1];value",
41+
// 'cacheIf' accesses qualifier the 'Promise' value and also returns the qualifier
3842
"cacheIf;;;Element of Argument[-1];Parameter[0] of Argument[0];value",
39-
"cacheIf;;;Argument[-1];ReturnValue;value",
40-
// 'route' accesses qualfier the 'Promise' value, and conditionally returns the qualifier or
43+
// 'route' accesses qualifier the 'Promise' value, and conditionally returns the qualifier or
4144
// the result of the second argument
4245
"route;;;Element of Argument[-1];Parameter[0] of Argument[0];value",
4346
"route;;;Element of Argument[-1];Parameter[0] of Argument[1];value",
@@ -46,12 +49,57 @@ private class RatpackExecModel extends SummaryModelCsv {
4649
"flatMap;;;Element of Argument[-1];Parameter[0] of Argument[0];value",
4750
"flatMap;;;Element of ReturnValue of Argument[0];Element of ReturnValue;value",
4851
"flatMapError;;;Element of ReturnValue of Argument[1];Element of ReturnValue;value",
52+
// `blockingOp` passes the value to the argument
53+
"blockingOp;;;Element of Argument[-1];Parameter[0] of Argument[0];value",
54+
// `replace` returns the passed `Promise`
55+
"replace;;;Element of Argument[0];Element of ReturnValue;value",
4956
// `mapIf` methods conditionally map their values, or return themselves
5057
"mapIf;;;Element of Argument[-1];Parameter[0] of Argument[0];value",
5158
"mapIf;;;Element of Argument[-1];Parameter[0] of Argument[1];value",
5259
"mapIf;;;Element of Argument[-1];Parameter[0] of Argument[2];value",
5360
"mapIf;;;ReturnValue of Argument[1];Element of ReturnValue;value",
54-
"mapIf;;;ReturnValue of Argument[2];Element of ReturnValue;value"
61+
"mapIf;;;ReturnValue of Argument[2];Element of ReturnValue;value",
62+
// `wiretap` wraps the qualifier `Promise` value in a `Result` and passes it to the argument
63+
"wiretap;;;Element of Argument[-1];Element of Parameter[0] of Argument[0];value"
64+
]
65+
or
66+
exists(string left, string right |
67+
left = "Field[ratpack.func.Pair.left]" and
68+
right = "Field[ratpack.func.Pair.right]"
69+
|
70+
row =
71+
"ratpack.exec;Promise;true;" +
72+
[
73+
// `left`, `right`, `flatLeft`, `flatRight` all pass the qualifier `Promise` element as the other `Pair` field
74+
"left;;;Element of Argument[-1];" + right + " of Element of ReturnValue;value",
75+
"right;;;Element of Argument[-1];" + left + " of Element of ReturnValue;value",
76+
"flatLeft;;;Element of Argument[-1];" + right + " of Element of ReturnValue;value",
77+
"flatRight;;;Element of Argument[-1];" + left + " of Element of ReturnValue;value",
78+
// `left` and `right` taking a `Promise` create a `Promise` of the `Pair`
79+
"left;(Promise);;Element of Argument[0];" + left + " of Element of ReturnValue;value",
80+
"right;(Promise);;Element of Argument[0];" + right + " of Element of ReturnValue;value",
81+
// `left` and `right` taking a `Function` pass the qualifier element then create a `Pair` with the returned value
82+
"left;(Function);;Element of Argument[-1];Parameter[0] of Argument[0];value",
83+
"flatLeft;(Function);;Element of Argument[-1];Parameter[0] of Argument[0];value",
84+
"right;(Function);;Element of Argument[-1];Parameter[0] of Argument[0];value",
85+
"flatRight;(Function);;Element of Argument[-1];Parameter[0] of Argument[0];value",
86+
"left;(Function);;ReturnValue of Argument[0];" + left +
87+
" of Element of ReturnValue;value",
88+
"flatLeft;(Function);;Element of ReturnValue of Argument[0];" + left +
89+
" of Element of ReturnValue;value",
90+
"right;(Function);;ReturnValue of Argument[0];" + right +
91+
" of Element of ReturnValue;value",
92+
"flatRight;(Function);;Element of ReturnValue of Argument[0];" + right +
93+
" of Element of ReturnValue;value"
94+
]
95+
)
96+
or
97+
row =
98+
"ratpack.exec;Result;true;" +
99+
[
100+
"success;;;Argument[0];Element of ReturnValue;value",
101+
"getValue;;;Element of Argument[-1];ReturnValue;value",
102+
"getValueOrThrow;;;Element of Argument[-1];ReturnValue;value"
55103
]
56104
}
57105
}

0 commit comments

Comments
 (0)