#1550 抽象出 spi 接口
This commit is contained in:
parent
f535ab9846
commit
93773c47d6
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* 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 com.alibaba.nacos.api.config.listener;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ConfigChangeParser
|
||||||
|
*
|
||||||
|
* @author rushsky518
|
||||||
|
*/
|
||||||
|
public interface ConfigChangeParser {
|
||||||
|
/**
|
||||||
|
* judge type
|
||||||
|
* @param type
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
boolean isResponsibleFor(String type);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* compare old and new data
|
||||||
|
* @param oldContent
|
||||||
|
* @param newContent
|
||||||
|
* @param type
|
||||||
|
* @return
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
Map<String, Object> doParse(String oldContent, String newContent, String type) throws IOException;
|
||||||
|
}
|
@ -15,8 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.alibaba.nacos.client.config.impl;
|
package com.alibaba.nacos.client.config.impl;
|
||||||
|
|
||||||
import java.io.IOException;
|
import com.alibaba.nacos.api.config.listener.ConfigChangeParser;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -26,50 +26,18 @@ import java.util.Map;
|
|||||||
*
|
*
|
||||||
* @author rushsky518
|
* @author rushsky518
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractConfigChangeParser {
|
public abstract class AbstractConfigChangeParser implements ConfigChangeParser {
|
||||||
private String configType;
|
private String configType;
|
||||||
|
|
||||||
private AbstractConfigChangeParser next;
|
|
||||||
|
|
||||||
public AbstractConfigChangeParser(String configType) {
|
public AbstractConfigChangeParser(String configType) {
|
||||||
this.configType = configType;
|
this.configType = configType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AbstractConfigChangeParser addNext(AbstractConfigChangeParser configChangeParser) {
|
@Override
|
||||||
if (null == this.next) {
|
public boolean isResponsibleFor(String type) {
|
||||||
this.next = configChangeParser;
|
|
||||||
} else {
|
|
||||||
this.next.addNext(configChangeParser);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isResponsibleFor(String type) {
|
|
||||||
return this.configType.equalsIgnoreCase(type);
|
return this.configType.equalsIgnoreCase(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map parseChangeData(String oldContent, String newContent, String type) throws IOException {
|
|
||||||
if (isResponsibleFor(type)) {
|
|
||||||
return this.doParse(oldContent, newContent, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (null != this.next) {
|
|
||||||
return this.next.parseChangeData(oldContent, newContent, type);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Collections.emptyMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* parse and compare config data
|
|
||||||
* @param oldContent
|
|
||||||
* @param newContent
|
|
||||||
* @param type
|
|
||||||
* @return
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
protected abstract Map<String, Object> doParse(String oldContent, String newContent, String type) throws IOException;
|
|
||||||
|
|
||||||
protected Map filterChangeData(Map oldMap, Map newMap) {
|
protected Map filterChangeData(Map oldMap, Map newMap) {
|
||||||
Map<String, ConfigChangeItem> result = new HashMap<String, ConfigChangeItem>(16);
|
Map<String, ConfigChangeItem> result = new HashMap<String, ConfigChangeItem>(16);
|
||||||
for (Iterator<Map.Entry<String, Object>> entryItr = oldMap.entrySet().iterator(); entryItr.hasNext();) {
|
for (Iterator<Map.Entry<String, Object>> entryItr = oldMap.entrySet().iterator(); entryItr.hasNext();) {
|
||||||
|
@ -203,7 +203,7 @@ public class CacheData {
|
|||||||
|
|
||||||
// compare lastContent and content
|
// compare lastContent and content
|
||||||
if (listener instanceof AbstractConfigChangeListener) {
|
if (listener instanceof AbstractConfigChangeListener) {
|
||||||
Map data = ConfigChangeHandler.getChangeParserInstance().parseChangeData(listenerWrap.lastContent, content, type);
|
Map data = ConfigChangeHandler.getInstance().parseChangeData(listenerWrap.lastContent, content, type);
|
||||||
ConfigChangeEvent event = new ConfigChangeEvent(data);
|
ConfigChangeEvent event = new ConfigChangeEvent(data);
|
||||||
((AbstractConfigChangeListener)listener).receiveConfigChange(event);
|
((AbstractConfigChangeListener)listener).receiveConfigChange(event);
|
||||||
listenerWrap.lastContent = content;
|
listenerWrap.lastContent = content;
|
||||||
|
@ -17,6 +17,7 @@ package com.alibaba.nacos.client.config.impl;
|
|||||||
|
|
||||||
import com.alibaba.nacos.api.PropertyKeyConst;
|
import com.alibaba.nacos.api.PropertyKeyConst;
|
||||||
import com.alibaba.nacos.api.common.Constants;
|
import com.alibaba.nacos.api.common.Constants;
|
||||||
|
import com.alibaba.nacos.api.config.ConfigType;
|
||||||
import com.alibaba.nacos.api.config.listener.Listener;
|
import com.alibaba.nacos.api.config.listener.Listener;
|
||||||
import com.alibaba.nacos.api.exception.NacosException;
|
import com.alibaba.nacos.api.exception.NacosException;
|
||||||
import com.alibaba.nacos.client.config.common.GroupKey;
|
import com.alibaba.nacos.client.config.common.GroupKey;
|
||||||
@ -248,6 +249,8 @@ public class ClientWorker {
|
|||||||
ct[0] = result.content;
|
ct[0] = result.content;
|
||||||
if (result.headers.containsKey(CONFIG_TYPE)) {
|
if (result.headers.containsKey(CONFIG_TYPE)) {
|
||||||
ct[1] = result.headers.get(CONFIG_TYPE).get(0);
|
ct[1] = result.headers.get(CONFIG_TYPE).get(0);
|
||||||
|
} else {
|
||||||
|
ct[1] = ConfigType.TEXT.getType();
|
||||||
}
|
}
|
||||||
return ct;
|
return ct;
|
||||||
case HttpURLConnection.HTTP_NOT_FOUND:
|
case HttpURLConnection.HTTP_NOT_FOUND:
|
||||||
|
@ -15,28 +15,51 @@
|
|||||||
*/
|
*/
|
||||||
package com.alibaba.nacos.client.config.impl;
|
package com.alibaba.nacos.client.config.impl;
|
||||||
|
|
||||||
|
import com.alibaba.nacos.api.config.listener.ConfigChangeParser;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ServiceLoader;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ConfigChangeHandler
|
* ConfigChangeHandler
|
||||||
*
|
*
|
||||||
* @author rushsky518
|
* @author rushsky518
|
||||||
*/
|
*/
|
||||||
public class ConfigChangeHandler {
|
public class ConfigChangeHandler {
|
||||||
|
private static class ConfigChangeHandlerHolder {
|
||||||
|
private final static ConfigChangeHandler INSTANCE = new ConfigChangeHandler();
|
||||||
|
}
|
||||||
|
|
||||||
private ConfigChangeHandler() {
|
private ConfigChangeHandler() {
|
||||||
this.configChangeParser = new PropertiesChangeParser("properties").addNext(new YmlChangeParser("yaml"));
|
this.parserList = new LinkedList<ConfigChangeParser>();
|
||||||
|
|
||||||
|
ServiceLoader<ConfigChangeParser> loader = ServiceLoader.load(ConfigChangeParser.class);
|
||||||
|
if (loader.iterator().hasNext()) {
|
||||||
|
this.parserList.add(loader.iterator().next());
|
||||||
|
}
|
||||||
|
|
||||||
|
this.parserList.add(new PropertiesChangeParser());
|
||||||
|
this.parserList.add(new YmlChangeParser());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ConfigChangeHandler getInstance() {
|
public static ConfigChangeHandler getInstance() {
|
||||||
return ConfigChangeHandlerHolder.INSTANCE;
|
return ConfigChangeHandlerHolder.INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AbstractConfigChangeParser getChangeParserInstance() {
|
public Map parseChangeData(String oldContent, String newContent, String type) throws IOException {
|
||||||
return ConfigChangeHandlerHolder.INSTANCE.configChangeParser;
|
for (ConfigChangeParser changeParser: this.parserList) {
|
||||||
|
if (changeParser.isResponsibleFor(type)) {
|
||||||
|
return changeParser.doParse(oldContent, newContent, type);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class ConfigChangeHandlerHolder {
|
return Collections.emptyMap();
|
||||||
private final static ConfigChangeHandler INSTANCE = new ConfigChangeHandler();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private AbstractConfigChangeParser configChangeParser;
|
private List<ConfigChangeParser> parserList;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -28,13 +28,12 @@ import java.util.Properties;
|
|||||||
* @author rushsky518
|
* @author rushsky518
|
||||||
*/
|
*/
|
||||||
public class PropertiesChangeParser extends AbstractConfigChangeParser {
|
public class PropertiesChangeParser extends AbstractConfigChangeParser {
|
||||||
|
public PropertiesChangeParser() {
|
||||||
public PropertiesChangeParser(String configType) {
|
super("properties");
|
||||||
super(configType);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Map doParse(String oldContent, String newContent, String type) throws IOException {
|
public Map doParse(String oldContent, String newContent, String type) throws IOException {
|
||||||
Properties oldProps = new Properties();
|
Properties oldProps = new Properties();
|
||||||
Properties newProps = new Properties();
|
Properties newProps = new Properties();
|
||||||
|
|
||||||
|
@ -25,13 +25,12 @@ import java.util.*;
|
|||||||
* @author rushsky518
|
* @author rushsky518
|
||||||
*/
|
*/
|
||||||
public class YmlChangeParser extends AbstractConfigChangeParser {
|
public class YmlChangeParser extends AbstractConfigChangeParser {
|
||||||
|
public YmlChangeParser() {
|
||||||
public YmlChangeParser(String configType) {
|
super("yaml");
|
||||||
super(configType);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Map<String, Object> doParse(String oldContent, String newContent, String type) {
|
public Map<String, Object> doParse(String oldContent, String newContent, String type) {
|
||||||
Map<String, Object> oldMap = Collections.emptyMap();
|
Map<String, Object> oldMap = Collections.emptyMap();
|
||||||
Map<String, Object> newMap = Collections.emptyMap();
|
Map<String, Object> newMap = Collections.emptyMap();
|
||||||
|
|
||||||
@ -88,4 +87,3 @@ public class YmlChangeParser extends AbstractConfigChangeParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,9 +131,7 @@ public class ConfigServletInner {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
String configType = cacheItem.getType();
|
String configType = cacheItem.getType();
|
||||||
if (null != configType) {
|
response.setHeader("Config-Type", (null != configType) ? configType : "text");
|
||||||
response.setHeader("Config-Type", configType);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
File file = null;
|
File file = null;
|
||||||
ConfigInfoBase configInfoBase = null;
|
ConfigInfoBase configInfoBase = null;
|
||||||
|
Loading…
Reference in New Issue
Block a user