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