keycloak-uncached

Sync UI for generic providers

8/12/2014 1:10:25 PM

Details

diff --git a/examples/providers/federation-provider/src/main/java/org/keycloak/examples/federation/properties/BasePropertiesFederationFactory.java b/examples/providers/federation-provider/src/main/java/org/keycloak/examples/federation/properties/BasePropertiesFederationFactory.java
index b0d9925..d79a13b 100755
--- a/examples/providers/federation-provider/src/main/java/org/keycloak/examples/federation/properties/BasePropertiesFederationFactory.java
+++ b/examples/providers/federation-provider/src/main/java/org/keycloak/examples/federation/properties/BasePropertiesFederationFactory.java
@@ -101,24 +101,7 @@ public abstract class BasePropertiesFederationFactory implements UserFederationP
                 RealmModel realm = session.realms().getRealm(realmId);
                 BasePropertiesFederationProvider federationProvider = (BasePropertiesFederationProvider)getInstance(session, model);
                 Set<String> allUsernames = federationProvider.getProperties().stringPropertyNames();
-                for (String username : allUsernames) {
-                    federationProvider.getUserByUsername(realm, username);
-                }
-            }
-
-        });
-    }
-
-    @Override
-    public void syncChangedUsers(KeycloakSessionFactory sessionFactory, final String realmId, final UserFederationProviderModel model, Date lastSync) {
-        KeycloakModelUtils.runJobInTransaction(sessionFactory, new KeycloakSessionTask() {
-
-            @Override
-            public void run(KeycloakSession session) {
-                RealmModel realm = session.realms().getRealm(realmId);
                 UserProvider localProvider = session.userStorage();
-                BasePropertiesFederationProvider federationProvider = (BasePropertiesFederationProvider)getInstance(session, model);
-                Set<String> allUsernames = federationProvider.getProperties().stringPropertyNames();
                 for (String username : allUsernames) {
                     UserModel localUser = localProvider.getUserByUsername(username, realm);
 
@@ -131,4 +114,9 @@ public abstract class BasePropertiesFederationFactory implements UserFederationP
 
         });
     }
+
+    @Override
+    public void syncChangedUsers(KeycloakSessionFactory sessionFactory, final String realmId, final UserFederationProviderModel model, Date lastSync) {
+        syncAllUsers(sessionFactory, realmId, model);
+    }
 }
diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/users.js b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/users.js
index d5f2e2c..46674ec 100755
--- a/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/users.js
+++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/js/controllers/users.js
@@ -359,22 +359,47 @@ module.controller('UserFederationCtrl', function($scope, $location, realm, UserF
 module.controller('GenericUserFederationCtrl', function($scope, $location, Notifications, Dialog, realm, instance, providerFactory, UserFederationInstances) {
     console.log('GenericUserFederationCtrl');
 
-    $scope.instance = angular.copy(instance);
     $scope.create = !instance.providerName;
     $scope.providerFactory = providerFactory;
 
     console.log("providerFactory: " + providerFactory.id);
 
-    if ($scope.create) {
-        $scope.instance.providerName = providerFactory.id;
-        $scope.instance.config = {};
-        $scope.instance.priority = 0;
+    function initFederationSettings() {
+        if ($scope.create) {
+            instance.providerName = providerFactory.id;
+            instance.config = {};
+            instance.priority = 0;
+            $scope.fullSyncEnabled = false;
+            $scope.changedSyncEnabled = false;
+        } else {
+            $scope.fullSyncEnabled = (instance.fullSyncPeriod && instance.fullSyncPeriod > 0);
+            $scope.changedSyncEnabled = (instance.changedSyncPeriod && instance.changedSyncPeriod > 0);
+        }
+
+        $scope.changed = false;
     }
 
+    initFederationSettings();
+    $scope.instance = angular.copy(instance);
     $scope.realm = realm;
 
+    $scope.$watch('fullSyncEnabled', function(newVal, oldVal) {
+        if (oldVal == newVal) {
+            return;
+        }
+
+        $scope.instance.fullSyncPeriod = $scope.fullSyncEnabled ? 604800 : -1;
+        $scope.changed = true;
+    });
+
+    $scope.$watch('changedSyncEnabled', function(newVal, oldVal) {
+        if (oldVal == newVal) {
+            return;
+        }
 
-    $scope.changed = false;
+        $scope.instance.changedSyncPeriod = $scope.changedSyncEnabled ? 86400 : -1;
+        $scope.changed = true;
+    });
 
     $scope.$watch('instance', function() {
         if (!angular.equals($scope.instance, instance)) {
@@ -405,13 +430,8 @@ module.controller('GenericUserFederationCtrl', function($scope, $location, Notif
     };
 
     $scope.reset = function() {
+        initFederationSettings();
         $scope.instance = angular.copy(instance);
-        if ($scope.create) {
-            $scope.instance.providerName = providerFactory.id;
-            $scope.instance.config = {};
-            $scope.instance.priority = 0;
-        }
-        $scope.changed = false;
     };
 
     $scope.cancel = function() {
@@ -430,7 +450,23 @@ module.controller('GenericUserFederationCtrl', function($scope, $location, Notif
         });
     };
 
+    $scope.triggerFullSync = function() {
+        console.log('GenericCtrl: triggerFullSync');
+        triggerSync('triggerFullSync');
+    }
+
+    $scope.triggerChangedUsersSync = function() {
+        console.log('GenericCtrl: triggerChangedUsersSync');
+        triggerSync('triggerChangedUsersSync');
+    }
 
+    function triggerSync(action) {
+        UserFederationSync.get({ action: action, realm: $scope.realm.realm, provider: $scope.instance.id }, function() {
+            Notifications.success("Sync of users finished successfully");
+        }, function() {
+            Notifications.error("Error during sync of users");
+        });
+    }
 });
 
 
diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-generic.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-generic.html
index b046180..7dcae0f 100755
--- a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-generic.html
+++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-generic.html
@@ -40,6 +40,34 @@
 
             </fieldset>
 
+            <fieldset>
+                <legend><span class="text">Sync settings</span></legend>
+                <div class="form-group clearfix">
+                    <label class="col-sm-2 control-label" for="fullSyncEnabled">Periodic full sync</label>
+                    <div class="col-sm-4">
+                        <input ng-model="fullSyncEnabled" name="fullSyncEnabled" id="fullSyncEnabled" onoffswitch />
+                    </div>
+                </div>
+                <div class="form-group clearfix" data-ng-show="fullSyncEnabled">
+                    <label class="col-sm-2 control-label" for="fullSyncPeriod">Full sync period</label>
+                    <div class="col-sm-4">
+                        <input class="form-control" type="number" ng-model="instance.fullSyncPeriod" id="fullSyncPeriod" />
+                    </div>
+                </div>
+                <div class="form-group clearfix">
+                    <label class="col-sm-2 control-label" for="changedSyncEnabled">Periodic changed users sync</label>
+                    <div class="col-sm-4">
+                        <input ng-model="changedSyncEnabled" name="changedSyncEnabled" id="changedSyncEnabled" onoffswitch />
+                    </div>
+                </div>
+                <div class="form-group clearfix" data-ng-show="changedSyncEnabled">
+                    <label class="col-sm-2 control-label" for="changedSyncPeriod">Changed users sync period</label>
+                    <div class="col-sm-4">
+                        <input class="form-control" type="number" ng-model="instance.changedSyncPeriod" id="changedSyncPeriod" />
+                    </div>
+                </div>
+            </fieldset>
+
             <div class="pull-right form-actions" data-ng-show="create && access.manageUsers">
                 <button kc-cancel data-ng-click="cancel()">Cancel</button>
                 <button kc-save data-ng-show="changed">Save</button>
@@ -49,6 +77,8 @@
                 <button kc-reset data-ng-show="changed">Clear changes</button>
                 <button kc-save  data-ng-show="changed">Save</button>
                 <button kc-delete data-ng-click="remove()" data-ng-hide="changed">Delete</button>
+                <button kc-delete data-ng-click="triggerFullSync()" data-ng-hide="changed">Synchronize all users</button>
+                <button kc-delete data-ng-click="triggerChangedUsersSync()" data-ng-hide="changed">Synchronize changed users</button>
             </div>
         </form>
     </div>
diff --git a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-ldap.html b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-ldap.html
index 49fb638..da1e04c 100755
--- a/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-ldap.html
+++ b/forms/common-themes/src/main/resources/theme/admin/base/resources/partials/federated-ldap.html
@@ -176,8 +176,8 @@
                 <button kc-reset data-ng-show="changed">Clear changes</button>
                 <button kc-save  data-ng-show="changed">Save</button>
                 <button kc-delete data-ng-click="remove()" data-ng-hide="changed">Delete</button>
-                <button kc-delete data-ng-click="triggerFullSync()" data-ng-hide="changed">Trigger full sync</button>
-                <button kc-delete data-ng-click="triggerChangedUsersSync()" data-ng-hide="changed">Trigger sync of changed users</button>
+                <button kc-delete data-ng-click="triggerFullSync()" data-ng-hide="changed">Synchronize all users</button>
+                <button kc-delete data-ng-click="triggerChangedUsersSync()" data-ng-hide="changed">Synchronize changed users</button>
             </div>
         </form>
     </div>
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/UserFederationResource.java b/services/src/main/java/org/keycloak/services/resources/admin/UserFederationResource.java
index 1669123..554ed7d 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/UserFederationResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/UserFederationResource.java
@@ -211,7 +211,7 @@ public class UserFederationResource {
     @GET
     @Path("sync/{id}")
     @NoCache
-    public Response getUserFederationInstances(@PathParam("id") String providerId, @QueryParam("action") String action) {
+    public Response syncUsers(@PathParam("id") String providerId, @QueryParam("action") String action) {
         logger.info("triggerSync");
         auth.requireManage();