keycloak-aplcache
Changes
export-import/export-import-api/src/main/java/org/keycloak/exportimport/ImportProvider.java 6(+6 -0)
export-import/export-import-api/src/main/java/org/keycloak/exportimport/util/ImportUtils.java 17(+15 -2)
export-import/export-import-dir/src/main/java/org/keycloak/exportimport/dir/DirImportProvider.java 19(+15 -4)
export-import/export-import-single-file/src/main/java/org/keycloak/exportimport/singlefile/SingleFileImportProvider.java 26(+24 -2)
Details
diff --git a/export-import/export-import-api/src/main/java/org/keycloak/exportimport/ImportProvider.java b/export-import/export-import-api/src/main/java/org/keycloak/exportimport/ImportProvider.java
index 56bc812..1aa0b5e 100755
--- a/export-import/export-import-api/src/main/java/org/keycloak/exportimport/ImportProvider.java
+++ b/export-import/export-import-api/src/main/java/org/keycloak/exportimport/ImportProvider.java
@@ -13,4 +13,10 @@ public interface ImportProvider extends Provider {
void importModel(KeycloakSessionFactory factory, Strategy strategy) throws IOException;
void importRealm(KeycloakSessionFactory factory, String realmName, Strategy strategy) throws IOException;
+
+ /**
+ * @return true if master realm was previously exported and is available in the data to be imported
+ * @throws IOException
+ */
+ boolean isMasterRealmExported() throws IOException;
}
diff --git a/export-import/export-import-api/src/main/java/org/keycloak/exportimport/util/ImportUtils.java b/export-import/export-import-api/src/main/java/org/keycloak/exportimport/util/ImportUtils.java
index fbd909d..4940820 100755
--- a/export-import/export-import-api/src/main/java/org/keycloak/exportimport/util/ImportUtils.java
+++ b/export-import/export-import-api/src/main/java/org/keycloak/exportimport/util/ImportUtils.java
@@ -21,6 +21,7 @@ import org.keycloak.representations.idm.UserRepresentation;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.keycloak.exportimport.ExportImportConfig;
@@ -143,6 +144,15 @@ public class ImportUtils {
* @throws IOException
*/
public static void importFromStream(KeycloakSession session, ObjectMapper mapper, InputStream is, Strategy strategy) throws IOException {
+ Map<String, RealmRepresentation> realmReps = getRealmsFromStream(mapper, is);
+ for (RealmRepresentation realmRep : realmReps.values()) {
+ importRealm(session, realmRep, strategy);
+ }
+ }
+
+ public static Map<String, RealmRepresentation> getRealmsFromStream(ObjectMapper mapper, InputStream is) throws IOException {
+ Map<String, RealmRepresentation> result = new HashMap<String, RealmRepresentation>();
+
JsonFactory factory = mapper.getJsonFactory();
JsonParser parser = factory.createJsonParser(is);
try {
@@ -166,18 +176,21 @@ public class ImportUtils {
}
for (RealmRepresentation realmRep : realmReps) {
- importRealm(session, realmRep, strategy);
+ result.put(realmRep.getId(), realmRep);
}
} else if (parser.getCurrentToken() == JsonToken.START_OBJECT) {
// Case with single realm in stream
RealmRepresentation realmRep = parser.readValueAs(RealmRepresentation.class);
- importRealm(session, realmRep, strategy);
+ result.put(realmRep.getId(), realmRep);
}
} finally {
parser.close();
}
+
+ return result;
}
+
// Assuming that it's invoked inside transaction
public static void importUsersFromStream(KeycloakSession session, String realmName, ObjectMapper mapper, InputStream is) throws IOException {
RealmProvider model = session.realms();
diff --git a/export-import/export-import-dir/src/main/java/org/keycloak/exportimport/dir/DirImportProvider.java b/export-import/export-import-dir/src/main/java/org/keycloak/exportimport/dir/DirImportProvider.java
index 15d6dc8..9a77264 100755
--- a/export-import/export-import-dir/src/main/java/org/keycloak/exportimport/dir/DirImportProvider.java
+++ b/export-import/export-import-dir/src/main/java/org/keycloak/exportimport/dir/DirImportProvider.java
@@ -49,6 +49,20 @@ public class DirImportProvider implements ImportProvider {
@Override
public void importModel(KeycloakSessionFactory factory, Strategy strategy) throws IOException {
+ List<String> realmNames = getRealmsToImport();
+
+ for (String realmName : realmNames) {
+ importRealm(factory, realmName, strategy);
+ }
+ }
+
+ @Override
+ public boolean isMasterRealmExported() throws IOException {
+ List<String> realmNames = getRealmsToImport();
+ return realmNames.contains(Config.getAdminRealm());
+ }
+
+ private List<String> getRealmsToImport() throws IOException {
File[] realmFiles = this.rootDirectory.listFiles(new FilenameFilter() {
@Override
@@ -70,10 +84,7 @@ public class DirImportProvider implements ImportProvider {
realmNames.add(realmName);
}
}
-
- for (String realmName : realmNames) {
- importRealm(factory, realmName, strategy);
- }
+ return realmNames;
}
@Override
diff --git a/export-import/export-import-single-file/src/main/java/org/keycloak/exportimport/singlefile/SingleFileImportProvider.java b/export-import/export-import-single-file/src/main/java/org/keycloak/exportimport/singlefile/SingleFileImportProvider.java
index 8e993d0..62ae93b 100755
--- a/export-import/export-import-single-file/src/main/java/org/keycloak/exportimport/singlefile/SingleFileImportProvider.java
+++ b/export-import/export-import-single-file/src/main/java/org/keycloak/exportimport/singlefile/SingleFileImportProvider.java
@@ -1,6 +1,7 @@
package org.keycloak.exportimport.singlefile;
import org.jboss.logging.Logger;
+import org.keycloak.Config;
import org.keycloak.exportimport.ImportProvider;
import org.keycloak.exportimport.Strategy;
import org.keycloak.exportimport.util.ExportImportSessionTask;
@@ -8,11 +9,13 @@ import org.keycloak.exportimport.util.ImportUtils;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.KeycloakSessionFactory;
import org.keycloak.models.utils.KeycloakModelUtils;
+import org.keycloak.representations.idm.RealmRepresentation;
import org.keycloak.util.JsonSerialization;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
+import java.util.Map;
/**
* @author <a href="mailto:mposolda@redhat.com">Marek Posolda</a>
@@ -23,6 +26,9 @@ public class SingleFileImportProvider implements ImportProvider {
private File file;
+ // Allows to cache representation per provider to avoid parsing them twice
+ protected Map<String, RealmRepresentation> realmReps;
+
public SingleFileImportProvider(File file) {
this.file = file;
}
@@ -30,18 +36,34 @@ public class SingleFileImportProvider implements ImportProvider {
@Override
public void importModel(KeycloakSessionFactory factory, final Strategy strategy) throws IOException {
logger.infof("Full importing from file %s", this.file.getAbsolutePath());
+ checkRealmReps();
+
KeycloakModelUtils.runJobInTransaction(factory, new ExportImportSessionTask() {
@Override
protected void runExportImportTask(KeycloakSession session) throws IOException {
- FileInputStream is = new FileInputStream(file);
- ImportUtils.importFromStream(session, JsonSerialization.mapper, is, strategy);
+ for (RealmRepresentation realmRep : realmReps.values()) {
+ ImportUtils.importRealm(session, realmRep, strategy);
+ }
}
});
}
@Override
+ public boolean isMasterRealmExported() throws IOException {
+ checkRealmReps();
+ return (realmReps.containsKey(Config.getAdminRealm()));
+ }
+
+ protected void checkRealmReps() throws IOException {
+ if (realmReps == null) {
+ FileInputStream is = new FileInputStream(file);
+ realmReps = ImportUtils.getRealmsFromStream(JsonSerialization.mapper, is);
+ }
+ }
+
+ @Override
public void importRealm(KeycloakSessionFactory factory, String realmName, Strategy strategy) throws IOException {
// TODO: import just that single realm in case that file contains many realms?
importModel(factory, strategy);
diff --git a/export-import/export-import-zip/src/main/java/org/keycloak/exportimport/zip/ZipImportProvider.java b/export-import/export-import-zip/src/main/java/org/keycloak/exportimport/zip/ZipImportProvider.java
index fb40139..c9e6178 100755
--- a/export-import/export-import-zip/src/main/java/org/keycloak/exportimport/zip/ZipImportProvider.java
+++ b/export-import/export-import-zip/src/main/java/org/keycloak/exportimport/zip/ZipImportProvider.java
@@ -51,6 +51,20 @@ public class ZipImportProvider implements ImportProvider {
@Override
public void importModel(KeycloakSessionFactory factory, Strategy strategy) throws IOException {
+ List<String> realmNames = getRealmsToImport();
+
+ for (String realmName : realmNames) {
+ importRealm(factory, realmName, strategy);
+ }
+ }
+
+ @Override
+ public boolean isMasterRealmExported() throws IOException {
+ List<String> realmNames = getRealmsToImport();
+ return realmNames.contains(Config.getAdminRealm());
+ }
+
+ private List<String> getRealmsToImport() throws IOException {
List<String> realmNames = new ArrayList<String>();
for (ExtZipEntry entry : this.decrypter.getEntryList()) {
String entryName = entry.getName();
@@ -66,10 +80,7 @@ public class ZipImportProvider implements ImportProvider {
}
}
}
-
- for (String realmName : realmNames) {
- importRealm(factory, realmName, strategy);
- }
+ return realmNames;
}
@Override
diff --git a/services/src/main/java/org/keycloak/services/resources/KeycloakApplication.java b/services/src/main/java/org/keycloak/services/resources/KeycloakApplication.java
index 0601882..875511e 100755
--- a/services/src/main/java/org/keycloak/services/resources/KeycloakApplication.java
+++ b/services/src/main/java/org/keycloak/services/resources/KeycloakApplication.java
@@ -83,7 +83,7 @@ public class KeycloakApplication extends Application {
classes.add(JsResource.class);
classes.add(WelcomeResource.class);
- new ExportImportManager().checkExportImport(this.sessionFactory);
+ new ExportImportManager().checkExportImport(this.sessionFactory, context.getContextPath());
setupDefaultRealm(context.getContextPath());