@@ -48,8 +48,10 @@ public class ManifestFileProcessor {
4848 protected static final String USER_FEATURE_DIR = "extension/lib/features" ;
4949
5050 protected HashMap <String , ProductExtensionInfo > productExtNameInfoMap ;
51+ protected Map <String , ProvisioningFeatureDefinition > allFeatureDefs ;
5152
52- public static final String MF_EXTENSION = ".mf" ;
53+
54+ public static final String MF_EXTENSION = ".mf" ;
5355 public static final String CORE_PRODUCT_NAME = "core" ;
5456
5557 public static final String USR_PRODUCT_EXT_NAME = ExtensionConstants .USER_EXTENSION ;
@@ -165,31 +167,36 @@ public Map<String, ProvisioningFeatureDefinition> getInstallFeatureDefinitions()
165167 * @return All product installed product features.
166168 */
167169 public Map <String , ProvisioningFeatureDefinition > getFeatureDefinitions () {
168- Map <String , ProvisioningFeatureDefinition > featureDefs = new TreeMap <String , ProvisioningFeatureDefinition >();
169-
170- // Add feature definitions from Liberty core.
171- featureDefs .putAll (getCoreProductFeatureDefinitions ());
172-
173- // Add product extension feature definitions in the default usr location.
174- Map <String , ProvisioningFeatureDefinition > userFeatureDefs = getUsrProductFeatureDefinitions ();
175- if (userFeatureDefs != null && !userFeatureDefs .isEmpty ()) {
176- featureDefs .putAll (userFeatureDefs );
177- }
178-
179- // Add product extension feature definitions that are not in the default usr location.
180- readProductExtFeatureLocations ();
181- if (!productExtNameInfoMap .isEmpty ()) {
182- for (String productExtName : BundleRepositoryRegistry .keys ()) {
183- if (productExtName .isEmpty () || USR_PRODUCT_EXT_NAME .equals (productExtName ))
184- continue ;
185-
186- Map <String , ProvisioningFeatureDefinition > prodExtFeatureDefs = getProductExtFeatureDefinitions (productExtName );
187- if (prodExtFeatureDefs != null && !prodExtFeatureDefs .isEmpty ())
188- featureDefs .putAll (prodExtFeatureDefs );
189- }
170+ Map <String , ProvisioningFeatureDefinition > featureDefs = getFeatureDefs ();
171+ if (featureDefs != null )
172+ return featureDefs ;
173+ else {
174+ featureDefs = new TreeMap <String , ProvisioningFeatureDefinition >();
175+ // Add feature definitions from Liberty core.
176+ featureDefs .putAll (getCoreProductFeatureDefinitions ());
177+
178+ // Add product extension feature definitions in the default usr location.
179+ Map <String , ProvisioningFeatureDefinition > userFeatureDefs = getUsrProductFeatureDefinitions ();
180+ if (userFeatureDefs != null && !userFeatureDefs .isEmpty ()) {
181+ featureDefs .putAll (userFeatureDefs );
182+ }
183+
184+ // Add product extension feature definitions that are not in the default usr location.
185+ readProductExtFeatureLocations ();
186+ if (!productExtNameInfoMap .isEmpty ()) {
187+ for (String productExtName : BundleRepositoryRegistry .keys ()) {
188+ if (productExtName .isEmpty () || USR_PRODUCT_EXT_NAME .equals (productExtName ))
189+ continue ;
190+
191+ Map <String , ProvisioningFeatureDefinition > prodExtFeatureDefs = getProductExtFeatureDefinitions (productExtName );
192+ if (prodExtFeatureDefs != null && !prodExtFeatureDefs .isEmpty ())
193+ featureDefs .putAll (prodExtFeatureDefs );
194+ }
195+ }
196+ // cache the featureDefs
197+ allFeatureDefs = featureDefs ;
198+ return featureDefs ;
190199 }
191-
192- return featureDefs ;
193200 }
194201
195202 /**
@@ -504,4 +511,10 @@ public File getCoreAssetDir() {
504511 public ContentBasedLocalBundleRepository getBundleRepository (String featureName , WsLocationAdmin locService ) {
505512 return BundleRepositoryRegistry .getRepositoryHolder (featureName ).getBundleRepository ();
506513 }
514+ /**
515+ * @return the cached featureDefs if present, or lazily read them and store.
516+ */
517+ private Map <String , ProvisioningFeatureDefinition > getFeatureDefs () {
518+ return allFeatureDefs ;
519+ }
507520}
0 commit comments