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