diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SecurityServicesFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SecurityServicesFeature.java index 5ff2196ba917..1a74a2e2a3db 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SecurityServicesFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SecurityServicesFeature.java @@ -187,6 +187,8 @@ public static class Options { /** Provider list that contains only used providers. */ private ProviderList filteredProviderList; + /** List of providers deemed not to be used by this feature. */ + private List removedProviders; private boolean shouldFilterProviders = true; @@ -342,11 +344,29 @@ public ProviderList cleanUnregisteredProviders(ProviderList providerList) { filteredProviders.removeIf(this::shouldRemoveProvider); if (filteredProviderList == null || !filteredProviderList.providers().equals(filteredProviders)) { filteredProviderList = ProviderList.newList(filteredProviders.toArray(new Provider[0])); + if (Options.TraceSecurityServices.getValue()) { + removedProviders = new ArrayList<>(providerList.providers()); + removedProviders.removeIf(provider -> !shouldRemoveProvider(provider)); + } } } return filteredProviderList; } + private void traceRemovedProviders() { + if (removedProviders == null || removedProviders.isEmpty()) { + trace("No security providers have been removed."); + } else { + trace("The following security providers were deemed to be unused and removed:"); + SecurityServicesPrinter.indent(); + trace("ProviderName - ProviderClass"); + for (Provider p : removedProviders) { + trace("%s - %s", p.getName(), p.getClass().getName()); + } + SecurityServicesPrinter.dedent(); + } + } + private static void linkSunEC(DuringAnalysisAccess a) { NativeLibraries nativeLibraries = ((DuringAnalysisAccessImpl) a).getNativeLibraries(); /* We statically link sunec thus we classify it as builtIn library */ @@ -638,6 +658,7 @@ private static void registerX509Extensions() { @Override public void afterAnalysis(AfterAnalysisAccess access) { + traceRemovedProviders(); SecurityServicesPrinter.endTracing(); shouldFilterProviders = false; }