/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.security.userstore.connector.remote; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.enonic.cms.core.security.user.UserEntity; 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.core.security.userstore.connector.synchronize.status.SynchronizeStatus; import com.enonic.cms.api.plugin.ext.userstore.RemoteUser; public class UsersSynchronizer extends AbstractBaseUserSynchronizer { private static final Logger LOG = LoggerFactory.getLogger( UsersSynchronizer.class ); public void setStatusCollector( final SynchronizeStatus value ) { status = value; } protected UsersSynchronizer( final SynchronizeStatus synchronizeStatus, final UserStoreEntity userStore, final boolean syncUser, final boolean syncMemberships ) { super( synchronizeStatus, userStore, syncUser, syncMemberships, false ); } public void synchronizeUsers( final List<RemoteUser> remoteUsers, final MemberCache memberCache ) { for ( final RemoteUser remoteUser : remoteUsers ) { createUpdateOrResurrectLocalUser( remoteUser, memberCache ); } } private void createUpdateOrResurrectLocalUser( final RemoteUser remoteUser, final MemberCache memberCache ) { UserEntity localUser = findUserBySyncValue( remoteUser.getSync() ); if ( syncUser ) { if ( !canBeCreatedOrUpdated( localUser, remoteUser ) ) { status.userSkipped(); return; } if ( localUser == null ) { localUser = createUser( remoteUser, memberCache ); status.userCreated(); } else { final boolean resurrected = updateAndResurrectUser( localUser, remoteUser ); status.userUpdated( resurrected ); } } if ( syncMemberships && localUser != null ) { syncUserMemberships( localUser, remoteUser, memberCache ); } } private boolean canBeCreatedOrUpdated( final UserEntity localUser, final RemoteUser remoteUser ) { final String userName = getNameToVerify( localUser, remoteUser ); if ( nameAlreadyUsedByOtherUser( userName, localUser ) ) { LOG.warn( NameAlreadyExistsException.createMessage( userStore.getName(), userName ) ); return false; } final String email = getEmailToVerify( localUser, remoteUser ); if ( emailAlreadyUsedByOtherUser( email, localUser ) ) { synchronizeOtherUserWithSameEmail( email, localUser ); if ( emailAlreadyUsedByOtherUser( email, localUser ) ) { LOG.warn( EmailAlreadyExistsException.createMessage( userStore.getName(), userName, email ) ); return false; } } return true; } }