syncable_cli/analyzer/frameworks/
java.rs

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