1use super::{LanguageFrameworkDetector, TechnologyRule, FrameworkDetectionUtils};
2use crate::analyzer::{DetectedTechnology, DetectedLanguage, TechnologyCategory, LibraryType};
3use crate::error::Result;
4
5pub struct JavaFrameworkDetector;
6
7impl LanguageFrameworkDetector for JavaFrameworkDetector {
8 fn detect_frameworks(&self, language: &DetectedLanguage) -> Result<Vec<DetectedTechnology>> {
9 let rules = get_jvm_technology_rules();
10
11 let all_deps: Vec<String> = language.main_dependencies.iter()
13 .chain(language.dev_dependencies.iter())
14 .cloned()
15 .collect();
16
17 let technologies = FrameworkDetectionUtils::detect_technologies_by_dependencies(
18 &rules, &all_deps, language.confidence
19 );
20
21 Ok(technologies)
22 }
23
24 fn supported_languages(&self) -> Vec<&'static str> {
25 vec!["Java", "Kotlin", "Java/Kotlin"]
26 }
27}
28
29fn get_jvm_technology_rules() -> Vec<TechnologyRule> {
31 vec![
32 TechnologyRule {
34 name: "Spring Boot".to_string(),
35 category: TechnologyCategory::BackendFramework,
36 confidence: 0.95,
37 dependency_patterns: vec!["spring-boot".to_string(), "org.springframework.boot".to_string()],
38 requires: vec![],
39 conflicts_with: vec![],
40 is_primary_indicator: true,
41 alternative_names: vec!["spring".to_string()],
42 file_indicators: vec![],
43 },
44 TechnologyRule {
45 name: "Spring Framework".to_string(),
46 category: TechnologyCategory::BackendFramework,
47 confidence: 0.90,
48 dependency_patterns: vec!["spring-context".to_string(), "org.springframework".to_string()],
49 requires: vec![],
50 conflicts_with: vec![],
51 is_primary_indicator: true,
52 alternative_names: vec!["spring".to_string()],
53 file_indicators: vec![],
54 },
55 TechnologyRule {
56 name: "Spring Data".to_string(),
57 category: TechnologyCategory::Database,
58 confidence: 0.90,
59 dependency_patterns: vec!["spring-data".to_string(), "org.springframework.data".to_string(), "spring-data-jpa".to_string(), "spring-data-mongodb".to_string(), "spring-data-redis".to_string()],
60 requires: vec!["Spring Framework".to_string()],
61 conflicts_with: vec![],
62 is_primary_indicator: false,
63 alternative_names: vec![],
64 file_indicators: vec![],
65 },
66 TechnologyRule {
67 name: "Spring Security".to_string(),
68 category: TechnologyCategory::Library(LibraryType::Utility),
69 confidence: 0.90,
70 dependency_patterns: vec!["spring-security".to_string(), "org.springframework.security".to_string(), "spring-security-core".to_string(), "spring-security-oauth2".to_string()],
71 requires: vec!["Spring Framework".to_string()],
72 conflicts_with: vec![],
73 is_primary_indicator: false,
74 alternative_names: vec![],
75 file_indicators: vec![],
76 },
77 TechnologyRule {
78 name: "Spring Cloud".to_string(),
79 category: TechnologyCategory::Library(LibraryType::Utility),
80 confidence: 0.90,
81 dependency_patterns: vec!["spring-cloud".to_string(), "org.springframework.cloud".to_string()],
82 requires: vec!["Spring Boot".to_string()],
83 conflicts_with: vec![],
84 is_primary_indicator: false,
85 alternative_names: vec![],
86 file_indicators: vec![],
87 },
88 TechnologyRule {
89 name: "Spring Cloud Gateway".to_string(),
90 category: TechnologyCategory::Library(LibraryType::Utility),
91 confidence: 0.95,
92 dependency_patterns: vec!["spring-cloud-gateway".to_string(), "spring-cloud-starter-gateway".to_string()],
93 requires: vec!["Spring Cloud".to_string()],
94 conflicts_with: vec![],
95 is_primary_indicator: false,
96 alternative_names: vec![],
97 file_indicators: vec![],
98 },
99 TechnologyRule {
100 name: "Spring Cloud Config".to_string(),
101 category: TechnologyCategory::Library(LibraryType::Utility),
102 confidence: 0.95,
103 dependency_patterns: vec!["spring-cloud-config".to_string(), "spring-cloud-starter-config".to_string()],
104 requires: vec!["Spring Cloud".to_string()],
105 conflicts_with: vec![],
106 is_primary_indicator: false,
107 alternative_names: vec![],
108 file_indicators: vec![],
109 },
110 TechnologyRule {
111 name: "Spring Cloud Netflix".to_string(),
112 category: TechnologyCategory::Library(LibraryType::Utility),
113 confidence: 0.95,
114 dependency_patterns: vec!["spring-cloud-netflix".to_string(), "spring-cloud-starter-netflix-eureka".to_string(), "spring-cloud-starter-netflix-hystrix".to_string()],
115 requires: vec!["Spring Cloud".to_string()],
116 conflicts_with: vec![],
117 is_primary_indicator: false,
118 alternative_names: vec![],
119 file_indicators: vec![],
120 },
121 TechnologyRule {
122 name: "Spring WebFlux".to_string(),
123 category: TechnologyCategory::Library(LibraryType::Utility),
124 confidence: 0.95,
125 dependency_patterns: vec!["spring-webflux".to_string(), "org.springframework.webflux".to_string()],
126 requires: vec!["Spring Framework".to_string()],
127 conflicts_with: vec![],
128 is_primary_indicator: false,
129 alternative_names: vec![],
130 file_indicators: vec![],
131 },
132 TechnologyRule {
133 name: "Spring MVC".to_string(),
134 category: TechnologyCategory::Library(LibraryType::Utility),
135 confidence: 0.85,
136 dependency_patterns: vec!["spring-webmvc".to_string(), "spring-web".to_string()],
137 requires: vec!["Spring Framework".to_string()],
138 conflicts_with: vec![],
139 is_primary_indicator: false,
140 alternative_names: vec![],
141 file_indicators: vec![],
142 },
143 TechnologyRule {
144 name: "Spring Batch".to_string(),
145 category: TechnologyCategory::Library(LibraryType::Utility),
146 confidence: 0.90,
147 dependency_patterns: vec!["spring-batch".to_string(), "org.springframework.batch".to_string()],
148 requires: vec!["Spring Framework".to_string()],
149 conflicts_with: vec![],
150 is_primary_indicator: false,
151 alternative_names: vec![],
152 file_indicators: vec![],
153 },
154 TechnologyRule {
155 name: "Spring Integration".to_string(),
156 category: TechnologyCategory::Library(LibraryType::Utility),
157 confidence: 0.90,
158 dependency_patterns: vec!["spring-integration".to_string(), "org.springframework.integration".to_string()],
159 requires: vec!["Spring Framework".to_string()],
160 conflicts_with: vec![],
161 is_primary_indicator: false,
162 file_indicators: vec![],
163 alternative_names: vec![],
164 },
165 TechnologyRule {
166 name: "Spring AOP".to_string(),
167 category: TechnologyCategory::Library(LibraryType::Utility),
168 confidence: 0.85,
169 dependency_patterns: vec!["spring-aop".to_string(), "org.springframework.aop".to_string()],
170 requires: vec!["Spring Framework".to_string()],
171 conflicts_with: vec![],
172 is_primary_indicator: false,
173 file_indicators: vec![],
174 alternative_names: vec![],
175 },
176
177 TechnologyRule {
179 name: "Quarkus".to_string(),
180 category: TechnologyCategory::BackendFramework,
181 confidence: 0.95,
182 dependency_patterns: vec!["quarkus".to_string(), "io.quarkus".to_string()],
183 requires: vec![],
184 conflicts_with: vec![],
185 is_primary_indicator: true,
186 file_indicators: vec![],
187 alternative_names: vec![],
188 },
189 TechnologyRule {
190 name: "Micronaut".to_string(),
191 category: TechnologyCategory::BackendFramework,
192 confidence: 0.95,
193 dependency_patterns: vec!["micronaut".to_string(), "io.micronaut".to_string()],
194 requires: vec![],
195 conflicts_with: vec![],
196 is_primary_indicator: true,
197 file_indicators: vec![],
198 alternative_names: vec![],
199 },
200 TechnologyRule {
201 name: "Helidon".to_string(),
202 category: TechnologyCategory::BackendFramework,
203 confidence: 0.95,
204 dependency_patterns: vec!["helidon".to_string(), "io.helidon".to_string()],
205 requires: vec![],
206 conflicts_with: vec![],
207 is_primary_indicator: true,
208 file_indicators: vec![],
209 alternative_names: vec![],
210 },
211 TechnologyRule {
212 name: "Vert.x".to_string(),
213 category: TechnologyCategory::BackendFramework,
214 confidence: 0.95,
215 dependency_patterns: vec!["vertx".to_string(), "io.vertx".to_string()],
216 requires: vec![],
217 conflicts_with: vec![],
218 is_primary_indicator: true,
219 file_indicators: vec![],
220 alternative_names: vec!["eclipse vert.x".to_string(), "vertx".to_string()],
221 },
222
223 TechnologyRule {
225 name: "Struts".to_string(),
226 category: TechnologyCategory::BackendFramework,
227 confidence: 0.90,
228 dependency_patterns: vec!["struts".to_string(), "org.apache.struts".to_string()],
229 requires: vec![],
230 conflicts_with: vec![],
231 is_primary_indicator: true,
232 alternative_names: vec!["apache struts".to_string()],
233 file_indicators: vec![],
234 },
235 TechnologyRule {
236 name: "JSF".to_string(),
237 category: TechnologyCategory::BackendFramework,
238 confidence: 0.85,
239 dependency_patterns: vec!["jsf".to_string(), "javax.faces".to_string(), "jakarta.faces".to_string()],
240 requires: vec![],
241 conflicts_with: vec![],
242 is_primary_indicator: true,
243 alternative_names: vec!["javaserver faces".to_string()],
244 file_indicators: vec![],
245 },
246
247 TechnologyRule {
249 name: "Dropwizard".to_string(),
250 category: TechnologyCategory::BackendFramework,
251 confidence: 0.90,
252 dependency_patterns: vec!["dropwizard".to_string(), "io.dropwizard".to_string()],
253 requires: vec![],
254 conflicts_with: vec![],
255 is_primary_indicator: true,
256 alternative_names: vec![],
257 file_indicators: vec![],
258 },
259 TechnologyRule {
260 name: "Spark Java".to_string(),
261 category: TechnologyCategory::BackendFramework,
262 confidence: 0.90,
263 dependency_patterns: vec!["spark-core".to_string(), "com.sparkjava".to_string()],
264 requires: vec![],
265 conflicts_with: vec![],
266 is_primary_indicator: true,
267 alternative_names: vec!["spark".to_string()],
268 file_indicators: vec![],
269 },
270 TechnologyRule {
271 name: "Javalin".to_string(),
272 category: TechnologyCategory::BackendFramework,
273 confidence: 0.90,
274 dependency_patterns: vec!["javalin".to_string(), "io.javalin".to_string()],
275 requires: vec![],
276 conflicts_with: vec![],
277 is_primary_indicator: true,
278 alternative_names: vec![],
279 file_indicators: vec![],
280 },
281 TechnologyRule {
282 name: "Ratpack".to_string(),
283 category: TechnologyCategory::BackendFramework,
284 confidence: 0.90,
285 dependency_patterns: vec!["ratpack".to_string(), "io.ratpack".to_string()],
286 requires: vec![],
287 conflicts_with: vec![],
288 is_primary_indicator: true,
289 alternative_names: vec![],
290 file_indicators: vec![],
291 },
292 TechnologyRule {
293 name: "Ninja Framework".to_string(),
294 category: TechnologyCategory::BackendFramework,
295 confidence: 0.90,
296 dependency_patterns: vec!["ninja".to_string(), "org.ninjaframework".to_string()],
297 requires: vec![],
298 conflicts_with: vec![],
299 is_primary_indicator: true,
300 alternative_names: vec!["ninja".to_string()],
301 file_indicators: vec![],
302 },
303 TechnologyRule {
304 name: "Blade".to_string(),
305 category: TechnologyCategory::BackendFramework,
306 confidence: 0.90,
307 dependency_patterns: vec!["blade".to_string(), "com.bladejava".to_string()],
308 requires: vec![],
309 conflicts_with: vec![],
310 is_primary_indicator: true,
311 alternative_names: vec![],
312 file_indicators: vec![],
313 },
314
315 TechnologyRule {
317 name: "Play Framework".to_string(),
318 category: TechnologyCategory::BackendFramework,
319 confidence: 0.95,
320 dependency_patterns: vec!["play".to_string(), "com.typesafe.play".to_string()],
321 requires: vec![],
322 conflicts_with: vec![],
323 is_primary_indicator: true,
324 alternative_names: vec!["play".to_string()],
325 file_indicators: vec![],
326 },
327
328 TechnologyRule {
330 name: "Hibernate".to_string(),
331 category: TechnologyCategory::Database,
332 confidence: 0.90,
333 dependency_patterns: vec!["hibernate".to_string(), "org.hibernate".to_string(), "hibernate-core".to_string(), "hibernate-entitymanager".to_string()],
334 requires: vec![],
335 conflicts_with: vec![],
336 is_primary_indicator: false,
337 alternative_names: vec!["hibernate orm".to_string()],
338 file_indicators: vec![],
339 },
340 TechnologyRule {
341 name: "MyBatis".to_string(),
342 category: TechnologyCategory::Database,
343 confidence: 0.90,
344 dependency_patterns: vec!["mybatis".to_string(), "org.mybatis".to_string()],
345 requires: vec![],
346 conflicts_with: vec![],
347 is_primary_indicator: false,
348 alternative_names: vec![],
349 file_indicators: vec![],
350 },
351 TechnologyRule {
352 name: "JOOQ".to_string(),
353 category: TechnologyCategory::Database,
354 confidence: 0.85,
355 dependency_patterns: vec!["jooq".to_string(), "org.jooq".to_string()],
356 requires: vec![],
357 conflicts_with: vec![],
358 is_primary_indicator: false,
359 alternative_names: vec![],
360 file_indicators: vec![],
361 },
362 TechnologyRule {
363 name: "JPA".to_string(),
364 category: TechnologyCategory::Database,
365 confidence: 0.85,
366 dependency_patterns: vec!["javax.persistence".to_string(), "jakarta.persistence".to_string(), "jpa".to_string()],
367 requires: vec![],
368 conflicts_with: vec![],
369 is_primary_indicator: false,
370 alternative_names: vec!["java persistence api".to_string()],
371 file_indicators: vec![],
372 },
373 TechnologyRule {
374 name: "EclipseLink".to_string(),
375 category: TechnologyCategory::Database,
376 confidence: 0.85,
377 dependency_patterns: vec!["eclipselink".to_string(), "org.eclipse.persistence".to_string()],
378 requires: vec![],
379 conflicts_with: vec![],
380 is_primary_indicator: false,
381 alternative_names: vec![],
382 file_indicators: vec![],
383 },
384 TechnologyRule {
385 name: "Apache OpenJPA".to_string(),
386 category: TechnologyCategory::Database,
387 confidence: 0.85,
388 dependency_patterns: vec!["openjpa".to_string(), "org.apache.openjpa".to_string()],
389 requires: vec![],
390 conflicts_with: vec![],
391 is_primary_indicator: false,
392 alternative_names: vec!["openjpa".to_string()],
393 file_indicators: vec![],
394 },
395 TechnologyRule {
396 name: "QueryDSL".to_string(),
397 category: TechnologyCategory::Database,
398 confidence: 0.85,
399 dependency_patterns: vec!["querydsl".to_string(), "com.querydsl".to_string()],
400 requires: vec![],
401 conflicts_with: vec![],
402 is_primary_indicator: false,
403 alternative_names: vec![],
404 file_indicators: vec![],
405 },
406 TechnologyRule {
407 name: "JDBI".to_string(),
408 category: TechnologyCategory::Database,
409 confidence: 0.85,
410 dependency_patterns: vec!["jdbi".to_string(), "org.jdbi".to_string()],
411 requires: vec![],
412 conflicts_with: vec![],
413 is_primary_indicator: false,
414 alternative_names: vec![],
415 file_indicators: vec![],
416 },
417
418 TechnologyRule {
420 name: "MySQL Connector".to_string(),
421 category: TechnologyCategory::Database,
422 confidence: 0.95,
423 dependency_patterns: vec!["mysql-connector-java".to_string(), "com.mysql".to_string()],
424 requires: vec![],
425 conflicts_with: vec![],
426 is_primary_indicator: false,
427 alternative_names: vec!["mysql".to_string()],
428 file_indicators: vec![],
429 },
430 TechnologyRule {
431 name: "PostgreSQL Driver".to_string(),
432 category: TechnologyCategory::Database,
433 confidence: 0.95,
434 dependency_patterns: vec!["postgresql".to_string(), "org.postgresql".to_string()],
435 requires: vec![],
436 conflicts_with: vec![],
437 is_primary_indicator: false,
438 alternative_names: vec!["postgres".to_string()],
439 file_indicators: vec![],
440 },
441 TechnologyRule {
442 name: "MongoDB Driver".to_string(),
443 category: TechnologyCategory::Database,
444 confidence: 0.95,
445 dependency_patterns: vec!["mongodb-driver".to_string(), "org.mongodb".to_string(), "mongo-java-driver".to_string(), "spring-boot-starter-data-mongodb".to_string(), "spring-data-mongodb".to_string(), "spring-boot-starter-data-mongodb-reactive".to_string()],
446 requires: vec![],
447 conflicts_with: vec![],
448 is_primary_indicator: false,
449 alternative_names: vec!["mongodb".to_string()],
450 file_indicators: vec![],
451 },
452 TechnologyRule {
453 name: "Redis Jedis".to_string(),
454 category: TechnologyCategory::Database,
455 confidence: 0.95,
456 dependency_patterns: vec!["jedis".to_string(), "redis.clients".to_string(), "spring-boot-starter-data-redis".to_string(), "spring-data-redis".to_string(), "lettuce-core".to_string()],
457 requires: vec![],
458 conflicts_with: vec![],
459 is_primary_indicator: false,
460 alternative_names: vec!["redis".to_string()],
461 file_indicators: vec![],
462 },
463 TechnologyRule {
464 name: "H2 Database".to_string(),
465 category: TechnologyCategory::Database,
466 confidence: 0.90,
467 dependency_patterns: vec!["com.h2database".to_string(), "h2database".to_string()],
468 requires: vec![],
469 conflicts_with: vec![],
470 is_primary_indicator: false,
471 alternative_names: vec![],
472 file_indicators: vec![],
473 },
474 TechnologyRule {
475 name: "Apache Derby".to_string(),
476 category: TechnologyCategory::Database,
477 confidence: 0.85,
478 dependency_patterns: vec!["derby".to_string(), "org.apache.derby".to_string()],
479 requires: vec![],
480 conflicts_with: vec![],
481 is_primary_indicator: false,
482 alternative_names: vec!["derby".to_string()],
483 file_indicators: vec![],
484 },
485 TechnologyRule {
486 name: "SQLite JDBC".to_string(),
487 category: TechnologyCategory::Database,
488 confidence: 0.90,
489 dependency_patterns: vec!["sqlite-jdbc".to_string(), "org.xerial".to_string()],
490 requires: vec![],
491 conflicts_with: vec![],
492 is_primary_indicator: false,
493 alternative_names: vec!["sqlite".to_string()],
494 file_indicators: vec![],
495 },
496 TechnologyRule {
497 name: "Oracle JDBC".to_string(),
498 category: TechnologyCategory::Database,
499 confidence: 0.90,
500 dependency_patterns: vec!["ojdbc".to_string(), "com.oracle.database.jdbc".to_string()],
501 requires: vec![],
502 conflicts_with: vec![],
503 is_primary_indicator: false,
504 alternative_names: vec!["oracle".to_string()],
505 file_indicators: vec![],
506 },
507 TechnologyRule {
508 name: "SQL Server JDBC".to_string(),
509 category: TechnologyCategory::Database,
510 confidence: 0.90,
511 dependency_patterns: vec!["mssql-jdbc".to_string(), "com.microsoft.sqlserver".to_string()],
512 requires: vec![],
513 conflicts_with: vec![],
514 is_primary_indicator: false,
515 alternative_names: vec!["sqlserver".to_string()],
516 file_indicators: vec![],
517 },
518
519 TechnologyRule {
521 name: "Jakarta EE".to_string(),
522 category: TechnologyCategory::BackendFramework,
523 confidence: 0.90,
524 dependency_patterns: vec!["jakarta.".to_string(), "jakarta-ee".to_string()],
525 requires: vec![],
526 conflicts_with: vec![],
527 is_primary_indicator: true,
528 alternative_names: vec!["java ee".to_string()],
529 file_indicators: vec![],
530 },
531
532 TechnologyRule {
534 name: "Maven".to_string(),
535 category: TechnologyCategory::BuildTool,
536 confidence: 0.80,
537 dependency_patterns: vec!["maven".to_string(), "org.apache.maven".to_string()],
538 requires: vec![],
539 conflicts_with: vec![],
540 is_primary_indicator: false,
541 alternative_names: vec!["apache maven".to_string()],
542 file_indicators: vec![],
543 },
544 TechnologyRule {
545 name: "Gradle".to_string(),
546 category: TechnologyCategory::BuildTool,
547 confidence: 0.80,
548 dependency_patterns: vec!["gradle".to_string(), "org.gradle".to_string()],
549 requires: vec![],
550 conflicts_with: vec![],
551 is_primary_indicator: false,
552 alternative_names: vec![],
553 file_indicators: vec![],
554 },
555
556 TechnologyRule {
558 name: "JUnit".to_string(),
559 category: TechnologyCategory::Testing,
560 confidence: 0.85,
561 dependency_patterns: vec!["junit".to_string(), "org.junit".to_string()],
562 requires: vec![],
563 conflicts_with: vec![],
564 is_primary_indicator: false,
565 alternative_names: vec![],
566 file_indicators: vec![],
567 },
568 TechnologyRule {
569 name: "TestNG".to_string(),
570 category: TechnologyCategory::Testing,
571 confidence: 0.85,
572 dependency_patterns: vec!["testng".to_string(), "org.testng".to_string()],
573 requires: vec![],
574 conflicts_with: vec![],
575 is_primary_indicator: false,
576 alternative_names: vec![],
577 file_indicators: vec![],
578 },
579 TechnologyRule {
580 name: "Mockito".to_string(),
581 category: TechnologyCategory::Testing,
582 confidence: 0.80,
583 dependency_patterns: vec!["mockito".to_string(), "org.mockito".to_string()],
584 requires: vec![],
585 conflicts_with: vec![],
586 is_primary_indicator: false,
587 alternative_names: vec![],
588 file_indicators: vec![],
589 },
590
591 TechnologyRule {
593 name: "Reactor".to_string(),
594 category: TechnologyCategory::Library(LibraryType::Utility),
595 confidence: 0.85,
596 dependency_patterns: vec!["reactor".to_string(), "io.projectreactor".to_string()],
597 requires: vec![],
598 conflicts_with: vec![],
599 is_primary_indicator: false,
600 alternative_names: vec!["project reactor".to_string()],
601 file_indicators: vec![],
602 },
603 TechnologyRule {
604 name: "RxJava".to_string(),
605 category: TechnologyCategory::Library(LibraryType::Utility),
606 confidence: 0.85,
607 dependency_patterns: vec!["rxjava".to_string(), "io.reactivex".to_string()],
608 requires: vec![],
609 conflicts_with: vec![],
610 is_primary_indicator: false,
611 alternative_names: vec![],
612 file_indicators: vec![],
613 },
614 TechnologyRule {
615 name: "RSocket".to_string(),
616 category: TechnologyCategory::Library(LibraryType::Utility),
617 confidence: 0.90,
618 dependency_patterns: vec!["rsocket".to_string(), "io.rsocket".to_string(), "rsocket-core".to_string(), "rsocket-transport-netty".to_string()],
619 requires: vec![],
620 conflicts_with: vec![],
621 is_primary_indicator: false,
622 alternative_names: vec![],
623 file_indicators: vec![],
624 },
625
626 TechnologyRule {
628 name: "Ktor".to_string(),
629 category: TechnologyCategory::BackendFramework,
630 confidence: 0.95,
631 dependency_patterns: vec!["ktor".to_string(), "io.ktor".to_string()],
632 requires: vec![],
633 conflicts_with: vec![],
634 is_primary_indicator: true,
635 alternative_names: vec![],
636 file_indicators: vec![],
637 },
638
639 TechnologyRule {
641 name: "Apache Kafka".to_string(),
642 category: TechnologyCategory::Library(LibraryType::Utility),
643 confidence: 0.95,
644 dependency_patterns: vec!["kafka".to_string(), "org.apache.kafka".to_string(), "kafka-clients".to_string(), "spring-kafka".to_string(), "reactor-kafka".to_string()],
645 requires: vec![],
646 conflicts_with: vec![],
647 is_primary_indicator: false,
648 alternative_names: vec!["kafka".to_string()],
649 file_indicators: vec![],
650 },
651 TechnologyRule {
652 name: "RabbitMQ".to_string(),
653 category: TechnologyCategory::Library(LibraryType::Utility),
654 confidence: 0.95,
655 dependency_patterns: vec!["amqp-client".to_string(), "com.rabbitmq".to_string()],
656 requires: vec![],
657 conflicts_with: vec![],
658 is_primary_indicator: false,
659 alternative_names: vec!["rabbitmq".to_string()],
660 file_indicators: vec![],
661 },
662 TechnologyRule {
663 name: "Apache ActiveMQ".to_string(),
664 category: TechnologyCategory::Library(LibraryType::Utility),
665 confidence: 0.90,
666 dependency_patterns: vec!["activemq".to_string(), "org.apache.activemq".to_string()],
667 requires: vec![],
668 conflicts_with: vec![],
669 is_primary_indicator: false,
670 alternative_names: vec!["activemq".to_string()],
671 file_indicators: vec![],
672 },
673 TechnologyRule {
674 name: "Apache Pulsar".to_string(),
675 category: TechnologyCategory::Library(LibraryType::Utility),
676 confidence: 0.90,
677 dependency_patterns: vec!["pulsar-client".to_string(), "org.apache.pulsar".to_string()],
678 requires: vec![],
679 conflicts_with: vec![],
680 is_primary_indicator: false,
681 alternative_names: vec!["pulsar".to_string()],
682 file_indicators: vec![],
683 },
684
685 TechnologyRule {
687 name: "Elasticsearch".to_string(),
688 category: TechnologyCategory::Database,
689 confidence: 0.95,
690 dependency_patterns: vec!["elasticsearch".to_string(), "org.elasticsearch".to_string()],
691 requires: vec![],
692 conflicts_with: vec![],
693 is_primary_indicator: false,
694 alternative_names: vec!["elastic".to_string()],
695 file_indicators: vec![],
696 },
697 TechnologyRule {
698 name: "Apache Solr".to_string(),
699 category: TechnologyCategory::Database,
700 confidence: 0.90,
701 dependency_patterns: vec!["solr".to_string(), "org.apache.solr".to_string()],
702 requires: vec![],
703 conflicts_with: vec![],
704 is_primary_indicator: false,
705 alternative_names: vec!["solr".to_string()],
706 file_indicators: vec![],
707 },
708 TechnologyRule {
709 name: "Apache Lucene".to_string(),
710 category: TechnologyCategory::Database,
711 confidence: 0.85,
712 dependency_patterns: vec!["lucene".to_string(), "org.apache.lucene".to_string()],
713 requires: vec![],
714 conflicts_with: vec![],
715 is_primary_indicator: false,
716 alternative_names: vec!["lucene".to_string()],
717 file_indicators: vec![],
718 },
719
720 TechnologyRule {
722 name: "Hazelcast".to_string(),
723 category: TechnologyCategory::Database,
724 confidence: 0.90,
725 dependency_patterns: vec!["hazelcast".to_string(), "com.hazelcast".to_string()],
726 requires: vec![],
727 conflicts_with: vec![],
728 is_primary_indicator: false,
729 alternative_names: vec![],
730 file_indicators: vec![],
731 },
732 TechnologyRule {
733 name: "Apache Ignite".to_string(),
734 category: TechnologyCategory::Database,
735 confidence: 0.90,
736 dependency_patterns: vec!["ignite".to_string(), "org.apache.ignite".to_string()],
737 requires: vec![],
738 conflicts_with: vec![],
739 is_primary_indicator: false,
740 alternative_names: vec!["ignite".to_string()],
741 file_indicators: vec![],
742 },
743 TechnologyRule {
744 name: "EhCache".to_string(),
745 category: TechnologyCategory::Database,
746 confidence: 0.85,
747 dependency_patterns: vec!["ehcache".to_string(), "org.ehcache".to_string()],
748 requires: vec![],
749 conflicts_with: vec![],
750 is_primary_indicator: false,
751 alternative_names: vec![],
752 file_indicators: vec![],
753 },
754 TechnologyRule {
755 name: "Caffeine".to_string(),
756 category: TechnologyCategory::Database,
757 confidence: 0.85,
758 dependency_patterns: vec!["caffeine".to_string(), "com.github.ben-manes.caffeine".to_string()],
759 requires: vec![],
760 conflicts_with: vec![],
761 is_primary_indicator: false,
762 alternative_names: vec![],
763 file_indicators: vec![],
764 },
765
766 TechnologyRule {
768 name: "Apache Shiro".to_string(),
769 category: TechnologyCategory::Library(LibraryType::Utility),
770 confidence: 0.90,
771 dependency_patterns: vec!["shiro".to_string(), "org.apache.shiro".to_string()],
772 requires: vec![],
773 conflicts_with: vec![],
774 is_primary_indicator: false,
775 alternative_names: vec!["shiro".to_string()],
776 file_indicators: vec![],
777 },
778 TechnologyRule {
779 name: "Bouncy Castle".to_string(),
780 category: TechnologyCategory::Library(LibraryType::Utility),
781 confidence: 0.85,
782 dependency_patterns: vec!["bcprov".to_string(), "org.bouncycastle".to_string()],
783 requires: vec![],
784 conflicts_with: vec![],
785 is_primary_indicator: false,
786 alternative_names: vec![],
787 file_indicators: vec![],
788 },
789 TechnologyRule {
790 name: "Keycloak".to_string(),
791 category: TechnologyCategory::Library(LibraryType::Utility),
792 confidence: 0.90,
793 dependency_patterns: vec!["keycloak".to_string(), "org.keycloak".to_string()],
794 requires: vec![],
795 conflicts_with: vec![],
796 is_primary_indicator: false,
797 alternative_names: vec![],
798 file_indicators: vec![],
799 },
800 TechnologyRule {
801 name: "Jasypt".to_string(),
802 category: TechnologyCategory::Library(LibraryType::Utility),
803 confidence: 0.90,
804 dependency_patterns: vec!["jasypt".to_string(), "org.jasypt".to_string()],
805 requires: vec![],
806 conflicts_with: vec![],
807 is_primary_indicator: false,
808 alternative_names: vec![],
809 file_indicators: vec![],
810 },
811
812 TechnologyRule {
814 name: "Apache Tomcat".to_string(),
815 category: TechnologyCategory::Runtime,
816 confidence: 0.85,
817 dependency_patterns: vec!["tomcat".to_string(), "org.apache.tomcat".to_string()],
818 requires: vec![],
819 conflicts_with: vec![],
820 is_primary_indicator: false,
821 alternative_names: vec!["tomcat".to_string()],
822 file_indicators: vec![],
823 },
824 TechnologyRule {
825 name: "Jetty".to_string(),
826 category: TechnologyCategory::Runtime,
827 confidence: 0.85,
828 dependency_patterns: vec!["jetty".to_string(), "org.eclipse.jetty".to_string()],
829 requires: vec![],
830 conflicts_with: vec![],
831 is_primary_indicator: false,
832 alternative_names: vec!["eclipse jetty".to_string()],
833 file_indicators: vec![],
834 },
835 TechnologyRule {
836 name: "Undertow".to_string(),
837 category: TechnologyCategory::Runtime,
838 confidence: 0.85,
839 dependency_patterns: vec!["undertow".to_string(), "io.undertow".to_string()],
840 requires: vec![],
841 conflicts_with: vec![],
842 is_primary_indicator: false,
843 alternative_names: vec![],
844 file_indicators: vec![],
845 },
846 TechnologyRule {
847 name: "Netty".to_string(),
848 category: TechnologyCategory::Runtime,
849 confidence: 0.85,
850 dependency_patterns: vec!["netty".to_string(), "io.netty".to_string()],
851 requires: vec![],
852 conflicts_with: vec![],
853 is_primary_indicator: false,
854 alternative_names: vec![],
855 file_indicators: vec![],
856 },
857
858 TechnologyRule {
860 name: "Apache HttpClient".to_string(),
861 category: TechnologyCategory::Library(LibraryType::Utility),
862 confidence: 0.85,
863 dependency_patterns: vec!["httpclient".to_string(), "org.apache.httpcomponents".to_string()],
864 requires: vec![],
865 conflicts_with: vec![],
866 is_primary_indicator: false,
867 alternative_names: vec!["httpclient".to_string()],
868 file_indicators: vec![],
869 },
870 TechnologyRule {
871 name: "OkHttp".to_string(),
872 category: TechnologyCategory::Library(LibraryType::Utility),
873 confidence: 0.85,
874 dependency_patterns: vec!["okhttp".to_string(), "com.squareup.okhttp3".to_string()],
875 requires: vec![],
876 conflicts_with: vec![],
877 is_primary_indicator: false,
878 alternative_names: vec![],
879 file_indicators: vec![],
880 },
881 TechnologyRule {
882 name: "Retrofit".to_string(),
883 category: TechnologyCategory::Library(LibraryType::Utility),
884 confidence: 0.85,
885 dependency_patterns: vec!["retrofit".to_string(), "com.squareup.retrofit2".to_string()],
886 requires: vec![],
887 conflicts_with: vec![],
888 is_primary_indicator: false,
889 alternative_names: vec![],
890 file_indicators: vec![],
891 },
892
893 TechnologyRule {
895 name: "Jackson".to_string(),
896 category: TechnologyCategory::Library(LibraryType::Utility),
897 confidence: 0.85,
898 dependency_patterns: vec!["jackson".to_string(), "com.fasterxml.jackson".to_string()],
899 requires: vec![],
900 conflicts_with: vec![],
901 is_primary_indicator: false,
902 file_indicators: vec![],
903 alternative_names: vec![],
904 },
905 TechnologyRule {
906 name: "Gson".to_string(),
907 category: TechnologyCategory::Library(LibraryType::Utility),
908 confidence: 0.85,
909 dependency_patterns: vec!["gson".to_string(), "com.google.gson".to_string()],
910 requires: vec![],
911 conflicts_with: vec![],
912 is_primary_indicator: false,
913 alternative_names: vec![],
914 file_indicators: vec![],
915 },
916 TechnologyRule {
917 name: "Apache JAXB".to_string(),
918 category: TechnologyCategory::Library(LibraryType::Utility),
919 confidence: 0.80,
920 dependency_patterns: vec!["jaxb".to_string(), "javax.xml.bind".to_string(), "jakarta.xml.bind".to_string()],
921 requires: vec![],
922 conflicts_with: vec![],
923 is_primary_indicator: false,
924 alternative_names: vec!["jaxb".to_string()],
925 file_indicators: vec![],
926 },
927
928 TechnologyRule {
930 name: "Logback".to_string(),
931 category: TechnologyCategory::Library(LibraryType::Utility),
932 confidence: 0.85,
933 dependency_patterns: vec!["logback".to_string(), "ch.qos.logback".to_string()],
934 requires: vec![],
935 conflicts_with: vec![],
936 is_primary_indicator: false,
937 alternative_names: vec![],
938 file_indicators: vec![],
939 },
940 TechnologyRule {
941 name: "Log4j".to_string(),
942 category: TechnologyCategory::Library(LibraryType::Utility),
943 confidence: 0.85,
944 dependency_patterns: vec!["log4j".to_string(), "org.apache.logging.log4j".to_string()],
945 requires: vec![],
946 conflicts_with: vec![],
947 is_primary_indicator: false,
948 alternative_names: vec!["apache log4j".to_string()],
949 file_indicators: vec![],
950 },
951 TechnologyRule {
952 name: "SLF4J".to_string(),
953 category: TechnologyCategory::Library(LibraryType::Utility),
954 confidence: 0.80,
955 dependency_patterns: vec!["slf4j".to_string(), "org.slf4j".to_string()],
956 requires: vec![],
957 conflicts_with: vec![],
958 is_primary_indicator: false,
959 alternative_names: vec![],
960 file_indicators: vec![],
961 },
962
963 TechnologyRule {
965 name: "Micrometer".to_string(),
966 category: TechnologyCategory::Library(LibraryType::Utility),
967 confidence: 0.90,
968 dependency_patterns: vec!["micrometer".to_string(), "io.micrometer".to_string()],
969 requires: vec![],
970 conflicts_with: vec![],
971 is_primary_indicator: false,
972 file_indicators: vec![],
973 alternative_names: vec![],
974 },
975 TechnologyRule {
976 name: "Prometheus".to_string(),
977 category: TechnologyCategory::Library(LibraryType::Utility),
978 confidence: 0.90,
979 dependency_patterns: vec!["prometheus".to_string(), "io.prometheus".to_string()],
980 requires: vec![],
981 conflicts_with: vec![],
982 is_primary_indicator: false,
983 alternative_names: vec![],
984 file_indicators: vec![],
985 },
986 TechnologyRule {
987 name: "Actuator".to_string(),
988 category: TechnologyCategory::Library(LibraryType::Utility),
989 confidence: 0.90,
990 dependency_patterns: vec!["spring-boot-starter-actuator".to_string(), "actuator".to_string()],
991 requires: vec!["Spring Boot".to_string()],
992 conflicts_with: vec![],
993 is_primary_indicator: false,
994 alternative_names: vec![],
995 file_indicators: vec![],
996 },
997
998 TechnologyRule {
1000 name: "Bean Validation".to_string(),
1001 category: TechnologyCategory::Library(LibraryType::Utility),
1002 confidence: 0.85,
1003 dependency_patterns: vec!["validation-api".to_string(), "javax.validation".to_string(), "jakarta.validation".to_string()],
1004 requires: vec![],
1005 conflicts_with: vec![],
1006 is_primary_indicator: false,
1007 alternative_names: vec!["jsr303".to_string(), "jsr380".to_string()],
1008 file_indicators: vec![],
1009 },
1010 TechnologyRule {
1011 name: "Hibernate Validator".to_string(),
1012 category: TechnologyCategory::Library(LibraryType::Utility),
1013 confidence: 0.85,
1014 dependency_patterns: vec!["hibernate-validator".to_string(), "org.hibernate.validator".to_string()],
1015 requires: vec![],
1016 conflicts_with: vec![],
1017 is_primary_indicator: false,
1018 file_indicators: vec![],
1019 alternative_names: vec![],
1020 },
1021
1022 TechnologyRule {
1024 name: "Selenium".to_string(),
1025 category: TechnologyCategory::Testing,
1026 confidence: 0.90,
1027 dependency_patterns: vec!["selenium".to_string(), "org.seleniumhq.selenium".to_string()],
1028 requires: vec![],
1029 conflicts_with: vec![],
1030 is_primary_indicator: false,
1031 alternative_names: vec![],
1032 file_indicators: vec![],
1033 },
1034 TechnologyRule {
1035 name: "Cucumber".to_string(),
1036 category: TechnologyCategory::Testing,
1037 confidence: 0.85,
1038 dependency_patterns: vec!["cucumber".to_string(), "io.cucumber".to_string()],
1039 requires: vec![],
1040 conflicts_with: vec![],
1041 is_primary_indicator: false,
1042 alternative_names: vec![],
1043 file_indicators: vec![],
1044 },
1045 TechnologyRule {
1046 name: "WireMock".to_string(),
1047 category: TechnologyCategory::Testing,
1048 confidence: 0.85,
1049 dependency_patterns: vec!["wiremock".to_string(), "com.github.tomakehurst".to_string()],
1050 requires: vec![],
1051 conflicts_with: vec![],
1052 is_primary_indicator: false,
1053 alternative_names: vec![],
1054 file_indicators: vec![],
1055 },
1056 TechnologyRule {
1057 name: "REST Assured".to_string(),
1058 category: TechnologyCategory::Testing,
1059 confidence: 0.85,
1060 dependency_patterns: vec!["rest-assured".to_string(), "io.rest-assured".to_string()],
1061 requires: vec![],
1062 conflicts_with: vec![],
1063 is_primary_indicator: false,
1064 alternative_names: vec![],
1065 file_indicators: vec![],
1066 },
1067 TechnologyRule {
1068 name: "Testcontainers".to_string(),
1069 category: TechnologyCategory::Testing,
1070 confidence: 0.90,
1071 dependency_patterns: vec!["testcontainers".to_string(), "org.testcontainers".to_string()],
1072 requires: vec![],
1073 conflicts_with: vec![],
1074 is_primary_indicator: false,
1075 file_indicators: vec![],
1076 alternative_names: vec![],
1077 },
1078
1079 TechnologyRule {
1081 name: "Apache Spark".to_string(),
1082 category: TechnologyCategory::Library(LibraryType::Utility),
1083 confidence: 0.90,
1084 dependency_patterns: vec!["spark".to_string(), "org.apache.spark".to_string()],
1085 requires: vec![],
1086 conflicts_with: vec![],
1087 is_primary_indicator: false,
1088 alternative_names: vec!["spark".to_string()],
1089 file_indicators: vec![],
1090 },
1091 TechnologyRule {
1092 name: "Apache Flink".to_string(),
1093 category: TechnologyCategory::Library(LibraryType::Utility),
1094 confidence: 0.90,
1095 dependency_patterns: vec!["flink".to_string(), "org.apache.flink".to_string()],
1096 requires: vec![],
1097 conflicts_with: vec![],
1098 is_primary_indicator: false,
1099 alternative_names: vec!["flink".to_string()],
1100 file_indicators: vec![],
1101 },
1102 TechnologyRule {
1103 name: "Apache Storm".to_string(),
1104 category: TechnologyCategory::Library(LibraryType::Utility),
1105 confidence: 0.85,
1106 dependency_patterns: vec!["storm".to_string(), "org.apache.storm".to_string()],
1107 requires: vec![],
1108 conflicts_with: vec![],
1109 is_primary_indicator: false,
1110 alternative_names: vec!["storm".to_string()],
1111 file_indicators: vec![],
1112 },
1113
1114 TechnologyRule {
1116 name: "Lombok".to_string(),
1117 category: TechnologyCategory::Library(LibraryType::Utility),
1118 confidence: 0.85,
1119 dependency_patterns: vec!["lombok".to_string(), "org.projectlombok".to_string()],
1120 requires: vec![],
1121 conflicts_with: vec![],
1122 is_primary_indicator: false,
1123 alternative_names: vec![],
1124 file_indicators: vec![],
1125 },
1126 TechnologyRule {
1127 name: "MapStruct".to_string(),
1128 category: TechnologyCategory::Library(LibraryType::Utility),
1129 confidence: 0.85,
1130 dependency_patterns: vec!["mapstruct".to_string(), "org.mapstruct".to_string()],
1131 requires: vec![],
1132 conflicts_with: vec![],
1133 is_primary_indicator: false,
1134 alternative_names: vec![],
1135 file_indicators: vec![],
1136 },
1137 TechnologyRule {
1138 name: "Google Guava".to_string(),
1139 category: TechnologyCategory::Library(LibraryType::Utility),
1140 confidence: 0.80,
1141 dependency_patterns: vec!["guava".to_string(), "com.google.guava".to_string()],
1142 requires: vec![],
1143 conflicts_with: vec![],
1144 is_primary_indicator: false,
1145 alternative_names: vec!["guava".to_string()],
1146 file_indicators: vec![],
1147 },
1148 TechnologyRule {
1149 name: "Apache Commons".to_string(),
1150 category: TechnologyCategory::Library(LibraryType::Utility),
1151 confidence: 0.75,
1152 dependency_patterns: vec!["commons-".to_string(), "org.apache.commons".to_string()],
1153 requires: vec![],
1154 conflicts_with: vec![],
1155 is_primary_indicator: false,
1156 alternative_names: vec!["commons".to_string()],
1157 file_indicators: vec![],
1158 },
1159 ]
1160}