From 90b346c3c778c06c9a23e53754cea6f557d70394 Mon Sep 17 00:00:00 2001 From: Pranav Gaikwad Date: Thu, 9 Nov 2023 07:26:01 -0500 Subject: [PATCH] :sparkles: add dependency location resolver Signed-off-by: Pranav Gaikwad --- demo-dep-output.yaml | 413 +++++++++++- demo-output.yaml | 84 +++ provider/internal/builtin/provider.go | 2 + provider/internal/builtin/service_client.go | 114 +++- provider/internal/java/dependency.go | 42 +- provider/internal/java/dependency_test.go | 82 ++- provider/internal/java/provider.go | 102 ++- provider/internal/java/service_client.go | 25 +- provider/lib.go | 48 ++ provider/lib_test.go | 71 ++ provider/provider.go | 44 +- provider/testdata/big.xml | 696 ++++++++++++++++++++ provider/testdata/small.xml | 165 +++++ 13 files changed, 1822 insertions(+), 66 deletions(-) create mode 100644 provider/lib_test.go create mode 100644 provider/testdata/big.xml create mode 100644 provider/testdata/small.xml diff --git a/demo-dep-output.yaml b/demo-dep-output.yaml index d08e915f..eb85f743 100644 --- a/demo-dep-output.yaml +++ b/demo-dep-output.yaml @@ -333,6 +333,10 @@ version: 1.0.0 type: compile resolvedIdentifier: FE4FE11AAEE77BE10035218537FBF4B2E6EF1D9F + extras: + artifactId: config-utils + groupId: io.konveyor.demo + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=internal - konveyor.io/language=java @@ -340,7 +344,10 @@ - name: org.postgresql.postgresql version: 42.2.23 type: compile - resolvedIdentifier: 9cb217a3d5b640567ed7c6e8c11f389613c81c4d + extras: + artifactId: postgresql + groupId: org.postgresql + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -349,7 +356,10 @@ version: 3.5.0 type: runtime indirect: true - resolvedIdentifier: 2f50520c8abea66fbd8d26e481d3aef5c673b510 + extras: + artifactId: checker-qual + groupId: org.checkerframework + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -357,7 +367,10 @@ - name: com.oracle.database.jdbc.ojdbc8 version: 21.1.0.0 type: compile - resolvedIdentifier: 50044485aea10afd7defeee8109c5195b4d3cae2 + extras: + artifactId: ojdbc8 + groupId: com.oracle.database.jdbc + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -365,7 +378,10 @@ - name: ch.qos.logback.logback-classic version: 1.1.7 type: compile - resolvedIdentifier: 9865cf6994f9ff13fce0bf93f2054ef6c65bb462 + extras: + artifactId: logback-classic + groupId: ch.qos.logback + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -374,7 +390,10 @@ version: 1.1.7 type: compile indirect: true - resolvedIdentifier: 7873092d39ef741575ca91378a6a21c388363ac8 + extras: + artifactId: logback-core + groupId: ch.qos.logback + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -382,7 +401,10 @@ - name: org.hibernate.validator.hibernate-validator version: 6.2.0.Final type: compile - resolvedIdentifier: d6b0760dfffbf379cedd02f715ff4c9a2e215921 + extras: + artifactId: hibernate-validator + groupId: org.hibernate.validator + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -391,7 +413,10 @@ version: 2.0.2 type: compile indirect: true - resolvedIdentifier: 5eacc6522521f7eacb081f95cee1e231648461e7 + extras: + artifactId: jakarta.validation-api + groupId: jakarta.validation + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -400,7 +425,10 @@ version: 1.5.1 type: compile indirect: true - resolvedIdentifier: 3fe0bed568c62df5e89f4f174c101eab25345b6c + extras: + artifactId: classmate + groupId: com.fasterxml + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -409,6 +437,10 @@ version: 5.4.32.Final type: compile resolvedIdentifier: 3f60db4097732960ec792c033dbb7c34f1b9e328 + extras: + artifactId: hibernate-entitymanager + groupId: org.hibernate + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -418,6 +450,10 @@ type: compile indirect: true resolvedIdentifier: 40fd4d696c55793e996d1ff3c475833f836c2498 + extras: + artifactId: jboss-logging + groupId: org.jboss.logging + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -426,7 +462,10 @@ version: 5.4.32.Final type: compile indirect: true - resolvedIdentifier: 99a5e10bf455337014c190e141ec631e9ff71663 + extras: + artifactId: hibernate-core + groupId: org.hibernate + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -436,6 +475,10 @@ type: compile indirect: true resolvedIdentifier: f63e6aa899e15eca8fdaa402a79af4c417252213 + extras: + artifactId: javassist + groupId: org.javassist + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -445,6 +488,10 @@ type: compile indirect: true resolvedIdentifier: 83cd2cd674a217ade95a4bb83a8a14f351f48bd0 + extras: + artifactId: antlr + groupId: antlr + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -454,6 +501,10 @@ type: compile indirect: true resolvedIdentifier: d3865101f0666b63586683bd811d754517f331ab + extras: + artifactId: jandex + groupId: org.jboss + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -463,6 +514,10 @@ type: compile indirect: true resolvedIdentifier: 85262acf3ca9816f9537ca47d5adeabaead7cb16 + extras: + artifactId: javax.activation-api + groupId: javax.activation + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -472,6 +527,10 @@ type: compile indirect: true resolvedIdentifier: 8531ad5ac454cc2deb9d4d32c40c4d7451939b5d + extras: + artifactId: jaxb-api + groupId: javax.xml.bind + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -480,7 +539,10 @@ version: 2.3.1 type: compile indirect: true - resolvedIdentifier: dd6dda9da676a54c5b36ca2806ff95ee017d8738 + extras: + artifactId: jaxb-runtime + groupId: org.glassfish.jaxb + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -490,6 +552,10 @@ type: compile indirect: true resolvedIdentifier: a09d2c48d3285f206fafbffe0e50619284e92126 + extras: + artifactId: txw2 + groupId: org.glassfish.jaxb + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -499,6 +565,10 @@ type: compile indirect: true resolvedIdentifier: c197c86ceec7318b1284bffb49b54226ca774003 + extras: + artifactId: istack-commons-runtime + groupId: com.sun.istack + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -508,6 +578,10 @@ type: compile indirect: true resolvedIdentifier: 8cc35f73da321c29973191f2cf143d29d26a1df7 + extras: + artifactId: stax-ex + groupId: org.jvnet.staxex + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -516,7 +590,10 @@ version: 1.2.15 type: compile indirect: true - resolvedIdentifier: bb7b7ec0379982b97c62cd17465cb6d9155f68e8 + extras: + artifactId: FastInfoset + groupId: com.sun.xml.fastinfoset + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -526,6 +603,10 @@ type: compile indirect: true resolvedIdentifier: a75914155a9f5808963170ec20653668a2ffd2fd + extras: + artifactId: dom4j + groupId: org.dom4j + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -535,6 +616,10 @@ type: compile indirect: true resolvedIdentifier: e59ffdbc6ad09eeb33507b39ffcf287679a498c8 + extras: + artifactId: hibernate-commons-annotations + groupId: org.hibernate.common + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -544,6 +629,10 @@ type: compile indirect: true resolvedIdentifier: 25665ac8c0b62f50e6488173233239120fc52c96 + extras: + artifactId: javax.persistence-api + groupId: javax.persistence + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -552,7 +641,10 @@ version: 1.10.22 type: compile indirect: true - resolvedIdentifier: ef45d7e2cd1c600d279704f492ed5ce2ceb6cdb5 + extras: + artifactId: byte-buddy + groupId: net.bytebuddy + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -561,7 +653,10 @@ version: 1.1.1.Final type: compile indirect: true - resolvedIdentifier: a8485cab9484dda36e9a8c319e76b5cc18797b58 + extras: + artifactId: jboss-transaction-api_1.2_spec + groupId: org.jboss.spec.javax.transaction + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -570,6 +665,10 @@ version: 9.0.46 type: runtime resolvedIdentifier: 385cb6cb1f6b26c881cd5c1c6ade5f180712ffdc + extras: + artifactId: tomcat-jdbc + groupId: org.apache.tomcat + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -579,6 +678,10 @@ type: runtime indirect: true resolvedIdentifier: 409b519751e104eab51b4347a0d27bf86a4f3bb1 + extras: + artifactId: tomcat-juli + groupId: org.apache.tomcat + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -587,6 +690,10 @@ version: 2.5.0 type: compile resolvedIdentifier: 8fc47befa38bdaa2f2b8f421d8532f03005e2851 + extras: + artifactId: spring-boot-starter-actuator + groupId: org.springframework.boot + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -596,6 +703,10 @@ type: compile indirect: true resolvedIdentifier: a910887c01efcc7d12f3f89a7604d436f26eeb90 + extras: + artifactId: spring-boot-starter + groupId: org.springframework.boot + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -605,6 +716,10 @@ type: compile indirect: true resolvedIdentifier: b07513e04ad906ea69ef84293a123cdb83828f06 + extras: + artifactId: spring-boot + groupId: org.springframework.boot + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -614,6 +729,10 @@ type: compile indirect: true resolvedIdentifier: 64c7bbc941c70895621ed613f38dc66b73ea9341 + extras: + artifactId: spring-boot-autoconfigure + groupId: org.springframework.boot + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -623,6 +742,10 @@ type: compile indirect: true resolvedIdentifier: 22401482ba1c5a1dcd3d33e47295779211b913d8 + extras: + artifactId: spring-boot-starter-logging + groupId: org.springframework.boot + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -632,6 +755,10 @@ type: compile indirect: true resolvedIdentifier: ce8a86a3f50a4304749828ce68e7478cafbc8039 + extras: + artifactId: log4j-to-slf4j + groupId: org.apache.logging.log4j + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -641,6 +768,10 @@ type: compile indirect: true resolvedIdentifier: cd8858fbbde69f46bce8db1152c18a43328aae78 + extras: + artifactId: log4j-api + groupId: org.apache.logging.log4j + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -650,6 +781,10 @@ type: compile indirect: true resolvedIdentifier: d58bebff8cbf70ff52b59208586095f467656c30 + extras: + artifactId: jul-to-slf4j + groupId: org.slf4j + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -659,6 +794,10 @@ type: compile indirect: true resolvedIdentifier: 59eb84ee0d616332ff44aba065f3888cf002cd2d + extras: + artifactId: jakarta.annotation-api + groupId: jakarta.annotation + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -668,6 +807,10 @@ type: compile indirect: true resolvedIdentifier: 7cae037c3014350c923776548e71c9feb7a69259 + extras: + artifactId: snakeyaml + groupId: org.yaml + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -677,6 +820,10 @@ type: compile indirect: true resolvedIdentifier: 41956882243e86f8260f649ebdd96597a2ff52a9 + extras: + artifactId: spring-boot-actuator-autoconfigure + groupId: org.springframework.boot + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -686,6 +833,10 @@ type: compile indirect: true resolvedIdentifier: e0ac75f1a183f8e6a319a8b03bad1c45d40a2761 + extras: + artifactId: spring-boot-actuator + groupId: org.springframework.boot + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -695,6 +846,10 @@ type: runtime indirect: true resolvedIdentifier: f69c636438dcf19c49960c1fe8901320ab85f989 + extras: + artifactId: jackson-datatype-jsr310 + groupId: com.fasterxml.jackson.datatype + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -704,6 +859,10 @@ type: compile indirect: true resolvedIdentifier: bc7dc1605f2099dc3c39156b7f62ac889f54fb67 + extras: + artifactId: micrometer-core + groupId: io.micrometer + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -713,6 +872,10 @@ type: compile indirect: true resolvedIdentifier: 6eb7552156e0d517ae80cc2247be1427c8d90452 + extras: + artifactId: HdrHistogram + groupId: org.hdrhistogram + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -722,6 +885,10 @@ type: runtime indirect: true resolvedIdentifier: 769c0b82cb2421c8256300e907298a9410a2a3d3 + extras: + artifactId: LatencyUtils + groupId: org.latencyutils + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -730,6 +897,10 @@ version: 5.3.7 type: compile resolvedIdentifier: 49e6a8f45e77f14ef16f82c0413254ef493b785f + extras: + artifactId: spring-web + groupId: org.springframework + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -738,6 +909,10 @@ version: 5.3.7 type: compile resolvedIdentifier: 8437c7a572177a34607abdaef2f6b8088488f5c0 + extras: + artifactId: spring-webmvc + groupId: org.springframework + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -747,6 +922,10 @@ type: compile indirect: true resolvedIdentifier: 13351fce0a604957cd6a41478ebb54a953a0245e + extras: + artifactId: spring-expression + groupId: org.springframework + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -755,6 +934,10 @@ version: 5.3.7 type: compile resolvedIdentifier: 5caf72035a9b8a3a09ef82322cd2497aedddc487 + extras: + artifactId: spring-jdbc + groupId: org.springframework + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -763,6 +946,10 @@ version: 2.5.1 type: compile resolvedIdentifier: 881f7ae140f424b3bdb1b0c27a61b93e0bee9fa5 + extras: + artifactId: spring-data-jpa + groupId: org.springframework.data + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -772,6 +959,10 @@ type: compile indirect: true resolvedIdentifier: c950ca1a05e928e9fb75420b4ac07713428e9969 + extras: + artifactId: spring-data-commons + groupId: org.springframework.data + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -781,6 +972,10 @@ type: compile indirect: true resolvedIdentifier: f1892fe7a6671348d6546facbd40159b7e6f64a2 + extras: + artifactId: spring-orm + groupId: org.springframework + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -790,6 +985,10 @@ type: compile indirect: true resolvedIdentifier: 330b3957efdcdebe3550b8e2c5d45a4c25496626 + extras: + artifactId: spring-context + groupId: org.springframework + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -799,6 +998,10 @@ type: compile indirect: true resolvedIdentifier: b86edd2455f8c4399068c999beb9ea2a9e7f2047 + extras: + artifactId: spring-aop + groupId: org.springframework + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -808,6 +1011,10 @@ type: compile indirect: true resolvedIdentifier: 98be572c2bf3bd08724363b0bba71bcef59c4739 + extras: + artifactId: spring-tx + groupId: org.springframework + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -817,6 +1024,10 @@ type: compile indirect: true resolvedIdentifier: 8b1eacd7aaa12f7d173a2f0836d28bd0c1b098fe + extras: + artifactId: spring-beans + groupId: org.springframework + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -826,6 +1037,10 @@ type: compile indirect: true resolvedIdentifier: 4aad1b62bd347a806fe693c9d67b376a3ad8151c + extras: + artifactId: spring-core + groupId: org.springframework + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -835,6 +1050,10 @@ type: compile indirect: true resolvedIdentifier: ccd8bde38bad689737295fa220e1c70680676d72 + extras: + artifactId: spring-jcl + groupId: org.springframework + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -844,6 +1063,10 @@ type: compile indirect: true resolvedIdentifier: 1651849d48659e5703adc2599e694bf67b8c3fc4 + extras: + artifactId: aspectjrt + groupId: org.aspectj + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -853,6 +1076,10 @@ type: compile indirect: true resolvedIdentifier: 77100a62c2e6f04b53977b9f541044d7d722693d + extras: + artifactId: slf4j-api + groupId: org.slf4j + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -861,6 +1088,10 @@ version: 2.12.3 type: compile resolvedIdentifier: d6153f8fc60c479ab0f9efb35c034526436a4953 + extras: + artifactId: jackson-databind + groupId: com.fasterxml.jackson.core + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -870,6 +1101,10 @@ type: compile indirect: true resolvedIdentifier: 7275513412694a1aafd08c0287f48469fa0e6e17 + extras: + artifactId: jackson-annotations + groupId: com.fasterxml.jackson.core + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -878,6 +1113,10 @@ version: 2.12.3 type: compile resolvedIdentifier: deb23fe2a7f2b773e18ced2b50d4acc1df8fa366 + extras: + artifactId: jackson-core + groupId: com.fasterxml.jackson.core + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -886,6 +1125,10 @@ version: 9.0.46 type: provided resolvedIdentifier: 8e8a27a3456b71b1da2c8adc902ade71bc91fcb4 + extras: + artifactId: tomcat-servlet-api + groupId: org.apache.tomcat + pomPath: /analyzer-lsp/examples/customers-tomcat-legacy/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -897,6 +1140,10 @@ version: 2.13.3 type: compile resolvedIdentifier: a27014716e4421684416e5fa83d896ddb87002da + extras: + artifactId: jackson-core + groupId: com.fasterxml.jackson.core + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -905,6 +1152,10 @@ version: 2.13.3 type: compile resolvedIdentifier: 56deb9ea2c93a7a556b3afbedd616d342963464e + extras: + artifactId: jackson-databind + groupId: com.fasterxml.jackson.core + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -913,6 +1164,10 @@ version: 2.13.3 type: compile resolvedIdentifier: ad2f4c61aeb9e2a8bb5e4a3ed782cfddec52d972 + extras: + artifactId: jackson-datatype-jsr310 + groupId: com.fasterxml.jackson.datatype + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -921,6 +1176,10 @@ version: 2.13.3 type: compile resolvedIdentifier: 9363ded5441b1fee62d5be0604035690ca759a2a + extras: + artifactId: jackson-dataformat-yaml + groupId: com.fasterxml.jackson.dataformat + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -930,6 +1189,10 @@ type: compile indirect: true resolvedIdentifier: 8fde7fe2586328ac3c68db92045e1c8759125000 + extras: + artifactId: snakeyaml + groupId: org.yaml + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -938,6 +1201,10 @@ version: 1.7.36 type: compile resolvedIdentifier: 6c62681a2f655b49963a5983b8b0950a6120ae14 + extras: + artifactId: slf4j-api + groupId: org.slf4j + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -946,6 +1213,10 @@ version: 6.0.0 type: compile resolvedIdentifier: 972706f6dffa518e11c94647cf47e188db6115f6 + extras: + artifactId: kubernetes-model-node + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -954,6 +1225,10 @@ version: 6.0.0 type: compile resolvedIdentifier: 6ffa61f9021d07a4a9d785e83a513955a3c48073 + extras: + artifactId: kubernetes-model-storageclass + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -962,6 +1237,10 @@ version: 6.0.0 type: compile resolvedIdentifier: a5fae7294f5c39fb9d7cffb7280b55ca458c9128 + extras: + artifactId: kubernetes-model-scheduling + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -970,6 +1249,10 @@ version: 6.0.0 type: compile resolvedIdentifier: 15b3011eb5ff48b9fc2bd8bcc4db697ca9ec30e4 + extras: + artifactId: kubernetes-model-policy + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -978,6 +1261,10 @@ version: 6.0.0 type: compile resolvedIdentifier: 1a400f8f7915bd2a68fa075605768d762aaad4cb + extras: + artifactId: kubernetes-model-metrics + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -986,6 +1273,10 @@ version: 6.0.0 type: compile resolvedIdentifier: c87e11bebb26bb48660765b42a68f9577336b799 + extras: + artifactId: kubernetes-model-networking + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -994,6 +1285,10 @@ version: 6.0.0 type: compile resolvedIdentifier: 3b01d9eab7e7d7c9d46d8828202bff78fbdaa7d9 + extras: + artifactId: kubernetes-model-flowcontrol + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1002,6 +1297,10 @@ version: 6.0.0 type: compile resolvedIdentifier: 60c9e43f1f34ab9c145798471926c07e13e45ecf + extras: + artifactId: kubernetes-model-extensions + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1010,6 +1309,10 @@ version: 6.0.0 type: compile resolvedIdentifier: 204c2c78a4a8e0b5f5ebc1b788c9f22a8c1b14ab + extras: + artifactId: kubernetes-model-events + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1018,6 +1321,10 @@ version: 6.0.0 type: compile resolvedIdentifier: 246ad448a1868b3c601394e21350a9602adef24c + extras: + artifactId: kubernetes-model-discovery + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1026,6 +1333,10 @@ version: 6.0.0 type: compile resolvedIdentifier: cd454532158351d8ff37616dc33749ca2a85c8d1 + extras: + artifactId: kubernetes-model-coordination + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1034,6 +1345,10 @@ version: 6.0.0 type: compile resolvedIdentifier: 33f5a3f386cddda55003e1616303ab924fcd3ca5 + extras: + artifactId: kubernetes-model-certificates + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1042,6 +1357,10 @@ version: 6.0.0 type: compile resolvedIdentifier: 9f14cbfc75d172fa81f3f6ad793bdd45a2decaec + extras: + artifactId: kubernetes-model-batch + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1050,6 +1369,10 @@ version: 6.0.0 type: compile resolvedIdentifier: eac63b8dec80e96c4356c91ed0a332415efcb75e + extras: + artifactId: kubernetes-model-apiextensions + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1058,6 +1381,10 @@ version: 6.0.0 type: compile resolvedIdentifier: b353e45133fbc80791d676b16203ec94c0958b7d + extras: + artifactId: kubernetes-model-autoscaling + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1066,6 +1393,10 @@ version: 6.0.0 type: compile resolvedIdentifier: 4dbda6401058a5fd3a4c6be88fc1bf4f99296c4f + extras: + artifactId: kubernetes-model-apps + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1074,6 +1405,10 @@ version: 6.0.0 type: compile resolvedIdentifier: 9e3b0d4caa3d033fa0f71c71d8a535a748b280ba + extras: + artifactId: kubernetes-model-admissionregistration + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1082,6 +1417,10 @@ version: 6.0.0 type: compile resolvedIdentifier: 03ad461761d775ff9c252d2b26a4977d22dd0f3a + extras: + artifactId: kubernetes-model-rbac + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1090,6 +1429,10 @@ version: 6.0.0 type: compile resolvedIdentifier: 73469e4a7baec7600455d7f4a121c6680e80bf35 + extras: + artifactId: kubernetes-model-core + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1099,6 +1442,10 @@ type: compile indirect: true resolvedIdentifier: 7d45968cf6b9902e37d5d542f42ee2daed203e3d + extras: + artifactId: kubernetes-model-common + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1108,6 +1455,10 @@ type: compile indirect: true resolvedIdentifier: 7198b3aac15285a49e218e08441c5f70af00fc51 + extras: + artifactId: jackson-annotations + groupId: com.fasterxml.jackson.core + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1116,6 +1467,10 @@ version: 6.0.0 type: compile resolvedIdentifier: 3f54cdb10f54b413fe4b8a0d4d044d33174bd271 + extras: + artifactId: kubernetes-client-api + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1124,6 +1479,10 @@ version: 6.0.0 type: compile resolvedIdentifier: d0831d44e12313df8989fc1d4a9c90452f08858e + extras: + artifactId: kubernetes-client + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1133,6 +1492,10 @@ type: runtime indirect: true resolvedIdentifier: 70690b98acb07a809c55d15d7cf45f53ec1026e1 + extras: + artifactId: kubernetes-httpclient-okhttp + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1142,6 +1505,10 @@ type: runtime indirect: true resolvedIdentifier: d3e1ce1d2b3119adf270b2d00d947beb03fe3321 + extras: + artifactId: okhttp + groupId: com.squareup.okhttp3 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1151,6 +1518,10 @@ type: runtime indirect: true resolvedIdentifier: bc28b5a964c8f5721eb58ee3f3c47a9bcbf4f4d8 + extras: + artifactId: okio + groupId: com.squareup.okio + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1160,6 +1531,10 @@ type: runtime indirect: true resolvedIdentifier: d952189f6abb148ff72aab246aa8c28cf99b469f + extras: + artifactId: logging-interceptor + groupId: com.squareup.okhttp3 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1169,6 +1544,10 @@ type: compile indirect: true resolvedIdentifier: d3ebf0f291297649b4c8dc3ecc81d2eddedc100d + extras: + artifactId: zjsonpatch + groupId: io.fabric8 + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1177,6 +1556,10 @@ version: "4.11" type: test resolvedIdentifier: 4e031bb61df09069aeb2bffb4019e7a5034a4ee0 + extras: + artifactId: junit + groupId: junit + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java @@ -1186,6 +1569,10 @@ type: test indirect: true resolvedIdentifier: 42a25dc3219429f0e5d060061f71acb49bf010a0 + extras: + artifactId: hamcrest-core + groupId: org.hamcrest + pomPath: /analyzer-lsp/examples/java/pom.xml labels: - konveyor.io/dep-source=open-source - konveyor.io/language=java diff --git a/demo-output.yaml b/demo-output.yaml index 7d557225..147f1e0a 100644 --- a/demo-output.yaml +++ b/demo-output.yaml @@ -12,120 +12,160 @@ incidents: - uri: file:///analyzer-lsp/examples/java/pom.xml message: junitjunit4.11test + codeSnip: "14 \n15 \n16 UTF-8\n17 1.7\n18 1.7\n19 \n20 \n21 \n22 \n23 junit\n24 junit\n25 4.11\n26 test\n27 \n28 \n29 io.fabric8\n30 kubernetes-client\n31 6.0.0\n32 \n33 \n34 io.fabric8" + lineNumber: 23 variables: data: dependency innerText: "\n junit\n junit\n 4.11\n test\n " matchingXML: junitjunit4.11test - uri: file:///analyzer-lsp/examples/java/pom.xml message: io.fabric8kubernetes-client6.0.0 + codeSnip: "20 \n21 \n22 \n23 junit\n24 junit\n25 4.11\n26 test\n27 \n28 \n29 io.fabric8\n30 kubernetes-client\n31 6.0.0\n32 \n33 \n34 io.fabric8\n35 kubernetes-client-api\n36 6.0.0\n37 \n38 \n39 \n40 " + lineNumber: 29 variables: data: dependency innerText: "\n io.fabric8\n kubernetes-client\n 6.0.0\n " matchingXML: io.fabric8kubernetes-client6.0.0 - uri: file:///analyzer-lsp/examples/java/pom.xml message: io.fabric8kubernetes-client-api6.0.0 + codeSnip: "25 4.11\n26 test\n27 \n28 \n29 io.fabric8\n30 kubernetes-client\n31 6.0.0\n32 \n33 \n34 io.fabric8\n35 kubernetes-client-api\n36 6.0.0\n37 \n38 \n39 \n40 \n41 \n42 \n43 \n44 \n45 maven-clean-plugin" + lineNumber: 34 variables: data: dependency innerText: "\n io.fabric8\n kubernetes-client-api\n 6.0.0\n " matchingXML: io.fabric8kubernetes-client-api6.0.0 - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: com.fasterxml.jacksonjackson-bom${jackson.version}importpom + codeSnip: "36 \t\t\tdemo-config\n37 \t\t\tAzure DevOps\n38 \t\t\thttps://pkgs.dev.azure.com/ShawnHurley21/demo-config-utils/_packaging/demo-config/maven/v1\n39 \t\t\n40 \t\n41 \n42 \t\n43 \t\t\n44 \t\t\t\n45 \t\t\t\tcom.fasterxml.jackson\n46 \t\t\t\tjackson-bom\n47 \t\t\t\t${jackson.version}\n48 \t\t\t\timport\n49 \t\t\t\tpom\n50 \t\t\t\n51 \t\t\t\n52 \t\t\t\torg.springframework.data\n53 \t\t\t\tspring-data-bom\n54 \t\t\t\t${spring-data.version}\n55 \t\t\t\timport\n56 \t\t\t\tpom" + lineNumber: 45 variables: data: dependency innerText: "\n\t\t\t\tcom.fasterxml.jackson\n\t\t\t\tjackson-bom\n\t\t\t\t${jackson.version}\n\t\t\t\timport\n\t\t\t\tpom\n\t\t\t" matchingXML: com.fasterxml.jacksonjackson-bom${jackson.version}importpom - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: org.springframework.dataspring-data-bom${spring-data.version}importpom + codeSnip: "43 \t\t\n44 \t\t\t\n45 \t\t\t\tcom.fasterxml.jackson\n46 \t\t\t\tjackson-bom\n47 \t\t\t\t${jackson.version}\n48 \t\t\t\timport\n49 \t\t\t\tpom\n50 \t\t\t\n51 \t\t\t\n52 \t\t\t\torg.springframework.data\n53 \t\t\t\tspring-data-bom\n54 \t\t\t\t${spring-data.version}\n55 \t\t\t\timport\n56 \t\t\t\tpom\n57 \t\t\t\n58 \t\t\n59 \t\n60 \t\n61 \t\t\n62 \t\t\torg.apache.tomcat\n63 \t\t\ttomcat-servlet-api" + lineNumber: 52 variables: data: dependency innerText: "\n\t\t\t\torg.springframework.data\n\t\t\t\tspring-data-bom\n\t\t\t\t${spring-data.version}\n\t\t\t\timport\n\t\t\t\tpom\n\t\t\t" matchingXML: org.springframework.dataspring-data-bom${spring-data.version}importpom - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: org.apache.tomcattomcat-servlet-api${tomcat.version}provided + codeSnip: "53 \t\t\t\tspring-data-bom\n54 \t\t\t\t${spring-data.version}\n55 \t\t\t\timport\n56 \t\t\t\tpom\n57 \t\t\t\n58 \t\t\n59 \t\n60 \t\n61 \t\t\n62 \t\t\torg.apache.tomcat\n63 \t\t\ttomcat-servlet-api\n64 \t\t\t${tomcat.version}\n65 \t\t\tprovided\n66 \t\t\n67 \t\t\n68 \t\t\tcom.fasterxml.jackson.core\n69 \t\t\tjackson-core\n70 \t\t\n71 \t\t\n72 \t\t\tcom.fasterxml.jackson.core\n73 \t\t\tjackson-databind" + lineNumber: 62 variables: data: dependency innerText: "\n\t\t\torg.apache.tomcat\n\t\t\ttomcat-servlet-api\n\t\t\t${tomcat.version}\n\t\t\tprovided\n\t\t" matchingXML: org.apache.tomcattomcat-servlet-api${tomcat.version}provided - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: com.fasterxml.jackson.corejackson-core + codeSnip: "59 \t\n60 \t\n61 \t\t\n62 \t\t\torg.apache.tomcat\n63 \t\t\ttomcat-servlet-api\n64 \t\t\t${tomcat.version}\n65 \t\t\tprovided\n66 \t\t\n67 \t\t\n68 \t\t\tcom.fasterxml.jackson.core\n69 \t\t\tjackson-core\n70 \t\t\n71 \t\t\n72 \t\t\tcom.fasterxml.jackson.core\n73 \t\t\tjackson-databind\n74 \t\t\n75 \t\t\n76 \t\t\torg.springframework.data\n77 \t\t\tspring-data-jpa\n78 \t\t\n79 " + lineNumber: 68 variables: data: dependency innerText: "\n\t\t\tcom.fasterxml.jackson.core\n\t\t\tjackson-core\n\t\t" matchingXML: com.fasterxml.jackson.corejackson-core - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: com.fasterxml.jackson.corejackson-databind + codeSnip: "63 \t\t\ttomcat-servlet-api\n64 \t\t\t${tomcat.version}\n65 \t\t\tprovided\n66 \t\t\n67 \t\t\n68 \t\t\tcom.fasterxml.jackson.core\n69 \t\t\tjackson-core\n70 \t\t\n71 \t\t\n72 \t\t\tcom.fasterxml.jackson.core\n73 \t\t\tjackson-databind\n74 \t\t\n75 \t\t\n76 \t\t\torg.springframework.data\n77 \t\t\tspring-data-jpa\n78 \t\t\n79 \n80 \t\t\n81 \t\t\torg.springframework\n82 \t\t\tspring-jdbc\n83 \t\t\t${spring-framework.version}" + lineNumber: 72 variables: data: dependency innerText: "\n\t\t\tcom.fasterxml.jackson.core\n\t\t\tjackson-databind\n\t\t" matchingXML: com.fasterxml.jackson.corejackson-databind - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: org.springframework.dataspring-data-jpa + codeSnip: "67 \t\t\n68 \t\t\tcom.fasterxml.jackson.core\n69 \t\t\tjackson-core\n70 \t\t\n71 \t\t\n72 \t\t\tcom.fasterxml.jackson.core\n73 \t\t\tjackson-databind\n74 \t\t\n75 \t\t\n76 \t\t\torg.springframework.data\n77 \t\t\tspring-data-jpa\n78 \t\t\n79 \n80 \t\t\n81 \t\t\torg.springframework\n82 \t\t\tspring-jdbc\n83 \t\t\t${spring-framework.version}\n84 \t\t\n85 \t\t\n86 \t\t\torg.springframework\n87 \t\t\tspring-webmvc" + lineNumber: 76 variables: data: dependency innerText: "\n\t\t\torg.springframework.data\n\t\t\tspring-data-jpa\n\t\t" matchingXML: org.springframework.dataspring-data-jpa - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: org.springframeworkspring-jdbc${spring-framework.version} + codeSnip: "72 \t\t\tcom.fasterxml.jackson.core\n73 \t\t\tjackson-databind\n74 \t\t\n75 \t\t\n76 \t\t\torg.springframework.data\n77 \t\t\tspring-data-jpa\n78 \t\t\n79 \n80 \t\t\n81 \t\t\torg.springframework\n82 \t\t\tspring-jdbc\n83 \t\t\t${spring-framework.version}\n84 \t\t\n85 \t\t\n86 \t\t\torg.springframework\n87 \t\t\tspring-webmvc\n88 \t\t\t${spring-framework.version}\n89 \t\t\n90 \t\t\n91 \t\t\torg.springframework\n92 \t\t\tspring-web" + lineNumber: 81 variables: data: dependency innerText: "\n\t\t\torg.springframework\n\t\t\tspring-jdbc\n\t\t\t${spring-framework.version}\n\t\t" matchingXML: org.springframeworkspring-jdbc${spring-framework.version} - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: org.springframeworkspring-webmvc${spring-framework.version} + codeSnip: "77 \t\t\tspring-data-jpa\n78 \t\t\n79 \n80 \t\t\n81 \t\t\torg.springframework\n82 \t\t\tspring-jdbc\n83 \t\t\t${spring-framework.version}\n84 \t\t\n85 \t\t\n86 \t\t\torg.springframework\n87 \t\t\tspring-webmvc\n88 \t\t\t${spring-framework.version}\n89 \t\t\n90 \t\t\n91 \t\t\torg.springframework\n92 \t\t\tspring-web\n93 \t\t\t${spring-framework.version}\n94 \t\t\n95 \t\t\n96 \t\t\torg.springframework.boot\n97 \t\t\tspring-boot-starter-actuator" + lineNumber: 86 variables: data: dependency innerText: "\n\t\t\torg.springframework\n\t\t\tspring-webmvc\n\t\t\t${spring-framework.version}\n\t\t" matchingXML: org.springframeworkspring-webmvc${spring-framework.version} - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: org.springframeworkspring-web${spring-framework.version} + codeSnip: "77 \t\t\tspring-data-jpa\n78 \t\t\n79 \n80 \t\t\n81 \t\t\torg.springframework\n82 \t\t\tspring-jdbc\n83 \t\t\t${spring-framework.version}\n84 \t\t\n85 \t\t\n86 \t\t\torg.springframework\n87 \t\t\tspring-webmvc\n88 \t\t\t${spring-framework.version}\n89 \t\t\n90 \t\t\n91 \t\t\torg.springframework\n92 \t\t\tspring-web\n93 \t\t\t${spring-framework.version}\n94 \t\t\n95 \t\t\n96 \t\t\torg.springframework.boot\n97 \t\t\tspring-boot-starter-actuator" + lineNumber: 86 variables: data: dependency innerText: "\n\t\t\torg.springframework\n\t\t\tspring-web\n\t\t\t${spring-framework.version}\n\t\t" matchingXML: org.springframeworkspring-web${spring-framework.version} - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: org.springframework.bootspring-boot-starter-actuator2.5.0 + codeSnip: " 87 \t\t\tspring-webmvc\n 88 \t\t\t${spring-framework.version}\n 89 \t\t\n 90 \t\t\n 91 \t\t\torg.springframework\n 92 \t\t\tspring-web\n 93 \t\t\t${spring-framework.version}\n 94 \t\t\n 95 \t\t\n 96 \t\t\torg.springframework.boot\n 97 \t\t\tspring-boot-starter-actuator\n 98 \t\t\t2.5.0\n 99 \t\t\n100 \t\t\n101 \t\t\torg.apache.tomcat\n102 \t\t\ttomcat-jdbc\n103 \t\t\t${tomcat.version}\n104 \t\t\truntime\n105 \t\t\n106 \t\t\n107 \t\t\torg.hibernate" + lineNumber: 96 variables: data: dependency innerText: "\n\t\t\torg.springframework.boot\n\t\t\tspring-boot-starter-actuator\n\t\t\t2.5.0\n\t\t" matchingXML: org.springframework.bootspring-boot-starter-actuator2.5.0 - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: org.apache.tomcattomcat-jdbc${tomcat.version}runtime + codeSnip: " 92 \t\t\tspring-web\n 93 \t\t\t${spring-framework.version}\n 94 \t\t\n 95 \t\t\n 96 \t\t\torg.springframework.boot\n 97 \t\t\tspring-boot-starter-actuator\n 98 \t\t\t2.5.0\n 99 \t\t\n100 \t\t\n101 \t\t\torg.apache.tomcat\n102 \t\t\ttomcat-jdbc\n103 \t\t\t${tomcat.version}\n104 \t\t\truntime\n105 \t\t\n106 \t\t\n107 \t\t\torg.hibernate\n108 \t\t\thibernate-entitymanager\n109 \t\t\t${hibernate.version}\n110 \t\t\n111 \t\t\n112 \t\t\torg.hibernate.validator" + lineNumber: 101 variables: data: dependency innerText: "\n\t\t\torg.apache.tomcat\n\t\t\ttomcat-jdbc\n\t\t\t${tomcat.version}\n\t\t\truntime\n\t\t" matchingXML: org.apache.tomcattomcat-jdbc${tomcat.version}runtime - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: org.hibernatehibernate-entitymanager${hibernate.version} + codeSnip: " 98 \t\t\t2.5.0\n 99 \t\t\n100 \t\t\n101 \t\t\torg.apache.tomcat\n102 \t\t\ttomcat-jdbc\n103 \t\t\t${tomcat.version}\n104 \t\t\truntime\n105 \t\t\n106 \t\t\n107 \t\t\torg.hibernate\n108 \t\t\thibernate-entitymanager\n109 \t\t\t${hibernate.version}\n110 \t\t\n111 \t\t\n112 \t\t\torg.hibernate.validator\n113 \t\t\thibernate-validator\n114 \t\t\t${hibernate-validator.version}\n115 \t\t\n116 \t\t\n117 \t\t\tch.qos.logback\n118 \t\t\tlogback-classic" + lineNumber: 107 variables: data: dependency innerText: "\n\t\t\torg.hibernate\n\t\t\thibernate-entitymanager\n\t\t\t${hibernate.version}\n\t\t" matchingXML: org.hibernatehibernate-entitymanager${hibernate.version} - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: org.hibernate.validatorhibernate-validator${hibernate-validator.version} + codeSnip: "103 \t\t\t${tomcat.version}\n104 \t\t\truntime\n105 \t\t\n106 \t\t\n107 \t\t\torg.hibernate\n108 \t\t\thibernate-entitymanager\n109 \t\t\t${hibernate.version}\n110 \t\t\n111 \t\t\n112 \t\t\torg.hibernate.validator\n113 \t\t\thibernate-validator\n114 \t\t\t${hibernate-validator.version}\n115 \t\t\n116 \t\t\n117 \t\t\tch.qos.logback\n118 \t\t\tlogback-classic\n119 \t\t\t1.1.7\n120 \t\t\n121 \t\t\n122 \t\t\tcom.oracle.database.jdbc\n123 \t\t\tojdbc8" + lineNumber: 112 variables: data: dependency innerText: "\n\t\t\torg.hibernate.validator\n\t\t\thibernate-validator\n\t\t\t${hibernate-validator.version}\n\t\t" matchingXML: org.hibernate.validatorhibernate-validator${hibernate-validator.version} - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: ch.qos.logbacklogback-classic1.1.7 + codeSnip: "108 \t\t\thibernate-entitymanager\n109 \t\t\t${hibernate.version}\n110 \t\t\n111 \t\t\n112 \t\t\torg.hibernate.validator\n113 \t\t\thibernate-validator\n114 \t\t\t${hibernate-validator.version}\n115 \t\t\n116 \t\t\n117 \t\t\tch.qos.logback\n118 \t\t\tlogback-classic\n119 \t\t\t1.1.7\n120 \t\t\n121 \t\t\n122 \t\t\tcom.oracle.database.jdbc\n123 \t\t\tojdbc8\n124 \t\t\t21.1.0.0\n125 \t\t\n126 \t\t\n127 \t\t\torg.postgresql\n128 \t\t\tpostgresql" + lineNumber: 117 variables: data: dependency innerText: "\n\t\t\tch.qos.logback\n\t\t\tlogback-classic\n\t\t\t1.1.7\n\t\t" matchingXML: ch.qos.logbacklogback-classic1.1.7 - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: com.oracle.database.jdbcojdbc821.1.0.0 + codeSnip: "113 \t\t\thibernate-validator\n114 \t\t\t${hibernate-validator.version}\n115 \t\t\n116 \t\t\n117 \t\t\tch.qos.logback\n118 \t\t\tlogback-classic\n119 \t\t\t1.1.7\n120 \t\t\n121 \t\t\n122 \t\t\tcom.oracle.database.jdbc\n123 \t\t\tojdbc8\n124 \t\t\t21.1.0.0\n125 \t\t\n126 \t\t\n127 \t\t\torg.postgresql\n128 \t\t\tpostgresql\n129 \t\t\t42.2.23\n130 \t\t\n131 \t\t\n132 \t\t\n133 \t\t\tio.konveyor.demo" + lineNumber: 122 variables: data: dependency innerText: "\n\t\t\tcom.oracle.database.jdbc\n\t\t\tojdbc8\n\t\t\t21.1.0.0\n\t\t" matchingXML: com.oracle.database.jdbcojdbc821.1.0.0 - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: org.postgresqlpostgresql42.2.23 + codeSnip: "118 \t\t\tlogback-classic\n119 \t\t\t1.1.7\n120 \t\t\n121 \t\t\n122 \t\t\tcom.oracle.database.jdbc\n123 \t\t\tojdbc8\n124 \t\t\t21.1.0.0\n125 \t\t\n126 \t\t\n127 \t\t\torg.postgresql\n128 \t\t\tpostgresql\n129 \t\t\t42.2.23\n130 \t\t\n131 \t\t\n132 \t\t\n133 \t\t\tio.konveyor.demo\n134 \t\t\tconfig-utils\n135 \t\t\t1.0.0\n136 \t\t\n137 \n138 \t" + lineNumber: 127 variables: data: dependency innerText: "\n\t\t\torg.postgresql\n\t\t\tpostgresql\n\t\t\t42.2.23\n\t\t" matchingXML: org.postgresqlpostgresql42.2.23 - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: io.konveyor.democonfig-utils1.0.0 + codeSnip: "124 \t\t\t21.1.0.0\n125 \t\t\n126 \t\t\n127 \t\t\torg.postgresql\n128 \t\t\tpostgresql\n129 \t\t\t42.2.23\n130 \t\t\n131 \t\t\n132 \t\t\n133 \t\t\tio.konveyor.demo\n134 \t\t\tconfig-utils\n135 \t\t\t1.0.0\n136 \t\t\n137 \n138 \t\n139 \t\n140 \t\t\n141 \t\t\t\n142 \t\t\t\torg.apache.maven.plugins\n143 \t\t\t\tmaven-compiler-plugin\n144 \t\t\t\t${maven-compiler-plugin.version}" + lineNumber: 133 variables: data: dependency innerText: "\n\t\t\tio.konveyor.demo\n\t\t\tconfig-utils\n\t\t\t1.0.0\n\t\t" @@ -189,11 +229,15 @@ incidents: - uri: file:///analyzer-lsp/examples/java/pom.xml message: dependency junit.junit with 4.11 is bad and you should feel bad for using it + codeSnip: "14 \n15 \n16 UTF-8\n17 1.7\n18 1.7\n19 \n20 \n21 \n22 \n23 junit\n24 junit\n25 4.11\n26 test\n27 \n28 \n29 io.fabric8\n30 kubernetes-client\n31 6.0.0\n32 \n33 \n34 io.fabric8" + lineNumber: 23 variables: name: junit.junit version: "4.11" - uri: file:///analyzer-lsp/examples/java/pom.xml message: dependency io.fabric8.kubernetes-client with 6.0.0 is bad and you should feel bad for using it + codeSnip: "20 \n21 \n22 \n23 junit\n24 junit\n25 4.11\n26 test\n27 \n28 \n29 io.fabric8\n30 kubernetes-client\n31 6.0.0\n32 \n33 \n34 io.fabric8\n35 kubernetes-client-api\n36 6.0.0\n37 \n38 \n39 \n40 " + lineNumber: 29 variables: name: io.fabric8.kubernetes-client version: 6.0.0 @@ -362,120 +406,160 @@ incidents: - uri: file:///analyzer-lsp/examples/java/pom.xml message: POM XML dependencies - 'junitjunit4.11test' + codeSnip: "14 \n15 \n16 UTF-8\n17 1.7\n18 1.7\n19 \n20 \n21 \n22 \n23 junit\n24 junit\n25 4.11\n26 test\n27 \n28 \n29 io.fabric8\n30 kubernetes-client\n31 6.0.0\n32 \n33 \n34 io.fabric8" + lineNumber: 23 variables: data: dependency innerText: "\n junit\n junit\n 4.11\n test\n " matchingXML: junitjunit4.11test - uri: file:///analyzer-lsp/examples/java/pom.xml message: POM XML dependencies - 'io.fabric8kubernetes-client6.0.0' + codeSnip: "20 \n21 \n22 \n23 junit\n24 junit\n25 4.11\n26 test\n27 \n28 \n29 io.fabric8\n30 kubernetes-client\n31 6.0.0\n32 \n33 \n34 io.fabric8\n35 kubernetes-client-api\n36 6.0.0\n37 \n38 \n39 \n40 " + lineNumber: 29 variables: data: dependency innerText: "\n io.fabric8\n kubernetes-client\n 6.0.0\n " matchingXML: io.fabric8kubernetes-client6.0.0 - uri: file:///analyzer-lsp/examples/java/pom.xml message: POM XML dependencies - 'io.fabric8kubernetes-client-api6.0.0' + codeSnip: "25 4.11\n26 test\n27 \n28 \n29 io.fabric8\n30 kubernetes-client\n31 6.0.0\n32 \n33 \n34 io.fabric8\n35 kubernetes-client-api\n36 6.0.0\n37 \n38 \n39 \n40 \n41 \n42 \n43 \n44 \n45 maven-clean-plugin" + lineNumber: 34 variables: data: dependency innerText: "\n io.fabric8\n kubernetes-client-api\n 6.0.0\n " matchingXML: io.fabric8kubernetes-client-api6.0.0 - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'com.fasterxml.jacksonjackson-bom${jackson.version}importpom' + codeSnip: "36 \t\t\tdemo-config\n37 \t\t\tAzure DevOps\n38 \t\t\thttps://pkgs.dev.azure.com/ShawnHurley21/demo-config-utils/_packaging/demo-config/maven/v1\n39 \t\t\n40 \t\n41 \n42 \t\n43 \t\t\n44 \t\t\t\n45 \t\t\t\tcom.fasterxml.jackson\n46 \t\t\t\tjackson-bom\n47 \t\t\t\t${jackson.version}\n48 \t\t\t\timport\n49 \t\t\t\tpom\n50 \t\t\t\n51 \t\t\t\n52 \t\t\t\torg.springframework.data\n53 \t\t\t\tspring-data-bom\n54 \t\t\t\t${spring-data.version}\n55 \t\t\t\timport\n56 \t\t\t\tpom" + lineNumber: 45 variables: data: dependency innerText: "\n\t\t\t\tcom.fasterxml.jackson\n\t\t\t\tjackson-bom\n\t\t\t\t${jackson.version}\n\t\t\t\timport\n\t\t\t\tpom\n\t\t\t" matchingXML: com.fasterxml.jacksonjackson-bom${jackson.version}importpom - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'org.springframework.dataspring-data-bom${spring-data.version}importpom' + codeSnip: "43 \t\t\n44 \t\t\t\n45 \t\t\t\tcom.fasterxml.jackson\n46 \t\t\t\tjackson-bom\n47 \t\t\t\t${jackson.version}\n48 \t\t\t\timport\n49 \t\t\t\tpom\n50 \t\t\t\n51 \t\t\t\n52 \t\t\t\torg.springframework.data\n53 \t\t\t\tspring-data-bom\n54 \t\t\t\t${spring-data.version}\n55 \t\t\t\timport\n56 \t\t\t\tpom\n57 \t\t\t\n58 \t\t\n59 \t\n60 \t\n61 \t\t\n62 \t\t\torg.apache.tomcat\n63 \t\t\ttomcat-servlet-api" + lineNumber: 52 variables: data: dependency innerText: "\n\t\t\t\torg.springframework.data\n\t\t\t\tspring-data-bom\n\t\t\t\t${spring-data.version}\n\t\t\t\timport\n\t\t\t\tpom\n\t\t\t" matchingXML: org.springframework.dataspring-data-bom${spring-data.version}importpom - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'org.apache.tomcattomcat-servlet-api${tomcat.version}provided' + codeSnip: "53 \t\t\t\tspring-data-bom\n54 \t\t\t\t${spring-data.version}\n55 \t\t\t\timport\n56 \t\t\t\tpom\n57 \t\t\t\n58 \t\t\n59 \t\n60 \t\n61 \t\t\n62 \t\t\torg.apache.tomcat\n63 \t\t\ttomcat-servlet-api\n64 \t\t\t${tomcat.version}\n65 \t\t\tprovided\n66 \t\t\n67 \t\t\n68 \t\t\tcom.fasterxml.jackson.core\n69 \t\t\tjackson-core\n70 \t\t\n71 \t\t\n72 \t\t\tcom.fasterxml.jackson.core\n73 \t\t\tjackson-databind" + lineNumber: 62 variables: data: dependency innerText: "\n\t\t\torg.apache.tomcat\n\t\t\ttomcat-servlet-api\n\t\t\t${tomcat.version}\n\t\t\tprovided\n\t\t" matchingXML: org.apache.tomcattomcat-servlet-api${tomcat.version}provided - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'com.fasterxml.jackson.corejackson-core' + codeSnip: "59 \t\n60 \t\n61 \t\t\n62 \t\t\torg.apache.tomcat\n63 \t\t\ttomcat-servlet-api\n64 \t\t\t${tomcat.version}\n65 \t\t\tprovided\n66 \t\t\n67 \t\t\n68 \t\t\tcom.fasterxml.jackson.core\n69 \t\t\tjackson-core\n70 \t\t\n71 \t\t\n72 \t\t\tcom.fasterxml.jackson.core\n73 \t\t\tjackson-databind\n74 \t\t\n75 \t\t\n76 \t\t\torg.springframework.data\n77 \t\t\tspring-data-jpa\n78 \t\t\n79 " + lineNumber: 68 variables: data: dependency innerText: "\n\t\t\tcom.fasterxml.jackson.core\n\t\t\tjackson-core\n\t\t" matchingXML: com.fasterxml.jackson.corejackson-core - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'com.fasterxml.jackson.corejackson-databind' + codeSnip: "63 \t\t\ttomcat-servlet-api\n64 \t\t\t${tomcat.version}\n65 \t\t\tprovided\n66 \t\t\n67 \t\t\n68 \t\t\tcom.fasterxml.jackson.core\n69 \t\t\tjackson-core\n70 \t\t\n71 \t\t\n72 \t\t\tcom.fasterxml.jackson.core\n73 \t\t\tjackson-databind\n74 \t\t\n75 \t\t\n76 \t\t\torg.springframework.data\n77 \t\t\tspring-data-jpa\n78 \t\t\n79 \n80 \t\t\n81 \t\t\torg.springframework\n82 \t\t\tspring-jdbc\n83 \t\t\t${spring-framework.version}" + lineNumber: 72 variables: data: dependency innerText: "\n\t\t\tcom.fasterxml.jackson.core\n\t\t\tjackson-databind\n\t\t" matchingXML: com.fasterxml.jackson.corejackson-databind - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'org.springframework.dataspring-data-jpa' + codeSnip: "67 \t\t\n68 \t\t\tcom.fasterxml.jackson.core\n69 \t\t\tjackson-core\n70 \t\t\n71 \t\t\n72 \t\t\tcom.fasterxml.jackson.core\n73 \t\t\tjackson-databind\n74 \t\t\n75 \t\t\n76 \t\t\torg.springframework.data\n77 \t\t\tspring-data-jpa\n78 \t\t\n79 \n80 \t\t\n81 \t\t\torg.springframework\n82 \t\t\tspring-jdbc\n83 \t\t\t${spring-framework.version}\n84 \t\t\n85 \t\t\n86 \t\t\torg.springframework\n87 \t\t\tspring-webmvc" + lineNumber: 76 variables: data: dependency innerText: "\n\t\t\torg.springframework.data\n\t\t\tspring-data-jpa\n\t\t" matchingXML: org.springframework.dataspring-data-jpa - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'org.springframeworkspring-jdbc${spring-framework.version}' + codeSnip: "72 \t\t\tcom.fasterxml.jackson.core\n73 \t\t\tjackson-databind\n74 \t\t\n75 \t\t\n76 \t\t\torg.springframework.data\n77 \t\t\tspring-data-jpa\n78 \t\t\n79 \n80 \t\t\n81 \t\t\torg.springframework\n82 \t\t\tspring-jdbc\n83 \t\t\t${spring-framework.version}\n84 \t\t\n85 \t\t\n86 \t\t\torg.springframework\n87 \t\t\tspring-webmvc\n88 \t\t\t${spring-framework.version}\n89 \t\t\n90 \t\t\n91 \t\t\torg.springframework\n92 \t\t\tspring-web" + lineNumber: 81 variables: data: dependency innerText: "\n\t\t\torg.springframework\n\t\t\tspring-jdbc\n\t\t\t${spring-framework.version}\n\t\t" matchingXML: org.springframeworkspring-jdbc${spring-framework.version} - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'org.springframeworkspring-webmvc${spring-framework.version}' + codeSnip: "77 \t\t\tspring-data-jpa\n78 \t\t\n79 \n80 \t\t\n81 \t\t\torg.springframework\n82 \t\t\tspring-jdbc\n83 \t\t\t${spring-framework.version}\n84 \t\t\n85 \t\t\n86 \t\t\torg.springframework\n87 \t\t\tspring-webmvc\n88 \t\t\t${spring-framework.version}\n89 \t\t\n90 \t\t\n91 \t\t\torg.springframework\n92 \t\t\tspring-web\n93 \t\t\t${spring-framework.version}\n94 \t\t\n95 \t\t\n96 \t\t\torg.springframework.boot\n97 \t\t\tspring-boot-starter-actuator" + lineNumber: 86 variables: data: dependency innerText: "\n\t\t\torg.springframework\n\t\t\tspring-webmvc\n\t\t\t${spring-framework.version}\n\t\t" matchingXML: org.springframeworkspring-webmvc${spring-framework.version} - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'org.springframeworkspring-web${spring-framework.version}' + codeSnip: "77 \t\t\tspring-data-jpa\n78 \t\t\n79 \n80 \t\t\n81 \t\t\torg.springframework\n82 \t\t\tspring-jdbc\n83 \t\t\t${spring-framework.version}\n84 \t\t\n85 \t\t\n86 \t\t\torg.springframework\n87 \t\t\tspring-webmvc\n88 \t\t\t${spring-framework.version}\n89 \t\t\n90 \t\t\n91 \t\t\torg.springframework\n92 \t\t\tspring-web\n93 \t\t\t${spring-framework.version}\n94 \t\t\n95 \t\t\n96 \t\t\torg.springframework.boot\n97 \t\t\tspring-boot-starter-actuator" + lineNumber: 86 variables: data: dependency innerText: "\n\t\t\torg.springframework\n\t\t\tspring-web\n\t\t\t${spring-framework.version}\n\t\t" matchingXML: org.springframeworkspring-web${spring-framework.version} - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'org.springframework.bootspring-boot-starter-actuator2.5.0' + codeSnip: " 87 \t\t\tspring-webmvc\n 88 \t\t\t${spring-framework.version}\n 89 \t\t\n 90 \t\t\n 91 \t\t\torg.springframework\n 92 \t\t\tspring-web\n 93 \t\t\t${spring-framework.version}\n 94 \t\t\n 95 \t\t\n 96 \t\t\torg.springframework.boot\n 97 \t\t\tspring-boot-starter-actuator\n 98 \t\t\t2.5.0\n 99 \t\t\n100 \t\t\n101 \t\t\torg.apache.tomcat\n102 \t\t\ttomcat-jdbc\n103 \t\t\t${tomcat.version}\n104 \t\t\truntime\n105 \t\t\n106 \t\t\n107 \t\t\torg.hibernate" + lineNumber: 96 variables: data: dependency innerText: "\n\t\t\torg.springframework.boot\n\t\t\tspring-boot-starter-actuator\n\t\t\t2.5.0\n\t\t" matchingXML: org.springframework.bootspring-boot-starter-actuator2.5.0 - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'org.apache.tomcattomcat-jdbc${tomcat.version}runtime' + codeSnip: " 92 \t\t\tspring-web\n 93 \t\t\t${spring-framework.version}\n 94 \t\t\n 95 \t\t\n 96 \t\t\torg.springframework.boot\n 97 \t\t\tspring-boot-starter-actuator\n 98 \t\t\t2.5.0\n 99 \t\t\n100 \t\t\n101 \t\t\torg.apache.tomcat\n102 \t\t\ttomcat-jdbc\n103 \t\t\t${tomcat.version}\n104 \t\t\truntime\n105 \t\t\n106 \t\t\n107 \t\t\torg.hibernate\n108 \t\t\thibernate-entitymanager\n109 \t\t\t${hibernate.version}\n110 \t\t\n111 \t\t\n112 \t\t\torg.hibernate.validator" + lineNumber: 101 variables: data: dependency innerText: "\n\t\t\torg.apache.tomcat\n\t\t\ttomcat-jdbc\n\t\t\t${tomcat.version}\n\t\t\truntime\n\t\t" matchingXML: org.apache.tomcattomcat-jdbc${tomcat.version}runtime - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'org.hibernatehibernate-entitymanager${hibernate.version}' + codeSnip: " 98 \t\t\t2.5.0\n 99 \t\t\n100 \t\t\n101 \t\t\torg.apache.tomcat\n102 \t\t\ttomcat-jdbc\n103 \t\t\t${tomcat.version}\n104 \t\t\truntime\n105 \t\t\n106 \t\t\n107 \t\t\torg.hibernate\n108 \t\t\thibernate-entitymanager\n109 \t\t\t${hibernate.version}\n110 \t\t\n111 \t\t\n112 \t\t\torg.hibernate.validator\n113 \t\t\thibernate-validator\n114 \t\t\t${hibernate-validator.version}\n115 \t\t\n116 \t\t\n117 \t\t\tch.qos.logback\n118 \t\t\tlogback-classic" + lineNumber: 107 variables: data: dependency innerText: "\n\t\t\torg.hibernate\n\t\t\thibernate-entitymanager\n\t\t\t${hibernate.version}\n\t\t" matchingXML: org.hibernatehibernate-entitymanager${hibernate.version} - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'org.hibernate.validatorhibernate-validator${hibernate-validator.version}' + codeSnip: "103 \t\t\t${tomcat.version}\n104 \t\t\truntime\n105 \t\t\n106 \t\t\n107 \t\t\torg.hibernate\n108 \t\t\thibernate-entitymanager\n109 \t\t\t${hibernate.version}\n110 \t\t\n111 \t\t\n112 \t\t\torg.hibernate.validator\n113 \t\t\thibernate-validator\n114 \t\t\t${hibernate-validator.version}\n115 \t\t\n116 \t\t\n117 \t\t\tch.qos.logback\n118 \t\t\tlogback-classic\n119 \t\t\t1.1.7\n120 \t\t\n121 \t\t\n122 \t\t\tcom.oracle.database.jdbc\n123 \t\t\tojdbc8" + lineNumber: 112 variables: data: dependency innerText: "\n\t\t\torg.hibernate.validator\n\t\t\thibernate-validator\n\t\t\t${hibernate-validator.version}\n\t\t" matchingXML: org.hibernate.validatorhibernate-validator${hibernate-validator.version} - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'ch.qos.logbacklogback-classic1.1.7' + codeSnip: "108 \t\t\thibernate-entitymanager\n109 \t\t\t${hibernate.version}\n110 \t\t\n111 \t\t\n112 \t\t\torg.hibernate.validator\n113 \t\t\thibernate-validator\n114 \t\t\t${hibernate-validator.version}\n115 \t\t\n116 \t\t\n117 \t\t\tch.qos.logback\n118 \t\t\tlogback-classic\n119 \t\t\t1.1.7\n120 \t\t\n121 \t\t\n122 \t\t\tcom.oracle.database.jdbc\n123 \t\t\tojdbc8\n124 \t\t\t21.1.0.0\n125 \t\t\n126 \t\t\n127 \t\t\torg.postgresql\n128 \t\t\tpostgresql" + lineNumber: 117 variables: data: dependency innerText: "\n\t\t\tch.qos.logback\n\t\t\tlogback-classic\n\t\t\t1.1.7\n\t\t" matchingXML: ch.qos.logbacklogback-classic1.1.7 - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'com.oracle.database.jdbcojdbc821.1.0.0' + codeSnip: "113 \t\t\thibernate-validator\n114 \t\t\t${hibernate-validator.version}\n115 \t\t\n116 \t\t\n117 \t\t\tch.qos.logback\n118 \t\t\tlogback-classic\n119 \t\t\t1.1.7\n120 \t\t\n121 \t\t\n122 \t\t\tcom.oracle.database.jdbc\n123 \t\t\tojdbc8\n124 \t\t\t21.1.0.0\n125 \t\t\n126 \t\t\n127 \t\t\torg.postgresql\n128 \t\t\tpostgresql\n129 \t\t\t42.2.23\n130 \t\t\n131 \t\t\n132 \t\t\n133 \t\t\tio.konveyor.demo" + lineNumber: 122 variables: data: dependency innerText: "\n\t\t\tcom.oracle.database.jdbc\n\t\t\tojdbc8\n\t\t\t21.1.0.0\n\t\t" matchingXML: com.oracle.database.jdbcojdbc821.1.0.0 - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'org.postgresqlpostgresql42.2.23' + codeSnip: "118 \t\t\tlogback-classic\n119 \t\t\t1.1.7\n120 \t\t\n121 \t\t\n122 \t\t\tcom.oracle.database.jdbc\n123 \t\t\tojdbc8\n124 \t\t\t21.1.0.0\n125 \t\t\n126 \t\t\n127 \t\t\torg.postgresql\n128 \t\t\tpostgresql\n129 \t\t\t42.2.23\n130 \t\t\n131 \t\t\n132 \t\t\n133 \t\t\tio.konveyor.demo\n134 \t\t\tconfig-utils\n135 \t\t\t1.0.0\n136 \t\t\n137 \n138 \t" + lineNumber: 127 variables: data: dependency innerText: "\n\t\t\torg.postgresql\n\t\t\tpostgresql\n\t\t\t42.2.23\n\t\t" matchingXML: org.postgresqlpostgresql42.2.23 - uri: file:///analyzer-lsp/examples/customers-tomcat-legacy/pom.xml message: POM XML dependencies - 'io.konveyor.democonfig-utils1.0.0' + codeSnip: "124 \t\t\t21.1.0.0\n125 \t\t\n126 \t\t\n127 \t\t\torg.postgresql\n128 \t\t\tpostgresql\n129 \t\t\t42.2.23\n130 \t\t\n131 \t\t\n132 \t\t\n133 \t\t\tio.konveyor.demo\n134 \t\t\tconfig-utils\n135 \t\t\t1.0.0\n136 \t\t\n137 \n138 \t\n139 \t\n140 \t\t\n141 \t\t\t\n142 \t\t\t\torg.apache.maven.plugins\n143 \t\t\t\tmaven-compiler-plugin\n144 \t\t\t\t${maven-compiler-plugin.version}" + lineNumber: 133 variables: data: dependency innerText: "\n\t\t\tio.konveyor.demo\n\t\t\tconfig-utils\n\t\t\t1.0.0\n\t\t" diff --git a/provider/internal/builtin/provider.go b/provider/internal/builtin/provider.go index dd9d88f7..23e63c2e 100644 --- a/provider/internal/builtin/provider.go +++ b/provider/internal/builtin/provider.go @@ -128,6 +128,8 @@ func (p *builtinProvider) Init(ctx context.Context, log logr.Logger, config prov config: config, tags: p.tags, UnimplementedDependenciesComponent: provider.UnimplementedDependenciesComponent{}, + locationCache: make(map[string]float64), + log: log, }, nil } diff --git a/provider/internal/builtin/service_client.go b/provider/internal/builtin/service_client.go index 231dabee..77be39da 100644 --- a/provider/internal/builtin/service_client.go +++ b/provider/internal/builtin/service_client.go @@ -10,11 +10,14 @@ import ( "regexp" "strconv" "strings" + "sync" "github.com/antchfx/jsonquery" "github.com/antchfx/xmlquery" "github.com/antchfx/xpath" + "github.com/go-logr/logr" "github.com/konveyor/analyzer-lsp/provider" + "github.com/konveyor/analyzer-lsp/tracing" "go.lsp.dev/uri" "gopkg.in/yaml.v2" ) @@ -23,13 +26,15 @@ type builtinServiceClient struct { config provider.InitConfig tags map[string]bool provider.UnimplementedDependenciesComponent + log logr.Logger + + cacheMutex sync.RWMutex + locationCache map[string]float64 } var _ provider.ServiceClient = &builtinServiceClient{} -func (p *builtinServiceClient) Stop() { - return -} +func (p *builtinServiceClient) Stop() {} func (p *builtinServiceClient) Evaluate(ctx context.Context, cap string, conditionInfo []byte) (provider.ProviderEvaluateResponse, error) { var cond builtinCondition @@ -119,7 +124,7 @@ func (p *builtinServiceClient) Evaluate(ctx context.Context, cap string, conditi } lineNumber, err := strconv.Atoi(pieces[1]) if err != nil { - return response, fmt.Errorf("Cannot convert line number string to integer") + return response, fmt.Errorf("cannot convert line number string to integer") } response.Incidents = append(response.Incidents, provider.IncidentContext{ FileURI: uri.File(ab), @@ -140,18 +145,17 @@ func (p *builtinServiceClient) Evaluate(ctx context.Context, cap string, conditi case "xml": query, err := xpath.CompileWithNS(cond.XML.XPath, cond.XML.Namespaces) if query == nil || err != nil { - return response, fmt.Errorf("Could not parse provided xpath query '%s': %v", cond.XML.XPath, err) + return response, fmt.Errorf("could not parse provided xpath query '%s': %v", cond.XML.XPath, err) } //TODO(fabianvf): how should we scope the files searched here? var xmlFiles []string patterns := []string{"*.xml", "*.xhtml"} xmlFiles, err = provider.GetFiles(p.config.Location, cond.XML.Filepaths, patterns...) if err != nil { - return response, fmt.Errorf("Unable to find files using pattern `%s`: %v", patterns, err) + return response, fmt.Errorf("unable to find files using pattern `%s`: %v", patterns, err) } for _, file := range xmlFiles { - f, err := os.Open(file) if err != nil { fmt.Printf("unable to open file '%s': %v\n", file, err) @@ -187,14 +191,21 @@ func (p *builtinServiceClient) Evaluate(ctx context.Context, cap string, conditi if err != nil { ab = file } - response.Incidents = append(response.Incidents, provider.IncidentContext{ + incident := provider.IncidentContext{ FileURI: uri.File(ab), Variables: map[string]interface{}{ "matchingXML": node.OutputXML(false), "innerText": node.InnerText(), "data": node.Data, }, - }) + } + location, err := p.getLocation(ctx, ab, node.InnerText()) + if err == nil { + incident.CodeLocation = &location + lineNo := int(location.StartPosition.Line) + incident.LineNumber = &lineNo + } + response.Incidents = append(response.Incidents, incident) } } } @@ -203,16 +214,24 @@ func (p *builtinServiceClient) Evaluate(ctx context.Context, cap string, conditi case "json": query := cond.JSON.XPath if query == "" { - return response, fmt.Errorf("Could not parse provided xpath query as string: %v", conditionInfo) + return response, fmt.Errorf("could not parse provided xpath query as string: %v", conditionInfo) } pattern := "*.json" jsonFiles, err := provider.GetFiles(p.config.Location, cond.JSON.Filepaths, pattern) if err != nil { - return response, fmt.Errorf("Unable to find files using pattern `%s`: %v", pattern, err) + return response, fmt.Errorf("unable to find files using pattern `%s`: %v", pattern, err) } for _, file := range jsonFiles { f, err := os.Open(file) + if err != nil { + p.log.V(5).Error(err, "error opening json file", "file", file) + continue + } doc, err := jsonquery.Parse(f) + if err != nil { + p.log.V(5).Error(err, "error parsing json file", "file", file) + continue + } list, err := jsonquery.QueryAll(doc, query) if err != nil { return response, err @@ -224,13 +243,20 @@ func (p *builtinServiceClient) Evaluate(ctx context.Context, cap string, conditi if err != nil { ab = file } - response.Incidents = append(response.Incidents, provider.IncidentContext{ + incident := provider.IncidentContext{ FileURI: uri.File(ab), Variables: map[string]interface{}{ "matchingJSON": node.InnerText(), "data": node.Data, }, - }) + } + location, err := p.getLocation(ctx, ab, node.InnerText()) + if err == nil { + incident.CodeLocation = &location + lineNo := int(location.StartPosition.Line) + incident.LineNumber = &lineNo + } + response.Incidents = append(response.Incidents, incident) } } } @@ -258,6 +284,68 @@ func (p *builtinServiceClient) Evaluate(ctx context.Context, cap string, conditi return response, fmt.Errorf("capability must be one of %v, not %s", capabilities, cap) } } + +// getLocation attempts to get code location for given content in JSON / XML files +func (b *builtinServiceClient) getLocation(ctx context.Context, path, content string) (provider.Location, error) { + ctx, span := tracing.StartNewSpan(ctx, "getLocation") + defer span.End() + location := provider.Location{} + + parts := strings.Split(content, "\n") + if len(parts) < 1 { + return location, fmt.Errorf("unable to get code location, empty content") + } else if len(parts) > 5 { + // limit content to search + parts = parts[:5] + } + lines := []string{} + for _, part := range parts { + line := strings.Trim(part, " ") + line = strings.ReplaceAll(line, "\t", "") + line = regexp.QuoteMeta(line) + if line != "" { + lines = append(lines, line) + } + } + if len(lines) < 1 { + return location, fmt.Errorf("unable to get code location, no-op content") + } + pattern := fmt.Sprintf(".*?%s", strings.Join(lines, ".*?")) + + cacheKey := fmt.Sprintf("%s-%s", path, pattern) + b.cacheMutex.RLock() + val, exists := b.locationCache[cacheKey] + b.cacheMutex.RUnlock() + if exists { + if val == -1 { + return location, fmt.Errorf("unable to get location due to a previous error") + } + return provider.Location{ + StartPosition: provider.Position{ + Line: float64(val), + }, + EndPosition: provider.Position{ + Line: float64(val), + }, + }, nil + } + + defer func() { + b.cacheMutex.Lock() + b.locationCache[cacheKey] = location.StartPosition.Line + b.cacheMutex.Unlock() + }() + + location.StartPosition.Line = -1 + lineNumber, err := provider.MultilineGrep(ctx, len(lines), path, pattern) + if err != nil || lineNumber == -1 { + return location, fmt.Errorf("unable to get location in file %s - %w", path, err) + } + location.StartPosition.Line = float64(lineNumber) + location.EndPosition.Line = float64(lineNumber) + return location, nil +} + func findFilesMatchingPattern(root, pattern string) ([]string, error) { var regex *regexp.Regexp // if the regex doesn't compile, we'll default to using filepath.Match on the pattern directly diff --git a/provider/internal/java/dependency.go b/provider/internal/java/dependency.go index d387bdcb..64dcddda 100644 --- a/provider/internal/java/dependency.go +++ b/provider/internal/java/dependency.go @@ -28,6 +28,13 @@ const ( providerSpecificConfigExcludePackagesKey = "excludePackages" ) +// keys used in dep.Extras for extra information about a dep +const ( + artifactIdKey = "artifactId" + groupIdKey = "groupId" + pomPathKey = "pomPath" +) + // TODO implement this for real func (p *javaServiceClient) findPom() string { var depPath string @@ -44,9 +51,13 @@ func (p *javaServiceClient) findPom() string { } func (p *javaServiceClient) GetDependencies(ctx context.Context) (map[uri.URI][]*provider.Dep, error) { - if p.depsCache != nil { - return p.depsCache, nil + p.depsMutex.RLock() + val := p.depsCache + p.depsMutex.RUnlock() + if val != nil { + return val, nil } + var err error var ll map[uri.URI][]konveyor.DepDAGItem m := map[uri.URI][]*provider.Dep{} @@ -74,7 +85,9 @@ func (p *javaServiceClient) GetDependencies(ctx context.Context) (map[uri.URI][] } m[f] = deps } + p.depsMutex.Lock() p.depsCache = m + p.depsMutex.Unlock() return m, nil } @@ -137,6 +150,11 @@ func (p *javaServiceClient) GetDependenciesFallback(ctx context.Context, locatio } dep := provider.Dep{} dep.Name = fmt.Sprintf("%s.%s", *d.GroupID, *d.ArtifactID) + dep.Extras = map[string]interface{}{ + groupIdKey: *d.GroupID, + artifactIdKey: *d.ArtifactID, + pomPathKey: path, + } if *d.Version != "" { if strings.Contains(*d.Version, "$") { version := strings.TrimSuffix(strings.TrimPrefix(*d.Version, "${"), "}") @@ -157,7 +175,9 @@ func (p *javaServiceClient) GetDependenciesFallback(ctx context.Context, locatio m := map[uri.URI][]*provider.Dep{} m[uri.File(path)] = deps + p.depsMutex.Lock() p.depsCache = m + p.depsMutex.Unlock() // recursively find deps in submodules if pom.Modules != nil { @@ -208,7 +228,7 @@ func (p *javaServiceClient) GetDependenciesDAG(ctx context.Context) (map[uri.URI var pomDeps []provider.DepDAGItem for _, tree := range submoduleTrees { - submoduleDeps, err := p.parseMavenDepLines(tree, localRepoPath) + submoduleDeps, err := p.parseMavenDepLines(tree, localRepoPath, path) if err != nil { return nil, err } @@ -328,7 +348,7 @@ func (w *walker) walkDirForJar(path string, info fs.DirEntry, err error) error { // parseDepString parses a java dependency string // assumes format :::: -func (p *javaServiceClient) parseDepString(dep, localRepoPath string) (provider.Dep, error) { +func (p *javaServiceClient) parseDepString(dep, localRepoPath, pomPath string) (provider.Dep, error) { d := provider.Dep{} // remove all the pretty print characters. dep = strings.TrimFunc(dep, func(r rune) bool { @@ -364,6 +384,12 @@ func (p *javaServiceClient) parseDepString(dep, localRepoPath string) (provider. d.Labels = addDepLabels(p.depToLabels, d.Name) d.FileURIPrefix = fmt.Sprintf("file://%v", filepath.Dir(fp)) + d.Extras = map[string]interface{}{ + groupIdKey: parts[0], + artifactIdKey: parts[1], + pomPathKey: pomPath, + } + return d, nil } @@ -391,10 +417,10 @@ func addDepLabels(depToLabels map[string]*depLabelItem, depName string) []string } // parseMavenDepLines recursively parses output lines from maven dependency tree -func (p *javaServiceClient) parseMavenDepLines(lines []string, localRepoPath string) ([]provider.DepDAGItem, error) { +func (p *javaServiceClient) parseMavenDepLines(lines []string, localRepoPath, pomPath string) ([]provider.DepDAGItem, error) { if len(lines) > 0 { baseDepString := lines[0] - baseDep, err := p.parseDepString(baseDepString, localRepoPath) + baseDep, err := p.parseDepString(baseDepString, localRepoPath, pomPath) if err != nil { return nil, err } @@ -404,7 +430,7 @@ func (p *javaServiceClient) parseMavenDepLines(lines []string, localRepoPath str idx := 1 // indirect deps are separated by 3 or more spaces after the direct dep for idx < len(lines) && strings.Count(lines[idx], " ") > 2 { - transitiveDep, err := p.parseDepString(lines[idx], localRepoPath) + transitiveDep, err := p.parseDepString(lines[idx], localRepoPath, pomPath) if err != nil { return nil, err } @@ -412,7 +438,7 @@ func (p *javaServiceClient) parseMavenDepLines(lines []string, localRepoPath str item.AddedDeps = append(item.AddedDeps, provider.DepDAGItem{Dep: transitiveDep}) idx += 1 } - ds, err := p.parseMavenDepLines(lines[idx:], localRepoPath) + ds, err := p.parseMavenDepLines(lines[idx:], localRepoPath, pomPath) if err != nil { return nil, err } diff --git a/provider/internal/java/dependency_test.go b/provider/internal/java/dependency_test.go index 8cc82055..adf02ee3 100644 --- a/provider/internal/java/dependency_test.go +++ b/provider/internal/java/dependency_test.go @@ -58,6 +58,11 @@ func Test_parseMavenDepLines(t *testing.T) { labels.AsString(provider.DepSourceLabel, "internal"), labels.AsString(provider.DepLanguageLabel, "java"), }, + Extras: map[string]interface{}{ + groupIdKey: "junit", + artifactIdKey: "junit", + pomPathKey: "pom.xml", + }, FileURIPrefix: "file://testdata/junit/junit/4.11", }, AddedDeps: []provider.DepDAGItem{ @@ -72,6 +77,11 @@ func Test_parseMavenDepLines(t *testing.T) { labels.AsString(provider.DepSourceLabel, "internal"), labels.AsString(provider.DepLanguageLabel, "java"), }, + Extras: map[string]interface{}{ + groupIdKey: "org.hamcrest", + artifactIdKey: "hamcrest-core", + pomPathKey: "pom.xml", + }, FileURIPrefix: "file://testdata/org/hamcrest/hamcrest-core/1.3", }, }, @@ -88,6 +98,11 @@ func Test_parseMavenDepLines(t *testing.T) { labels.AsString(provider.DepSourceLabel, "internal"), labels.AsString(provider.DepLanguageLabel, "java"), }, + Extras: map[string]interface{}{ + groupIdKey: "io.fabric8", + artifactIdKey: "kubernetes-client", + pomPathKey: "pom.xml", + }, FileURIPrefix: "file://testdata/io/fabric8/kubernetes-client/6.0.0", }, AddedDeps: []provider.DepDAGItem{ @@ -102,6 +117,11 @@ func Test_parseMavenDepLines(t *testing.T) { labels.AsString(provider.DepSourceLabel, "internal"), labels.AsString(provider.DepLanguageLabel, "java"), }, + Extras: map[string]interface{}{ + groupIdKey: "io.fabric8", + artifactIdKey: "kubernetes-httpclient-okhttp", + pomPathKey: "pom.xml", + }, FileURIPrefix: "file://testdata/io/fabric8/kubernetes-httpclient-okhttp/6.0.0", }, }, @@ -116,6 +136,11 @@ func Test_parseMavenDepLines(t *testing.T) { labels.AsString(provider.DepSourceLabel, "internal"), labels.AsString(provider.DepLanguageLabel, "java"), }, + Extras: map[string]interface{}{ + groupIdKey: "com.squareup.okhttp3", + artifactIdKey: "okhttp", + pomPathKey: "pom.xml", + }, FileURIPrefix: "file://testdata/com/squareup/okhttp3/okhttp/3.12.12", }, }, @@ -130,6 +155,11 @@ func Test_parseMavenDepLines(t *testing.T) { labels.AsString(provider.DepSourceLabel, "internal"), labels.AsString(provider.DepLanguageLabel, "java"), }, + Extras: map[string]interface{}{ + groupIdKey: "com.squareup.okio", + artifactIdKey: "okio", + pomPathKey: "pom.xml", + }, FileURIPrefix: "file://testdata/com/squareup/okio/okio/1.15.0", }, }, @@ -144,6 +174,11 @@ func Test_parseMavenDepLines(t *testing.T) { labels.AsString(provider.DepSourceLabel, "internal"), labels.AsString(provider.DepLanguageLabel, "java"), }, + Extras: map[string]interface{}{ + groupIdKey: "com.squareup.okhttp3", + artifactIdKey: "logging-interceptor", + pomPathKey: "pom.xml", + }, FileURIPrefix: "file://testdata/com/squareup/okhttp3/logging-interceptor/3.12.12", }, }, @@ -158,6 +193,11 @@ func Test_parseMavenDepLines(t *testing.T) { labels.AsString(provider.DepSourceLabel, "internal"), labels.AsString(provider.DepLanguageLabel, "java"), }, + Extras: map[string]interface{}{ + groupIdKey: "io.fabric8", + artifactIdKey: "zjsonpatch", + pomPathKey: "pom.xml", + }, FileURIPrefix: "file://testdata/io/fabric8/zjsonpatch/0.3.0", }, }, @@ -193,6 +233,11 @@ func Test_parseMavenDepLines(t *testing.T) { labels.AsString(provider.DepSourceLabel, "open-source"), labels.AsString(provider.DepLanguageLabel, "java"), }, + Extras: map[string]interface{}{ + groupIdKey: "junit", + artifactIdKey: "junit", + pomPathKey: "pom.xml", + }, FileURIPrefix: "file://testdata/junit/junit/4.11", }, AddedDeps: []provider.DepDAGItem{ @@ -208,6 +253,11 @@ func Test_parseMavenDepLines(t *testing.T) { labels.AsString(provider.DepSourceLabel, "internal"), labels.AsString(provider.DepLanguageLabel, "java"), }, + Extras: map[string]interface{}{ + groupIdKey: "org.hamcrest", + artifactIdKey: "hamcrest-core", + pomPathKey: "pom.xml", + }, FileURIPrefix: "file://testdata/org/hamcrest/hamcrest-core/1.3", }, }, @@ -224,6 +274,11 @@ func Test_parseMavenDepLines(t *testing.T) { labels.AsString(provider.DepSourceLabel, "internal"), labels.AsString(provider.DepLanguageLabel, "java"), }, + Extras: map[string]interface{}{ + groupIdKey: "io.fabric8", + artifactIdKey: "kubernetes-client", + pomPathKey: "pom.xml", + }, FileURIPrefix: "file://testdata/io/fabric8/kubernetes-client/6.0.0", }, AddedDeps: []provider.DepDAGItem{ @@ -238,6 +293,11 @@ func Test_parseMavenDepLines(t *testing.T) { labels.AsString(provider.DepSourceLabel, "internal"), labels.AsString(provider.DepLanguageLabel, "java"), }, + Extras: map[string]interface{}{ + groupIdKey: "io.fabric8", + artifactIdKey: "kubernetes-httpclient-okhttp", + pomPathKey: "pom.xml", + }, FileURIPrefix: "file://testdata/io/fabric8/kubernetes-httpclient-okhttp/6.0.0", }, }, @@ -252,6 +312,11 @@ func Test_parseMavenDepLines(t *testing.T) { labels.AsString(provider.DepSourceLabel, "internal"), labels.AsString(provider.DepLanguageLabel, "java"), }, + Extras: map[string]interface{}{ + groupIdKey: "com.squareup.okhttp3", + artifactIdKey: "okhttp", + pomPathKey: "pom.xml", + }, FileURIPrefix: "file://testdata/com/squareup/okhttp3/okhttp/3.12.12", }, }, @@ -266,6 +331,11 @@ func Test_parseMavenDepLines(t *testing.T) { labels.AsString(provider.DepSourceLabel, "internal"), labels.AsString(provider.DepLanguageLabel, "java"), }, + Extras: map[string]interface{}{ + groupIdKey: "com.squareup.okio", + artifactIdKey: "okio", + pomPathKey: "pom.xml", + }, FileURIPrefix: "file://testdata/com/squareup/okio/okio/1.15.0", }, }, @@ -280,6 +350,11 @@ func Test_parseMavenDepLines(t *testing.T) { labels.AsString(provider.DepSourceLabel, "internal"), labels.AsString(provider.DepLanguageLabel, "java"), }, + Extras: map[string]interface{}{ + groupIdKey: "com.squareup.okhttp3", + artifactIdKey: "logging-interceptor", + pomPathKey: "pom.xml", + }, FileURIPrefix: "file://testdata/com/squareup/okhttp3/logging-interceptor/3.12.12", }, }, @@ -294,6 +369,11 @@ func Test_parseMavenDepLines(t *testing.T) { labels.AsString(provider.DepSourceLabel, "internal"), labels.AsString(provider.DepLanguageLabel, "java"), }, + Extras: map[string]interface{}{ + groupIdKey: "io.fabric8", + artifactIdKey: "zjsonpatch", + pomPathKey: "pom.xml", + }, FileURIPrefix: "file://testdata/io/fabric8/zjsonpatch/0.3.0", }, }, @@ -322,7 +402,7 @@ func Test_parseMavenDepLines(t *testing.T) { } // we are not testing dep init here, so ignore error p.depInit() - if deps, err = p.parseMavenDepLines(lines[1:], "testdata"); (err != nil) != tt.wantErr { + if deps, err = p.parseMavenDepLines(lines[1:], "testdata", "pom.xml"); (err != nil) != tt.wantErr { t.Errorf("parseMavenDepLines() error = %v, wantErr %v", err, tt.wantErr) } if len(tt.wantDeps) != len(deps) { diff --git a/provider/internal/java/provider.go b/provider/internal/java/provider.go index 0c563eeb..fcfaac33 100644 --- a/provider/internal/java/provider.go +++ b/provider/internal/java/provider.go @@ -12,11 +12,14 @@ import ( "path/filepath" "regexp" "strings" + "sync" "github.com/getkin/kin-openapi/openapi3" "github.com/go-logr/logr" + "github.com/konveyor/analyzer-lsp/engine" "github.com/konveyor/analyzer-lsp/jsonrpc2" "github.com/konveyor/analyzer-lsp/lsp/protocol" + "github.com/konveyor/analyzer-lsp/output/v1/konveyor" "github.com/konveyor/analyzer-lsp/provider" "github.com/vifraa/gopom" "go.lsp.dev/uri" @@ -62,11 +65,15 @@ type javaProvider struct { clients []provider.ServiceClient - hasMaven bool + hasMaven bool + depsMutex sync.RWMutex + depsLocationCache map[string]int } var _ provider.InternalProviderClient = &javaProvider{} +var _ provider.DependencyLocationResolver = &javaProvider{} + type javaCondition struct { Referenced referenceCondition `yaml:"referenced"` } @@ -81,10 +88,11 @@ func NewJavaProvider(config provider.Config, log logr.Logger) *javaProvider { _, mvnBinaryError := exec.LookPath("mvn") return &javaProvider{ - config: config, - hasMaven: mvnBinaryError == nil, - Log: log, - clients: []provider.ServiceClient{}, + config: config, + hasMaven: mvnBinaryError == nil, + Log: log, + clients: []provider.ServiceClient{}, + depsLocationCache: make(map[string]int), } } @@ -296,16 +304,17 @@ func (p *javaProvider) Init(ctx context.Context, log logr.Logger, config provide }() svcClient := javaServiceClient{ - rpc: rpc, - cancelFunc: cancelFunc, - config: config, - cmd: cmd, - bundles: bundles, - workspace: workspace, - log: log, - depToLabels: map[string]*depLabelItem{}, - isLocationBinary: isBinary, - mvnSettingsFile: mavenSettingsFile, + rpc: rpc, + cancelFunc: cancelFunc, + config: config, + cmd: cmd, + bundles: bundles, + workspace: workspace, + log: log, + depToLabels: map[string]*depLabelItem{}, + isLocationBinary: isBinary, + mvnSettingsFile: mavenSettingsFile, + depsLocationCache: make(map[string]int), } svcClient.initialization(ctx) @@ -324,6 +333,69 @@ func (p *javaProvider) GetDependenciesDAG(ctx context.Context) (map[uri.URI][]pr return provider.FullDepDAGResponse(ctx, p.clients) } +// GetLocation given a dep, attempts to find line number, caches the line number for a given dep +func (j *javaProvider) GetLocation(ctx context.Context, dep konveyor.Dep) (engine.Location, error) { + location := engine.Location{StartPosition: engine.Position{}, EndPosition: engine.Position{}} + + cacheKey := fmt.Sprintf("%s-%s-%s-%v", + dep.Name, dep.Version, dep.ResolvedIdentifier, dep.Indirect) + j.depsMutex.RLock() + val, exists := j.depsLocationCache[cacheKey] + j.depsMutex.RUnlock() + if exists { + if val == -1 { + return location, + fmt.Errorf("unable to get location for dep %s due to a previous error", dep.Name) + } + return engine.Location{ + StartPosition: engine.Position{ + Line: val, + }, + EndPosition: engine.Position{ + Line: val, + }, + }, nil + } + + defer func() { + j.depsMutex.Lock() + j.depsLocationCache[cacheKey] = location.StartPosition.Line + j.depsMutex.Unlock() + }() + + location.StartPosition.Line = -1 + // we know that this provider populates extras with required information + if dep.Extras == nil { + return location, fmt.Errorf("unable to get location for dep %s, dep.Extras not set", dep.Name) + } + extrasKeys := []string{artifactIdKey, groupIdKey, pomPathKey} + for _, key := range extrasKeys { + if val, ok := dep.Extras[key]; !ok { + return location, + fmt.Errorf("unable to get location for dep %s, missing dep.Extras key %s", dep.Name, key) + } else if _, ok := val.(string); !ok { + return location, + fmt.Errorf("unable to get location for dep %s, dep.Extras key %s not a string", dep.Name, key) + } + } + + groupId := dep.Extras[groupIdKey].(string) + artifactId := dep.Extras[artifactIdKey].(string) + path := dep.Extras[pomPathKey].(string) + if path == "" { + return location, fmt.Errorf("unable to get location for dep %s, empty pom path", dep.Name) + } + lineNumber, err := provider.MultilineGrep(ctx, 2, path, + fmt.Sprintf("(%s|%s).*?(%s|%s).*", + groupId, artifactId, artifactId, groupId)) + if err != nil || lineNumber == -1 { + return location, fmt.Errorf("unable to get location for dep %s, search error - %w", dep.Name, err) + } + location.StartPosition.Line = lineNumber + location.EndPosition.Line = lineNumber + return location, nil +} + // resolveSourcesJars for a given source code location, runs maven to find // deps that don't have sources attached and decompiles them func resolveSourcesJars(ctx context.Context, log logr.Logger, location, mavenSettings string) error { diff --git a/provider/internal/java/service_client.go b/provider/internal/java/service_client.go index 3ccda010..d9d3e6ce 100644 --- a/provider/internal/java/service_client.go +++ b/provider/internal/java/service_client.go @@ -8,6 +8,7 @@ import ( "path/filepath" "regexp" "strings" + "sync" "github.com/go-logr/logr" "github.com/konveyor/analyzer-lsp/jsonrpc2" @@ -18,17 +19,19 @@ import ( ) type javaServiceClient struct { - rpc *jsonrpc2.Conn - cancelFunc context.CancelFunc - config provider.InitConfig - log logr.Logger - cmd *exec.Cmd - bundles []string - workspace string - depToLabels map[string]*depLabelItem - isLocationBinary bool - mvnSettingsFile string - depsCache map[uri.URI][]*provider.Dep + rpc *jsonrpc2.Conn + cancelFunc context.CancelFunc + config provider.InitConfig + log logr.Logger + cmd *exec.Cmd + bundles []string + workspace string + depToLabels map[string]*depLabelItem + isLocationBinary bool + mvnSettingsFile string + depsMutex sync.RWMutex + depsCache map[uri.URI][]*provider.Dep + depsLocationCache map[string]int } type depLabelItem struct { diff --git a/provider/lib.go b/provider/lib.go index fb57d502..b7a028bb 100644 --- a/provider/lib.go +++ b/provider/lib.go @@ -1,8 +1,12 @@ package provider import ( + "bufio" + "context" "fmt" "io/fs" + "math" + "os" "path/filepath" "regexp" "strings" @@ -94,3 +98,47 @@ func GetFiles(configLocation string, filepaths []string, patterns ...string) ([] } return xmlFiles, nil } + +// MultilineGrep searches for a multi-line pattern in a file and returns line number when matched +// window determines how many lines to load in mem at a time, uses ctx to abort search on timeout +// fails when a line in file overflows 64K, returns -1 and error on failure +func MultilineGrep(ctx context.Context, window int, path, pattern string) (int, error) { + file, err := os.Open(path) + if err != nil { + return -1, fmt.Errorf("failed to open file - %w", err) + } + defer file.Close() + + patternRegex, err := regexp.Compile(`(?s)` + pattern) + if err != nil { + return -1, fmt.Errorf("bad pattern - %w", err) + } + + // make sure we never keep too big a chunk in memory + window = int(math.Min(float64(window), 5)) + scanner := bufio.NewScanner(file) + currLine := 1 + lines := make([]string, window) + for scanner.Scan() { + select { + case <-ctx.Done(): + return -1, fmt.Errorf("aborting search in file %s, timed out", path) + default: + } + + if len(lines) == window { + lines = lines[1:] + } + line := scanner.Text() + line = strings.ReplaceAll(line, "\t", "") + line = strings.Trim(line, " ") + lines = append(lines, line) + content := strings.Join(lines, "\n") + if patternRegex.MatchString(content) { + return int(math.Max(1, float64(currLine)-float64(window)+1)), nil + } + currLine += 1 + } + + return -1, scanner.Err() +} diff --git a/provider/lib_test.go b/provider/lib_test.go new file mode 100644 index 00000000..cc9fc886 --- /dev/null +++ b/provider/lib_test.go @@ -0,0 +1,71 @@ +package provider + +import ( + "context" + "testing" + "time" +) + +func TestMultilineGrep(t *testing.T) { + tests := []struct { + name string + filePath string + pattern string + want int + wantErr bool + }{ + { + name: "plain single line text", + filePath: "./testdata/small.xml", + pattern: "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"", + want: 2, + wantErr: false, + }, + { + name: "multi-line simple pattern", + filePath: "./testdata/small.xml", + pattern: "com.fasterxml.jackson.core.*?jackson-core.*", + want: 69, + wantErr: false, + }, + { + name: "multi-line complex pattern", + filePath: "./testdata/small.xml", + pattern: "(com.fasterxml.jackson.core|jackson-core).*?(jackson-core|com.fasterxml.jackson.core).*", + want: 69, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := MultilineGrep(context.TODO(), 5, tt.filePath, tt.pattern) + if (err != nil) != tt.wantErr { + t.Errorf("MultilineGrep() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("MultilineGrep() = %v, want %v", got, tt.want) + } + }) + } +} + +func BenchmarkMultilineGrepFileSizeSmall(b *testing.B) { + for i := 0; i < b.N; i++ { + ctx, canMe := context.WithTimeout(context.TODO(), time.Second*3) + MultilineGrep(ctx, 5, + "./testdata/small.xml", + "(com.fasterxml.jackson.core|jackson-core).*?(jackson-core|com.fasterxml.jackson.core).*") + canMe() + } +} + +func BenchmarkMultilineGrepFileSizeBig(b *testing.B) { + for i := 0; i < b.N; i++ { + ctx, canMe := context.WithTimeout(context.TODO(), time.Second*3) + MultilineGrep(ctx, 5, + "./testdata/big.xml", + "(io.konveyor.demo|config-utils).*?(config-utils|io.konveyor.demo).*") + canMe() + } +} diff --git a/provider/provider.go b/provider/provider.go index 1e2f5b83..51333168 100644 --- a/provider/provider.go +++ b/provider/provider.go @@ -6,6 +6,7 @@ import ( "os" "regexp" "strings" + "time" "github.com/cbroglie/mustache" "github.com/getkin/kin-openapi/openapi3" @@ -336,6 +337,10 @@ type ServiceClient interface { GetDependenciesDAG(ctx context.Context) (map[uri.URI][]DepDAGItem, error) } +type DependencyLocationResolver interface { + GetLocation(ctx context.Context, dep konveyor.Dep) (engine.Location, error) +} + type Dep = konveyor.Dep type DepDAGItem = konveyor.DepDAGItem type Startable interface { @@ -561,17 +566,33 @@ func (dc DependencyCondition) Evaluate(ctx context.Context, log logr.Logger, con return resp, nil } + var depLocationResolver DependencyLocationResolver + depLocationResolver, _ = dc.Client.(DependencyLocationResolver) + for _, matchedDep := range matchedDeps { if matchedDep.dep.Version == "" || (dc.Lowerbound == "" && dc.Upperbound == "") { - resp.Matched = true - resp.Incidents = append(resp.Incidents, engine.IncidentContext{ + incident := engine.IncidentContext{ FileURI: matchedDep.uri, Variables: map[string]interface{}{ "name": matchedDep.dep.Name, "version": matchedDep.dep.Version, "type": matchedDep.dep.Type, }, - }) + } + if depLocationResolver != nil { + // this is a best-effort step and we don't want to block if resolver misbehaves + timeoutContext, cancelFunc := context.WithTimeout(ctx, time.Second*3) + location, err := depLocationResolver.GetLocation(timeoutContext, *matchedDep.dep) + if err == nil { + incident.LineNumber = &location.StartPosition.Line + incident.CodeLocation = &location + } else { + log.V(7).Error(err, "failed to get location for dependency", "dep", matchedDep.dep.Name) + } + cancelFunc() + } + resp.Matched = true + resp.Incidents = append(resp.Incidents, incident) // For now, lets leave this TODO to figure out what we should be setting in the context resp.TemplateContext = map[string]interface{}{ "name": matchedDep.dep.Name, @@ -612,13 +633,26 @@ func (dc DependencyCondition) Evaluate(ctx context.Context, log logr.Logger, con } resp.Matched = constraints.Check(depVersion) - resp.Incidents = append(resp.Incidents, engine.IncidentContext{ + incident := engine.IncidentContext{ FileURI: matchedDep.uri, Variables: map[string]interface{}{ "name": matchedDep.dep.Name, "version": matchedDep.dep.Version, }, - }) + } + if depLocationResolver != nil { + // this is a best-effort step and we don't want to block if resolver misbehaves + timeoutContext, cancelFunc := context.WithTimeout(context.Background(), time.Second*3) + location, err := depLocationResolver.GetLocation(timeoutContext, *matchedDep.dep) + if err == nil { + incident.LineNumber = &location.StartPosition.Line + incident.CodeLocation = &location + } else { + log.V(7).Error(err, "failed to get location for dependency", "dep", matchedDep.dep.Name) + } + cancelFunc() + } + resp.Incidents = append(resp.Incidents, incident) resp.TemplateContext = map[string]interface{}{ "name": matchedDep.dep.Name, "version": matchedDep.dep.Version, diff --git a/provider/testdata/big.xml b/provider/testdata/big.xml new file mode 100644 index 00000000..a5dc3bc1 --- /dev/null +++ b/provider/testdata/big.xml @@ -0,0 +1,696 @@ + + 4.0.0 + io.konveyor.demo + customers-tomcat + 0.0.1-SNAPSHOT + + Order Management + war + Remaining services for the legacy Order Management application + + + 1.8 + UTF-8 + UTF-8 + ${java.version} + ${java.version} + 5.3.7 + 9.0.46 + 2021.0.1 + 5.4.32.Final + 6.2.0.Final + + 42.2.20 + 2.12.3 + + 3.8.1 + 3.3.1 + 3.2.0 + + + + + + demo-config + Azure DevOps + https://pkgs.dev.azure.com/ShawnHurley21/demo-config-utils/_packaging/demo-config/maven/v1 + + + + + + + com.fasterxml.jackson + jackson-bom + ${jackson.version} + import + pom + + + org.springframework.data + spring-data-bom + ${spring-data.version} + import + pom + + + + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-test + + + org.springframework.data + spring-data-jpa + + + org.springframework + spring-jdbc + ${spring-framework.version} + + + org.springframework + spring-webmvc + ${spring-framework.version} + + + org.springframework + spring-web + ${spring-framework.version} + + + org.springframework.boot + spring-boot-starter-actuator + 2.5.0 + + + org.apache.tomcat + tomcat-jdbc + ${tomcat.version} + runtime + + + org.hibernate + hibernate-entitymanager + ${hibernate.version} + + + org.hibernate.validator + hibernate-validator + ${hibernate-validator.version} + + + ch.qos.logback + logback-classic + 1.1.7 + + + com.oracle.database.jdbc + ojdbc8 + 21.1.0.0 + + + org.postgresql + postgresql + 42.2.23 + + + + io.konveyor.demo + config-utils + 1.0.0 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + false + + + + org.apache.maven.plugins + maven-resources-plugin + ${maven-resources-plugin.version} + + UTF-8 + + + + + + diff --git a/provider/testdata/small.xml b/provider/testdata/small.xml new file mode 100644 index 00000000..5fd20fde --- /dev/null +++ b/provider/testdata/small.xml @@ -0,0 +1,165 @@ + + 4.0.0 + io.konveyor.demo + customers-tomcat + 0.0.1-SNAPSHOT + + Order Management + war + Remaining services for the legacy Order Management application + + + 1.8 + UTF-8 + UTF-8 + ${java.version} + ${java.version} + 5.3.7 + 9.0.46 + 2021.0.1 + 5.4.32.Final + 6.2.0.Final + + 42.2.20 + 2.12.3 + + 3.8.1 + 3.3.1 + 3.2.0 + + + + + + demo-config + Azure DevOps + https://pkgs.dev.azure.com/ShawnHurley21/demo-config-utils/_packaging/demo-config/maven/v1 + + + + + + + com.fasterxml.jackson + jackson-bom + ${jackson.version} + import + pom + + + org.springframework.data + spring-data-bom + ${spring-data.version} + import + pom + + + + + + org.apache.tomcat + tomcat-servlet-api + ${tomcat.version} + provided + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + + org.springframework.data + spring-data-jpa + + + + org.springframework + spring-jdbc + ${spring-framework.version} + + + org.springframework + spring-webmvc + ${spring-framework.version} + + + org.springframework + spring-web + ${spring-framework.version} + + + org.springframework.boot + spring-boot-starter-actuator + 2.5.0 + + + org.apache.tomcat + tomcat-jdbc + ${tomcat.version} + runtime + + + org.hibernate + hibernate-entitymanager + ${hibernate.version} + + + org.hibernate.validator + hibernate-validator + ${hibernate-validator.version} + + + ch.qos.logback + logback-classic + 1.1.7 + + + com.oracle.database.jdbc + ojdbc8 + 21.1.0.0 + + + org.postgresql + postgresql + 42.2.23 + + + + io.konveyor.demo + config-utils + 1.0.0 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + false + + + + org.apache.maven.plugins + maven-resources-plugin + ${maven-resources-plugin.version} + + UTF-8 + + + + + +