syncable_cli/analyzer/frameworks/
java.rs

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        // Combine main and dev dependencies for comprehensive detection
12        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
33/// Java technology detection rules with comprehensive framework coverage
34fn get_jvm_technology_rules() -> Vec<TechnologyRule> {
35    vec![
36        // SPRING ECOSYSTEM - COMPREHENSIVE COVERAGE
37        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        // MICROSERVICES FRAMEWORKS
223        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        // TRADITIONAL FRAMEWORKS
268        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        // LIGHTWEIGHT FRAMEWORKS
295        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        // PLAY FRAMEWORK
362        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        // ORM/DATABASE - EXPANDED
374        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        // DATABASE DRIVERS - CRITICAL FOR INFRASTRUCTURE
475        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        // ENTERPRISE JAVA
591        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        // BUILD TOOLS
603        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        // TESTING
626        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        // REACTIVE FRAMEWORKS
660        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        // KOTLIN SPECIFIC
699        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        // MESSAGE BROKERS & MESSAGING (Critical for infrastructure)
711        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        // SEARCH ENGINES (Critical for data infrastructure)
762        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        // CACHING (Critical for performance)
796        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        // SECURITY FRAMEWORKS (Critical for enterprise)
844        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        // WEB SERVERS & APPLICATION SERVERS (Critical for deployment)
889        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        // HTTP CLIENTS (Important for integration)
934        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        // JSON/XML PROCESSING (Critical for APIs)
971        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        // LOGGING (Critical for monitoring)
1009        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        // MONITORING & METRICS (Critical for production)
1043        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        // VALIDATION (Important for data integrity)
1080        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        // ADDITIONAL TESTING FRAMEWORKS
1110        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        // BIG DATA & ANALYTICS (Important for enterprise)
1172        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        // UTILITIES & TOOLS
1206        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}