This is an automated email from the ASF dual-hosted git repository. liubao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
commit f2c562ddf92d01905bf828735404e263f0cb40ea Author: liubao <bi...@qq.com> AuthorDate: Fri Sep 22 16:46:19 2023 +0800 [SCB-2008]allows not injectable property in model --- .../config/ConfigurationChangedEvent.java | 97 ++++++++++++++++++++++ .../config/priority/ConfigObjectFactory.java | 9 +- .../config/priority/PriorityPropertyManager.java | 2 + .../config/inject/TestConfigObjectFactory.java | 29 +++++++ .../priority/TestPriorityPropertyManager.java | 9 +- .../registry/sc/MicroserviceHandler.java | 3 + 6 files changed, 141 insertions(+), 8 deletions(-) diff --git a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/ConfigurationChangedEvent.java b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/ConfigurationChangedEvent.java new file mode 100644 index 000000000..ff56ae202 --- /dev/null +++ b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/ConfigurationChangedEvent.java @@ -0,0 +1,97 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.servicecomb.config; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class ConfigurationChangedEvent { + private final Map<String, Object> added; + + private final Map<String, Object> deleted; + + private final Map<String, Object> updated; + + private final boolean changed; + + private Map<String, Object> complete; + + private ConfigurationChangedEvent(Map<String, Object> added, Map<String, Object> updated, + Map<String, Object> deleted, boolean changed) { + this.added = added; + this.deleted = deleted; + this.updated = updated; + this.changed = changed; + } + + public static ConfigurationChangedEvent createIncremental(Map<String, Object> latest, Map<String, Object> last) { + Map<String, Object> itemsCreated = new HashMap<>(); + Map<String, Object> itemsDeleted = new HashMap<>(); + Map<String, Object> itemsModified = new HashMap<>(); + boolean changed = false; + + for (Map.Entry<String, Object> entry : latest.entrySet()) { + String itemKey = entry.getKey(); + if (!last.containsKey(itemKey)) { + itemsCreated.put(itemKey, entry.getValue()); + changed = true; + } else if (!Objects.equals(last.get(itemKey), latest.get(itemKey))) { + itemsModified.put(itemKey, entry.getValue()); + changed = true; + } + } + for (String itemKey : last.keySet()) { + if (!latest.containsKey(itemKey)) { + itemsDeleted.put(itemKey, null); + changed = true; + } + } + ConfigurationChangedEvent event = ConfigurationChangedEvent + .createIncremental(itemsCreated, itemsModified, itemsDeleted, changed); + event.complete = latest; + return event; + } + + private static ConfigurationChangedEvent createIncremental(Map<String, Object> added, Map<String, Object> updated, + Map<String, Object> deleted, boolean changed) { + return new ConfigurationChangedEvent(added, updated, deleted, changed); + } + + public final Map<String, Object> getAdded() { + return added; + } + + + public final Map<String, Object> getUpdated() { + return updated; + } + + + public final Map<String, Object> getDeleted() { + return deleted; + } + + public final Map<String, Object> getComplete() { + return complete; + } + + public final boolean isChanged() { + return changed; + } +} diff --git a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/ConfigObjectFactory.java b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/ConfigObjectFactory.java index aa4248f7e..c5b9cf855 100644 --- a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/ConfigObjectFactory.java +++ b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/ConfigObjectFactory.java @@ -100,10 +100,13 @@ public class ConfigObjectFactory { continue; } - Setter<Object, Object> setter = beanDescriptionCache.computeIfAbsent(propertyDefinition, - LambdaMetafactoryUtils::createObjectSetter); PriorityProperty<?> priorityProperty = createPriorityProperty(propertyDefinition.getField().getAnnotated(), prefix, parameters); + if (priorityProperty == null) { + continue; + } + Setter<Object, Object> setter = beanDescriptionCache.computeIfAbsent(propertyDefinition, + LambdaMetafactoryUtils::createObjectSetter); setter.set(instance, priorityProperty.getValue()); properties.add(new ConfigObjectProperty(setter, priorityProperty)); } @@ -138,7 +141,7 @@ public class ConfigObjectFactory { case "java.lang.Boolean": return createBooleanProperty(field, keys, null); default: - throw new IllegalStateException("not support, field=" + field); + return null; } } diff --git a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityPropertyManager.java b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityPropertyManager.java index c1e47ac30..95b37a037 100644 --- a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityPropertyManager.java +++ b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/priority/PriorityPropertyManager.java @@ -28,6 +28,7 @@ import org.apache.commons.configuration.AbstractConfiguration; import org.apache.commons.configuration.event.ConfigurationEvent; import org.apache.commons.configuration.event.ConfigurationListener; +import com.google.common.annotations.VisibleForTesting; import com.netflix.config.ConfigurationManager; public class PriorityPropertyManager { @@ -70,6 +71,7 @@ public class PriorityPropertyManager { } } + @VisibleForTesting public Map<Object, List<ConfigObjectProperty>> getConfigObjectMap() { return configObjectMap; } diff --git a/foundations/foundation-config/src/test/java/org/apache/servicecomb/config/inject/TestConfigObjectFactory.java b/foundations/foundation-config/src/test/java/org/apache/servicecomb/config/inject/TestConfigObjectFactory.java index b80bb60bf..ec9412898 100644 --- a/foundations/foundation-config/src/test/java/org/apache/servicecomb/config/inject/TestConfigObjectFactory.java +++ b/foundations/foundation-config/src/test/java/org/apache/servicecomb/config/inject/TestConfigObjectFactory.java @@ -423,4 +423,33 @@ public class TestConfigObjectFactory extends TestPriorityPropertyBase { ArchaiusUtils.setProperty("override.low", null); Assertions.assertNull(config.strValue); } + + @InjectProperties(prefix = "root") + public static class ConfigWithPojo { + + @InjectProperties(prefix = "root.model") + public static class Model { + @InjectProperty(defaultValue = "h") + public String name; + } + + @InjectProperty(defaultValue = "4") + public int index; + + public Model model; + } + + @Test + public void configWithPojoWork() { + ConfigWithPojo config = priorityPropertyManager.createConfigObject(ConfigWithPojo.class); + ConfigWithPojo.Model model = priorityPropertyManager.createConfigObject(ConfigWithPojo.Model.class); + config.model = model; + + Assertions.assertEquals(4, config.index); + Assertions.assertEquals("h", config.model.name); + ArchaiusUtils.setProperty("root.index", "5"); + ArchaiusUtils.setProperty("root.model.name", "w"); + Assertions.assertEquals(5, config.index); + Assertions.assertEquals("w", config.model.name); + } } diff --git a/foundations/foundation-config/src/test/java/org/apache/servicecomb/config/priority/TestPriorityPropertyManager.java b/foundations/foundation-config/src/test/java/org/apache/servicecomb/config/priority/TestPriorityPropertyManager.java index 294a506df..15e223b3e 100644 --- a/foundations/foundation-config/src/test/java/org/apache/servicecomb/config/priority/TestPriorityPropertyManager.java +++ b/foundations/foundation-config/src/test/java/org/apache/servicecomb/config/priority/TestPriorityPropertyManager.java @@ -20,7 +20,6 @@ package org.apache.servicecomb.config.priority; import org.apache.servicecomb.config.ConfigUtil; import org.apache.servicecomb.config.inject.InjectProperties; import org.apache.servicecomb.config.inject.InjectProperty; -import org.apache.servicecomb.config.inject.TestConfigObjectFactory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -37,7 +36,7 @@ public class TestPriorityPropertyManager extends TestPriorityPropertyBase { @InjectProperties(prefix = "root") public static class ConfigWithAnnotation { - @InjectProperty(prefix = "override", keys = {"high", "low"}) + @InjectProperty(prefix = "override", keys = {"high", "low"}, defaultValue = "abc") public String strValue; } @@ -65,9 +64,9 @@ public class TestPriorityPropertyManager extends TestPriorityPropertyBase { for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) { - TestConfigObjectFactory.ConfigWithAnnotation configConfigObject = priorityPropertyManager.createConfigObject( - TestConfigObjectFactory.ConfigWithAnnotation.class); - Assertions.assertEquals("abc", configConfigObject.strDef); + ConfigWithAnnotation configConfigObject = priorityPropertyManager.createConfigObject( + ConfigWithAnnotation.class); + Assertions.assertEquals("abc", configConfigObject.strValue); PriorityProperty<Long> configPriorityProperty = propertyFactory.getOrCreate(Long.class, -1L, -2L, keys); Assertions.assertEquals(-2L, (long) configPriorityProperty.getValue()); } diff --git a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/registry/sc/MicroserviceHandler.java b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/registry/sc/MicroserviceHandler.java index cdd21cdab..ec495c710 100644 --- a/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/registry/sc/MicroserviceHandler.java +++ b/service-registry/registry-service-center/src/main/java/org/apache/servicecomb/registry/sc/MicroserviceHandler.java @@ -107,6 +107,9 @@ public class MicroserviceHandler { MicroserviceInstance microserviceInstance = new MicroserviceInstance(); String hostName = StringUtils.isEmpty(scConfigurationProperties.getHostname()) ? NetUtils.getHostName() : scConfigurationProperties.getHostname(); + if (hostName.length() > 64) { + hostName = hostName.substring(0, 64); + } microserviceInstance.setHostName(hostName); if (StringUtils.isNotEmpty(dataCenterProperties.getName())) {