diff --git a/broker/core/src/main/java/org/keycloak/broker/provider/IdentityProviderMapperSpi.java b/broker/core/src/main/java/org/keycloak/broker/provider/IdentityProviderMapperSpi.java
index e660700a1a..44fb65d5ed 100755
--- a/broker/core/src/main/java/org/keycloak/broker/provider/IdentityProviderMapperSpi.java
+++ b/broker/core/src/main/java/org/keycloak/broker/provider/IdentityProviderMapperSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class IdentityProviderMapperSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return false;
+ }
+
@Override
public String getName() {
return "identity-provider-mapper";
diff --git a/broker/core/src/main/java/org/keycloak/broker/provider/IdentityProviderSpi.java b/broker/core/src/main/java/org/keycloak/broker/provider/IdentityProviderSpi.java
index de9872aea8..b507e551c2 100644
--- a/broker/core/src/main/java/org/keycloak/broker/provider/IdentityProviderSpi.java
+++ b/broker/core/src/main/java/org/keycloak/broker/provider/IdentityProviderSpi.java
@@ -28,6 +28,11 @@ public class IdentityProviderSpi implements Spi {
public static final String IDENTITY_PROVIDER_SPI_NAME = "identity_provider";
+ @Override
+ public boolean isPrivate() {
+ return false;
+ }
+
@Override
public String getName() {
return IDENTITY_PROVIDER_SPI_NAME;
diff --git a/connections/file/src/main/java/org/keycloak/connections/file/FileConnectionSpi.java b/connections/file/src/main/java/org/keycloak/connections/file/FileConnectionSpi.java
index 4558be3059..ec64192281 100644
--- a/connections/file/src/main/java/org/keycloak/connections/file/FileConnectionSpi.java
+++ b/connections/file/src/main/java/org/keycloak/connections/file/FileConnectionSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class FileConnectionSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "connectionsFile";
diff --git a/connections/http-client/src/main/java/org/keycloak/connections/httpclient/HttpClientSpi.java b/connections/http-client/src/main/java/org/keycloak/connections/httpclient/HttpClientSpi.java
index d9f42287c2..510b1648bc 100755
--- a/connections/http-client/src/main/java/org/keycloak/connections/httpclient/HttpClientSpi.java
+++ b/connections/http-client/src/main/java/org/keycloak/connections/httpclient/HttpClientSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class HttpClientSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "connectionsHttpClient";
diff --git a/connections/infinispan/src/main/java/org/keycloak/connections/infinispan/InfinispanConnectionSpi.java b/connections/infinispan/src/main/java/org/keycloak/connections/infinispan/InfinispanConnectionSpi.java
index 71f915d59c..f76c070673 100644
--- a/connections/infinispan/src/main/java/org/keycloak/connections/infinispan/InfinispanConnectionSpi.java
+++ b/connections/infinispan/src/main/java/org/keycloak/connections/infinispan/InfinispanConnectionSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class InfinispanConnectionSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "connectionsInfinispan";
diff --git a/connections/jpa/src/main/java/org/keycloak/connections/jpa/JpaConnectionSpi.java b/connections/jpa/src/main/java/org/keycloak/connections/jpa/JpaConnectionSpi.java
index 83859abd86..d565357534 100644
--- a/connections/jpa/src/main/java/org/keycloak/connections/jpa/JpaConnectionSpi.java
+++ b/connections/jpa/src/main/java/org/keycloak/connections/jpa/JpaConnectionSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class JpaConnectionSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "connectionsJpa";
diff --git a/connections/jpa/src/main/java/org/keycloak/connections/jpa/updater/JpaUpdaterSpi.java b/connections/jpa/src/main/java/org/keycloak/connections/jpa/updater/JpaUpdaterSpi.java
index e95242aac9..c9bd8ee380 100644
--- a/connections/jpa/src/main/java/org/keycloak/connections/jpa/updater/JpaUpdaterSpi.java
+++ b/connections/jpa/src/main/java/org/keycloak/connections/jpa/updater/JpaUpdaterSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class JpaUpdaterSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "connectionsJpaUpdater";
diff --git a/connections/mongo/src/main/java/org/keycloak/connections/mongo/MongoConnectionSpi.java b/connections/mongo/src/main/java/org/keycloak/connections/mongo/MongoConnectionSpi.java
index 031076d629..f391dfd651 100644
--- a/connections/mongo/src/main/java/org/keycloak/connections/mongo/MongoConnectionSpi.java
+++ b/connections/mongo/src/main/java/org/keycloak/connections/mongo/MongoConnectionSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class MongoConnectionSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "connectionsMongo";
diff --git a/connections/mongo/src/main/java/org/keycloak/connections/mongo/updater/MongoUpdaterSpi.java b/connections/mongo/src/main/java/org/keycloak/connections/mongo/updater/MongoUpdaterSpi.java
index da89b4d8f8..830aaa339c 100644
--- a/connections/mongo/src/main/java/org/keycloak/connections/mongo/updater/MongoUpdaterSpi.java
+++ b/connections/mongo/src/main/java/org/keycloak/connections/mongo/updater/MongoUpdaterSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class MongoUpdaterSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "connectionsMongoUpdater";
diff --git a/events/api/src/main/java/org/keycloak/events/EventListenerSpi.java b/events/api/src/main/java/org/keycloak/events/EventListenerSpi.java
index 70cdea4385..a16ad46bde 100644
--- a/events/api/src/main/java/org/keycloak/events/EventListenerSpi.java
+++ b/events/api/src/main/java/org/keycloak/events/EventListenerSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class EventListenerSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return false;
+ }
+
@Override
public String getName() {
return "eventsListener";
diff --git a/events/api/src/main/java/org/keycloak/events/EventStoreSpi.java b/events/api/src/main/java/org/keycloak/events/EventStoreSpi.java
index 573fc86124..af5f59f018 100644
--- a/events/api/src/main/java/org/keycloak/events/EventStoreSpi.java
+++ b/events/api/src/main/java/org/keycloak/events/EventStoreSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class EventStoreSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "eventsStore";
diff --git a/export-import/export-import-api/src/main/java/org/keycloak/exportimport/ExportSpi.java b/export-import/export-import-api/src/main/java/org/keycloak/exportimport/ExportSpi.java
index 6ec29606d9..208cc6aa61 100644
--- a/export-import/export-import-api/src/main/java/org/keycloak/exportimport/ExportSpi.java
+++ b/export-import/export-import-api/src/main/java/org/keycloak/exportimport/ExportSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class ExportSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "export";
diff --git a/export-import/export-import-api/src/main/java/org/keycloak/exportimport/ImportSpi.java b/export-import/export-import-api/src/main/java/org/keycloak/exportimport/ImportSpi.java
index b562f3fcbe..90cb6ac79e 100644
--- a/export-import/export-import-api/src/main/java/org/keycloak/exportimport/ImportSpi.java
+++ b/export-import/export-import-api/src/main/java/org/keycloak/exportimport/ImportSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class ImportSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "import";
diff --git a/forms/account-api/src/main/java/org/keycloak/account/AccountSpi.java b/forms/account-api/src/main/java/org/keycloak/account/AccountSpi.java
index e956b14e61..2c9843ebc1 100644
--- a/forms/account-api/src/main/java/org/keycloak/account/AccountSpi.java
+++ b/forms/account-api/src/main/java/org/keycloak/account/AccountSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class AccountSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "account";
diff --git a/forms/common-freemarker/src/main/java/org/keycloak/freemarker/ThemeSpi.java b/forms/common-freemarker/src/main/java/org/keycloak/freemarker/ThemeSpi.java
index c3d738bb56..94db863159 100644
--- a/forms/common-freemarker/src/main/java/org/keycloak/freemarker/ThemeSpi.java
+++ b/forms/common-freemarker/src/main/java/org/keycloak/freemarker/ThemeSpi.java
@@ -8,6 +8,12 @@ import org.keycloak.provider.Spi;
* @author Stian Thorgersen
*/
public class ThemeSpi implements Spi {
+
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "theme";
diff --git a/forms/email-api/src/main/java/org/keycloak/email/EmailSpi.java b/forms/email-api/src/main/java/org/keycloak/email/EmailSpi.java
index cb2877bb6b..cde73cec0f 100644
--- a/forms/email-api/src/main/java/org/keycloak/email/EmailSpi.java
+++ b/forms/email-api/src/main/java/org/keycloak/email/EmailSpi.java
@@ -8,6 +8,12 @@ import org.keycloak.provider.Spi;
* @author Stian Thorgersen
*/
public class EmailSpi implements Spi {
+
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "email";
diff --git a/forms/login-api/src/main/java/org/keycloak/login/LoginFormsSpi.java b/forms/login-api/src/main/java/org/keycloak/login/LoginFormsSpi.java
index 74f5b4a3e8..f99292aeb1 100644
--- a/forms/login-api/src/main/java/org/keycloak/login/LoginFormsSpi.java
+++ b/forms/login-api/src/main/java/org/keycloak/login/LoginFormsSpi.java
@@ -8,6 +8,12 @@ import org.keycloak.provider.Spi;
* @author Stian Thorgersen
*/
public class LoginFormsSpi implements Spi {
+
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "login";
diff --git a/model/api/src/main/java/org/keycloak/migration/MigrationSpi.java b/model/api/src/main/java/org/keycloak/migration/MigrationSpi.java
index f6b768c61d..e599146a89 100644
--- a/model/api/src/main/java/org/keycloak/migration/MigrationSpi.java
+++ b/model/api/src/main/java/org/keycloak/migration/MigrationSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class MigrationSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "migration";
diff --git a/model/api/src/main/java/org/keycloak/models/RealmSpi.java b/model/api/src/main/java/org/keycloak/models/RealmSpi.java
index 1c1429c229..f531cd918f 100755
--- a/model/api/src/main/java/org/keycloak/models/RealmSpi.java
+++ b/model/api/src/main/java/org/keycloak/models/RealmSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class RealmSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "realm";
diff --git a/model/api/src/main/java/org/keycloak/models/UserFederationSpi.java b/model/api/src/main/java/org/keycloak/models/UserFederationSpi.java
index 6a22337f3e..c17c02a393 100755
--- a/model/api/src/main/java/org/keycloak/models/UserFederationSpi.java
+++ b/model/api/src/main/java/org/keycloak/models/UserFederationSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class UserFederationSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return false;
+ }
+
@Override
public String getName() {
return "userFederation";
diff --git a/model/api/src/main/java/org/keycloak/models/UserSessionSpi.java b/model/api/src/main/java/org/keycloak/models/UserSessionSpi.java
index e470db542c..8755660fad 100644
--- a/model/api/src/main/java/org/keycloak/models/UserSessionSpi.java
+++ b/model/api/src/main/java/org/keycloak/models/UserSessionSpi.java
@@ -11,6 +11,11 @@ public class UserSessionSpi implements Spi {
public static final String NAME = "userSessions";
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return NAME;
diff --git a/model/api/src/main/java/org/keycloak/models/UserSpi.java b/model/api/src/main/java/org/keycloak/models/UserSpi.java
index e68299c650..1d6cd74545 100755
--- a/model/api/src/main/java/org/keycloak/models/UserSpi.java
+++ b/model/api/src/main/java/org/keycloak/models/UserSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class UserSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "user";
diff --git a/model/api/src/main/java/org/keycloak/provider/Spi.java b/model/api/src/main/java/org/keycloak/provider/Spi.java
index 03b9afcc24..be68251697 100644
--- a/model/api/src/main/java/org/keycloak/provider/Spi.java
+++ b/model/api/src/main/java/org/keycloak/provider/Spi.java
@@ -5,6 +5,7 @@ package org.keycloak.provider;
*/
public interface Spi {
+ public boolean isPrivate();
public String getName();
public Class extends Provider> getProviderClass();
public Class extends ProviderFactory> getProviderFactoryClass();
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheRealmProviderSpi.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheRealmProviderSpi.java
index f6bbfd5742..300b8f0d1b 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheRealmProviderSpi.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheRealmProviderSpi.java
@@ -10,6 +10,11 @@ import org.keycloak.provider.Spi;
*/
public class CacheRealmProviderSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "realmCache";
diff --git a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheUserProviderSpi.java b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheUserProviderSpi.java
index 6c0fae5950..9e0affa8e6 100755
--- a/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheUserProviderSpi.java
+++ b/model/invalidation-cache/model-adapters/src/main/java/org/keycloak/models/cache/CacheUserProviderSpi.java
@@ -10,6 +10,11 @@ import org.keycloak.provider.Spi;
*/
public class CacheUserProviderSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "userCache";
diff --git a/services/src/main/java/org/keycloak/exportimport/ClientImportSpi.java b/services/src/main/java/org/keycloak/exportimport/ClientImportSpi.java
index 6fe071e536..e59a45af74 100755
--- a/services/src/main/java/org/keycloak/exportimport/ClientImportSpi.java
+++ b/services/src/main/java/org/keycloak/exportimport/ClientImportSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class ClientImportSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "client-import";
diff --git a/services/src/main/java/org/keycloak/protocol/LoginProtocolSpi.java b/services/src/main/java/org/keycloak/protocol/LoginProtocolSpi.java
index ef73b34d35..6ac5496f60 100755
--- a/services/src/main/java/org/keycloak/protocol/LoginProtocolSpi.java
+++ b/services/src/main/java/org/keycloak/protocol/LoginProtocolSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class LoginProtocolSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "login-protocol";
diff --git a/services/src/main/java/org/keycloak/protocol/ProtocolMapperSpi.java b/services/src/main/java/org/keycloak/protocol/ProtocolMapperSpi.java
index 421319e3ca..1b98e07dc8 100755
--- a/services/src/main/java/org/keycloak/protocol/ProtocolMapperSpi.java
+++ b/services/src/main/java/org/keycloak/protocol/ProtocolMapperSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class ProtocolMapperSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return false;
+ }
+
@Override
public String getName() {
return "protocol-mapper";
diff --git a/services/src/main/java/org/keycloak/wellknown/WellKnownSpi.java b/services/src/main/java/org/keycloak/wellknown/WellKnownSpi.java
index 7cb962d7f9..7734f48d14 100755
--- a/services/src/main/java/org/keycloak/wellknown/WellKnownSpi.java
+++ b/services/src/main/java/org/keycloak/wellknown/WellKnownSpi.java
@@ -9,6 +9,11 @@ import org.keycloak.provider.Spi;
*/
public class WellKnownSpi implements Spi {
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "well-known";
diff --git a/social/core/src/main/java/org/keycloak/social/SocialProviderSpi.java b/social/core/src/main/java/org/keycloak/social/SocialProviderSpi.java
index 949fea7432..fd500a8458 100644
--- a/social/core/src/main/java/org/keycloak/social/SocialProviderSpi.java
+++ b/social/core/src/main/java/org/keycloak/social/SocialProviderSpi.java
@@ -28,6 +28,11 @@ public class SocialProviderSpi implements Spi {
public static final String SOCIAL_SPI_NAME = "social";
+ @Override
+ public boolean isPrivate() {
+ return false;
+ }
+
@Override
public String getName() {
return SOCIAL_SPI_NAME;
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/utils/ListSpi.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/utils/ListSpi.java
new file mode 100644
index 0000000000..82695bc974
--- /dev/null
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/utils/ListSpi.java
@@ -0,0 +1,34 @@
+package org.keycloak.testsuite.utils;
+
+import org.keycloak.provider.Spi;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ServiceLoader;
+
+/**
+ * @author Stian Thorgersen
+ */
+public class ListSpi {
+
+ public static void main(String[] args) {
+ List l = new LinkedList<>();
+ for (Spi s : ServiceLoader.load(Spi.class)) {
+ l.add(fixedLength(s.getName()) + s.isPrivate());
+ }
+ Collections.sort(l);
+ System.out.println(fixedLength("SPI") + "Private");
+ System.out.println("-------------------------------------");
+ for (String s : l) {
+ System.out.println(s);
+ }
+ }
+
+ public static String fixedLength(String s) {
+ while (s.length() < 30) {
+ s = s + " ";
+ }
+ return s;
+ }
+}
diff --git a/timer/api/src/main/java/org/keycloak/timer/TimerSpi.java b/timer/api/src/main/java/org/keycloak/timer/TimerSpi.java
index d0e57f93f0..ac92339573 100644
--- a/timer/api/src/main/java/org/keycloak/timer/TimerSpi.java
+++ b/timer/api/src/main/java/org/keycloak/timer/TimerSpi.java
@@ -8,6 +8,12 @@ import org.keycloak.provider.Spi;
* @author Stian Thorgersen
*/
public class TimerSpi implements Spi {
+
+ @Override
+ public boolean isPrivate() {
+ return true;
+ }
+
@Override
public String getName() {
return "timer";