|
@@ -1,12 +1,17 @@
|
|
|
package com.ctrip.framework.apollo.portal.service;
|
|
|
|
|
|
|
|
|
+import com.ctrip.framework.apollo.common.constants.GsonType;
|
|
|
import com.ctrip.framework.apollo.common.dto.ItemChangeSets;
|
|
|
import com.ctrip.framework.apollo.common.dto.ItemDTO;
|
|
|
import com.ctrip.framework.apollo.common.dto.NamespaceDTO;
|
|
|
+import com.ctrip.framework.apollo.common.dto.ReleaseDTO;
|
|
|
import com.ctrip.framework.apollo.common.exception.BadRequestException;
|
|
|
import com.ctrip.framework.apollo.common.utils.BeanUtils;
|
|
|
import com.ctrip.framework.apollo.core.enums.ConfigFileFormat;
|
|
|
+import com.ctrip.framework.apollo.portal.api.AdminServiceAPI.ItemAPI;
|
|
|
+import com.ctrip.framework.apollo.portal.api.AdminServiceAPI.NamespaceAPI;
|
|
|
+import com.ctrip.framework.apollo.portal.api.AdminServiceAPI.ReleaseAPI;
|
|
|
import com.ctrip.framework.apollo.portal.environment.Env;
|
|
|
import com.ctrip.framework.apollo.core.utils.StringUtils;
|
|
|
import com.ctrip.framework.apollo.portal.api.AdminServiceAPI;
|
|
@@ -17,6 +22,9 @@ import com.ctrip.framework.apollo.portal.entity.vo.ItemDiffs;
|
|
|
import com.ctrip.framework.apollo.portal.entity.vo.NamespaceIdentifier;
|
|
|
import com.ctrip.framework.apollo.portal.spi.UserInfoHolder;
|
|
|
import com.ctrip.framework.apollo.tracer.Tracer;
|
|
|
+import com.google.gson.Gson;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.concurrent.atomic.AtomicInteger;
|
|
|
import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
import org.springframework.http.HttpStatus;
|
|
|
import org.springframework.stereotype.Service;
|
|
@@ -29,22 +37,26 @@ import java.util.Map;
|
|
|
|
|
|
@Service
|
|
|
public class ItemService {
|
|
|
+ private Gson gson = new Gson();
|
|
|
|
|
|
private final UserInfoHolder userInfoHolder;
|
|
|
private final AdminServiceAPI.NamespaceAPI namespaceAPI;
|
|
|
private final AdminServiceAPI.ItemAPI itemAPI;
|
|
|
+ private final AdminServiceAPI.ReleaseAPI releaseAPI;
|
|
|
private final ConfigTextResolver fileTextResolver;
|
|
|
private final ConfigTextResolver propertyResolver;
|
|
|
|
|
|
public ItemService(
|
|
|
final UserInfoHolder userInfoHolder,
|
|
|
- final AdminServiceAPI.NamespaceAPI namespaceAPI,
|
|
|
- final AdminServiceAPI.ItemAPI itemAPI,
|
|
|
+ final NamespaceAPI namespaceAPI,
|
|
|
+ final ItemAPI itemAPI,
|
|
|
+ final ReleaseAPI releaseAPI,
|
|
|
final @Qualifier("fileTextResolver") ConfigTextResolver fileTextResolver,
|
|
|
final @Qualifier("propertyResolver") ConfigTextResolver propertyResolver) {
|
|
|
this.userInfoHolder = userInfoHolder;
|
|
|
this.namespaceAPI = namespaceAPI;
|
|
|
this.itemAPI = itemAPI;
|
|
|
+ this.releaseAPI = releaseAPI;
|
|
|
this.fileTextResolver = fileTextResolver;
|
|
|
this.propertyResolver = propertyResolver;
|
|
|
}
|
|
@@ -144,6 +156,55 @@ public class ItemService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ public void revokeItem(String appId, Env env, String clusterName, String namespaceName) {
|
|
|
+
|
|
|
+ NamespaceDTO namespace = namespaceAPI.loadNamespace(appId, env, clusterName, namespaceName);
|
|
|
+ if (namespace == null) {
|
|
|
+ throw new BadRequestException(
|
|
|
+ "namespace:" + namespaceName + " not exist in env:" + env + ", cluster:" + clusterName);
|
|
|
+ }
|
|
|
+ long namespaceId = namespace.getId();
|
|
|
+
|
|
|
+ Map<String, String> releaseItemDTOs = new HashMap<>();
|
|
|
+ ReleaseDTO latestRelease = releaseAPI.loadLatestRelease(appId,env,clusterName,namespaceName);
|
|
|
+ if (latestRelease != null) {
|
|
|
+ releaseItemDTOs = gson.fromJson(latestRelease.getConfigurations(), GsonType.CONFIG);
|
|
|
+ }
|
|
|
+ List<ItemDTO> baseItems = itemAPI.findItems(appId, env, clusterName, namespaceName);
|
|
|
+ Map<String, ItemDTO> oldKeyMapItem = BeanUtils.mapByKey("key", baseItems);
|
|
|
+ Map<String, ItemDTO> deletedItemDTOs = new HashMap<>();
|
|
|
+
|
|
|
+ //deleted items for comment
|
|
|
+ findDeletedItems(appId, env, clusterName, namespaceName).forEach(item -> {
|
|
|
+ deletedItemDTOs.put(item.getKey(),item);
|
|
|
+ });
|
|
|
+
|
|
|
+ ItemChangeSets changeSets = new ItemChangeSets();
|
|
|
+ AtomicInteger lineNum = new AtomicInteger(1);
|
|
|
+ releaseItemDTOs.forEach((key,value) -> {
|
|
|
+ ItemDTO oldItem = oldKeyMapItem.get(key);
|
|
|
+ if (oldItem == null) {
|
|
|
+ ItemDTO deletedItemDto = deletedItemDTOs.computeIfAbsent(key, k -> new ItemDTO());
|
|
|
+ changeSets.addCreateItem(buildNormalItem(0L, namespaceId,key,value,deletedItemDto.getComment(),lineNum.get()));
|
|
|
+ } else if (!oldItem.getValue().equals(value) || lineNum.get() != oldItem
|
|
|
+ .getLineNum()) {
|
|
|
+ changeSets.addUpdateItem(buildNormalItem(oldItem.getId(), namespaceId, key,
|
|
|
+ value, oldItem.getComment(), lineNum.get()));
|
|
|
+ }
|
|
|
+ oldKeyMapItem.remove(key);
|
|
|
+ lineNum.set(lineNum.get() + 1);
|
|
|
+ });
|
|
|
+ oldKeyMapItem.forEach((key, value) -> changeSets.addDeleteItem(oldKeyMapItem.get(key)));
|
|
|
+ changeSets.setDataChangeLastModifiedBy(userInfoHolder.getUser().getUserId());
|
|
|
+
|
|
|
+ updateItems(appId, env, clusterName, namespaceName, changeSets);
|
|
|
+
|
|
|
+ Tracer.logEvent(TracerEventType.MODIFY_NAMESPACE_BY_TEXT,
|
|
|
+ String.format("%s+%s+%s+%s", appId, env, clusterName, namespaceName));
|
|
|
+ Tracer.logEvent(TracerEventType.MODIFY_NAMESPACE, String.format("%s+%s+%s+%s", appId, env, clusterName, namespaceName));
|
|
|
+ }
|
|
|
+
|
|
|
public List<ItemDiffs> compare(List<NamespaceIdentifier> comparedNamespaces, List<ItemDTO> sourceItems) {
|
|
|
|
|
|
List<ItemDiffs> result = new LinkedList<>();
|
|
@@ -231,6 +292,13 @@ public class ItemService {
|
|
|
return createdItem;
|
|
|
}
|
|
|
|
|
|
+ private ItemDTO buildNormalItem(Long id, Long namespaceId, String key, String value, String comment, int lineNum) {
|
|
|
+ ItemDTO item = new ItemDTO(key, value, comment, lineNum);
|
|
|
+ item.setId(id);
|
|
|
+ item.setNamespaceId(namespaceId);
|
|
|
+ return item;
|
|
|
+ }
|
|
|
+
|
|
|
private boolean isModified(String sourceValue, String targetValue, String sourceComment, String targetComment) {
|
|
|
|
|
|
if (!sourceValue.equals(targetValue)) {
|