diff --git a/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/aop/NamespaceUnlockAspect.java b/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/aop/NamespaceUnlockAspect.java index c5436e4e03d8651000aee853cd8467e8f2224494..24f531208f4d447dc3d23442ca0d46451b135cc6 100644 --- a/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/aop/NamespaceUnlockAspect.java +++ b/apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/aop/NamespaceUnlockAspect.java @@ -1,6 +1,7 @@ package com.ctrip.framework.apollo.adminservice.aop; +import com.google.common.collect.MapDifference; import com.google.common.collect.Maps; import com.google.gson.Gson; @@ -35,7 +36,6 @@ import java.util.Objects; * -------------------------------------------- * First operate: change k1 = v2 (lock namespace) * Second operate: change k1 = v1 (unlock namespace) - * */ @Aspect @Component @@ -106,42 +106,52 @@ public class NamespaceUnlockAspect { } Map releasedConfiguration = gson.fromJson(release.getConfigurations(), GsonType.CONFIG); - Map configurationFromItems = Maps.newHashMap(); + Map configurationFromItems = generateConfigurationFromItems(namespace, items); + + MapDifference difference = Maps.difference(releasedConfiguration, configurationFromItems); + return !difference.areEqual(); + + } + + private boolean hasNormalItems(List items) { for (Item item : items) { - String key = item.getKey(); - if (StringUtils.isBlank(key)) { - continue; - } - //added - if (releasedConfiguration.get(key) == null) { + if (!StringUtils.isEmpty(item.getKey())) { return true; } - configurationFromItems.put(key, item.getValue()); } - for (Map.Entry entry : releasedConfiguration.entrySet()) { - String key = entry.getKey(); - String value = entry.getValue(); + return false; + } + + private Map generateConfigurationFromItems(Namespace namespace, List namespaceItems) { - //deleted or modified - if (!Objects.equals(configurationFromItems.get(key), value)) { - return true; - } + Map configurationFromItems = Maps.newHashMap(); + Namespace parentNamespace = namespaceService.findParentNamespace(namespace); + //parent namespace + if (parentNamespace == null) { + generateMapFromItems(namespaceItems, configurationFromItems); + } else {//child namespace + List parentItems = itemService.findItems(parentNamespace.getId()); + + generateMapFromItems(parentItems, configurationFromItems); + generateMapFromItems(namespaceItems, configurationFromItems); } - return false; + return configurationFromItems; } - private boolean hasNormalItems(List items) { + private Map generateMapFromItems(List items, Map configurationFromItems) { for (Item item : items) { - if (!StringUtils.isEmpty(item.getKey())) { - return true; + String key = item.getKey(); + if (StringUtils.isBlank(key)) { + continue; } + configurationFromItems.put(key, item.getValue()); } - return false; + return configurationFromItems; } } diff --git a/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/aop/NamespaceUnlockAspectTest.java b/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/aop/NamespaceUnlockAspectTest.java index 33487d724adb8e5a5cde8352b80bfe80bd1009d6..cc3f4d2ddd87ee7334e18d0860ff6e48ca77b020 100644 --- a/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/aop/NamespaceUnlockAspectTest.java +++ b/apollo-adminservice/src/test/java/com/ctrip/framework/apollo/adminservice/aop/NamespaceUnlockAspectTest.java @@ -4,6 +4,7 @@ import com.ctrip.framework.apollo.biz.entity.Item; import com.ctrip.framework.apollo.biz.entity.Namespace; import com.ctrip.framework.apollo.biz.entity.Release; import com.ctrip.framework.apollo.biz.service.ItemService; +import com.ctrip.framework.apollo.biz.service.NamespaceService; import com.ctrip.framework.apollo.biz.service.ReleaseService; import org.junit.Assert; @@ -26,6 +27,8 @@ public class NamespaceUnlockAspectTest { private ReleaseService releaseService; @Mock private ItemService itemService; + @Mock + private NamespaceService namespaceService; @InjectMocks private NamespaceUnlockAspect namespaceUnlockAspect; @@ -55,6 +58,7 @@ public class NamespaceUnlockAspectTest { when(releaseService.findLatestActiveRelease(namespace)).thenReturn(release); when(itemService.findItems(namespaceId)).thenReturn(items); + when(namespaceService.findParentNamespace(namespace)).thenReturn(null); boolean isModified = namespaceUnlockAspect.isModified(namespace); @@ -71,6 +75,7 @@ public class NamespaceUnlockAspectTest { when(releaseService.findLatestActiveRelease(namespace)).thenReturn(release); when(itemService.findItems(namespaceId)).thenReturn(items); + when(namespaceService.findParentNamespace(namespace)).thenReturn(null); boolean isModified = namespaceUnlockAspect.isModified(namespace); @@ -87,12 +92,54 @@ public class NamespaceUnlockAspectTest { when(releaseService.findLatestActiveRelease(namespace)).thenReturn(release); when(itemService.findItems(namespaceId)).thenReturn(items); + when(namespaceService.findParentNamespace(namespace)).thenReturn(null); boolean isModified = namespaceUnlockAspect.isModified(namespace); Assert.assertTrue(isModified); } + @Test + public void testChildNamespaceModified() { + long childNamespaceId = 1, parentNamespaceId = 2; + Namespace childNamespace = createNamespace(childNamespaceId); + Namespace parentNamespace = createNamespace(childNamespaceId); + + Release childRelease = createRelease("{\"k1\":\"v1\", \"k2\":\"v2\"}"); + List childItems = Arrays.asList(createItem("k1", "v3")); + List parentItems = Arrays.asList(createItem("k1", "v1"), createItem("k2", "v2")); + + when(releaseService.findLatestActiveRelease(childNamespace)).thenReturn(childRelease); + when(itemService.findItems(childNamespaceId)).thenReturn(childItems); + when(itemService.findItems(parentNamespaceId)).thenReturn(parentItems); + when(namespaceService.findParentNamespace(parentNamespace)).thenReturn(parentNamespace); + + boolean isModified = namespaceUnlockAspect.isModified(parentNamespace); + + Assert.assertTrue(isModified); + } + + @Test + public void testChildNamespaceNotModified() { + long childNamespaceId = 1, parentNamespaceId = 2; + Namespace childNamespace = createNamespace(childNamespaceId); + Namespace parentNamespace = createNamespace(childNamespaceId); + + Release childRelease = createRelease("{\"k1\":\"v1\", \"k2\":\"v2\"}"); + List childItems = Arrays.asList(createItem("k1", "v1")); + List parentItems = Arrays.asList(createItem("k2", "v2")); + + when(releaseService.findLatestActiveRelease(childNamespace)).thenReturn(childRelease); + when(itemService.findItems(childNamespaceId)).thenReturn(childItems); + when(itemService.findItems(parentNamespaceId)).thenReturn(parentItems); + when(namespaceService.findParentNamespace(parentNamespace)).thenReturn(parentNamespace); + + boolean isModified = namespaceUnlockAspect.isModified(parentNamespace); + + Assert.assertTrue(isModified); + } + + private Namespace createNamespace(long namespaceId) { Namespace namespace = new Namespace(); namespace.setId(namespaceId);