package com.ctrip.framework.apollo.biz.service; import com.google.common.base.Strings; import com.ctrip.framework.apollo.biz.entity.Audit; import com.ctrip.framework.apollo.biz.entity.Cluster; import com.ctrip.framework.apollo.biz.repository.ClusterRepository; import com.ctrip.framework.apollo.common.exception.BadRequestException; import com.ctrip.framework.apollo.common.exception.ServiceException; import com.ctrip.framework.apollo.common.utils.BeanUtils; import com.ctrip.framework.apollo.core.ConfigConsts; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Collections; import java.util.List; import java.util.Objects; @Service public class ClusterService { @Autowired private ClusterRepository clusterRepository; @Autowired private AuditService auditService; @Autowired private NamespaceService namespaceService; public boolean isClusterNameUnique(String appId, String clusterName) { Objects.requireNonNull(appId, "AppId must not be null"); Objects.requireNonNull(clusterName, "ClusterName must not be null"); return Objects.isNull(clusterRepository.findByAppIdAndName(appId, clusterName)); } public Cluster findOne(String appId, String name) { return clusterRepository.findByAppIdAndName(appId, name); } public Cluster findOne(long clusterId) { return clusterRepository.findOne(clusterId); } public List<Cluster> findParentClusters(String appId) { if (Strings.isNullOrEmpty(appId)) { return Collections.emptyList(); } List<Cluster> clusters = clusterRepository.findByAppIdAndParentClusterId(appId, 0L); if (clusters == null) { return Collections.emptyList(); } Collections.sort(clusters); return clusters; } @Transactional public Cluster saveWithInstanceOfAppNamespaces(Cluster entity) { Cluster savedCluster = saveWithoutInstanceOfAppNamespaces(entity); namespaceService.instanceOfAppNamespaces(savedCluster.getAppId(), savedCluster.getName(), savedCluster.getDataChangeCreatedBy()); return savedCluster; } @Transactional public Cluster saveWithoutInstanceOfAppNamespaces(Cluster entity) { if (!isClusterNameUnique(entity.getAppId(), entity.getName())) { throw new BadRequestException("cluster not unique"); } entity.setId(0);//protection Cluster cluster = clusterRepository.save(entity); auditService.audit(Cluster.class.getSimpleName(), cluster.getId(), Audit.OP.INSERT, cluster.getDataChangeCreatedBy()); return cluster; } @Transactional public void delete(long id, String operator) { Cluster cluster = clusterRepository.findOne(id); if (cluster == null) { throw new BadRequestException("cluster not exist"); } //delete linked namespaces namespaceService.deleteByAppIdAndClusterName(cluster.getAppId(), cluster.getName(), operator); cluster.setDeleted(true); cluster.setDataChangeLastModifiedBy(operator); clusterRepository.save(cluster); auditService.audit(Cluster.class.getSimpleName(), id, Audit.OP.DELETE, operator); } @Transactional public Cluster update(Cluster cluster) { Cluster managedCluster = clusterRepository.findByAppIdAndName(cluster.getAppId(), cluster.getName()); BeanUtils.copyEntityProperties(cluster, managedCluster); managedCluster = clusterRepository.save(managedCluster); auditService.audit(Cluster.class.getSimpleName(), managedCluster.getId(), Audit.OP.UPDATE, managedCluster.getDataChangeLastModifiedBy()); return managedCluster; } @Transactional public void createDefaultCluster(String appId, String createBy) { if (!isClusterNameUnique(appId, ConfigConsts.CLUSTER_NAME_DEFAULT)) { throw new ServiceException("cluster not unique"); } Cluster cluster = new Cluster(); cluster.setName(ConfigConsts.CLUSTER_NAME_DEFAULT); cluster.setAppId(appId); cluster.setDataChangeCreatedBy(createBy); cluster.setDataChangeLastModifiedBy(createBy); clusterRepository.save(cluster); auditService.audit(Cluster.class.getSimpleName(), cluster.getId(), Audit.OP.INSERT, createBy); } public List<Cluster> findChildClusters(String appId, String parentClusterName) { Cluster parentCluster = findOne(appId, parentClusterName); if (parentCluster == null) { throw new BadRequestException("parent cluster not exist"); } return clusterRepository.findByParentClusterId(parentCluster.getId()); } }