Skip to content

Commit

Permalink
path inclusion
Browse files Browse the repository at this point in the history
Signed-off-by: Pranav Gaikwad <pgaikwad@redhat.com>
  • Loading branch information
pranavgaikwad committed May 16, 2024
1 parent a743dce commit de9dee0
Show file tree
Hide file tree
Showing 19 changed files with 305 additions and 37 deletions.
71 changes: 39 additions & 32 deletions demo-output.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,29 @@
variables:
name: sigs.k8s.io/structured-merge-diff/v4
version: v4.2.1
java-inclusion-test:
description: "This rule tests includedPaths config of the java provider. There should be two instances of this issue in the example app. \nWe are filtering one of them using includedPaths in provider config.\n"
category: mandatory
incidents:
- uri: file:///examples/java/example/src/main/java/com/example/apps/util/FileReader.java
message: Only incidents in util/FileReader.java should be found
codeSnip: " 1 package com.example.apps.util;\n 2 \n 3 import java.io.File;\n 4 \n 5 public class FileReader {\n 6 public static void main(String[] args) {\n 7 File file = new File(\"test\");\n 8 if (file.exists()) {\n 9 System.out.println(\"file exists\");\n10 }\n11 }\n12 \n13 }"
lineNumber: 3
variables:
file: file:///examples/java/example/src/main/java/com/example/apps/util/FileReader.java
kind: Module
name: java.io.File
package: com.example.apps.util
- uri: file:///examples/java/example/src/main/java/com/example/apps/util/FileReader.java
message: Only incidents in util/FileReader.java should be found
codeSnip: " 1 package com.example.apps.util;\n 2 \n 3 import java.io.File;\n 4 \n 5 public class FileReader {\n 6 public static void main(String[] args) {\n 7 File file = new File(\"test\");\n 8 if (file.exists()) {\n 9 System.out.println(\"file exists\");\n10 }\n11 }\n12 \n13 }\n"
lineNumber: 7
variables:
file: file:///examples/java/example/src/main/java/com/example/apps/util/FileReader.java
kind: Method
name: main
package: com.example.apps.util
effort: 3
java-pomxml-dependencies:
description: ""
category: potential
Expand Down Expand Up @@ -370,17 +393,17 @@
file: file:///examples/golang/main.go
- uri: file:///examples/java/example/src/main/java/com/example/apps/App.java
message: apiextensions/v1beta1/customresourcedefinitions is deprecated, apiextensions/v1/customresourcedefinitions should be used instead
codeSnip: " 1 package com.example.apps;\n 2 \n 3 import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition;\n 4 \n 5 public class App \n 6 {\n 7 \n 8 /**\n 9 * {@link CustomResourceDefinition}\n10 * @param args\n11 */\n12 public static void main( String[] args )\n13 {"
lineNumber: 3
codeSnip: " 1 package com.example.apps;\n 2 \n 3 import java.io.File;\n 4 import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition;\n 5 \n 6 public class App \n 7 {\n 8 \n 9 /**\n10 * {@link CustomResourceDefinition}\n11 * @param args\n12 */\n13 public static void main( String[] args )\n14 {"
lineNumber: 4
variables:
file: file:///examples/java/example/src/main/java/com/example/apps/App.java
kind: Module
name: io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition
package: com.example.apps
- uri: file:///examples/java/example/src/main/java/com/example/apps/App.java
message: apiextensions/v1beta1/customresourcedefinitions is deprecated, apiextensions/v1/customresourcedefinitions should be used instead
codeSnip: " 4 \n 5 public class App \n 6 {\n 7 \n 8 /**\n 9 * {@link CustomResourceDefinition}\n10 * @param args\n11 */\n12 public static void main( String[] args )\n13 {\n14 CustomResourceDefinition crd = new CustomResourceDefinition();\n15 System.out.println( crd );\n16 \n17 GenericClass<String> element = new GenericClass<String>(\"Hello world!\");\n18 element.get();\n19 }\n20 }\n"
lineNumber: 14
codeSnip: " 5 \n 6 public class App \n 7 {\n 8 \n 9 /**\n10 * {@link CustomResourceDefinition}\n11 * @param args\n12 */\n13 public static void main( String[] args )\n14 {\n15 CustomResourceDefinition crd = new CustomResourceDefinition();\n16 System.out.println( crd );\n17 \n18 GenericClass<String> element = new GenericClass<String>(\"Hello world!\");\n19 element.get();\n20 \n21 // test file usage\n22 File file = new File(\"test\");\n23 if (file.exists()) {\n24 System.out.println(\"file exists\");\n25 }"
lineNumber: 15
variables:
file: file:///examples/java/example/src/main/java/com/example/apps/App.java
kind: Method
Expand All @@ -391,18 +414,18 @@
category: potential
incidents:
- uri: file:///examples/java/example/src/main/java/com/example/apps/App.java
message: java found apiextensions/v1/customresourcedefinitions found file:///examples/java/example/src/main/java/com/example/apps/App.java:14
codeSnip: " 4 \n 5 public class App \n 6 {\n 7 \n 8 /**\n 9 * {@link CustomResourceDefinition}\n10 * @param args\n11 */\n12 public static void main( String[] args )\n13 {\n14 CustomResourceDefinition crd = new CustomResourceDefinition();\n15 System.out.println( crd );\n16 \n17 GenericClass<String> element = new GenericClass<String>(\"Hello world!\");\n18 element.get();\n19 }\n20 }\n"
lineNumber: 14
message: java found apiextensions/v1/customresourcedefinitions found file:///examples/java/example/src/main/java/com/example/apps/App.java:15
codeSnip: " 5 \n 6 public class App \n 7 {\n 8 \n 9 /**\n10 * {@link CustomResourceDefinition}\n11 * @param args\n12 */\n13 public static void main( String[] args )\n14 {\n15 CustomResourceDefinition crd = new CustomResourceDefinition();\n16 System.out.println( crd );\n17 \n18 GenericClass<String> element = new GenericClass<String>(\"Hello world!\");\n19 element.get();\n20 \n21 // test file usage\n22 File file = new File(\"test\");\n23 if (file.exists()) {\n24 System.out.println(\"file exists\");\n25 }"
lineNumber: 15
variables:
file: file:///examples/java/example/src/main/java/com/example/apps/App.java
kind: Method
name: main
package: com.example.apps
- uri: file:///examples/java/example/src/main/java/com/example/apps/App.java
message: java found apiextensions/v1/customresourcedefinitions found file:///examples/java/example/src/main/java/com/example/apps/App.java:3
codeSnip: " 1 package com.example.apps;\n 2 \n 3 import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition;\n 4 \n 5 public class App \n 6 {\n 7 \n 8 /**\n 9 * {@link CustomResourceDefinition}\n10 * @param args\n11 */\n12 public static void main( String[] args )\n13 {"
lineNumber: 3
message: java found apiextensions/v1/customresourcedefinitions found file:///examples/java/example/src/main/java/com/example/apps/App.java:4
codeSnip: " 1 package com.example.apps;\n 2 \n 3 import java.io.File;\n 4 import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition;\n 5 \n 6 public class App \n 7 {\n 8 \n 9 /**\n10 * {@link CustomResourceDefinition}\n11 * @param args\n12 */\n13 public static void main( String[] args )\n14 {"
lineNumber: 4
variables:
file: file:///examples/java/example/src/main/java/com/example/apps/App.java
kind: Module
Expand All @@ -414,8 +437,8 @@
incidents:
- uri: file:///examples/java/example/src/main/java/com/example/apps/App.java
message: found generic call
codeSnip: " 8 /**\n 9 * {@link CustomResourceDefinition}\n10 * @param args\n11 */\n12 public static void main( String[] args )\n13 {\n14 CustomResourceDefinition crd = new CustomResourceDefinition();\n15 System.out.println( crd );\n16 \n17 GenericClass<String> element = new GenericClass<String>(\"Hello world!\");\n18 element.get();\n19 }\n20 }\n"
lineNumber: 18
codeSnip: " 9 /**\n10 * {@link CustomResourceDefinition}\n11 * @param args\n12 */\n13 public static void main( String[] args )\n14 {\n15 CustomResourceDefinition crd = new CustomResourceDefinition();\n16 System.out.println( crd );\n17 \n18 GenericClass<String> element = new GenericClass<String>(\"Hello world!\");\n19 element.get();\n20 \n21 // test file usage\n22 File file = new File(\"test\");\n23 if (file.exists()) {\n24 System.out.println(\"file exists\");\n25 }\n26 }\n27 }\n"
lineNumber: 19
variables:
VariableName: element
file: file:///examples/java/example/src/main/java/com/example/apps/App.java
Expand Down Expand Up @@ -490,44 +513,26 @@
incidents:
- uri: file:///examples/java/example/src/main/java/com/example/apps/Bean.java
message: condition entries should evaluate out of order
codeSnip: " 1 package com.example.apps;\n 2 \n 3 import javax.ejb.SessionBean;\n 4 import javax.ejb.Singleton;\n 5 \n 6 @Singleton\n 7 public abstract class Bean implements SessionBean {\n 8 }\n"
codeSnip: " 1 package com.example.apps;\n 2 \n 3 import javax.ejb.SessionBean;\n 4 import javax.ejb.Singleton;\n 5 \n 6 @Singleton\n 7 public abstract class Bean implements SessionBean {\n 8 \n 9 }\n"
lineNumber: 6
variables:
file: file:///examples/java/example/src/main/java/com/example/apps/Bean.java
kind: Class
name: Singleton
package: com.example.apps
- uri: file:///examples/java/example/src/main/java/com/example/apps/Bean.java
message: condition entries should evaluate out of order
codeSnip: " 1 package com.example.apps;\n 2 \n 3 import javax.ejb.SessionBean;\n 4 import javax.ejb.Singleton;\n 5 \n 6 @Singleton\n 7 public abstract class Bean implements SessionBean {\n 8 }\n"
lineNumber: 7
variables:
file: file:///examples/java/example/src/main/java/com/example/apps/Bean.java
kind: Class
name: Bean
package: com.example.apps
singleton-sessionbean-00002:
description: ""
category: potential
incidents:
- uri: file:///examples/java/example/src/main/java/com/example/apps/Bean.java
message: condition entries should evaluate in order
codeSnip: " 1 package com.example.apps;\n 2 \n 3 import javax.ejb.SessionBean;\n 4 import javax.ejb.Singleton;\n 5 \n 6 @Singleton\n 7 public abstract class Bean implements SessionBean {\n 8 }\n"
codeSnip: " 1 package com.example.apps;\n 2 \n 3 import javax.ejb.SessionBean;\n 4 import javax.ejb.Singleton;\n 5 \n 6 @Singleton\n 7 public abstract class Bean implements SessionBean {\n 8 \n 9 }\n"
lineNumber: 6
variables:
file: file:///examples/java/example/src/main/java/com/example/apps/Bean.java
kind: Class
name: Singleton
package: com.example.apps
- uri: file:///examples/java/example/src/main/java/com/example/apps/Bean.java
message: condition entries should evaluate in order
codeSnip: " 1 package com.example.apps;\n 2 \n 3 import javax.ejb.SessionBean;\n 4 import javax.ejb.Singleton;\n 5 \n 6 @Singleton\n 7 public abstract class Bean implements SessionBean {\n 8 }\n"
lineNumber: 7
variables:
file: file:///examples/java/example/src/main/java/com/example/apps/Bean.java
kind: Class
name: Bean
package: com.example.apps
tech-tag-001:
description: ""
category: potential
Expand Down Expand Up @@ -803,6 +808,8 @@
unable to get query info: yaml: unmarshal errors:
line 9: cannot unmarshal !!map into string
unmatched:
- builtin-inclusion-test-json
- builtin-inclusion-test-xml
- file-002
- lang-ref-002
- python-sample-rule-003
5 changes: 5 additions & 0 deletions examples/builtin/inclusion_tests/dir-0/inclusion-test.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"description": "Does your JSON search work?",
"name": "test-your-json-search",
"inclusionTestNode": "Test this node"
}
5 changes: 5 additions & 0 deletions examples/builtin/inclusion_tests/dir-0/inclusion-test.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<xmlTest>
<description>Does your XML search work?</description>
<name>xml-search</name>
<inclusionTestNode>Test this node</inclusionTestNode>
</xmlTest>
5 changes: 5 additions & 0 deletions examples/builtin/inclusion_tests/inclusion-test.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"description": "Does your JSON search work?",
"name": "test-your-json-search",
"inclusionTestNode": "Test this node"
}
5 changes: 5 additions & 0 deletions examples/builtin/inclusion_tests/inclusion-test.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<xmlTest>
<description>Does your XML search work?</description>
<name>xml-search</name>
<inclusionTestNode>Test this node</inclusionTestNode>
</xmlTest>
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.example.apps;

