@@ -6,7 +6,11 @@ import JSZip = require('jszip')
66import { EclipseConfigGenerator , JavaProjectAnalyzer } from './javaManager'
77import { resolveSymlink , isDirectory , isEmptyDirectory } from './util'
88import glob = require( 'fast-glob' )
9- import { CodewhispererLanguage , getCodeWhispererLanguageIdFromPath } from '../../shared/languageDetection'
9+ import {
10+ CodewhispererLanguage ,
11+ getCodeWhispererLanguageIdFromPath ,
12+ isJavaProjectFileFromPath ,
13+ } from '../../shared/languageDetection'
1014
1115export interface FileMetadata {
1216 filePath : string
@@ -627,31 +631,55 @@ export class ArtifactManager {
627631 files : FileMetadata [ ]
628632 ) : Promise < FileMetadata [ ] > {
629633 const workspacePath = URI . parse ( workspaceFolder . uri ) . path
630- const hasJavaFiles = files . some ( file => file . language === 'java' )
634+ const hasJavaFiles = files . some ( file => file . language === 'java' && file . relativePath . endsWith ( 'java' ) )
631635
632636 if ( ! hasJavaFiles ) {
633637 return files
634638 }
635639
640+ // Extract project roots from file paths for scenarios that workspace were not opened up from project roots
641+ const projectRoots = this . extractJavaProjectRoots ( files )
636642 const additionalFiles : FileMetadata [ ] = [ ]
637643
638- // Generate Eclipse configuration files
639- const javaManager = new JavaProjectAnalyzer ( workspacePath )
640- const structure = await javaManager . analyze ( )
641- const generator = new EclipseConfigGenerator ( workspaceFolder , this . logging )
644+ // Process each project root separately
645+ for ( const projectRoot of projectRoots ) {
646+ const isRootProject = projectRoot === '.'
647+ const projectPath = path . join ( workspacePath , projectRoot )
642648
643- // Generate and add .classpath file
644- const classpathFiles = await generator . generateDotClasspath ( structure )
645- for ( const classpathFile of classpathFiles ) {
646- additionalFiles . push ( classpathFile )
647- }
649+ // Create project-specific "workspace folder" for analyzing
650+ const projectWorkspaceFolder : WorkspaceFolder = {
651+ ...workspaceFolder ,
652+ uri : URI . file ( projectPath ) . toString ( ) ,
653+ }
654+
655+ const javaManager = new JavaProjectAnalyzer ( projectPath )
656+ const structure = await javaManager . analyze ( )
657+ const generator = new EclipseConfigGenerator ( projectWorkspaceFolder , this . logging )
658+
659+ const classpathFiles = await generator . generateDotClasspath ( structure )
660+ const projectConfigFiles = await generator . generateDotProject (
661+ isRootProject ? workspaceFolder . name : projectRoot ,
662+ structure
663+ )
664+
665+ // Update relativePath to include project directory for zip upload
666+ const updatedFiles = [ ...classpathFiles , ...projectConfigFiles ] . map ( file => ( {
667+ ...file ,
668+ relativePath : isRootProject ? file . relativePath : path . join ( projectRoot , file . relativePath ) ,
669+ } ) )
648670
649- // Generate and add .project file
650- const projectFiles = await generator . generateDotProject ( path . basename ( workspacePath ) , structure )
651- for ( const projectFile of projectFiles ) {
652- additionalFiles . push ( projectFile )
671+ additionalFiles . push ( ...updatedFiles )
653672 }
654673
655674 return [ ...files , ...additionalFiles ]
656675 }
676+
677+ private extractJavaProjectRoots ( files : FileMetadata [ ] ) : string [ ] {
678+ const projectRoots = new Set < string > ( )
679+ files
680+ . filter ( file => isJavaProjectFileFromPath ( file . relativePath ) )
681+ . map ( file => path . dirname ( file . relativePath ) )
682+ . forEach ( projectRoot => projectRoots . add ( projectRoot ) )
683+ return Array . from ( projectRoots )
684+ }
657685}
0 commit comments