package com.sequenceiq.cloudbreak.service.account;
import java.util.Collections;
import java.util.concurrent.locks.Lock;
import javax.inject.Inject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.stereotype.Service;
import com.google.common.util.concurrent.Striped;
import com.sequenceiq.cloudbreak.common.type.CbUserRole;
import com.sequenceiq.cloudbreak.controller.BadRequestException;
import com.sequenceiq.cloudbreak.domain.AccountPreferences;
import com.sequenceiq.cloudbreak.domain.CbUser;
import com.sequenceiq.cloudbreak.repository.AccountPreferencesRepository;
@Service
public class SimpleAccountPreferencesService implements AccountPreferencesService {
private static final long ZERO = 0L;
private static final int STRIPES = 10;
@Value("${cb.enabledplatforms:}")
private String enabledPlatforms;
@Inject
private AccountPreferencesRepository repository;
private Striped<Lock> locks = Striped.lazyWeakLock(STRIPES);
@Override
public AccountPreferences save(AccountPreferences accountPreferences) {
return repository.save(accountPreferences);
}
@Override
@PostAuthorize("hasPermission(returnObject,'read')")
public AccountPreferences saveOne(CbUser user, AccountPreferences accountPreferences) {
accountPreferences.setAccount(user.getAccount());
return repository.save(accountPreferences);
}
@Override
public AccountPreferences get(Long id) {
return repository.findOne(id);
}
public Boolean isPlatformSelectionDisabled() {
return !StringUtils.isEmpty(enabledPlatforms);
}
@Override
public AccountPreferences getByAccount(String account) {
Lock lock = locks.get(account);
lock.lock();
try {
AccountPreferences accountPreferences = repository.findByAccount(account);
if (accountPreferences == null) {
accountPreferences = createDefaultAccountPreferences(account);
}
if (!StringUtils.isEmpty(enabledPlatforms)) {
accountPreferences.setPlatforms(enabledPlatforms);
}
return accountPreferences;
} finally {
lock.unlock();
}
}
@Override
@PostAuthorize("hasPermission(returnObject,'read')")
public AccountPreferences getOneById(Long id, CbUser user) {
AccountPreferences accountPreferences = repository.findOne(id);
if (!user.getRoles().contains(CbUserRole.ADMIN)) {
throw new BadRequestException("AccountPreferences are only available for admin users!");
} else if (accountPreferences == null) {
throw new BadRequestException(String.format("AccountPreferences could not find with id: %s", id));
} else if (!accountPreferences.getAccount().equals(user.getAccount())) {
throw new BadRequestException("AccountPreferences are only available for the owner admin user!");
} else {
return accountPreferences;
}
}
@Override
public AccountPreferences getOneByAccount(CbUser user) {
String account = user.getAccount();
return getByAccount(account);
}
@Override
public void delete(CbUser user) {
AccountPreferences preferences = getOneByAccount(user);
repository.delete(preferences);
}
private AccountPreferences createDefaultAccountPreferences(String account) {
AccountPreferences defaultPreferences = new AccountPreferences();
defaultPreferences.setAccount(account);
defaultPreferences.setMaxNumberOfClusters(ZERO);
defaultPreferences.setMaxNumberOfNodesPerCluster(ZERO);
defaultPreferences.setMaxNumberOfClustersPerUser(ZERO);
defaultPreferences.setAllowedInstanceTypes(Collections.emptyList());
defaultPreferences.setClusterTimeToLive(ZERO);
defaultPreferences.setUserTimeToLive(ZERO);
return repository.save(defaultPreferences);
}
}