Skip to content

Commit 14201fc

Browse files
committed
Added backend storage for traced state. Wired this to the agent configuration.
1 parent 19ed4e2 commit 14201fc

File tree

9 files changed

+45
-13
lines changed

9 files changed

+45
-13
lines changed

codepulse/src/main/scala/com/secdec/codepulse/data/bytecode/CodeForestBuilder.scala

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,11 @@ import com.secdec.codepulse.data.MethodSignatureParser
2828
import com.secdec.codepulse.data.trace.TreeNode
2929

3030
object CodeForestBuilder {
31-
32-
def main(arts: Array[String]): Unit = {
33-
val rawSig = "com/avi/codepulse/Cool$Beans.stuff;9;([Ljava/lang/String;)V"
34-
println(CodePath.parse(rawSig))
35-
}
31+
val JSPGroupName = "JSPs"
3632
}
3733

38-
class CodeForestBuilder {
34+
class CodeForestBuilder(defaultTracedGroups: List[String]) {
35+
import CodeForestBuilder._
3936

4037
private val roots = SortedSet.empty[CodeTreeNode]
4138
private var nodeFactory = CodeTreeNodeFactory.mkDefaultFactory
@@ -48,13 +45,18 @@ class CodeForestBuilder {
4845

4946
def result = {
5047
val lb = List.newBuilder[TreeNode]
48+
val tracedGroups = defaultTracedGroups.toSet
5149
for (root <- roots) root.visitTree { node =>
5250
val id = node.id
5351
val name = node.name
5452
val parentId = node.parentId
5553
val kind = node.kind
5654
val size = node.size
57-
lb += TreeNode(id, parentId, name, kind, size)
55+
val traced = kind match {
56+
case CodeTreeNodeKind.Grp | CodeTreeNodeKind.Pkg => Some(tracedGroups contains root.name)
57+
case _ => None
58+
}
59+
lb += TreeNode(id, parentId, name, kind, size, traced)
5860
}
5961
lb.result()
6062
}
@@ -95,7 +97,7 @@ class CodeForestBuilder {
9597
case packageNode :: rest => recurse(addChildPackage(parent, packageNode), rest)
9698
}
9799

98-
recurse(addGroup("JSPs"), path)
100+
recurse(addGroup(JSPGroupName), path)
99101
}
100102

101103
protected def addGroup(name: String) = roots.find { node =>

codepulse/src/main/scala/com/secdec/codepulse/data/trace/TreeNodeData.scala

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,9 @@ import com.secdec.codepulse.data.bytecode.CodeTreeNodeKind
2929
* @param kind The `CodeTreeNodeKind` of this node
3030
* @param size A number indicating the size of the node (e.g. lines of code). If unspecified,
3131
* the size of a node is assumed to be the sum of its childrens' sizes.
32+
* @param traced whether or not this treenode is being traced; this value may be unspecified (None)
3233
*/
33-
case class TreeNode(id: Int, parentId: Option[Int], label: String, kind: CodeTreeNodeKind, size: Option[Int])
34+
case class TreeNode(id: Int, parentId: Option[Int], label: String, kind: CodeTreeNodeKind, size: Option[Int], traced: Option[Boolean])
3435

3536
/** Access trait for tree node data.
3637
*
@@ -62,4 +63,10 @@ trait TreeNodeDataAccess {
6263

6364
def storeNode(node: TreeNode): Unit
6465
def storeNodes(nodes: Iterable[TreeNode]) = nodes foreach storeNode
66+
67+
def updateTraced(id: Int, traced: Option[Boolean]): Unit
68+
def updateTraced(id: Int, traced: Boolean): Unit = updateTraced(id, Some(traced))
69+
def updateTraced(node: TreeNode, traced: Option[Boolean]): Unit = updateTraced(node.id, traced)
70+
def updateTraced(node: TreeNode, traced: Boolean): Unit = updateTraced(node.id, Some(traced))
71+
def updateTraced(values: Iterable[(Int, Boolean)]): Unit = values foreach { case (id, traced) => updateTraced(id, Some(traced)) }
6572
}

codepulse/src/main/scala/com/secdec/codepulse/data/trace/slick/SlickTreeNodeDataAccess.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,8 @@ private[slick] class SlickTreeNodeDataAccess(dao: TreeNodeDataDao, db: Database)
100100
override def storeNodes(nodes: Iterable[TreeNode]) = db withTransaction { implicit transaction =>
101101
dao storeNodes nodes
102102
}
103+
104+
def updateTraced(id: Int, traced: Option[Boolean]) = db withTransaction { implicit transaction =>
105+
dao.updateTraced(id, traced)
106+
}
103107
}

codepulse/src/main/scala/com/secdec/codepulse/data/trace/slick/TreeNodeDataDao.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ private[slick] class TreeNodeDataDao(val driver: JdbcProfile) {
4848
def label = column[String]("label", O.NotNull)
4949
def kind = column[CodeTreeNodeKind]("kind", O.NotNull)
5050
def size = column[Option[Int]]("size", O.Nullable)
51-
def * = (id, parentId, label, kind, size) <> (TreeNode.tupled, TreeNode.unapply)
51+
def traced = column[Option[Boolean]]("traced", O.Nullable)
52+
def * = (id, parentId, label, kind, size, traced) <> (TreeNode.tupled, TreeNode.unapply)
5253
}
5354
val treeNodeData = TableQuery[TreeNodeData]
5455

@@ -132,4 +133,9 @@ private[slick] class TreeNodeDataDao(val driver: JdbcProfile) {
132133
def storeNodes(nodes: Iterable[TreeNode])(implicit session: Session) {
133134
treeNodeData ++= nodes
134135
}
136+
137+
def updateTraced(id: Int, traced: Option[Boolean])(implicit session: Session) {
138+
val q = for (n <- treeNodeData if n.id === id) yield n.traced
139+
q.update(traced)
140+
}
135141
}

codepulse/src/main/scala/com/secdec/codepulse/tracer/TraceSettingsCreator.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ object TraceSettingsCreator {
3131
(for {
3232
treeNode <- it
3333
if treeNode.kind == CodeTreeNodeKind.Pkg
34+
traced = treeNode.traced getOrElse ???
35+
if traced
3436
} yield {
3537
val slashedName = treeNode.label.replace('.', '/')
3638
"^" + slashedName + "/[^/]+$"

codepulse/src/main/scala/com/secdec/codepulse/tracer/TraceUploadData.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,15 @@ object TraceUploadData {
104104
}
105105

106106
def handleBinaryZip(file: File): TraceId = createAndLoadTraceData { traceData =>
107-
val builder = new CodeForestBuilder
107+
val RootGroupName = "Classes"
108+
val builder = new CodeForestBuilder(defaultTracedGroups = RootGroupName :: CodeForestBuilder.JSPGroupName :: Nil)
108109
val methodCorrelationsBuilder = collection.mutable.Map.empty[String, Int]
109110

110111
//TODO: make this configurable somehow
111112
val jspAdapter = new JasperJspAdapter
112113

113114
ZipEntryChecker.forEachEntry(file) { (filename, entry, contents) =>
114-
val groupName = if (filename == file.getName) "\"classes\"" else new File(filename).getName
115+
val groupName = if (filename == file.getName) RootGroupName else new File(filename).getName
115116
if (!entry.isDirectory) {
116117
FilenameUtils.getExtension(entry.getName) match {
117118
case "class" =>

codepulse/src/main/scala/com/secdec/codepulse/tracer/TreemapDataStreamer.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ object TreemapDataStreamer {
4242
jg.writeStringField("name", node.label)
4343
jg.writeStringField("kind", node.kind.label)
4444
for (size <- node.size) jg.writeNumberField("lineCount", size)
45+
for (traced <- node.traced) jg.writeBooleanField("traced", traced)
4546

4647
jg.writeEndObject
4748
}

codepulse/src/main/scala/com/secdec/codepulse/tracer/export/TraceExporter.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ object TraceExporter extends JsonHelpers {
107107
jg.writeStringField("label", node.label)
108108
jg.writeStringField("kind", node.kind.label)
109109
for (size <- node.size) jg.writeNumberField("size", size)
110+
for (traced <- node.traced) jg.writeBooleanField("traced", traced)
110111

111112
jg.writeEndObject
112113
}

codepulse/src/main/scala/com/secdec/codepulse/tracer/export/TraceImportReaderV1.scala

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ object TraceImportReaderV1 extends TraceImportReader with TraceImportHelpers wit
8383
var label = None: Option[String]
8484
var kind = None: Option[CodeTreeNodeKind]
8585
var size = None: Option[Int]
86+
var traced = None: Option[Boolean]
8687

8788
while (jp.nextValue != END_OBJECT) {
8889
jp.getCurrentName match {
@@ -102,6 +103,12 @@ object TraceImportReaderV1 extends TraceImportReader with TraceImportHelpers wit
102103
case VALUE_NULL => None
103104
case _ => Some(jp.getIntValue)
104105
}
106+
107+
case "traced" =>
108+
traced = jp.getCurrentToken match {
109+
case VALUE_NULL => None
110+
case _ => Some(jp.getBooleanValue)
111+
}
105112
}
106113
}
107114

@@ -110,7 +117,8 @@ object TraceImportReaderV1 extends TraceImportReader with TraceImportHelpers wit
110117
parentId,
111118
label getOrElse { throw new TraceImportException("Missing label for tree node.") },
112119
kind.getOrElse { throw new TraceImportException("Missing or invalid kind for tree node.") },
113-
size)
120+
size,
121+
traced)
114122

115123
checkAndFlush
116124
}

0 commit comments

Comments
 (0)