#1550 抽象出 spi 接口

This commit is contained in:
rushsky518 2019-11-26 21:35:05 +08:00
parent f535ab9846
commit 93773c47d6
8 changed files with 90 additions and 58 deletions

View File

@ -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;
}

View File

@ -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();) {

View File

@ -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;

View File

@ -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:

View File

@ -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);
}
}
return Collections.emptyMap();
} }
private static class ConfigChangeHandlerHolder { private List<ConfigChangeParser> parserList;
private final static ConfigChangeHandler INSTANCE = new ConfigChangeHandler();
}
private AbstractConfigChangeParser configChangeParser;
} }

View File

@ -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();

View File

@ -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 {
} }
} }

View File

@ -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;