/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.server.service.admin.ajax; import java.util.Date; import com.enonic.cms.core.security.userstore.UserStoreKey; import com.enonic.cms.core.security.userstore.connector.synchronize.SynchronizeUserStoreJob; import com.enonic.cms.core.security.userstore.connector.synchronize.SynchronizeUserStoreJobFactory; import com.enonic.cms.core.security.userstore.connector.synchronize.SynchronizeUserStoreType; import com.enonic.cms.core.security.userstore.connector.synchronize.status.SynchronizeStatus; import com.enonic.cms.server.service.admin.ajax.dto.SynchronizeStatusDto; public final class SyncUserStoreExecutor { private final String userStoreKey; private final SynchronizeUserStoreJobFactory factory; private SynchronizeUserStoreJob job; private Date started; private Date finished; public SyncUserStoreExecutor( String userStoreKey, SynchronizeUserStoreJobFactory factory ) { this.userStoreKey = userStoreKey; this.factory = factory; } private boolean inProgress() { if ( started == null ) /* Never started */ { return false; } if ( finished == null ) /* Started but never finished */ { return true; } if ( started.after( finished ) ) /* Started after last finished */ { return true; } return false; /* Finished after last started */ } private void createJob( boolean users, boolean groups, int batchSize ) { SynchronizeUserStoreType type = getSyncType( users, groups ); UserStoreKey key = UserStoreKey.parse( this.userStoreKey ); this.job = this.factory.createSynchronizeUserStoreJob( key, type, batchSize ); } public boolean start( boolean users, boolean groups, int batchSize ) { if ( inProgress() ) { return false; } try { this.started = new Date(); createJob( users, groups, batchSize ); this.job.start(); return true; } finally { this.finished = new Date(); } } public SynchronizeStatusDto getStatus( final String languageCode ) { final SynchronizeStatusDto dto = new SynchronizeStatusDto( this.userStoreKey ); dto.setStartedDate( this.started ); dto.setFinishedDate( this.finished ); dto.setCompleted( !inProgress() ); final SynchronizeStatus status = getJobStatus(); if ( status != null ) { dto.setCompleted( status.isCompleted() ); dto.setType( status.getType().toString() ); dto.setMessage( new StatusMessageCreator( languageCode ).createMessage( status ) ); } return dto; } private SynchronizeStatus getJobStatus() { return this.job != null ? this.job.getStatus() : null; } private SynchronizeUserStoreType getSyncType( boolean users, boolean groups ) { if ( users && groups ) { return SynchronizeUserStoreType.USERS_AND_GROUPS; } else if ( groups && !users ) { return SynchronizeUserStoreType.GROUPS_ONLY; } else if ( users && !groups ) { return SynchronizeUserStoreType.USERS_ONLY; } else { return null; } } }