diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/pom.xml b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/pom.xml index 0a36d2c8..7629648d 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/pom.xml +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/pom.xml @@ -105,7 +105,6 @@ 2.0.0 test - diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySource.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySource.java index 2d83fa5d..8e1b6fe2 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySource.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySource.java @@ -16,12 +16,16 @@ package com.alibaba.cloud.nacos.client; +import java.util.Collections; import java.util.Date; +import java.util.List; import java.util.Map; import com.alibaba.cloud.nacos.NacosConfigProperties; import org.springframework.core.env.MapPropertySource; +import org.springframework.core.env.PropertySource; +import org.springframework.util.CollectionUtils; /** * @author xiaojing @@ -50,7 +54,7 @@ public class NacosPropertySource extends MapPropertySource { private final boolean isRefreshable; NacosPropertySource(String group, String dataId, Map source, - Date timestamp, boolean isRefreshable) { + Date timestamp, boolean isRefreshable) { super(String.join(NacosConfigProperties.COMMAS, dataId, group), source); this.group = group; this.dataId = dataId; @@ -58,6 +62,32 @@ public class NacosPropertySource extends MapPropertySource { this.isRefreshable = isRefreshable; } + NacosPropertySource(List> propertySources, String group, + String dataId, Date timestamp, boolean isRefreshable) { + this(group, dataId, getSourceMap(group, dataId, propertySources), timestamp, + isRefreshable); + } + + private static Map getSourceMap(String group, String dataId, + List> propertySources) { + if (CollectionUtils.isEmpty(propertySources)) { + return Collections.emptyMap(); + } + // If only one, return the internal element, otherwise wrap it. + if (propertySources.size() == 1) { + PropertySource propertySource = propertySources.get(0); + if (propertySource != null && propertySource.getSource() instanceof Map) { + return (Map) propertySource.getSource(); + } + } + // If it is multiple, it will be returned as it is, and the internal elements + // cannot be directly retrieved, so the user needs to implement the retrieval + // logic by himself + return Collections.singletonMap( + String.join(NacosConfigProperties.COMMAS, dataId, group), + propertySources); + } + public String getGroup() { return this.group; } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceBuilder.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceBuilder.java index ed5ac5d9..762b9b91 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceBuilder.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/client/NacosPropertySourceBuilder.java @@ -16,17 +16,18 @@ package com.alibaba.cloud.nacos.client; -import java.util.Date; -import java.util.LinkedHashMap; -import java.util.Map; - import com.alibaba.cloud.nacos.NacosPropertySourceRepository; import com.alibaba.cloud.nacos.parser.NacosDataParserHandler; import com.alibaba.nacos.api.config.ConfigService; import com.alibaba.nacos.api.exception.NacosException; + +import java.util.Collections; +import java.util.Date; +import java.util.List; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; - +import org.springframework.core.env.PropertySource; import org.springframework.util.StringUtils; /** @@ -38,8 +39,6 @@ public class NacosPropertySourceBuilder { private static final Logger log = LoggerFactory .getLogger(NacosPropertySourceBuilder.class); - private static final Map EMPTY_MAP = new LinkedHashMap(); - private ConfigService configService; private long timeout; @@ -71,14 +70,15 @@ public class NacosPropertySourceBuilder { */ NacosPropertySource build(String dataId, String group, String fileExtension, boolean isRefreshable) { - Map p = loadNacosData(dataId, group, fileExtension); - NacosPropertySource nacosPropertySource = new NacosPropertySource(group, dataId, - p, new Date(), isRefreshable); + List> propertySources = loadNacosData(dataId, group, + fileExtension); + NacosPropertySource nacosPropertySource = new NacosPropertySource(propertySources, + group, dataId, new Date(), isRefreshable); NacosPropertySourceRepository.collectNacosPropertySource(nacosPropertySource); return nacosPropertySource; } - private Map loadNacosData(String dataId, String group, + private List> loadNacosData(String dataId, String group, String fileExtension) { String data = null; try { @@ -87,24 +87,23 @@ public class NacosPropertySourceBuilder { log.warn( "Ignore the empty nacos configuration and get it based on dataId[{}] & group[{}]", dataId, group); - return EMPTY_MAP; + return Collections.emptyList(); } if (log.isDebugEnabled()) { log.debug(String.format( "Loading nacos data, dataId: '%s', group: '%s', data: %s", dataId, group, data)); } - Map dataMap = NacosDataParserHandler.getInstance() - .parseNacosData( data, fileExtension); - return dataMap == null ? EMPTY_MAP : dataMap; + return NacosDataParserHandler.getInstance().parseNacosData(dataId, data, + fileExtension); } catch (NacosException e) { - log.error("get data from Nacos error,dataId:{}, ", dataId, e); + log.error("get data from Nacos error,dataId:{} ", dataId, e); } catch (Exception e) { - log.error("parse data from Nacos error,dataId:{},data:{},", dataId, data, e); + log.error("parse data from Nacos error,dataId:{},data:{}", dataId, data, e); } - return EMPTY_MAP; + return Collections.emptyList(); } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractNacosDataParser.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractNacosDataParser.java deleted file mode 100644 index 6f94cb6c..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractNacosDataParser.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2013-2018 the original author or authors. - * - * Licensed 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 - * - * https://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 com.alibaba.cloud.nacos.parser; - -import java.io.IOException; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; - -import org.springframework.util.StringUtils; - -/** - * @author zkz - */ -public abstract class AbstractNacosDataParser { - - protected static final String DOT = "."; - - protected static final String VALUE = "value"; - - protected static final String EMPTY_STRING = ""; - - private String extension; - - private AbstractNacosDataParser nextParser; - - protected AbstractNacosDataParser(String extension) { - if (StringUtils.isEmpty(extension)) { - throw new IllegalArgumentException("extension cannot be empty"); - } - this.extension = extension.toLowerCase(); - } - - /** - * Verify dataId extensions. - * @param extension file extension. json or xml or yml or yaml or properties - * @return valid or not - */ - public final boolean checkFileExtension(String extension) { - if (this.isLegal(extension.toLowerCase())) { - return true; - } - if (this.nextParser == null) { - return false; - } - return this.nextParser.checkFileExtension(extension); - - } - - /** - * Parsing nacos configuration content. - * @param data config data from Nacos - * @param extension file extension. json or xml or yml or yaml or properties - * @return result of Properties - * @throws IOException thrown if there is a problem parsing config. - */ - public final Map parseNacosData(String data, String extension) - throws IOException { - if (extension == null || extension.length() < 1) { - throw new IllegalStateException("The file extension cannot be empty"); - } - if (this.isLegal(extension.toLowerCase())) { - return this.doParse(data); - } - if (this.nextParser == null) { - throw new IllegalStateException(getTips(extension)); - } - return this.nextParser.parseNacosData(data, extension); - } - - /** - * Core logic for parsing. - * @param data config from Nacos - * @return result of Properties - * @throws IOException thrown if there is a problem parsing config. - */ - protected abstract Map doParse(String data) throws IOException; - - protected AbstractNacosDataParser setNextParser(AbstractNacosDataParser nextParser) { - this.nextParser = nextParser; - return this; - } - - public AbstractNacosDataParser addNextParser(AbstractNacosDataParser nextParser) { - if (this.nextParser == null) { - this.nextParser = nextParser; - } - else { - this.nextParser.addNextParser(nextParser); - } - return this; - } - - protected boolean isLegal(String extension) { - return this.extension.equalsIgnoreCase(extension) - || this.extension.contains(extension); - } - - protected void flattenedMap(Map result, Map dataMap, - String parentKey) { - Set> entries = dataMap.entrySet(); - for (Iterator> iterator = entries.iterator(); iterator - .hasNext();) { - Map.Entry entry = iterator.next(); - String key = entry.getKey(); - Object value = entry.getValue(); - - String fullKey = StringUtils.isEmpty(parentKey) ? key : key.startsWith("[") - ? parentKey.concat(key) : parentKey.concat(DOT).concat(key); - - if (value instanceof Map) { - Map map = (Map) value; - flattenedMap(result, map, fullKey); - continue; - } - else if (value instanceof Collection) { - int count = 0; - Collection collection = (Collection) value; - for (Object object : collection) { - flattenedMap(result, - Collections.singletonMap("[" + (count++) + "]", object), - fullKey); - } - continue; - } - - result.put(fullKey, value); - } - } - - /** - * Reload the key ending in `value` if need. - */ - protected Map reloadMap(Map map) { - if (map == null || map.isEmpty()) { - return null; - } - Map result = new LinkedHashMap<>(map); - for (Map.Entry entry : map.entrySet()) { - String key = entry.getKey(); - if (key.contains(DOT)) { - int idx = key.lastIndexOf(DOT); - String suffix = key.substring(idx + 1); - if (VALUE.equalsIgnoreCase(suffix)) { - result.put(key.substring(0, idx), entry.getValue()); - } - } - } - return result; - } - - public static String getTips(String fileName) { - return String.format( - "[%s] must contains file extension with properties|yaml|yml|xml|json", - fileName); - } - -} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractPropertySourceLoader.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractPropertySourceLoader.java index 4990d94e..c344076a 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractPropertySourceLoader.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/AbstractPropertySourceLoader.java @@ -17,13 +17,8 @@ package com.alibaba.cloud.nacos.parser; import java.io.IOException; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Set; import org.springframework.boot.env.PropertySourceLoader; import org.springframework.core.env.PropertySource; @@ -102,7 +97,7 @@ public abstract class AbstractPropertySourceLoader implements PropertySourceLoad Set> entries = dataMap.entrySet(); for (Iterator> iterator = entries.iterator(); iterator .hasNext();) { - Map.Entry entry = iterator.next(); + Entry entry = iterator.next(); String key = entry.getKey(); Object value = entry.getValue(); diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataJsonParser.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataJsonParser.java deleted file mode 100644 index d33cf62f..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataJsonParser.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2013-2018 the original author or authors. - * - * Licensed 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 - * - * https://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 com.alibaba.cloud.nacos.parser; - -import java.io.IOException; -import java.util.LinkedHashMap; -import java.util.Map; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; - -/** - * @author zkz - * @author yuhuangbin - */ -public class NacosDataJsonParser extends AbstractNacosDataParser { - - protected NacosDataJsonParser() { - super("json"); - } - - @Override - protected Map doParse(String data) throws IOException { - if (StringUtils.isEmpty(data)) { - return null; - } - Map map = parseJSON2Map(data); - return this.reloadMap(map); - } - - /** - * JSON to Map. - * @param json json data - * @return the map convert by json string - * @throws IOException thrown if there is a problem parsing config. - */ - private Map parseJSON2Map(String json) throws IOException { - Map result = new LinkedHashMap<>(32); - - ObjectMapper mapper = new ObjectMapper(); - Map nacosDataMap = mapper.readValue(json, LinkedHashMap.class); - - if (CollectionUtils.isEmpty(nacosDataMap)) { - return result; - } - flattenedMap(result, nacosDataMap, EMPTY_STRING); - return result; - } - -} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataParserHandler.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataParserHandler.java index f5787e79..c7ef4edf 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataParserHandler.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataParserHandler.java @@ -16,64 +16,139 @@ package com.alibaba.cloud.nacos.parser; +import static com.alibaba.cloud.nacos.parser.AbstractPropertySourceLoader.DOT; + +import com.alibaba.cloud.nacos.utils.NacosConfigUtils; + import java.io.IOException; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; + +import org.springframework.boot.env.OriginTrackedMapPropertySource; +import org.springframework.boot.env.PropertiesPropertySourceLoader; +import org.springframework.boot.env.PropertySourceLoader; +import org.springframework.core.env.EnumerablePropertySource; +import org.springframework.core.env.PropertySource; +import org.springframework.core.io.support.SpringFactoriesLoader; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; /** * @author zkz */ public final class NacosDataParserHandler { - private AbstractNacosDataParser parser; + /** + * default extension. + */ + private static final String DEFAULT_EXTENSION = "properties"; + + private static List propertySourceLoaders; private NacosDataParserHandler() { - parser = this.createParser(); + propertySourceLoaders = SpringFactoriesLoader + .loadFactories(PropertySourceLoader.class, getClass().getClassLoader()); } /** * Parsing nacos configuration content. - * @param data config from Nacos - * @param extension file extension. json or xml or yml or yaml or properties - * @return result of LinkedHashMap + * @param configName name of nacos-config + * @param configValue value from nacos-config + * @param extension identifies the type of configValue + * @return result of Map * @throws IOException thrown if there is a problem parsing config. */ - public Map parseNacosData(String data, String extension) - throws IOException { - if (null == parser) { - parser = this.createParser(); + public List> parseNacosData(String configName, String configValue, + String extension) throws IOException { + if (StringUtils.isEmpty(configValue)) { + return Collections.emptyList(); } - return parser.parseNacosData(data, extension); + if (StringUtils.isEmpty(extension)) { + extension = this.getFileExtension(configName); + } + for (PropertySourceLoader propertySourceLoader : propertySourceLoaders) { + if (!canLoadFileExtension(propertySourceLoader, extension)) { + continue; + } + NacosByteArrayResource nacosByteArrayResource; + if (propertySourceLoader instanceof PropertiesPropertySourceLoader) { + // PropertiesPropertySourceLoader internal is to use the ISO_8859_1, + // the Chinese will be garbled, needs to transform into unicode. + nacosByteArrayResource = new NacosByteArrayResource( + NacosConfigUtils.selectiveConvertUnicode(configValue).getBytes(), + configName); + } + else { + nacosByteArrayResource = new NacosByteArrayResource( + configValue.getBytes(), configName); + } + nacosByteArrayResource.setFilename(getFileName(configName, extension)); + List> propertySourceList = propertySourceLoader + .load(configName, nacosByteArrayResource); + if (CollectionUtils.isEmpty(propertySourceList)) { + return Collections.emptyList(); + } + return propertySourceList.stream().filter(Objects::nonNull) + .map(propertySource -> { + if (propertySource instanceof EnumerablePropertySource) { + String[] propertyNames = ((EnumerablePropertySource) propertySource) + .getPropertyNames(); + if (propertyNames != null && propertyNames.length > 0) { + Map map = new LinkedHashMap<>(); + Arrays.stream(propertyNames).forEach(name -> { + map.put(name, propertySource.getProperty(name)); + }); + return new OriginTrackedMapPropertySource(propertySource.getName(), map); + } + } + return propertySource; + }).collect(Collectors.toList()); + } + return Collections.emptyList(); } /** - * check the validity of file extensions in dataid. - * @param dataIdAry array of dataId - * @return dataId handle success or not + * check the current extension can be processed. + * @param loader the propertySourceLoader + * @param extension file extension + * @return if can match extension */ - public boolean checkDataId(String... dataIdAry) { - StringBuilder stringBuilder = new StringBuilder(); - for (String dataId : dataIdAry) { - int idx = dataId.lastIndexOf(AbstractNacosDataParser.DOT); - if (idx > 0 && idx < dataId.length() - 1) { - String extension = dataId.substring(idx + 1); - if (parser.checkFileExtension(extension)) { - break; - } - } - // add tips - stringBuilder.append(dataId).append(","); - } - if (stringBuilder.length() > 0) { - String result = stringBuilder.substring(0, stringBuilder.length() - 1); - throw new IllegalStateException(AbstractNacosDataParser.getTips(result)); - } - return true; + private boolean canLoadFileExtension(PropertySourceLoader loader, String extension) { + return Arrays.stream(loader.getFileExtensions()) + .anyMatch((fileExtension) -> StringUtils.endsWithIgnoreCase(extension, + fileExtension)); } - private AbstractNacosDataParser createParser() { - return new NacosDataPropertiesParser().addNextParser(new NacosDataYamlParser()) - .addNextParser(new NacosDataXmlParser()) - .addNextParser(new NacosDataJsonParser()); + /** + * @param name filename + * @return file extension, default {@code DEFAULT_EXTENSION} if don't get + */ + public String getFileExtension(String name) { + if (StringUtils.isEmpty(name)) { + return DEFAULT_EXTENSION; + } + int idx = name.lastIndexOf(DOT); + if (idx > 0 && idx < name.length() - 1) { + return name.substring(idx + 1); + } + return DEFAULT_EXTENSION; + } + + private String getFileName(String name, String extension) { + if (StringUtils.isEmpty(extension)) { + return name; + } + if (StringUtils.isEmpty(name)) { + return extension; + } + int idx = name.lastIndexOf(DOT); + if (idx > 0 && idx < name.length() - 1) { + String ext = name.substring(idx + 1); + if (extension.equalsIgnoreCase(ext)) { + return name; + } + } + return name + DOT + extension; } public static NacosDataParserHandler getInstance() { diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataPropertiesParser.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataPropertiesParser.java deleted file mode 100644 index 6dec190e..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataPropertiesParser.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2013-2018 the original author or authors. - * - * Licensed 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 - * - * https://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 com.alibaba.cloud.nacos.parser; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.StringReader; -import java.util.LinkedHashMap; -import java.util.Map; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.springframework.util.StringUtils; - -/** - * @author zkz - */ -public class NacosDataPropertiesParser extends AbstractNacosDataParser { - - private static final Logger log = LoggerFactory - .getLogger(NacosDataPropertiesParser.class); - - public NacosDataPropertiesParser() { - super("properties"); - } - - @Override - protected Map doParse(String data) throws IOException { - Map result = new LinkedHashMap<>(); - - try (BufferedReader reader = new BufferedReader(new StringReader(data))) { - for (String line = reader.readLine(); line != null; line = reader - .readLine()) { - String dataLine = line.trim(); - if (StringUtils.isEmpty(dataLine) || dataLine.startsWith("#")) { - continue; - } - int index = dataLine.indexOf("="); - if (index == -1) { - log.warn("the config data is invalid {}", dataLine); - continue; - } - String key = dataLine.substring(0, index); - String value = dataLine.substring(index + 1); - result.put(key.trim(), value.trim()); - } - } - return result; - } - -} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataXmlParser.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataXmlParser.java deleted file mode 100644 index eab890b9..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataXmlParser.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright 2013-2018 the original author or authors. - * - * Licensed 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 - * - * https://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 com.alibaba.cloud.nacos.parser; - -import java.io.IOException; -import java.io.StringReader; -import java.util.LinkedHashMap; -import java.util.Map; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; - -import org.springframework.util.StringUtils; - -/** - * With relatively few usage scenarios, only simple parsing is performed to reduce jar - * dependencies. - * - * @author zkz - */ -public class NacosDataXmlParser extends AbstractNacosDataParser { - - public NacosDataXmlParser() { - super("xml"); - } - - @Override - protected Map doParse(String data) throws IOException { - if (StringUtils.isEmpty(data)) { - return null; - } - Map map = parseXml2Map(data); - return this.reloadMap(map); - } - - private Map parseXml2Map(String xml) throws IOException { - xml = xml.replaceAll("\\r", "").replaceAll("\\n", "").replaceAll("\\t", ""); - Map map = new LinkedHashMap<>(32); - try { - DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance() - .newDocumentBuilder(); - Document document = documentBuilder - .parse(new InputSource(new StringReader(xml))); - if (null == document) { - return null; - } - parseNodeList(document.getChildNodes(), map, ""); - } - catch (Exception e) { - throw new IOException("The xml content parse error.", e.getCause()); - } - return map; - } - - private void parseNodeList(NodeList nodeList, Map map, - String parentKey) { - if (nodeList == null || nodeList.getLength() < 1) { - return; - } - parentKey = parentKey == null ? "" : parentKey; - for (int i = 0; i < nodeList.getLength(); i++) { - Node node = nodeList.item(i); - String value = node.getNodeValue(); - value = value == null ? "" : value.trim(); - String name = node.getNodeName(); - name = name == null ? "" : name.trim(); - - if (StringUtils.isEmpty(name)) { - continue; - } - - String key = StringUtils.isEmpty(parentKey) ? name : parentKey + DOT + name; - NamedNodeMap nodeMap = node.getAttributes(); - parseNodeAttr(nodeMap, map, key); - if (node.getNodeType() == Node.ELEMENT_NODE && node.hasChildNodes()) { - parseNodeList(node.getChildNodes(), map, key); - continue; - } - if (value.length() < 1) { - continue; - } - map.put(parentKey, value); - } - } - - private void parseNodeAttr(NamedNodeMap nodeMap, Map map, - String parentKey) { - if (null == nodeMap || nodeMap.getLength() < 1) { - return; - } - for (int i = 0; i < nodeMap.getLength(); i++) { - Node node = nodeMap.item(i); - if (null == node) { - continue; - } - if (node.getNodeType() == Node.ATTRIBUTE_NODE) { - if (StringUtils.isEmpty(node.getNodeName())) { - continue; - } - if (StringUtils.isEmpty(node.getNodeValue())) { - continue; - } - map.put(String.join(DOT, parentKey, node.getNodeName()), - node.getNodeValue()); - } - } - } - -} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataYamlParser.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataYamlParser.java deleted file mode 100644 index b963a097..00000000 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosDataYamlParser.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2013-2018 the original author or authors. - * - * Licensed 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 - * - * https://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 com.alibaba.cloud.nacos.parser; - -import java.util.LinkedHashMap; -import java.util.Map; - -import org.springframework.beans.factory.config.YamlMapFactoryBean; -import org.springframework.core.io.ByteArrayResource; - -/** - * @author zkz - */ -public class NacosDataYamlParser extends AbstractNacosDataParser { - - public NacosDataYamlParser() { - super(",yml,yaml,"); - } - - @Override - protected Map doParse(String data) { - YamlMapFactoryBean yamlFactory = new YamlMapFactoryBean(); - yamlFactory.setResources(new ByteArrayResource(data.getBytes())); - - Map result = new LinkedHashMap<>(); - flattenedMap(result, yamlFactory.getObject(), EMPTY_STRING); - return result; - } - -} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosXmlPropertySourceLoader.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosXmlPropertySourceLoader.java index 65fdfa3d..4db8e808 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosXmlPropertySourceLoader.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/java/com/alibaba/cloud/nacos/parser/NacosXmlPropertySourceLoader.java @@ -21,21 +21,19 @@ import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; - import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - import org.springframework.boot.env.OriginTrackedMapPropertySource; import org.springframework.boot.env.PropertiesPropertySourceLoader; import org.springframework.core.Ordered; import org.springframework.core.env.PropertySource; import org.springframework.core.io.Resource; import org.springframework.util.StringUtils; +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; /** * Parsing for XML requires overwriting the default diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/resources/META-INF/spring.factories b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/resources/META-INF/spring.factories index e7027bce..aa6bf0d9 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/main/resources/META-INF/spring.factories @@ -7,5 +7,4 @@ org.springframework.boot.diagnostics.FailureAnalyzer=\ com.alibaba.cloud.nacos.diagnostics.analyzer.NacosConnectionFailureAnalyzer org.springframework.boot.env.PropertySourceLoader=\ com.alibaba.cloud.nacos.parser.NacosJsonPropertySourceLoader,\ -com.alibaba.cloud.nacos.parser.NacosXmlPropertySourceLoader -com.alibaba.cloud.nacos.diagnostics.analyzer.NacosConnectionFailureAnalyzer \ No newline at end of file +com.alibaba.cloud.nacos.parser.NacosXmlPropertySourceLoader \ No newline at end of file diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationNoSuffixTest.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationNoSuffixTest.java index a42ebb60..fb73fe2b 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationNoSuffixTest.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationNoSuffixTest.java @@ -1,255 +1,255 @@ -///* -// * Copyright 2013-2018 the original author or authors. -// * -// * Licensed 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 -// * -// * https://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 com.alibaba.cloud.nacos; -// -//import static org.assertj.core.api.Assertions.assertThat; -//import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; -// -//import com.alibaba.cloud.nacos.client.NacosPropertySourceLocator; -//import com.alibaba.cloud.nacos.endpoint.NacosConfigEndpoint; -//import com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfiguration; -//import com.alibaba.cloud.nacos.refresh.NacosRefreshHistory; -//import com.alibaba.nacos.client.config.NacosConfigService; -// -//import java.lang.reflect.InvocationHandler; -//import java.lang.reflect.Method; -//import java.util.Map; -// -//import org.junit.Test; -//import org.junit.runner.RunWith; -//import org.powermock.api.mockito.PowerMockito; -//import org.powermock.api.support.MethodProxy; -//import org.powermock.core.classloader.annotations.PowerMockIgnore; -//import org.powermock.core.classloader.annotations.PrepareForTest; -//import org.powermock.modules.junit4.PowerMockRunner; -//import org.powermock.modules.junit4.PowerMockRunnerDelegate; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -//import org.springframework.boot.autoconfigure.ImportAutoConfiguration; -//import org.springframework.boot.test.context.SpringBootTest; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.core.env.Environment; -//import org.springframework.test.context.junit4.SpringRunner; -// -///** -// * @author zkz -// */ -// -//@RunWith(PowerMockRunner.class) -//@PowerMockIgnore({ "javax.management.*", "javax.xml.parsers.*", -// "com.sun.org.apache.xerces.internal.jaxp.*", "org.w3c.dom.*" }) -//@PowerMockRunnerDelegate(SpringRunner.class) -//@PrepareForTest({ NacosConfigService.class }) -//@SpringBootTest(classes = NacosConfigurationNoSuffixTest.TestConfig.class, properties = { -// "spring.application.name=app-no-suffix", "spring.profiles.active=dev", -// "spring.cloud.nacos.config.server-addr=127.0.0.1:8848", -// "spring.cloud.nacos.config.namespace=test-namespace", -// "spring.cloud.nacos.config.encode=utf-8", -// "spring.cloud.nacos.config.timeout=1000", -// "spring.cloud.nacos.config.group=test-group", -// "spring.cloud.nacos.config.name=test-no-suffix-name", -// "spring.cloud.nacos.config.cluster-name=test-cluster", -// "spring.cloud.nacos.config.contextPath=test-contextpath", -// "spring.cloud.nacos.config.ext-config[0].data-id=ext-json-test.json", -// "spring.cloud.nacos.config.ext-config[1].data-id=ext-common02.properties", -// "spring.cloud.nacos.config.ext-config[1].group=GLOBAL_GROUP", -// "spring.cloud.nacos.config.shared-dataids=shared-data1.properties,shared-data2.xml", -// "spring.cloud.nacos.config.accessKey=test-accessKey", -// "spring.cloud.nacos.config.secretKey=test-secretKey" }, webEnvironment = NONE) -//public class NacosConfigurationNoSuffixTest { -// -// static { -// -// try { -// -// Method method = PowerMockito.method(NacosConfigService.class, "getConfig", -// String.class, String.class, long.class); -// MethodProxy.proxy(method, new InvocationHandler() { -// @Override -// public Object invoke(Object proxy, Method method, Object[] args) -// throws Throwable { -// -// if ("app-no-suffix".equals(args[0]) && "test-group".equals(args[1])) { -// return "test-no-suffix=value-no-suffix-1"; -// } -// if ("app-no-suffix.properties".equals(args[0]) -// && "test-group".equals(args[1])) { -// return "test-no-suffix=value-no-suffix-2"; -// } -// -// if ("test-no-suffix-name".equals(args[0]) -// && "test-group".equals(args[1])) { -// return "test-no-suffix-assign=assign-value-no-suffix-111"; -// } -// if ("test-no-suffix-name.properties".equals(args[0]) -// && "test-group".equals(args[1])) { -// return "test-no-suffix-assign=assign-value-no-suffix-222"; -// } -// if ("test-no-suffix-name-dev.properties".equals(args[0]) -// && "test-group".equals(args[1])) { -// return "test-no-suffix-assign=assign-dev-value-no-suffix-333"; -// } -// -// if ("ext-json-test.json".equals(args[0]) -// && "DEFAULT_GROUP".equals(args[1])) { -// return "{\n" + " \"people\":{\n" -// + " \"firstName\":\"Brett\",\n" -// + " \"lastName\":\"McLaughlin\"\n" + " }\n" -// + "}"; -// } -// -// if ("ext-config-common02.properties".equals(args[0]) -// && "GLOBAL_GROUP".equals(args[1])) { -// return "global-ext-config=global-config-value-2"; -// } -// -// if ("shared-data1.properties".equals(args[0]) -// && "DEFAULT_GROUP".equals(args[1])) { -// return "shared-name=shared-value-1"; -// } -// -// if ("shared-data2.xml".equals(args[0]) -// && "DEFAULT_GROUP".equals(args[1])) { -// return " \n" -// + " \n" -// + " \n" -// + " 开启服务 \n" -// + " 初始化一下 \n" -// + " \n" + " \n" -// + " one\n" -// + " \n" -// + " three\n" -// + " \n" -// + " \n" + " \n" -// + " 销毁一下 \n" -// + " 关闭服务 \n" -// + " \n" + " \n" -// + " "; -// } -// -// return ""; -// } -// }); -// -// } -// catch (Exception ignore) { -// ignore.printStackTrace(); -// -// } -// } -// -// @Autowired -// private NacosPropertySourceLocator locator; -// -// @Autowired -// private NacosConfigProperties properties; -// -// @Autowired -// private NacosRefreshHistory refreshHistory; -// -// @Autowired -// private Environment environment; -// -// @Test -// public void contextLoads() throws Exception { -// -// assertThat(locator).isNotNull(); -// assertThat(properties).isNotNull(); -// -// checkoutNacosConfigServerAddr(); -// checkoutNacosConfigNamespace(); -// checkoutNacosConfigClusterName(); -// checkoutNacosConfigAccessKey(); -// checkoutNacosConfigSecrectKey(); -// checkoutNacosConfigName(); -// checkoutNacosConfigGroup(); -// checkoutNacosConfigContextPath(); -// checkoutNacosConfigFileExtension(); -// checkoutNacosConfigTimeout(); -// checkoutNacosConfigEncode(); -// -// checkoutEndpoint(); -// checkEnvironmentProperties(); -// } -// -// private void checkEnvironmentProperties() { -// assertThat(environment.getProperty("test-no-suffix")).isNull(); -// assertThat(environment.getProperty("test-no-suffix-assign")) -// .isEqualTo("assign-dev-value-no-suffix-333"); -// } -// -// private void checkoutNacosConfigServerAddr() { -// assertThat(properties.getServerAddr()).isEqualTo("127.0.0.1:8848"); -// } -// -// private void checkoutNacosConfigNamespace() { -// assertThat(properties.getNamespace()).isEqualTo("test-namespace"); -// } -// -// private void checkoutNacosConfigClusterName() { -// assertThat(properties.getClusterName()).isEqualTo("test-cluster"); -// } -// -// private void checkoutNacosConfigAccessKey() { -// assertThat(properties.getAccessKey()).isEqualTo("test-accessKey"); -// } -// -// private void checkoutNacosConfigSecrectKey() { -// assertThat(properties.getSecretKey()).isEqualTo("test-secretKey"); -// } -// -// private void checkoutNacosConfigContextPath() { -// assertThat(properties.getContextPath()).isEqualTo("test-contextpath"); -// } -// -// private void checkoutNacosConfigName() { -// assertThat(properties.getName()).isEqualTo("test-no-suffix-name"); -// } -// -// private void checkoutNacosConfigGroup() { -// assertThat(properties.getGroup()).isEqualTo("test-group"); -// } -// -// private void checkoutNacosConfigFileExtension() { -// assertThat(properties.getFileExtension()).isEqualTo("properties"); -// } -// -// private void checkoutNacosConfigTimeout() { -// assertThat(properties.getTimeout()).isEqualTo(1000); -// } -// -// private void checkoutNacosConfigEncode() { -// assertThat(properties.getEncode()).isEqualTo("utf-8"); -// } -// -// private void checkoutEndpoint() throws Exception { -// NacosConfigEndpoint nacosConfigEndpoint = new NacosConfigEndpoint(properties, -// refreshHistory); -// Map map = nacosConfigEndpoint.invoke(); -// assertThat(properties).isEqualTo(map.get("NacosConfigProperties")); -// assertThat(refreshHistory.getRecords()).isEqualTo(map.get("RefreshHistory")); -// } -// -// @Configuration -// @EnableAutoConfiguration -// @ImportAutoConfiguration({ NacosConfigEndpointAutoConfiguration.class, -// NacosConfigAutoConfiguration.class, NacosConfigBootstrapConfiguration.class }) -// public static class TestConfig { -// -// } -// -//} +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed 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 + * + * https://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 com.alibaba.cloud.nacos; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; + +import com.alibaba.cloud.nacos.client.NacosPropertySourceLocator; +import com.alibaba.cloud.nacos.endpoint.NacosConfigEndpoint; +import com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfiguration; +import com.alibaba.cloud.nacos.refresh.NacosRefreshHistory; +import com.alibaba.nacos.client.config.NacosConfigService; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.util.Map; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.api.support.MethodProxy; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * @author zkz + */ + +@RunWith(PowerMockRunner.class) +@PowerMockIgnore({ "javax.management.*", "javax.xml.parsers.*", + "com.sun.org.apache.xerces.internal.jaxp.*", "org.w3c.dom.*" }) +@PowerMockRunnerDelegate(SpringRunner.class) +@PrepareForTest({ NacosConfigService.class }) +@SpringBootTest(classes = NacosConfigurationNoSuffixTest.TestConfig.class, properties = { + "spring.application.name=app-no-suffix", "spring.profiles.active=dev", + "spring.cloud.nacos.config.server-addr=127.0.0.1:8848", + "spring.cloud.nacos.config.namespace=test-namespace", + "spring.cloud.nacos.config.encode=utf-8", + "spring.cloud.nacos.config.timeout=1000", + "spring.cloud.nacos.config.group=test-group", + "spring.cloud.nacos.config.name=test-no-suffix-name", + "spring.cloud.nacos.config.cluster-name=test-cluster", + "spring.cloud.nacos.config.contextPath=test-contextpath", + "spring.cloud.nacos.config.ext-config[0].data-id=ext-json-test.json", + "spring.cloud.nacos.config.ext-config[1].data-id=ext-common02.properties", + "spring.cloud.nacos.config.ext-config[1].group=GLOBAL_GROUP", + "spring.cloud.nacos.config.shared-dataids=shared-data1.properties,shared-data2.xml", + "spring.cloud.nacos.config.accessKey=test-accessKey", + "spring.cloud.nacos.config.secretKey=test-secretKey" }, webEnvironment = NONE) +public class NacosConfigurationNoSuffixTest { + + static { + + try { + + Method method = PowerMockito.method(NacosConfigService.class, "getConfig", + String.class, String.class, long.class); + MethodProxy.proxy(method, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) + throws Throwable { + + if ("app-no-suffix".equals(args[0]) && "test-group".equals(args[1])) { + return "test-no-suffix=value-no-suffix-1"; + } + if ("app-no-suffix.properties".equals(args[0]) + && "test-group".equals(args[1])) { + return "test-no-suffix=value-no-suffix-2"; + } + + if ("test-no-suffix-name".equals(args[0]) + && "test-group".equals(args[1])) { + return "test-no-suffix-assign=assign-value-no-suffix-111"; + } + if ("test-no-suffix-name.properties".equals(args[0]) + && "test-group".equals(args[1])) { + return "test-no-suffix-assign=assign-value-no-suffix-222"; + } + if ("test-no-suffix-name-dev.properties".equals(args[0]) + && "test-group".equals(args[1])) { + return "test-no-suffix-assign=assign-dev-value-no-suffix-333"; + } + + if ("ext-json-test.json".equals(args[0]) + && "DEFAULT_GROUP".equals(args[1])) { + return "{\n" + " \"people\":{\n" + + " \"firstName\":\"Brett\",\n" + + " \"lastName\":\"McLaughlin\"\n" + " }\n" + + "}"; + } + + if ("ext-config-common02.properties".equals(args[0]) + && "GLOBAL_GROUP".equals(args[1])) { + return "global-ext-config=global-config-value-2"; + } + + if ("shared-data1.properties".equals(args[0]) + && "DEFAULT_GROUP".equals(args[1])) { + return "shared-name=shared-value-1"; + } + + if ("shared-data2.xml".equals(args[0]) + && "DEFAULT_GROUP".equals(args[1])) { + return " \n" + + " \n" + + " \n" + + " 开启服务 \n" + + " 初始化一下 \n" + + " \n" + " \n" + + " one\n" + + " \n" + + " three\n" + + " \n" + + " \n" + " \n" + + " 销毁一下 \n" + + " 关闭服务 \n" + + " \n" + " \n" + + " "; + } + + return ""; + } + }); + + } + catch (Exception ignore) { + ignore.printStackTrace(); + + } + } + + @Autowired + private NacosPropertySourceLocator locator; + + @Autowired + private NacosConfigProperties properties; + + @Autowired + private NacosRefreshHistory refreshHistory; + + @Autowired + private Environment environment; + + @Test + public void contextLoads() throws Exception { + + assertThat(locator).isNotNull(); + assertThat(properties).isNotNull(); + + checkoutNacosConfigServerAddr(); + checkoutNacosConfigNamespace(); + checkoutNacosConfigClusterName(); + checkoutNacosConfigAccessKey(); + checkoutNacosConfigSecrectKey(); + checkoutNacosConfigName(); + checkoutNacosConfigGroup(); + checkoutNacosConfigContextPath(); + checkoutNacosConfigFileExtension(); + checkoutNacosConfigTimeout(); + checkoutNacosConfigEncode(); + + checkoutEndpoint(); + checkEnvironmentProperties(); + } + + private void checkEnvironmentProperties() { + assertThat(environment.getProperty("test-no-suffix")).isNull(); + assertThat(environment.getProperty("test-no-suffix-assign")) + .isEqualTo("assign-dev-value-no-suffix-333"); + } + + private void checkoutNacosConfigServerAddr() { + assertThat(properties.getServerAddr()).isEqualTo("127.0.0.1:8848"); + } + + private void checkoutNacosConfigNamespace() { + assertThat(properties.getNamespace()).isEqualTo("test-namespace"); + } + + private void checkoutNacosConfigClusterName() { + assertThat(properties.getClusterName()).isEqualTo("test-cluster"); + } + + private void checkoutNacosConfigAccessKey() { + assertThat(properties.getAccessKey()).isEqualTo("test-accessKey"); + } + + private void checkoutNacosConfigSecrectKey() { + assertThat(properties.getSecretKey()).isEqualTo("test-secretKey"); + } + + private void checkoutNacosConfigContextPath() { + assertThat(properties.getContextPath()).isEqualTo("test-contextpath"); + } + + private void checkoutNacosConfigName() { + assertThat(properties.getName()).isEqualTo("test-no-suffix-name"); + } + + private void checkoutNacosConfigGroup() { + assertThat(properties.getGroup()).isEqualTo("test-group"); + } + + private void checkoutNacosConfigFileExtension() { + assertThat(properties.getFileExtension()).isEqualTo("properties"); + } + + private void checkoutNacosConfigTimeout() { + assertThat(properties.getTimeout()).isEqualTo(1000); + } + + private void checkoutNacosConfigEncode() { + assertThat(properties.getEncode()).isEqualTo("utf-8"); + } + + private void checkoutEndpoint() throws Exception { + NacosConfigEndpoint nacosConfigEndpoint = new NacosConfigEndpoint(properties, + refreshHistory); + Map map = nacosConfigEndpoint.invoke(); + assertThat(properties).isEqualTo(map.get("NacosConfigProperties")); + assertThat(refreshHistory.getRecords()).isEqualTo(map.get("RefreshHistory")); + } + + @Configuration + @EnableAutoConfiguration + @ImportAutoConfiguration({ NacosConfigEndpointAutoConfiguration.class, + NacosConfigAutoConfiguration.class, NacosConfigBootstrapConfiguration.class }) + public static class TestConfig { + + } + +} diff --git a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationXmlJsonTest.java b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationXmlJsonTest.java index 90493f5c..eb6923c0 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationXmlJsonTest.java +++ b/spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-nacos-config/src/test/java/com/alibaba/cloud/nacos/NacosConfigurationXmlJsonTest.java @@ -1,285 +1,281 @@ -///* -// * Copyright 2013-2018 the original author or authors. -// * -// * Licensed 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 -// * -// * https://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 com.alibaba.cloud.nacos; -// -//import static org.assertj.core.api.Assertions.assertThat; -//import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; -// -//import com.alibaba.cloud.nacos.client.NacosPropertySourceLocator; -//import com.alibaba.cloud.nacos.endpoint.NacosConfigEndpoint; -//import com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfiguration; -//import com.alibaba.cloud.nacos.refresh.NacosRefreshHistory; -//import com.alibaba.nacos.client.config.NacosConfigService; -// -//import java.lang.reflect.InvocationHandler; -//import java.lang.reflect.Method; -//import java.util.Map; -// -//import org.junit.Test; -//import org.junit.runner.RunWith; -//import org.powermock.api.mockito.PowerMockito; -//import org.powermock.api.support.MethodProxy; -//import org.powermock.core.classloader.annotations.PowerMockIgnore; -//import org.powermock.core.classloader.annotations.PrepareForTest; -//import org.powermock.modules.junit4.PowerMockRunner; -//import org.powermock.modules.junit4.PowerMockRunnerDelegate; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -//import org.springframework.boot.autoconfigure.ImportAutoConfiguration; -//import org.springframework.boot.test.context.SpringBootTest; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.core.env.Environment; -//import org.springframework.test.context.junit4.SpringRunner; -// -///** -// * @author zkz -// */ -//@RunWith(PowerMockRunner.class) -//@PowerMockIgnore({ "javax.management.*", "javax.xml.parsers.*", -// "com.sun.org.apache.xerces.internal.jaxp.*", "org.w3c.dom.*" }) -//@PowerMockRunnerDelegate(SpringRunner.class) -//@PrepareForTest({ NacosConfigService.class }) -//@SpringBootTest(classes = NacosConfigurationXmlJsonTest.TestConfig.class, properties = { -// "spring.application.name=xmlApp", "spring.profiles.active=dev", -// "spring.cloud.nacos.config.server-addr=127.0.0.1:8848", -// "spring.cloud.nacos.config.namespace=test-namespace", -// "spring.cloud.nacos.config.encode=utf-8", -// "spring.cloud.nacos.config.timeout=1000", -// "spring.cloud.nacos.config.group=test-group", -// "spring.cloud.nacos.config.name=test-name", -// "spring.cloud.nacos.config.cluster-name=test-cluster", -// "spring.cloud.nacos.config.file-extension=xml", -// "spring.cloud.nacos.config.contextPath=test-contextpath", -// "spring.cloud.nacos.config.ext-config[0].data-id=ext-json-test.json", -// "spring.cloud.nacos.config.ext-config[1].data-id=ext-common02.properties", -// "spring.cloud.nacos.config.ext-config[1].group=GLOBAL_GROUP", -// "spring.cloud.nacos.config.shared-dataids=shared-data1.properties,shared-data.json", -// "spring.cloud.nacos.config.accessKey=test-accessKey", -// "spring.cloud.nacos.config.secretKey=test-secretKey" }, webEnvironment = NONE) -//public class NacosConfigurationXmlJsonTest { -// -// static { -// -// try { -// -// Method method = PowerMockito.method(NacosConfigService.class, "getConfig", -// String.class, String.class, long.class); -// MethodProxy.proxy(method, new InvocationHandler() { -// @Override -// public Object invoke(Object proxy, Method method, Object[] args) -// throws Throwable { -// -// if ("xmlApp.xml".equals(args[0]) && "test-group".equals(args[1])) { -// return "" + "\n" -// + " one\n" -// + " \n" -// + " three\n" + " \n" -// + ""; -// } -// if ("test-name.xml".equals(args[0]) && "test-group".equals(args[1])) { -// return "" -// + " \n" -// + " \n" -// + " \n" -// + " 开启服务 \n" -// + " 初始化一下 \n" -// + " \n" + " \n" -// + " one\n" -// + " \n" -// + " three\n" -// + " \n" -// + " \n" + " \n" -// + " 销毁一下 \n" -// + " 关闭服务 \n" -// + " \n" + " \n" -// + " "; -// } -// -// if ("test-name-dev.xml".equals(args[0]) -// && "test-group".equals(args[1])) { -// return "" -// + "\n" -// + " \n" -// + " \n" -// + " \n" -// + " \n" -// + " \n" + " \n" -// + ""; -// } -// -// if ("ext-json-test.json".equals(args[0]) -// && "DEFAULT_GROUP".equals(args[1])) { -// return "{\n" + " \"people\":{\n" -// + " \"firstName\":\"Brett\",\n" -// + " \"lastName\":\"McLaughlin\"\n" + " }\n" -// + "}"; -// } -// -// if ("ext-config-common02.properties".equals(args[0]) -// && "GLOBAL_GROUP".equals(args[1])) { -// return "global-ext-config=global-config-value-2"; -// } -// -// if ("shared-data1.properties".equals(args[0]) -// && "DEFAULT_GROUP".equals(args[1])) { -// return "shared-name=shared-value-1"; -// } -// -// if ("shared-data.json".equals(args[0]) -// && "DEFAULT_GROUP".equals(args[1])) { -// return "{\n" + " \"test\" : {\n" -// + " \"name\" : \"test\",\n" -// + " \"list\" : [\n" + " {\n" -// + " \"name\" :\"listname1\",\n" -// + " \"age\":1\n" + " },\n" -// + " {\n" -// + " \"name\" :\"listname2\",\n" -// + " \"age\":2\n" + " }\n" -// + " ],\n" + " \"metadata\" : {\n" -// + " \"intKey\" : 123,\n" -// + " \"booleanKey\" : true\n" + " }\n" -// + " }\n" + "}"; -// } -// -// return ""; -// } -// }); -// -// } -// catch (Exception ignore) { -// ignore.printStackTrace(); -// -// } -// } -// -// @Autowired -// private NacosPropertySourceLocator locator; -// -// @Autowired -// private NacosConfigProperties properties; -// -// @Autowired -// private NacosRefreshHistory refreshHistory; -// -// @Autowired -// private Environment environment; -// -// @Test -// public void contextLoads() throws Exception { -// -// assertThat(locator).isNotNull(); -// assertThat(properties).isNotNull(); -// -// checkoutNacosConfigServerAddr(); -// checkoutNacosConfigNamespace(); -// checkoutNacosConfigClusterName(); -// checkoutNacosConfigAccessKey(); -// checkoutNacosConfigSecrectKey(); -// checkoutNacosConfigName(); -// checkoutNacosConfigGroup(); -// checkoutNacosConfigContextPath(); -// checkoutNacosConfigFileExtension(); -// checkoutNacosConfigTimeout(); -// checkoutNacosConfigEncode(); -// -// checkoutEndpoint(); -// -// checkJsonParser(); -// } -// -// private void checkJsonParser() { -// assertThat(environment.getProperty("test.name", String.class)).isEqualTo("test"); -// -// assertThat(environment.getProperty("test.list[0].name", String.class)) -// .isEqualTo("listname1"); -// assertThat(environment.getProperty("test.list[0].age", Integer.class)) -// .isEqualTo(1); -// -// assertThat(environment.getProperty("test.list[1].name", String.class)) -// .isEqualTo("listname2"); -// assertThat(environment.getProperty("test.list[1].age", Integer.class)) -// .isEqualTo(2); -// -// assertThat( -// (Integer) environment.getProperty("test.metadata.intKey", Object.class)) -// .isEqualTo(123); -// assertThat((Boolean) environment.getProperty("test.metadata.booleanKey", -// Object.class)).isEqualTo(true); -// } -// -// private void checkoutNacosConfigServerAddr() { -// assertThat(properties.getServerAddr()).isEqualTo("127.0.0.1:8848"); -// } -// -// private void checkoutNacosConfigNamespace() { -// assertThat(properties.getNamespace()).isEqualTo("test-namespace"); -// } -// -// private void checkoutNacosConfigClusterName() { -// assertThat(properties.getClusterName()).isEqualTo("test-cluster"); -// } -// -// private void checkoutNacosConfigAccessKey() { -// assertThat(properties.getAccessKey()).isEqualTo("test-accessKey"); -// } -// -// private void checkoutNacosConfigSecrectKey() { -// assertThat(properties.getSecretKey()).isEqualTo("test-secretKey"); -// } -// -// private void checkoutNacosConfigContextPath() { -// assertThat(properties.getContextPath()).isEqualTo("test-contextpath"); -// } -// -// private void checkoutNacosConfigName() { -// assertThat(properties.getName()).isEqualTo("test-name"); -// } -// -// private void checkoutNacosConfigGroup() { -// assertThat(properties.getGroup()).isEqualTo("test-group"); -// } -// -// private void checkoutNacosConfigFileExtension() { -// assertThat(properties.getFileExtension()).isEqualTo("xml"); -// } -// -// private void checkoutNacosConfigTimeout() { -// assertThat(properties.getTimeout()).isEqualTo(1000); -// } -// -// private void checkoutNacosConfigEncode() { -// assertThat(properties.getEncode()).isEqualTo("utf-8"); -// } -// -// private void checkoutEndpoint() throws Exception { -// NacosConfigEndpoint nacosConfigEndpoint = new NacosConfigEndpoint(properties, -// refreshHistory); -// Map map = nacosConfigEndpoint.invoke(); -// assertThat(properties).isEqualTo(map.get("NacosConfigProperties")); -// assertThat(refreshHistory.getRecords()).isEqualTo(map.get("RefreshHistory")); -// } -// -// @Configuration -// @EnableAutoConfiguration -// @ImportAutoConfiguration({ NacosConfigEndpointAutoConfiguration.class, -// NacosConfigAutoConfiguration.class, NacosConfigBootstrapConfiguration.class }) -// public static class TestConfig { -// -// } -// -//} +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed 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 + * + * https://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 com.alibaba.cloud.nacos; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.util.Map; + +import com.alibaba.cloud.nacos.client.NacosPropertySourceLocator; +import com.alibaba.cloud.nacos.endpoint.NacosConfigEndpoint; +import com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfiguration; +import com.alibaba.cloud.nacos.refresh.NacosRefreshHistory; +import com.alibaba.nacos.client.config.NacosConfigService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.api.support.MethodProxy; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; + +/** + * @author zkz + */ +@RunWith(PowerMockRunner.class) +@PowerMockIgnore("javax.management.*") +@PowerMockRunnerDelegate(SpringRunner.class) +@PrepareForTest({ NacosConfigService.class }) +@SpringBootTest(classes = NacosConfigurationXmlJsonTest.TestConfig.class, properties = { + "spring.application.name=xmlApp", "spring.profiles.active=dev", + "spring.cloud.nacos.config.server-addr=127.0.0.1:8848", + "spring.cloud.nacos.config.namespace=test-namespace", + "spring.cloud.nacos.config.encode=utf-8", + "spring.cloud.nacos.config.timeout=1000", + "spring.cloud.nacos.config.group=test-group", + "spring.cloud.nacos.config.name=test-name", + "spring.cloud.nacos.config.cluster-name=test-cluster", + "spring.cloud.nacos.config.file-extension=xml", + "spring.cloud.nacos.config.contextPath=test-contextpath", + "spring.cloud.nacos.config.ext-config[0].data-id=ext-json-test.json", + "spring.cloud.nacos.config.ext-config[1].data-id=ext-common02.properties", + "spring.cloud.nacos.config.ext-config[1].group=GLOBAL_GROUP", + "spring.cloud.nacos.config.shared-dataids=shared-data1.properties,shared-data.json", + "spring.cloud.nacos.config.accessKey=test-accessKey", + "spring.cloud.nacos.config.secretKey=test-secretKey" }, webEnvironment = NONE) +public class NacosConfigurationXmlJsonTest { + + static { + + try { + + Method method = PowerMockito.method(NacosConfigService.class, "getConfig", + String.class, String.class, long.class); + MethodProxy.proxy(method, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) + throws Throwable { + + if ("xmlApp.xml".equals(args[0]) && "test-group".equals(args[1])) { + return "\n" + " one\n" + + " \n" + + " three\n" + " \n" + + ""; + } + if ("test-name.xml".equals(args[0]) && "test-group".equals(args[1])) { + return " \n" + + " \n" + + " \n" + + " 开启服务 \n" + + " 初始化一下 \n" + + " \n" + " \n" + + " one\n" + + " \n" + + " three\n" + + " \n" + + " \n" + " \n" + + " 销毁一下 \n" + + " 关闭服务 \n" + + " \n" + " \n" + + " "; + } + + if ("test-name-dev.xml".equals(args[0]) + && "test-group".equals(args[1])) { + return "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + " \n" + + ""; + } + + if ("ext-json-test.json".equals(args[0]) + && "DEFAULT_GROUP".equals(args[1])) { + return "{\n" + " \"people\":{\n" + + " \"firstName\":\"Brett\",\n" + + " \"lastName\":\"McLaughlin\"\n" + " }\n" + + "}"; + } + + if ("ext-config-common02.properties".equals(args[0]) + && "GLOBAL_GROUP".equals(args[1])) { + return "global-ext-config=global-config-value-2"; + } + + if ("shared-data1.properties".equals(args[0]) + && "DEFAULT_GROUP".equals(args[1])) { + return "shared-name=shared-value-1"; + } + + if ("shared-data.json".equals(args[0]) + && "DEFAULT_GROUP".equals(args[1])) { + return "{\n" + " \"test\" : {\n" + + " \"name\" : \"test\",\n" + + " \"list\" : [\n" + " {\n" + + " \"name\" :\"listname1\",\n" + + " \"age\":1\n" + " },\n" + + " {\n" + + " \"name\" :\"listname2\",\n" + + " \"age\":2\n" + " }\n" + + " ],\n" + " \"metadata\" : {\n" + + " \"intKey\" : 123,\n" + + " \"booleanKey\" : true\n" + " }\n" + + " }\n" + "}"; + } + + return ""; + } + }); + + } + catch (Exception ignore) { + ignore.printStackTrace(); + + } + } + + @Autowired + private NacosPropertySourceLocator locator; + + @Autowired + private NacosConfigProperties properties; + + @Autowired + private NacosRefreshHistory refreshHistory; + + @Autowired + private Environment environment; + + @Test + public void contextLoads() throws Exception { + + assertThat(locator).isNotNull(); + assertThat(properties).isNotNull(); + + checkoutNacosConfigServerAddr(); + checkoutNacosConfigNamespace(); + checkoutNacosConfigClusterName(); + checkoutNacosConfigAccessKey(); + checkoutNacosConfigSecrectKey(); + checkoutNacosConfigName(); + checkoutNacosConfigGroup(); + checkoutNacosConfigContextPath(); + checkoutNacosConfigFileExtension(); + checkoutNacosConfigTimeout(); + checkoutNacosConfigEncode(); + + checkoutEndpoint(); + + checkJsonParser(); + } + + private void checkJsonParser() { + assertThat(environment.getProperty("test.name", String.class)).isEqualTo("test"); + + assertThat(environment.getProperty("test.list[0].name", String.class)) + .isEqualTo("listname1"); + assertThat(environment.getProperty("test.list[0].age", Integer.class)) + .isEqualTo(1); + + assertThat(environment.getProperty("test.list[1].name", String.class)) + .isEqualTo("listname2"); + assertThat(environment.getProperty("test.list[1].age", Integer.class)) + .isEqualTo(2); + + assertThat( + (Integer) environment.getProperty("test.metadata.intKey", Object.class)) + .isEqualTo(123); + assertThat((Boolean) environment.getProperty("test.metadata.booleanKey", + Object.class)).isEqualTo(true); + } + + private void checkoutNacosConfigServerAddr() { + assertThat(properties.getServerAddr()).isEqualTo("127.0.0.1:8848"); + } + + private void checkoutNacosConfigNamespace() { + assertThat(properties.getNamespace()).isEqualTo("test-namespace"); + } + + private void checkoutNacosConfigClusterName() { + assertThat(properties.getClusterName()).isEqualTo("test-cluster"); + } + + private void checkoutNacosConfigAccessKey() { + assertThat(properties.getAccessKey()).isEqualTo("test-accessKey"); + } + + private void checkoutNacosConfigSecrectKey() { + assertThat(properties.getSecretKey()).isEqualTo("test-secretKey"); + } + + private void checkoutNacosConfigContextPath() { + assertThat(properties.getContextPath()).isEqualTo("test-contextpath"); + } + + private void checkoutNacosConfigName() { + assertThat(properties.getName()).isEqualTo("test-name"); + } + + private void checkoutNacosConfigGroup() { + assertThat(properties.getGroup()).isEqualTo("test-group"); + } + + private void checkoutNacosConfigFileExtension() { + assertThat(properties.getFileExtension()).isEqualTo("xml"); + } + + private void checkoutNacosConfigTimeout() { + assertThat(properties.getTimeout()).isEqualTo(1000); + } + + private void checkoutNacosConfigEncode() { + assertThat(properties.getEncode()).isEqualTo("utf-8"); + } + + private void checkoutEndpoint() throws Exception { + NacosConfigEndpoint nacosConfigEndpoint = new NacosConfigEndpoint(properties, + refreshHistory); + Map map = nacosConfigEndpoint.invoke(); + assertThat(properties).isEqualTo(map.get("NacosConfigProperties")); + assertThat(refreshHistory.getRecords()).isEqualTo(map.get("RefreshHistory")); + } + + @Configuration + @EnableAutoConfiguration + @ImportAutoConfiguration({ NacosConfigEndpointAutoConfiguration.class, + NacosConfigAutoConfiguration.class, NacosConfigBootstrapConfiguration.class }) + public static class TestConfig { + + } + +}