/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.security.userstore.connector.remote; import com.enonic.cms.core.security.user.QualifiedUsername; import com.enonic.cms.core.security.user.UserEntity; import com.enonic.cms.core.security.user.UserNotFoundException; import com.enonic.cms.core.security.userstore.UserStoreEntity; import com.enonic.cms.core.security.userstore.connector.EmailAlreadyExistsException; import com.enonic.cms.core.security.userstore.connector.NameAlreadyExistsException; import com.enonic.cms.api.plugin.ext.userstore.RemoteUser; public class UserSynchronizer extends AbstractBaseUserSynchronizer { protected UserSynchronizer( final UserStoreEntity userStore, final boolean syncMemberships ) { super( null, userStore, true, syncMemberships, true ); } public void synchronizeUser( final String uid ) { final RemoteUser remoteUser = remoteUserStorePlugin.getUser( uid ); final UserEntity localUser; if ( remoteUser != null ) { localUser = findUserBySyncValue( remoteUser.getSync() ); } else { localUser = findUserByName( uid ); } if ( remoteUser == null ) { if ( localUser == null ) { throw new UserNotFoundException( new QualifiedUsername( userStore.getName(), uid ) ); } else { deleteUser( localUser ); } } else { if ( localUser == null ) { final String userName = getNameToVerify( localUser, remoteUser ); if ( nameAlreadyUsedByOtherUser( userName, localUser ) ) { throw new NameAlreadyExistsException( userStore.getName(), userName ); } final String email = getEmailToVerify( localUser, remoteUser ); if ( emailAlreadyUsedByOtherUser( email, localUser ) ) { handleEmailAlreadyUsedByOtherUser( userName, email, localUser ); } createUser( remoteUser, new MemberCache() ); } else { updateUserLocally( remoteUser, localUser ); } } } private void updateUserLocally( final RemoteUser remoteUser, final UserEntity localUser ) { final String userName = getNameToVerify( localUser, remoteUser ); if ( nameAlreadyUsedByOtherUser( userName, localUser ) ) { throw new NameAlreadyExistsException( userStore.getName(), userName ); } final String email = getEmailToVerify( localUser, remoteUser ); if ( emailAlreadyUsedByOtherUser( email, localUser ) ) { handleEmailAlreadyUsedByOtherUser( userName, email, localUser ); } final MemberCache memberCache = new MemberCache(); updateAndResurrectUser( localUser, remoteUser ); if ( syncMemberships ) { syncUserMemberships( localUser, remoteUser, memberCache ); } } private void handleEmailAlreadyUsedByOtherUser( String userName, String email, UserEntity localUser ) { synchronizeOtherUserWithSameEmail( email, localUser ); if ( emailAlreadyUsedByOtherUser( email, localUser ) ) { throw new EmailAlreadyExistsException( userStore.getName(), userName, email ); } } }