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