@@ -438,6 +438,7 @@ private enum FileTrackMode {
438438 private boolean generateToSrc ;
439439 private Set <String > generatedFeaturesSet ; // set of features in generated-features.xml file
440440 private boolean generatedFeaturesModified ;
441+ private boolean generatedFeaturesCopied ;
441442 private Set <String > compileArtifactPaths ;
442443 private Set <String > testArtifactPaths ;
443444 protected File generateFeaturesFile ; // the file that is created from the generate-features goal/task
@@ -565,6 +566,7 @@ public DevUtil(File buildDirectory, File serverDirectory, File sourceDirectory,
565566 this .testArtifactPaths = testArtifactPaths ;
566567 this .monitoredWebResourceDirs = monitoredWebResourceDirs ;
567568 this .generatedFeaturesModified = false ;
569+ this .generatedFeaturesCopied = false ;
568570 if (this .generateFeatures ) {
569571 this .generatedFeaturesSet = getGeneratedFeatures ();
570572 } else {
@@ -580,6 +582,9 @@ private void initGenerationContext() {
580582
581583 public void copyGeneratedFeaturesFile (File destinationDir ) throws IOException {
582584 copyFile (generateFeaturesFile , generateFeaturesOutputDir , destinationDir , null );
585+ if (destinationDir .equals (serverDirectory )) {
586+ generatedFeaturesCopied = true ; // features copied into server dir and not some temp dir
587+ }
583588 }
584589 /**
585590 * Run unit and/or integration tests
@@ -2755,15 +2760,15 @@ protected void setFeatureGeneration(boolean generateFeatures) {
27552760 logFeatureGenerationStatus ();
27562761 }
27572762
2758- private boolean optimizeGenerateFeatures (boolean useTmpDir ) {
2763+ protected boolean optimizeGenerateFeatures (boolean useTmpDir ) {
27592764 debug ("Entering optimizeGenerateFeatures(boolean)" );
27602765 return optimizeGenerateFeatures (useTmpDir , false );
27612766 }
27622767
27632768 /**
27642769 * Generate features using all classes and only user specified features.
27652770 */
2766- private boolean optimizeGenerateFeatures (boolean useTmpDirOut , boolean useTmpDirIn ) {
2771+ protected boolean optimizeGenerateFeatures (boolean useTmpDirOut , boolean useTmpDirIn ) {
27672772 debug ("Generating optimized features list...use temp directory for output=" + useTmpDirOut + " use temp directory for input=" + useTmpDirIn );
27682773 // scan all class files and provide only user specified features
27692774 boolean generatedFeatures = libertyGenerateFeatures (null , true , generateToSrc , useTmpDirOut , useTmpDirIn );
@@ -3445,15 +3450,6 @@ public void watchFiles(File outputDirectory, File testOutputDirectory, final Thr
34453450 }
34463451 }
34473452
3448- /**
3449- *
3450- * @return {@code Collection<String>} of class paths
3451- * @throws IOException
3452- */
3453- public Collection <String > getJavaSourceClassPaths () throws IOException {
3454- return getClassPaths (modifiedClasses );
3455- }
3456-
34573453 /**
34583454 *
34593455 * @param classFiles javaSourceClassFiles that have been modified
@@ -4682,14 +4678,26 @@ private void processConfigFileChange(File fileChanged, ChangeType changeType, Th
46824678 System .setProperty (SKIP_BETA_INSTALL_WARNING , Boolean .TRUE .toString ());
46834679 installFeaturesToTempDir (fileChanged , fileChangedParentDir , targetFileName , generateFeaturesSuccess );
46844680 }
4685- copyFile (fileChanged , fileChangedParentDir , serverDirectory , targetFileName );
4686-
4687- // if the generated features file was modified as a result of another config
4688- // file modification, copy it over to target so the server picks up the changes
4689- // together
4681+ // Copy the config file which was changed to the server directory unless it is
4682+ // the generated features file. The generated features file may have been copied
4683+ // to the server directory already as a result of a change to the build file (pom.xml)
4684+ // or the server.xml.
4685+ if (!isGeneratedFeaturesFile ) { // all other config files
4686+ copyFile (fileChanged , fileChangedParentDir , serverDirectory , targetFileName );
4687+ } else {
4688+ if (!generatedFeaturesCopied ) {
4689+ copyGeneratedFeaturesFile (serverDirectory );
4690+ }
4691+ generatedFeaturesCopied = false ;
4692+ }
4693+ // If the generated features file was modified as a result of another config file modification
4694+ // (usually server.xml), copy it over to target so the server picks up the two changes together
46904695 if (generateFeaturesSuccess && generatedFeaturesModified && !isGeneratedFeaturesFile ) {
4691- // this logic is not entered if the fileChanged is the generated features file
4692- // copy generated features file to server dir
4696+ // This logic is not entered if the fileChanged is the generated features file.
4697+ // Copy generated features file to server dir and set generatedFeaturesCopied true
4698+ // (not referring to generatedFeaturesModified).
4699+ // Leave generatedFeaturesCopied true because the call to optimize/incrementalGenerateFeatures that was
4700+ // required to get into this IF block will also generate a file change event for generatedFeaturesFile
46934701 copyGeneratedFeaturesFile (serverDirectory );
46944702 generatedFeaturesModified = false ;
46954703 }
0 commit comments