import java.io.File;
import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition;

public class App
Expand All @@ -16,5 +17,11 @@ public static void main( String[] args )

GenericClass<String> element = new GenericClass<String>("Hello world!");
element.get();

// test file usage
File file = new File("test");
if (file.exists()) {
System.out.println("file exists");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@

@Singleton
public abstract class Bean implements SessionBean {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.apps.util;

import java.io.File;

public class FileReader {
public static void main(String[] args) {
File file = new File("test");
if (file.exists()) {
System.out.println("file exists");
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,7 @@ func (p *javaProvider) Init(ctx context.Context, log logr.Logger, config provide
isLocationBinary: isBinary,
mvnSettingsFile: mavenSettingsFile,
depsLocationCache: make(map[string]int),
includedPaths: provider.GetIncludedPathsFromConfig(config, false),
}

svcClient.initialization(ctx)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ type javaServiceClient struct {
depsMutex sync.RWMutex
depsCache map[uri.URI][]*provider.Dep
depsLocationCache map[string]int
includedPaths []string
}

type depLabelItem struct {
Expand Down Expand Up @@ -101,13 +102,18 @@ func (p *javaServiceClient) GetAllSymbols(ctx context.Context, query, location s
// This command will run the added bundle to the language server. The command over the wire needs too look like this.
// in this case the project is hardcoded in the init of the Langauge Server above
// workspace/executeCommand '{"command": "io.konveyor.tackle.ruleEntry", "arguments": {"query":"*customresourcedefinition","project": "java"}}'
argumentsMap := map[string]string{
argumentsMap := map[string]interface{}{
"query": query,
"project": "java",
"location": fmt.Sprintf("%v", locationToCode[strings.ToLower(location)]),
"analysisMode": string(p.config.AnalysisMode),
}

if p.includedPaths != nil && len(p.includedPaths) > 0 {
argumentsMap[provider.IncludedPathsConfigKey] = p.includedPaths
p.log.V(5).Info("setting search scope by filepaths", "paths", p.includedPaths)
}

argumentsBytes, _ := json.Marshal(argumentsMap)
arguments := []json.RawMessage{argumentsBytes}

Expand Down
1 change: 1 addition & 0 deletions provider/internal/builtin/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ func (p *builtinProvider) Init(ctx context.Context, log logr.Logger, config prov
UnimplementedDependenciesComponent: provider.UnimplementedDependenciesComponent{},
locationCache: make(map[string]float64),
log: log,
includedPaths: provider.GetIncludedPathsFromConfig(config, true),
}, nil
}

Expand Down
51 changes: 48 additions & 3 deletions provider/internal/builtin/service_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ type builtinServiceClient struct {

cacheMutex sync.RWMutex
locationCache map[string]float64
includedPaths []string
}

type fileTemplateContext struct {
Expand Down Expand Up @@ -57,7 +58,7 @@ func (p *builtinServiceClient) Evaluate(ctx context.Context, cap string, conditi
if err != nil {
return response, fmt.Errorf("unable to find files using pattern `%s`: %v", c.Pattern, err)
}

matchingFiles = p.filterByIncludedPaths(matchingFiles)
if len(matchingFiles) != 0 {
response.Matched = true
}
Expand Down Expand Up @@ -155,7 +156,7 @@ func (p *builtinServiceClient) Evaluate(ctx context.Context, cap string, conditi
if err != nil {
return response, fmt.Errorf("unable to find XML files: %v", err)
}

xmlFiles = p.filterByIncludedPaths(xmlFiles)
for _, file := range xmlFiles {
nodes, err := queryXMLFile(file, query)
if err != nil {
Expand All @@ -169,6 +170,9 @@ func (p *builtinServiceClient) Evaluate(ctx context.Context, cap string, conditi
if err != nil {
ab = file
}
if paths := p.filterByIncludedPaths([]string{ab}); len(paths) == 0 {
continue
}
incident := provider.IncidentContext{
FileURI: uri.File(ab),
Variables: map[string]interface{}{
Expand Down Expand Up @@ -206,7 +210,7 @@ func (p *builtinServiceClient) Evaluate(ctx context.Context, cap string, conditi
if err != nil {
return response, fmt.Errorf("unable to find XML files: %v", err)
}

xmlFiles = p.filterByIncludedPaths(xmlFiles)
for _, file := range xmlFiles {
nodes, err := queryXMLFile(file, query)
if err != nil {
Expand Down Expand Up @@ -250,6 +254,7 @@ func (p *builtinServiceClient) Evaluate(ctx context.Context, cap string, conditi
if err != nil {
return response, fmt.Errorf("unable to find files using pattern `%s`: %v", pattern, err)
}
jsonFiles = p.filterByIncludedPaths(jsonFiles)
for _, file := range jsonFiles {
f, err := os.Open(file)
if err != nil {
Expand Down Expand Up @@ -451,3 +456,43 @@ func queryXMLFile(filePath string, query *xpath.Expr) (nodes []*xmlquery.Node, e
nodes = xmlquery.QuerySelectorAll(doc, query)
return nodes, err
}

// filterByIncludedPaths given a list of file paths,
// filters-out the ones not present in includedPaths
func (b *builtinServiceClient) filterByIncludedPaths(paths []string) []string {
if b.includedPaths == nil || len(b.includedPaths) == 0 {
return paths
}

getSegments := func(path string) []string {
segments := []string{}
path = filepath.Clean(path)
for _, segment := range strings.Split(
path, string(os.PathSeparator)) {
if segment != "" {
segments = append(segments, segment)
}
}
return segments
}

validatedPaths := []string{}
for _, p := range paths {
absPath := p
if path, err := filepath.Abs(p); err == nil {
absPath = path
}
pathSegments := getSegments(absPath)
for _, includedPath := range b.includedPaths {
includedPathSegments := getSegments(includedPath)
if len(pathSegments) >= len(includedPathSegments) &&
strings.HasPrefix(strings.Join(pathSegments, ""),
strings.Join(includedPathSegments, "")) {
validatedPaths = append(validatedPaths, absPath)
} else {
b.log.V(5).Info("path excluded from search", "path", absPath)
}
}
}
return validatedPaths
}
Loading

0 comments on commit de9dee0

Please sign in to comment.