@@ -28,17 +28,77 @@ object Pattern {
28
28
29
29
case class Definition (patternId : Pattern .Id , parameters : Option [Set [Parameter .Definition ]])
30
30
31
- case class Specification (patternId : Pattern .Id ,
32
- level : Result .Level ,
33
- category : Category ,
34
- parameters : Option [Set [Parameter .Specification ]],
35
- languages : Option [Set [Language ]] = None )
31
+ trait Specification {
32
+ val patternId : Pattern .Id
33
+ val level : Result .Level
34
+ val category : Category
35
+ val subcategory : Option [Subcategory ]
36
+ val parameters : Option [Set [Parameter .Specification ]]
37
+ val languages : Option [Set [Language ]]
38
+ }
39
+
40
+ object Specification {
41
+ private case class SpecificationImpl (patternId : Pattern .Id ,
42
+ level : Result .Level ,
43
+ category : Category ,
44
+ subcategory : Option [Subcategory ],
45
+ parameters : Option [Set [Parameter .Specification ]],
46
+ languages : Option [Set [Language ]] = None )
47
+ extends Specification
48
+
49
+ def apply (patternId : Pattern .Id ,
50
+ level : Result .Level ,
51
+ category : Category ,
52
+ subcategory : Option [Subcategory ],
53
+ parameters : Option [Set [Parameter .Specification ]],
54
+ languages : Option [Set [Language ]] = None ): Specification = {
55
+ val spec = SpecificationImpl (patternId, level, category, subcategory, parameters, languages)
56
+
57
+ spec.subcategory match {
58
+ case Some (sc) =>
59
+ sc match {
60
+ case Subcategory .BadDeserialization | Subcategory .BrokenAccess | Subcategory .BrokenAuth |
61
+ Subcategory .Injection | Subcategory .Misconfiguration | Subcategory .NoLogging |
62
+ Subcategory .SensitiveData | Subcategory .VulnerableComponent | Subcategory .XSS | Subcategory .XXE
63
+ if category == Category .Security =>
64
+ spec
65
+
66
+ case _ => throw new Exception (" invalid sub category" )
67
+ }
68
+ case None => spec
69
+ }
70
+ }
71
+ }
72
+
73
+ sealed trait Category
74
+
75
+ object Category {
76
+ case object Security extends Category
77
+ case object CodeStyle extends Category
78
+ case object ErrorProne extends Category
79
+ case object Performance extends Category
80
+ case object Compatibility extends Category
81
+ case object UnusedCode extends Category
82
+ case object Complexity extends Category
83
+ case object BestPractice extends Category
84
+ case object Comprehensibility extends Category
85
+ case object Duplication extends Category
86
+ case object Documentation extends Category
87
+ }
36
88
37
- type Category = Category . Value
89
+ sealed trait Subcategory
38
90
39
- object Category extends Enumeration {
40
- val Security, CodeStyle, ErrorProne, Performance, Compatibility, UnusedCode, // Deprecated
41
- Complexity , BestPractice , Comprehensibility , Duplication , Documentation = Value
91
+ object Subcategory {
92
+ case object Injection extends Subcategory
93
+ case object BrokenAuth extends Subcategory
94
+ case object SensitiveData extends Subcategory
95
+ case object XXE extends Subcategory
96
+ case object BrokenAccess extends Subcategory
97
+ case object Misconfiguration extends Subcategory
98
+ case object XSS extends Subcategory
99
+ case object BadDeserialization extends Subcategory
100
+ case object VulnerableComponent extends Subcategory
101
+ case object NoLogging extends Subcategory
42
102
}
43
103
44
104
}
0 commit comments