11/**
2- * (C) Copyright IBM Corporation 2019, 2026.
2+ * (C) Copyright IBM Corporation 2019, 2026
33 *
44 * Licensed under the Apache License, Version 2.0 (the "License");
55 * you may not use this file except in compliance with the License.
@@ -1942,12 +1942,13 @@ private void addUserId(List<String> commandElements) {
19421942 *
19431943 * @param classes class file paths features should be generated for (can be null if no modified classes)
19441944 * @param optimize if true, generate optimized feature list
1945+ * @param generateToSrc if true, generate feature list into file in src/main/liberty
19451946 * @param useTmpDirOut if true, generate feature file in a hidden directory named in BinaryScannerUtil
19461947 * @param useTmpDirIn if true, the hidden directory named in BinaryScannerUtil will be used as the
19471948 * context or input values to generate features
19481949 * @return true if feature generation was successful
19491950 */
1950- public abstract boolean libertyGenerateFeatures (Collection <String > classes , boolean optimize , boolean useTmpDirOut , boolean useTmpDirIn );
1951+ public abstract boolean libertyGenerateFeatures (Collection <String > classes , boolean optimize , boolean generateToSrc , boolean useTmpDirOut , boolean useTmpDirIn );
19511952
19521953 /**
19531954 * Install features in regular dev mode. This method should not be used in container mode.
@@ -2672,13 +2673,11 @@ private void toggleGenerateToSrc() {
26722673 generateToSrc = !generateToSrc ;
26732674 logGenerateToSrcStatus ();
26742675 initGenerationContext ();
2675- if (!generateToSrc ) { // when you toggle off generate to src, delete the generated file in src
2676- File srcGenFeaturesFile = new File (configDirectory , BinaryScannerUtil .GENERATED_FEATURES_FILE_PATH );
2677- if (srcGenFeaturesFile .exists ()) {
2678- if (!srcGenFeaturesFile .delete ()) {
2679- debug ("Error trying to delete the generated features file:" + srcGenFeaturesFile .getAbsolutePath ());
2680- }
2681- }
2676+ // When you toggle generateToSrc delete the old file you no longer need
2677+ if (generateToSrc ) {
2678+ deleteGenFeaturesFile (generateFeaturesTmpDir ); // delete the old gen file in tmpdir
2679+ } else {
2680+ deleteGenFeaturesFile (configDirectory ); // delete the old gen file in src/main/liberty/config
26822681 }
26832682 if (generateFeatures ) {
26842683 if (generateToSrc ) {
@@ -2689,6 +2688,16 @@ private void toggleGenerateToSrc() {
26892688 }
26902689 }
26912690
2691+ private void deleteGenFeaturesFile (File dir ) {
2692+ // N.B. processConfigFileChange() will be called upon deletion of generated features file, it should be ignored
2693+ File oldGenFeaturesFile = new File (dir , BinaryScannerUtil .GENERATED_FEATURES_FILE_PATH );
2694+ if (oldGenFeaturesFile .exists ()) {
2695+ if (!oldGenFeaturesFile .delete ()) {
2696+ debug ("Error trying to delete the generated features file:" + oldGenFeaturesFile .getAbsolutePath ());
2697+ }
2698+ }
2699+ }
2700+
26922701 private void logGenerateToSrcStatus () {
26932702 info ("Setting generation of features in src directory to: " + getFormattedBooleanString (generateToSrc ));
26942703 }
@@ -2720,7 +2729,7 @@ private boolean optimizeGenerateFeatures(boolean useTmpDir) {
27202729 private boolean optimizeGenerateFeatures (boolean useTmpDirOut , boolean useTmpDirIn ) {
27212730 debug ("Generating optimized features list...use temp directory for output=" + useTmpDirOut + " use temp directory for input=" + useTmpDirIn );
27222731 // scan all class files and provide only user specified features
2723- boolean generatedFeatures = libertyGenerateFeatures (null , true , useTmpDirOut , useTmpDirIn );
2732+ boolean generatedFeatures = libertyGenerateFeatures (null , true , generateToSrc , useTmpDirOut , useTmpDirIn );
27242733 if (generatedFeatures ) {
27252734 modifiedClasses .clear ();
27262735 failedToGenerateClasses .clear ();
@@ -2739,7 +2748,7 @@ private boolean incrementGenerateFeatures(boolean useTmpDir) {
27392748 boolean generatedFeatures = false ;
27402749 try {
27412750 Collection <String > classPaths = getClassPaths (modifiedClasses );
2742- generatedFeatures = libertyGenerateFeatures (classPaths , false , useTmpDir , false );
2751+ generatedFeatures = libertyGenerateFeatures (classPaths , false , generateToSrc , useTmpDir , false );
27432752 if (generatedFeatures ) {
27442753 modifiedClasses .clear ();
27452754 failedToGenerateClasses .clear ();
@@ -4673,8 +4682,11 @@ private void processConfigFileChange(File fileChanged, ChangeType changeType, Th
46734682 // generateFeaturesTmpDir in the process of handling an xml config modicifcation.
46744683 // Deleting that directory could cause generated-features.xml to be deleted and we
46754684 // need to be careful how to handle that event e.g. don't call optimizeGenerateFeatures().
4685+ // Another scenario, when we toggle generateToSrc option we delete the old file and change the
4686+ // value of generateFeaturesFile. Therefore we must only use the base name of generateFeaturesFile
4687+ // in this file name check.
46764688 if (generateFeatures && (fileChanged .getName ().endsWith (".xml" )
4677- && !fileChanged .equals (generateFeaturesFile ))
4689+ && !fileChanged .getName (). equals (generateFeaturesFile . getName () ))
46784690 && serverFeaturesModified ()) {
46794691 optimizeGenerateFeatures (!generateToSrc );
46804692 }
0 commit comments