Compare commits
1 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
1dd6a4aaa8 |
|
|
@ -43,7 +43,7 @@ jobs:
|
|||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
distribution: 'zulu'
|
||||
java-version: 21
|
||||
java-version: 8
|
||||
- uses: actions/cache@v3
|
||||
name: "Cache local Maven repository"
|
||||
with:
|
||||
|
|
|
|||
|
|
@ -11,8 +11,6 @@ target/
|
|||
.settings/
|
||||
.project
|
||||
.classpath
|
||||
.externalToolBuilders
|
||||
maven-eclipse.xml
|
||||
|
||||
# idea ignore
|
||||
.idea/
|
||||
|
|
@ -52,6 +50,3 @@ dubbo-demo/dubbo-demo-triple/build/*
|
|||
|
||||
.git.exec.error
|
||||
|
||||
# log files generated by testcase.
|
||||
dubbo-rpc/dubbo-rpc-api/custom-access.log*
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ There's a [README](https://github.com/apache/dubbo-samples/blob/389cd612f1ea57ee
|
|||
|
||||
```xml
|
||||
<properties>
|
||||
<dubbo.version>3.2.13-SNAPSHOT</dubbo.version>
|
||||
<dubbo.version>3.2.11</dubbo.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
|
|
|
|||
|
|
@ -212,7 +212,7 @@ public class SingleRouterChain<T> {
|
|||
public RouterSnapshotNode<T> buildRouterSnapshot(
|
||||
URL url, BitList<Invoker<T>> availableInvokers, Invocation invocation) {
|
||||
BitList<Invoker<T>> resultInvokers = availableInvokers.clone();
|
||||
RouterSnapshotNode<T> parentNode = new RouterSnapshotNode<>("Parent", resultInvokers.clone());
|
||||
RouterSnapshotNode<T> parentNode = new RouterSnapshotNode<T>("Parent", resultInvokers.clone());
|
||||
parentNode.setNodeOutputInvokers(resultInvokers.clone());
|
||||
|
||||
// 1. route state router
|
||||
|
|
@ -227,7 +227,7 @@ public class SingleRouterChain<T> {
|
|||
return parentNode;
|
||||
}
|
||||
|
||||
RouterSnapshotNode<T> commonRouterNode = new RouterSnapshotNode<>("CommonRouter", resultInvokers.clone());
|
||||
RouterSnapshotNode<T> commonRouterNode = new RouterSnapshotNode<T>("CommonRouter", resultInvokers.clone());
|
||||
parentNode.appendNode(commonRouterNode);
|
||||
List<Invoker<T>> commonRouterResult = resultInvokers;
|
||||
|
||||
|
|
@ -237,7 +237,7 @@ public class SingleRouterChain<T> {
|
|||
List<Invoker<T>> inputInvokers = new ArrayList<>(commonRouterResult);
|
||||
|
||||
RouterSnapshotNode<T> currentNode =
|
||||
new RouterSnapshotNode<>(router.getClass().getSimpleName(), inputInvokers);
|
||||
new RouterSnapshotNode<T>(router.getClass().getSimpleName(), inputInvokers);
|
||||
|
||||
// append to router node chain
|
||||
commonRouterNode.appendNode(currentNode);
|
||||
|
|
|
|||
|
|
@ -223,7 +223,7 @@ public abstract class AbstractConfigurator implements Configurator {
|
|||
}
|
||||
|
||||
private Set<String> genConditionKeys() {
|
||||
Set<String> conditionKeys = new HashSet<>();
|
||||
Set<String> conditionKeys = new HashSet<String>();
|
||||
conditionKeys.add(CATEGORY_KEY);
|
||||
conditionKeys.add(Constants.CHECK_KEY);
|
||||
conditionKeys.add(DYNAMIC_KEY);
|
||||
|
|
|
|||
|
|
@ -46,7 +46,8 @@ public class ConsistentHashLoadBalance extends AbstractLoadBalance {
|
|||
*/
|
||||
public static final String HASH_ARGUMENTS = "hash.arguments";
|
||||
|
||||
private final ConcurrentMap<String, ConsistentHashSelector<?>> selectors = new ConcurrentHashMap<>();
|
||||
private final ConcurrentMap<String, ConsistentHashSelector<?>> selectors =
|
||||
new ConcurrentHashMap<String, ConsistentHashSelector<?>>();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
|
|
@ -74,7 +75,7 @@ public class ConsistentHashLoadBalance extends AbstractLoadBalance {
|
|||
private final int[] argumentIndex;
|
||||
|
||||
ConsistentHashSelector(List<Invoker<T>> invokers, String methodName, int identityHashCode) {
|
||||
this.virtualInvokers = new TreeMap<>();
|
||||
this.virtualInvokers = new TreeMap<Long, Invoker<T>>();
|
||||
this.identityHashCode = identityHashCode;
|
||||
URL url = invokers.get(0).getUrl();
|
||||
this.replicaNumber = url.getMethodParameter(methodName, HASH_NODES, 160);
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ public class MapMerger implements Merger<Map<?, ?>> {
|
|||
if (ArrayUtils.isEmpty(items)) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
Map<Object, Object> result = new HashMap<>();
|
||||
Map<Object, Object> result = new HashMap<Object, Object>();
|
||||
Stream.of(items).filter(Objects::nonNull).forEach(result::putAll);
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ public class MergerFactory implements ScopeModelAware {
|
|||
|
||||
private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(MergerFactory.class);
|
||||
|
||||
private ConcurrentMap<Class<?>, Merger<?>> MERGER_CACHE = new ConcurrentHashMap<>();
|
||||
private ConcurrentMap<Class<?>, Merger<?>> MERGER_CACHE = new ConcurrentHashMap<Class<?>, Merger<?>>();
|
||||
private ScopeModel scopeModel;
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ public class SetMerger implements Merger<Set<?>> {
|
|||
if (ArrayUtils.isEmpty(items)) {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
Set<Object> result = new HashSet<>();
|
||||
Set<Object> result = new HashSet<Object>();
|
||||
Stream.of(items).filter(Objects::nonNull).forEach(result::addAll);
|
||||
return result;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,6 @@ public class ConditionStateRouterFactory extends CacheableStateRouterFactory {
|
|||
|
||||
@Override
|
||||
protected <T> StateRouter<T> createRouter(Class<T> interfaceClass, URL url) {
|
||||
return new ConditionStateRouter<>(url);
|
||||
return new ConditionStateRouter<T>(url);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,6 +32,6 @@ public class ServiceStateRouterFactory extends CacheableStateRouterFactory {
|
|||
|
||||
@Override
|
||||
protected <T> StateRouter<T> createRouter(Class<T> interfaceClass, URL url) {
|
||||
return new ServiceStateRouter<>(url);
|
||||
return new ServiceStateRouter<T>(url);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -136,7 +136,7 @@ public class MeshRuleCache<T> {
|
|||
Collections.unmodifiableMap(totalSubsetMap),
|
||||
unmatchedInvokers);
|
||||
} else {
|
||||
return new MeshRuleCache<>(
|
||||
return new MeshRuleCache<T>(
|
||||
Collections.emptyList(), Collections.emptyMap(), Collections.emptyMap(), invokers);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,6 @@ public class MockStateRouterFactory implements StateRouterFactory {
|
|||
|
||||
@Override
|
||||
public <T> StateRouter<T> getRouter(Class<T> interfaceClass, URL url) {
|
||||
return new MockInvokersSelector<>(url);
|
||||
return new MockInvokersSelector<T>(url);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -93,23 +93,23 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
}
|
||||
|
||||
// Provided by BitList only
|
||||
public synchronized List<E> getOriginList() {
|
||||
public List<E> getOriginList() {
|
||||
return originList;
|
||||
}
|
||||
|
||||
public synchronized void addIndex(int index) {
|
||||
public void addIndex(int index) {
|
||||
this.rootSet.set(index);
|
||||
}
|
||||
|
||||
public synchronized int totalSetSize() {
|
||||
public int totalSetSize() {
|
||||
return this.originList.size();
|
||||
}
|
||||
|
||||
public synchronized boolean indexExist(int index) {
|
||||
public boolean indexExist(int index) {
|
||||
return this.rootSet.get(index);
|
||||
}
|
||||
|
||||
public synchronized E getByIndex(int index) {
|
||||
public E getByIndex(int index) {
|
||||
return this.originList.get(index);
|
||||
}
|
||||
|
||||
|
|
@ -120,7 +120,7 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
* @param target target bitList
|
||||
* @return this bitList only contains those elements contain in both two list and source bitList's tailList
|
||||
*/
|
||||
public synchronized BitList<E> and(BitList<E> target) {
|
||||
public BitList<E> and(BitList<E> target) {
|
||||
rootSet.and(target.rootSet);
|
||||
if (target.getTailList() != null) {
|
||||
target.getTailList().forEach(this::addToTailList);
|
||||
|
|
@ -128,28 +128,28 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
return this;
|
||||
}
|
||||
|
||||
public synchronized BitList<E> or(BitList<E> target) {
|
||||
public BitList<E> or(BitList<E> target) {
|
||||
BitSet resultSet = (BitSet) rootSet.clone();
|
||||
resultSet.or(target.rootSet);
|
||||
return new BitList<>(originList, resultSet, tailList);
|
||||
}
|
||||
|
||||
public synchronized boolean hasMoreElementInTailList() {
|
||||
public boolean hasMoreElementInTailList() {
|
||||
return CollectionUtils.isNotEmpty(tailList);
|
||||
}
|
||||
|
||||
public synchronized List<E> getTailList() {
|
||||
public List<E> getTailList() {
|
||||
return tailList;
|
||||
}
|
||||
|
||||
public synchronized void addToTailList(E e) {
|
||||
public void addToTailList(E e) {
|
||||
if (tailList == null) {
|
||||
tailList = new LinkedList<>();
|
||||
}
|
||||
tailList.add(e);
|
||||
}
|
||||
|
||||
public synchronized E randomSelectOne() {
|
||||
public E randomSelectOne() {
|
||||
int originSize = originList.size();
|
||||
int tailSize = tailList != null ? tailList.size() : 0;
|
||||
int totalSize = originSize + tailSize;
|
||||
|
|
@ -181,18 +181,18 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
|
||||
// Provided by JDK List interface
|
||||
@Override
|
||||
public synchronized int size() {
|
||||
public int size() {
|
||||
return rootSet.cardinality() + (CollectionUtils.isNotEmpty(tailList) ? tailList.size() : 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized boolean contains(Object o) {
|
||||
public boolean contains(Object o) {
|
||||
int idx = originList.indexOf(o);
|
||||
return (idx >= 0 && rootSet.get(idx)) || (CollectionUtils.isNotEmpty(tailList) && tailList.contains(o));
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized Iterator<E> iterator() {
|
||||
public Iterator<E> iterator() {
|
||||
return new BitListIterator<>(this, 0);
|
||||
}
|
||||
|
||||
|
|
@ -205,7 +205,7 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
* Notice: It is not recommended adding duplicated element.
|
||||
*/
|
||||
@Override
|
||||
public synchronized boolean add(E e) {
|
||||
public boolean add(E e) {
|
||||
int index = originList.indexOf(e);
|
||||
if (index > -1) {
|
||||
rootSet.set(index);
|
||||
|
|
@ -225,7 +225,7 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
* If the element is not contained in originList, try to remove from tailList.
|
||||
*/
|
||||
@Override
|
||||
public synchronized boolean remove(Object o) {
|
||||
public boolean remove(Object o) {
|
||||
int idx = originList.indexOf(o);
|
||||
if (idx > -1 && rootSet.get(idx)) {
|
||||
rootSet.set(idx, false);
|
||||
|
|
@ -242,7 +242,7 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
* This may change the default behaviour when adding new element later.
|
||||
*/
|
||||
@Override
|
||||
public synchronized void clear() {
|
||||
public void clear() {
|
||||
rootSet.clear();
|
||||
// to remove references
|
||||
originList = Collections.emptyList();
|
||||
|
|
@ -252,7 +252,7 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
}
|
||||
|
||||
@Override
|
||||
public synchronized E get(int index) {
|
||||
public E get(int index) {
|
||||
int bitIndex = -1;
|
||||
if (index < 0) {
|
||||
throw new IndexOutOfBoundsException();
|
||||
|
|
@ -272,7 +272,7 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
}
|
||||
|
||||
@Override
|
||||
public synchronized E remove(int index) {
|
||||
public E remove(int index) {
|
||||
int bitIndex = -1;
|
||||
if (index >= rootSet.cardinality()) {
|
||||
if (CollectionUtils.isNotEmpty(tailList)) {
|
||||
|
|
@ -290,7 +290,7 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
}
|
||||
|
||||
@Override
|
||||
public synchronized int indexOf(Object o) {
|
||||
public int indexOf(Object o) {
|
||||
int bitIndex = -1;
|
||||
for (int i = 0; i < rootSet.cardinality(); i++) {
|
||||
bitIndex = rootSet.nextSetBit(bitIndex + 1);
|
||||
|
|
@ -311,7 +311,7 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public synchronized boolean addAll(Collection<? extends E> c) {
|
||||
public boolean addAll(Collection<? extends E> c) {
|
||||
if (c instanceof BitList) {
|
||||
rootSet.or(((BitList<? extends E>) c).rootSet);
|
||||
if (((BitList<? extends E>) c).hasMoreElementInTailList()) {
|
||||
|
|
@ -325,7 +325,7 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
}
|
||||
|
||||
@Override
|
||||
public synchronized int lastIndexOf(Object o) {
|
||||
public int lastIndexOf(Object o) {
|
||||
int bitIndex = -1;
|
||||
int index = -1;
|
||||
if (CollectionUtils.isNotEmpty(tailList)) {
|
||||
|
|
@ -344,22 +344,22 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
}
|
||||
|
||||
@Override
|
||||
public synchronized boolean isEmpty() {
|
||||
public boolean isEmpty() {
|
||||
return this.rootSet.isEmpty() && CollectionUtils.isEmpty(tailList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized ListIterator<E> listIterator() {
|
||||
public ListIterator<E> listIterator() {
|
||||
return new BitListIterator<>(this, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized ListIterator<E> listIterator(int index) {
|
||||
public ListIterator<E> listIterator(int index) {
|
||||
return new BitListIterator<>(this, index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized BitList<E> subList(int fromIndex, int toIndex) {
|
||||
public BitList<E> subList(int fromIndex, int toIndex) {
|
||||
BitSet resultSet = (BitSet) rootSet.clone();
|
||||
List<E> copiedTailList = tailList == null ? null : new LinkedList<>(tailList);
|
||||
if (toIndex < size()) {
|
||||
|
|
@ -414,7 +414,7 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
}
|
||||
|
||||
@Override
|
||||
public synchronized boolean hasNext() {
|
||||
public boolean hasNext() {
|
||||
if (isInTailList) {
|
||||
return tailListIterator.hasNext();
|
||||
} else {
|
||||
|
|
@ -428,7 +428,7 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
}
|
||||
|
||||
@Override
|
||||
public synchronized E next() {
|
||||
public E next() {
|
||||
if (isInTailList) {
|
||||
if (tailListIterator.hasNext()) {
|
||||
index += 1;
|
||||
|
|
@ -457,7 +457,7 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
}
|
||||
|
||||
@Override
|
||||
public synchronized boolean hasPrevious() {
|
||||
public boolean hasPrevious() {
|
||||
if (isInTailList) {
|
||||
boolean hasPreviousInTailList = tailListIterator.hasPrevious();
|
||||
if (hasPreviousInTailList) {
|
||||
|
|
@ -471,7 +471,7 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
}
|
||||
|
||||
@Override
|
||||
public synchronized E previous() {
|
||||
public E previous() {
|
||||
if (isInTailList) {
|
||||
boolean hasPreviousInTailList = tailListIterator.hasPrevious();
|
||||
if (hasPreviousInTailList) {
|
||||
|
|
@ -503,17 +503,17 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
}
|
||||
|
||||
@Override
|
||||
public synchronized int nextIndex() {
|
||||
public int nextIndex() {
|
||||
return hasNext() ? index + 1 : index;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized int previousIndex() {
|
||||
public int previousIndex() {
|
||||
return index;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void remove() {
|
||||
public void remove() {
|
||||
if (lastReturnedIndex == -1) {
|
||||
throw new IllegalStateException();
|
||||
} else {
|
||||
|
|
@ -533,17 +533,17 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
}
|
||||
|
||||
@Override
|
||||
public synchronized void set(E e) {
|
||||
public void set(E e) {
|
||||
throw new UnsupportedOperationException("Set method is not supported in BitListIterator!");
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void add(E e) {
|
||||
public void add(E e) {
|
||||
throw new UnsupportedOperationException("Add method is not supported in BitListIterator!");
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized ArrayList<E> cloneToArrayList() {
|
||||
public ArrayList<E> cloneToArrayList() {
|
||||
if (rootSet.cardinality() == originList.size() && (CollectionUtils.isEmpty(tailList))) {
|
||||
return new ArrayList<>(originList);
|
||||
}
|
||||
|
|
@ -553,7 +553,7 @@ public class BitList<E> extends AbstractList<E> implements Cloneable {
|
|||
}
|
||||
|
||||
@Override
|
||||
public synchronized BitList<E> clone() {
|
||||
public BitList<E> clone() {
|
||||
return new BitList<>(
|
||||
originList, (BitSet) rootSet.clone(), tailList == null ? null : new LinkedList<>(tailList));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,6 +31,6 @@ public class TagStateRouterFactory extends CacheableStateRouterFactory {
|
|||
|
||||
@Override
|
||||
protected <T> StateRouter<T> createRouter(Class<T> interfaceClass, URL url) {
|
||||
return new TagStateRouter<>(url);
|
||||
return new TagStateRouter<T>(url);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,8 +63,8 @@ public class FailoverClusterInvoker<T> extends AbstractClusterInvoker<T> {
|
|||
int len = calculateInvokeTimes(methodName);
|
||||
// retry loop.
|
||||
RpcException le = null; // last exception.
|
||||
List<Invoker<T>> invoked = new ArrayList<>(copyInvokers.size()); // invoked invokers.
|
||||
Set<String> providers = new HashSet<>(len);
|
||||
List<Invoker<T>> invoked = new ArrayList<Invoker<T>>(copyInvokers.size()); // invoked invokers.
|
||||
Set<String> providers = new HashSet<String>(len);
|
||||
for (int i = 0; i < len; i++) {
|
||||
// Reselect before retry to avoid a change of candidate `invokers`.
|
||||
// NOTE: if `invokers` changed, then `invoked` also lose accuracy.
|
||||
|
|
|
|||
|
|
@ -26,6 +26,6 @@ public class MergeableCluster extends AbstractCluster {
|
|||
|
||||
@Override
|
||||
public <T> AbstractClusterInvoker<T> doJoin(Directory<T> directory) throws RpcException {
|
||||
return new MergeableClusterInvoker<>(directory);
|
||||
return new MergeableClusterInvoker<T>(directory);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,6 +27,6 @@ public class ZoneAwareCluster extends AbstractCluster {
|
|||
|
||||
@Override
|
||||
protected <T> AbstractClusterInvoker<T> doJoin(Directory<T> directory) throws RpcException {
|
||||
return new ZoneAwareClusterInvoker<>(directory);
|
||||
return new ZoneAwareClusterInvoker<T>(directory);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ public class MockClusterWrapper implements Cluster {
|
|||
|
||||
@Override
|
||||
public <T> Invoker<T> join(Directory<T> directory, boolean buildFilterChain) throws RpcException {
|
||||
return new MockClusterInvoker<>(directory, this.cluster.join(directory, buildFilterChain));
|
||||
return new MockClusterInvoker<T>(directory, this.cluster.join(directory, buildFilterChain));
|
||||
}
|
||||
|
||||
public Cluster getCluster() {
|
||||
|
|
|
|||
|
|
@ -22,8 +22,6 @@ import java.util.HashSet;
|
|||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
|
@ -578,44 +576,4 @@ class BitListTest {
|
|||
set.add(new LinkedList<>(Arrays.asList("A", "B", "C", "D", "E", "F", "G")));
|
||||
Assertions.assertEquals(2, set.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testConcurrent() throws InterruptedException {
|
||||
for (int i = 0; i < 100000; i++) {
|
||||
BitList<String> bitList = new BitList<>(Collections.singletonList("test"));
|
||||
bitList.remove("test");
|
||||
|
||||
CountDownLatch countDownLatch = new CountDownLatch(1);
|
||||
CountDownLatch countDownLatch2 = new CountDownLatch(2);
|
||||
|
||||
Thread thread1 = new Thread(() -> {
|
||||
try {
|
||||
countDownLatch.await();
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
bitList.add("test");
|
||||
countDownLatch2.countDown();
|
||||
});
|
||||
|
||||
AtomicReference<BitList<String>> ref = new AtomicReference<>();
|
||||
Thread thread2 = new Thread(() -> {
|
||||
try {
|
||||
countDownLatch.await();
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
ref.set(bitList.clone());
|
||||
countDownLatch2.countDown();
|
||||
});
|
||||
|
||||
thread1.start();
|
||||
thread2.start();
|
||||
|
||||
countDownLatch.countDown();
|
||||
countDownLatch2.await();
|
||||
|
||||
Assertions.assertDoesNotThrow(() -> ref.get().iterator().hasNext());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1295,19 +1295,6 @@ public /*final**/ class URL implements Serializable {
|
|||
return serviceNameBuilder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* The format is "{interface}:[version]"
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public String getCompatibleColonSeparatedKey() {
|
||||
StringBuilder serviceNameBuilder = new StringBuilder();
|
||||
serviceNameBuilder.append(this.getServiceInterface());
|
||||
compatibleAppend(serviceNameBuilder, VERSION_KEY);
|
||||
compatibleAppend(serviceNameBuilder, GROUP_KEY);
|
||||
return serviceNameBuilder.toString();
|
||||
}
|
||||
|
||||
private void append(StringBuilder target, String parameterName, boolean first) {
|
||||
String parameterValue = this.getParameter(parameterName);
|
||||
if (!isBlank(parameterValue)) {
|
||||
|
|
@ -1320,14 +1307,6 @@ public /*final**/ class URL implements Serializable {
|
|||
}
|
||||
}
|
||||
|
||||
private void compatibleAppend(StringBuilder target, String parameterName) {
|
||||
String parameterValue = this.getParameter(parameterName);
|
||||
if (!isBlank(parameterValue)) {
|
||||
target.append(':');
|
||||
target.append(parameterValue);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The format of return value is '{group}/{interfaceName}:{version}'
|
||||
*
|
||||
|
|
@ -1397,10 +1376,6 @@ public /*final**/ class URL implements Serializable {
|
|||
return buildString(true, false, true, true);
|
||||
}
|
||||
|
||||
public String toServiceString(String... parameters) {
|
||||
return buildString(true, true, true, true, parameters);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public String getServiceName() {
|
||||
return getServiceInterface();
|
||||
|
|
|
|||
|
|
@ -16,7 +16,6 @@
|
|||
*/
|
||||
package org.apache.dubbo.common;
|
||||
|
||||
import org.apache.dubbo.common.constants.CommonConstants;
|
||||
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
|
||||
import org.apache.dubbo.common.logger.LoggerFactory;
|
||||
import org.apache.dubbo.common.utils.StringUtils;
|
||||
|
|
@ -61,7 +60,7 @@ public final class Version {
|
|||
public static final int LOWEST_VERSION_FOR_RESPONSE_ATTACHMENT = 2000200; // 2.0.2
|
||||
|
||||
public static final int HIGHEST_PROTOCOL_VERSION = 2009900; // 2.0.99
|
||||
private static final Map<String, Integer> VERSION2INT = new HashMap<>();
|
||||
private static final Map<String, Integer> VERSION2INT = new HashMap<String, Integer>();
|
||||
|
||||
static {
|
||||
// get dubbo version and last commit id
|
||||
|
|
@ -85,8 +84,7 @@ public final class Version {
|
|||
}
|
||||
|
||||
private static void tryLoadVersionFromResource() throws IOException {
|
||||
Enumeration<URL> configLoader =
|
||||
Version.class.getClassLoader().getResources(CommonConstants.DUBBO_VERSIONS_KEY + "/dubbo-common");
|
||||
Enumeration<URL> configLoader = Version.class.getClassLoader().getResources("META-INF/versions/dubbo-common");
|
||||
if (configLoader.hasMoreElements()) {
|
||||
URL url = configLoader.nextElement();
|
||||
try (BufferedReader reader =
|
||||
|
|
@ -314,7 +312,7 @@ public final class Version {
|
|||
|
||||
private static void checkArtifact(String artifactId) throws IOException {
|
||||
Enumeration<URL> artifactEnumeration =
|
||||
Version.class.getClassLoader().getResources(CommonConstants.DUBBO_VERSIONS_KEY + artifactId);
|
||||
Version.class.getClassLoader().getResources("META-INF/versions/" + artifactId);
|
||||
while (artifactEnumeration.hasMoreElements()) {
|
||||
URL url = artifactEnumeration.nextElement();
|
||||
try (BufferedReader reader =
|
||||
|
|
@ -350,7 +348,7 @@ public final class Version {
|
|||
|
||||
private static Set<String> loadArtifactIds() throws IOException {
|
||||
Enumeration<URL> artifactsEnumeration =
|
||||
Version.class.getClassLoader().getResources(CommonConstants.DUBBO_VERSIONS_KEY + "/.artifacts");
|
||||
Version.class.getClassLoader().getResources("META-INF/versions/.artifacts");
|
||||
Set<String> artifactIds = new HashSet<>();
|
||||
while (artifactsEnumeration.hasMoreElements()) {
|
||||
URL url = artifactsEnumeration.nextElement();
|
||||
|
|
|
|||
|
|
@ -25,13 +25,11 @@ import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
|
|||
import org.apache.dubbo.common.logger.LoggerFactory;
|
||||
import org.apache.dubbo.common.resource.Disposable;
|
||||
import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
|
||||
import org.apache.dubbo.common.utils.ConcurrentHashSet;
|
||||
import org.apache.dubbo.common.utils.StringUtils;
|
||||
import org.apache.dubbo.rpc.model.ScopeModelAccessor;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
|
@ -55,7 +53,7 @@ public class ScopeBeanFactory {
|
|||
private final List<BeanInfo> registeredBeanInfos = new CopyOnWriteArrayList<>();
|
||||
private InstantiationStrategy instantiationStrategy;
|
||||
private final AtomicBoolean destroyed = new AtomicBoolean();
|
||||
private final Set<Class<?>> registeredClasses = new ConcurrentHashSet<>();
|
||||
private List<Class<?>> registeredClasses = new ArrayList<>();
|
||||
|
||||
public ScopeBeanFactory(ScopeBeanFactory parent, ExtensionAccessor extensionAccessor) {
|
||||
this.parent = parent;
|
||||
|
|
@ -301,7 +299,7 @@ public class ScopeBeanFactory {
|
|||
}
|
||||
}
|
||||
|
||||
public Set<Class<?>> getRegisteredClasses() {
|
||||
public List<Class<?>> getRegisteredClasses() {
|
||||
return registeredClasses;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ import java.util.Map;
|
|||
public final class JavaBeanSerializeUtil {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(JavaBeanSerializeUtil.class);
|
||||
private static final Map<String, Class<?>> TYPES = new HashMap<>();
|
||||
private static final Map<String, Class<?>> TYPES = new HashMap<String, Class<?>>();
|
||||
private static final String ARRAY_PREFIX = "[";
|
||||
private static final String REFERENCE_TYPE_PREFIX = "L";
|
||||
private static final String REFERENCE_TYPE_SUFFIX = ";";
|
||||
|
|
@ -72,7 +72,7 @@ public final class JavaBeanSerializeUtil {
|
|||
if (obj instanceof JavaBeanDescriptor) {
|
||||
return (JavaBeanDescriptor) obj;
|
||||
}
|
||||
IdentityHashMap<Object, JavaBeanDescriptor> cache = new IdentityHashMap<>();
|
||||
IdentityHashMap<Object, JavaBeanDescriptor> cache = new IdentityHashMap<Object, JavaBeanDescriptor>();
|
||||
return createDescriptorIfAbsent(obj, accessor, cache);
|
||||
}
|
||||
|
||||
|
|
@ -209,7 +209,7 @@ public final class JavaBeanSerializeUtil {
|
|||
if (beanDescriptor == null) {
|
||||
return null;
|
||||
}
|
||||
IdentityHashMap<JavaBeanDescriptor, Object> cache = new IdentityHashMap<>();
|
||||
IdentityHashMap<JavaBeanDescriptor, Object> cache = new IdentityHashMap<JavaBeanDescriptor, Object>();
|
||||
Object result = instantiateForDeserialize(beanDescriptor, loader, cache);
|
||||
deserializeInternal(result, beanDescriptor, loader, cache);
|
||||
return result;
|
||||
|
|
|
|||
|
|
@ -120,7 +120,7 @@ public abstract class Mixin {
|
|||
|
||||
Class<?> neighbor = null;
|
||||
// impl methods.
|
||||
Set<String> worked = new HashSet<>();
|
||||
Set<String> worked = new HashSet<String>();
|
||||
for (int i = 0; i < ics.length; i++) {
|
||||
if (!Modifier.isPublic(ics[i].getModifiers())) {
|
||||
String npkg = ics[i].getPackage().getName();
|
||||
|
|
|
|||
|
|
@ -42,8 +42,8 @@ import javassist.CtMethod;
|
|||
* Wrapper.
|
||||
*/
|
||||
public abstract class Wrapper {
|
||||
// class wrapper map
|
||||
private static final ConcurrentMap<Class<?>, Wrapper> WRAPPER_MAP = new ConcurrentHashMap<>();
|
||||
private static final ConcurrentMap<Class<?>, Wrapper> WRAPPER_MAP =
|
||||
new ConcurrentHashMap<Class<?>, Wrapper>(); // class wrapper map
|
||||
private static final String[] EMPTY_STRING_ARRAY = new String[0];
|
||||
private static final String[] OBJECT_METHODS = new String[] {"getClass", "hashCode", "toString", "equals"};
|
||||
private static final Wrapper OBJECT_WRAPPER = new Wrapper() {
|
||||
|
|
|
|||
|
|
@ -392,7 +392,7 @@ public class ClassUtils {
|
|||
}
|
||||
|
||||
public static <K, V> Map<K, V> toMap(Map.Entry<K, V>[] entries) {
|
||||
Map<K, V> map = new HashMap<>();
|
||||
Map<K, V> map = new HashMap<K, V>();
|
||||
if (entries != null && entries.length > 0) {
|
||||
for (Map.Entry<K, V> entry : entries) {
|
||||
map.put(entry.getKey(), entry.getValue());
|
||||
|
|
|
|||
|
|
@ -31,9 +31,10 @@ import java.io.StringReader;
|
|||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Properties;
|
||||
|
|
@ -42,7 +43,6 @@ import java.util.Set;
|
|||
import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_SERVER_SHUTDOWN_TIMEOUT;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_SECONDS_KEY;
|
||||
import static org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_PROPERTY_TYPE_MISMATCH;
|
||||
|
||||
/**
|
||||
* Utilities for manipulating configurations from different sources
|
||||
|
|
@ -57,18 +57,18 @@ public final class ConfigurationUtils {
|
|||
}
|
||||
|
||||
private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(ConfigurationUtils.class);
|
||||
private static final Set<String> securityKey;
|
||||
private static final List<String> securityKey;
|
||||
|
||||
private static volatile long expectedShutdownTime = Long.MAX_VALUE;
|
||||
|
||||
static {
|
||||
Set<String> keys = new HashSet<>();
|
||||
List<String> keys = new LinkedList<>();
|
||||
keys.add("accesslog");
|
||||
keys.add("router");
|
||||
keys.add("rule");
|
||||
keys.add("runtime");
|
||||
keys.add("type");
|
||||
securityKey = Collections.unmodifiableSet(keys);
|
||||
securityKey = Collections.unmodifiableList(keys);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -213,15 +213,11 @@ public final class ConfigurationUtils {
|
|||
properties.load(new StringReader(content));
|
||||
properties.stringPropertyNames().forEach(k -> {
|
||||
boolean deny = false;
|
||||
// check whether property name is safe or not based on the last fragment kebab-case comparison.
|
||||
String[] fragments = k.split("\\.");
|
||||
if (securityKey.contains(StringUtils.convertToSplitName(fragments[fragments.length - 1], "-"))) {
|
||||
deny = true;
|
||||
logger.warn(
|
||||
COMMON_PROPERTY_TYPE_MISMATCH,
|
||||
"security properties are not allowed to be set",
|
||||
"",
|
||||
String.format("'%s' is not allowed to be set as it is on the security key list.", k));
|
||||
for (String key : securityKey) {
|
||||
if (k.contains(key)) {
|
||||
deny = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!deny) {
|
||||
map.put(k, properties.getProperty(k));
|
||||
|
|
|
|||
|
|
@ -24,7 +24,6 @@ import java.util.concurrent.ExecutorService;
|
|||
import java.util.regex.Pattern;
|
||||
|
||||
public interface CommonConstants {
|
||||
|
||||
String DUBBO = "dubbo";
|
||||
|
||||
String TRIPLE = "tri";
|
||||
|
|
@ -268,14 +267,12 @@ public interface CommonConstants {
|
|||
String $INVOKE = "$invoke";
|
||||
|
||||
String $INVOKE_ASYNC = "$invokeAsync";
|
||||
|
||||
String GENERIC_PARAMETER_DESC = "Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;";
|
||||
|
||||
/**
|
||||
* echo call
|
||||
*/
|
||||
String $ECHO = "$echo";
|
||||
|
||||
/**
|
||||
* package version in the manifest
|
||||
*/
|
||||
|
|
@ -286,19 +283,12 @@ public interface CommonConstants {
|
|||
int MAX_PROXY_COUNT = 65535;
|
||||
|
||||
String MONITOR_KEY = "monitor";
|
||||
|
||||
String BACKGROUND_KEY = "background";
|
||||
|
||||
String CLUSTER_KEY = "cluster";
|
||||
|
||||
String USERNAME_KEY = "username";
|
||||
|
||||
String PASSWORD_KEY = "password";
|
||||
|
||||
String HOST_KEY = "host";
|
||||
|
||||
String PORT_KEY = "port";
|
||||
|
||||
String DUBBO_IP_TO_BIND = "DUBBO_IP_TO_BIND";
|
||||
|
||||
/**
|
||||
|
|
@ -318,29 +308,21 @@ public interface CommonConstants {
|
|||
String SHUTDOWN_WAIT_SECONDS_KEY = "dubbo.service.shutdown.wait.seconds";
|
||||
|
||||
String SHUTDOWN_WAIT_KEY = "dubbo.service.shutdown.wait";
|
||||
|
||||
String DUBBO_PROTOCOL = "dubbo";
|
||||
|
||||
String DUBBO_LABELS = "dubbo.labels";
|
||||
|
||||
String DUBBO_ENV_KEYS = "dubbo.env.keys";
|
||||
|
||||
String CONFIG_CONFIGFILE_KEY = "config-file";
|
||||
|
||||
String CONFIG_ENABLE_KEY = "highest-priority";
|
||||
|
||||
String CONFIG_NAMESPACE_KEY = "namespace";
|
||||
|
||||
String CHECK_KEY = "check";
|
||||
|
||||
String BACKLOG_KEY = "backlog";
|
||||
|
||||
String HEARTBEAT_EVENT = null;
|
||||
|
||||
String MOCK_HEARTBEAT_EVENT = "H";
|
||||
|
||||
String READONLY_EVENT = "R";
|
||||
|
||||
String WRITEABLE_EVENT = "W";
|
||||
|
||||
String REFERENCE_FILTER_KEY = "reference.filter";
|
||||
|
|
@ -477,7 +459,6 @@ public interface CommonConstants {
|
|||
String REGISTRY_DELAY_NOTIFICATION_KEY = "delay-notification";
|
||||
|
||||
String CACHE_CLEAR_TASK_INTERVAL = "dubbo.application.url.cache.task.interval";
|
||||
|
||||
String CACHE_CLEAR_WAITING_THRESHOLD = "dubbo.application.url.cache.clear.waiting";
|
||||
|
||||
String CLUSTER_INTERCEPTOR_COMPATIBLE_KEY = "dubbo.application.cluster.interceptor.compatible";
|
||||
|
|
@ -634,18 +615,17 @@ public interface CommonConstants {
|
|||
String SERVICE_EXECUTOR = "service-executor";
|
||||
|
||||
String EXECUTOR_MANAGEMENT_MODE = "executor-management-mode";
|
||||
|
||||
String EXECUTOR_MANAGEMENT_MODE_DEFAULT = "default";
|
||||
|
||||
String EXECUTOR_MANAGEMENT_MODE_ISOLATION = "isolation";
|
||||
|
||||
/**
|
||||
*
|
||||
* used in JVMUtil.java ,Control stack print lines, default is 32 lines
|
||||
*
|
||||
*/
|
||||
String DUBBO_JSTACK_MAXLINE = "dubbo.jstack-dump.max-line";
|
||||
|
||||
String ENCODE_IN_IO_THREAD_KEY = "encode.in.io";
|
||||
|
||||
boolean DEFAULT_ENCODE_IN_IO_THREAD = false;
|
||||
|
||||
/**
|
||||
|
|
@ -666,8 +646,4 @@ public interface CommonConstants {
|
|||
String DUBBO_MANUAL_REGISTER_KEY = "dubbo.application.manual-register";
|
||||
|
||||
String DUBBO2_COMPACT_ENABLE = "dubbo.compact.enable";
|
||||
|
||||
String ZOOKEEPER_ENSEMBLE_TRACKER_KEY = "zookeeper.ensemble.tracker";
|
||||
|
||||
String DUBBO_VERSIONS_KEY = "META-INF/dubbo-versions";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -141,11 +141,4 @@ public interface RegistryConstants {
|
|||
String ENABLE_EMPTY_PROTECTION_KEY = "enable-empty-protection";
|
||||
boolean DEFAULT_ENABLE_EMPTY_PROTECTION = false;
|
||||
String REGISTER_CONSUMER_URL_KEY = "register-consumer-url";
|
||||
|
||||
/**
|
||||
* export noting suffix servicename
|
||||
* by default, dubbo export servicename is "${interface}:${version}:", this servicename with ':' suffix
|
||||
* for compatible, we should export noting suffix servicename, eg: ${interface}:${version}
|
||||
*/
|
||||
String NACOE_REGISTER_COMPATIBLE = "nacos.register-compatible";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,8 +23,6 @@ import java.util.Map;
|
|||
public interface JSON {
|
||||
boolean isSupport();
|
||||
|
||||
boolean isJson(String json);
|
||||
|
||||
<T> T toJavaObject(String json, Type type);
|
||||
|
||||
<T> List<T> toJavaList(String json, Class<T> clazz);
|
||||
|
|
|
|||
|
|
@ -19,17 +19,9 @@ package org.apache.dubbo.common.json.impl;
|
|||
import java.lang.reflect.Type;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.fastjson2.JSONValidator;
|
||||
import com.alibaba.fastjson2.JSONWriter;
|
||||
|
||||
public class FastJson2Impl extends AbstractJSONImpl {
|
||||
|
||||
@Override
|
||||
public boolean isJson(String json) {
|
||||
JSONValidator validator = JSONValidator.from(json);
|
||||
return validator.validate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T toJavaObject(String json, Type type) {
|
||||
return com.alibaba.fastjson2.JSON.parseObject(json, type);
|
||||
|
|
|
|||
|
|
@ -23,16 +23,6 @@ import com.alibaba.fastjson.serializer.SerializerFeature;
|
|||
|
||||
public class FastJsonImpl extends AbstractJSONImpl {
|
||||
|
||||
@Override
|
||||
public boolean isJson(String json) {
|
||||
try {
|
||||
Object obj = com.alibaba.fastjson.JSON.parse(json);
|
||||
return obj instanceof com.alibaba.fastjson.JSONObject || obj instanceof com.alibaba.fastjson.JSONArray;
|
||||
} catch (com.alibaba.fastjson.JSONException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T toJavaObject(String json, Type type) {
|
||||
return com.alibaba.fastjson.JSON.parseObject(json, type);
|
||||
|
|
|
|||
|
|
@ -20,25 +20,12 @@ import java.lang.reflect.Type;
|
|||
import java.util.List;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.google.gson.JsonSyntaxException;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
|
||||
public class GsonImpl extends AbstractJSONImpl {
|
||||
// weak reference of com.google.gson.Gson, prevent throw exception when init
|
||||
private volatile Object gsonCache = null;
|
||||
|
||||
@Override
|
||||
public boolean isJson(String json) {
|
||||
try {
|
||||
JsonElement jsonElement = JsonParser.parseString(json);
|
||||
return jsonElement.isJsonObject() || jsonElement.isJsonArray();
|
||||
} catch (JsonSyntaxException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T toJavaObject(String json, Type type) {
|
||||
return getGson().fromJson(json, type);
|
||||
|
|
|
|||
|
|
@ -20,9 +20,7 @@ import java.lang.reflect.Type;
|
|||
import java.util.List;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude.Include;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.MapperFeature;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.json.JsonMapper;
|
||||
|
|
@ -33,16 +31,6 @@ public class JacksonImpl extends AbstractJSONImpl {
|
|||
|
||||
private volatile Object jacksonCache = null;
|
||||
|
||||
@Override
|
||||
public boolean isJson(String json) {
|
||||
try {
|
||||
JsonNode node = objectMapper.readTree(json);
|
||||
return node.isObject() || node.isArray();
|
||||
} catch (JsonProcessingException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T toJavaObject(String json, Type type) {
|
||||
try {
|
||||
|
|
|
|||
|
|
@ -34,6 +34,4 @@ public interface DataStore {
|
|||
void put(String componentName, String key, Object value);
|
||||
|
||||
void remove(String componentName, String key);
|
||||
|
||||
default void addListener(DataStoreUpdateListener dataStoreUpdateListener) {}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,21 +0,0 @@
|
|||
/*
|
||||
* 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.dubbo.common.store;
|
||||
|
||||
public interface DataStoreUpdateListener {
|
||||
void onUpdate(String componentName, String key, Object value);
|
||||
}
|
||||
|
|
@ -16,13 +16,8 @@
|
|||
*/
|
||||
package org.apache.dubbo.common.store.support;
|
||||
|
||||
import org.apache.dubbo.common.constants.LoggerCodeConstants;
|
||||
import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
|
||||
import org.apache.dubbo.common.logger.LoggerFactory;
|
||||
import org.apache.dubbo.common.store.DataStore;
|
||||
import org.apache.dubbo.common.store.DataStoreUpdateListener;
|
||||
import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
|
||||
import org.apache.dubbo.common.utils.ConcurrentHashSet;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
|
@ -30,11 +25,9 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||
import java.util.concurrent.ConcurrentMap;
|
||||
|
||||
public class SimpleDataStore implements DataStore {
|
||||
private static final ErrorTypeAwareLogger logger = LoggerFactory.getErrorTypeAwareLogger(SimpleDataStore.class);
|
||||
|
||||
// <component name or id, <data-name, data-value>>
|
||||
private final ConcurrentMap<String, ConcurrentMap<String, Object>> data = new ConcurrentHashMap<>();
|
||||
private final ConcurrentHashSet<DataStoreUpdateListener> listeners = new ConcurrentHashSet<>();
|
||||
|
||||
@Override
|
||||
public Map<String, Object> get(String componentName) {
|
||||
|
|
@ -59,7 +52,6 @@ public class SimpleDataStore implements DataStore {
|
|||
Map<String, Object> componentData =
|
||||
ConcurrentHashMapUtils.computeIfAbsent(data, componentName, k -> new ConcurrentHashMap<>());
|
||||
componentData.put(key, value);
|
||||
notifyListeners(componentName, key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -68,27 +60,5 @@ public class SimpleDataStore implements DataStore {
|
|||
return;
|
||||
}
|
||||
data.get(componentName).remove(key);
|
||||
notifyListeners(componentName, key, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addListener(DataStoreUpdateListener dataStoreUpdateListener) {
|
||||
listeners.add(dataStoreUpdateListener);
|
||||
}
|
||||
|
||||
private void notifyListeners(String componentName, String key, Object value) {
|
||||
for (DataStoreUpdateListener listener : listeners) {
|
||||
try {
|
||||
listener.onUpdate(componentName, key, value);
|
||||
} catch (Throwable t) {
|
||||
logger.warn(
|
||||
LoggerCodeConstants.INTERNAL_ERROR,
|
||||
"",
|
||||
"",
|
||||
"Failed to notify data store update listener. " + "ComponentName: " + componentName + " Key: "
|
||||
+ key,
|
||||
t);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ public final class InternalThreadLocalMap {
|
|||
|
||||
private Object[] indexedVariables;
|
||||
|
||||
private static ThreadLocal<InternalThreadLocalMap> slowThreadLocalMap = new ThreadLocal<>();
|
||||
private static ThreadLocal<InternalThreadLocalMap> slowThreadLocalMap = new ThreadLocal<InternalThreadLocalMap>();
|
||||
|
||||
private static final AtomicInteger NEXT_INDEX = new AtomicInteger();
|
||||
|
||||
|
|
|
|||
|
|
@ -427,7 +427,7 @@ public class HashedWheelTimer implements Timer {
|
|||
}
|
||||
|
||||
private final class Worker implements Runnable {
|
||||
private final Set<Timeout> unprocessedTimeouts = new HashSet<>();
|
||||
private final Set<Timeout> unprocessedTimeouts = new HashSet<Timeout>();
|
||||
|
||||
private long tick;
|
||||
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ public class CIDRUtils {
|
|||
|
||||
private byte[] toBytes(byte[] array, int targetSize) {
|
||||
int counter = 0;
|
||||
List<Byte> newArr = new ArrayList<>();
|
||||
List<Byte> newArr = new ArrayList<Byte>();
|
||||
while (counter < targetSize && (array.length - 1 - counter >= 0)) {
|
||||
newArr.add(0, array[array.length - 1 - counter]);
|
||||
counter++;
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ public class ConfigUtils {
|
|||
*/
|
||||
public static List<String> mergeValues(
|
||||
ExtensionDirector extensionDirector, Class<?> type, String cfg, List<String> def) {
|
||||
List<String> defaults = new ArrayList<>();
|
||||
List<String> defaults = new ArrayList<String>();
|
||||
if (def != null) {
|
||||
for (String name : def) {
|
||||
if (extensionDirector.getExtensionLoader(type).hasExtension(name)) {
|
||||
|
|
@ -96,7 +96,7 @@ public class ConfigUtils {
|
|||
}
|
||||
}
|
||||
|
||||
List<String> names = new ArrayList<>();
|
||||
List<String> names = new ArrayList<String>();
|
||||
|
||||
// add initial values
|
||||
String[] configs = (cfg == null || cfg.trim().length() == 0) ? new String[0] : COMMA_SPLIT_PATTERN.split(cfg);
|
||||
|
|
|
|||
|
|
@ -179,7 +179,7 @@ public class IOUtils {
|
|||
* @throws IOException If an I/O error occurs
|
||||
*/
|
||||
public static String[] readLines(InputStream is) throws IOException {
|
||||
List<String> lines = new ArrayList<>();
|
||||
List<String> lines = new ArrayList<String>();
|
||||
try (BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
|
|
|
|||
|
|
@ -146,8 +146,4 @@ public class JsonUtils {
|
|||
public static List<String> checkStringList(List<?> rawList) {
|
||||
return getJson().checkStringList(rawList);
|
||||
}
|
||||
|
||||
public static boolean checkJson(String json) {
|
||||
return getJson().isJson(json);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ import java.util.List;
|
|||
public class Stack<E> {
|
||||
private int mSize = 0;
|
||||
|
||||
private final List<E> mElements = new ArrayList<>();
|
||||
private final List<E> mElements = new ArrayList<E>();
|
||||
|
||||
public Stack() {}
|
||||
|
||||
|
|
|
|||
|
|
@ -861,7 +861,7 @@ public final class StringUtils {
|
|||
*/
|
||||
private static Map<String, String> parseKeyValuePair(String str, String itemSeparator) {
|
||||
String[] tmp = str.split(itemSeparator);
|
||||
Map<String, String> map = new HashMap<>(tmp.length);
|
||||
Map<String, String> map = new HashMap<String, String>(tmp.length);
|
||||
for (int i = 0; i < tmp.length; i++) {
|
||||
Matcher matcher = KVP_PATTERN.matcher(tmp[i]);
|
||||
if (!matcher.matches()) {
|
||||
|
|
@ -885,7 +885,7 @@ public final class StringUtils {
|
|||
*/
|
||||
public static Map<String, String> parseQueryString(String qs) {
|
||||
if (isEmpty(qs)) {
|
||||
return new HashMap<>();
|
||||
return new HashMap<String, String>();
|
||||
}
|
||||
return parseKeyValuePair(qs, "\\&");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -181,7 +181,7 @@ public class UrlUtils {
|
|||
throw new IllegalArgumentException(
|
||||
"Addresses is not allowed to be empty, please re-enter."); // here won't be empty
|
||||
}
|
||||
List<URL> registries = new ArrayList<>();
|
||||
List<URL> registries = new ArrayList<URL>();
|
||||
for (String addr : addresses) {
|
||||
registries.add(parseURL(addr, defaults));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -204,7 +204,7 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {
|
|||
/**
|
||||
* The url of the reference service
|
||||
*/
|
||||
protected final transient List<URL> urls = new ArrayList<>();
|
||||
protected final transient List<URL> urls = new ArrayList<URL>();
|
||||
|
||||
@Transient
|
||||
public List<URL> getExportedUrls() {
|
||||
|
|
|
|||
|
|
@ -361,7 +361,7 @@ public class ApplicationConfig extends AbstractConfig {
|
|||
}
|
||||
|
||||
public void setRegistry(RegistryConfig registry) {
|
||||
List<RegistryConfig> registries = new ArrayList<>(1);
|
||||
List<RegistryConfig> registries = new ArrayList<RegistryConfig>(1);
|
||||
registries.add(registry);
|
||||
this.registries = registries;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -149,11 +149,7 @@ public interface Constants {
|
|||
|
||||
String SERVER_THREAD_POOL_NAME = "DubboServerHandler";
|
||||
|
||||
String SERVER_THREAD_POOL_PREFIX = SERVER_THREAD_POOL_NAME + "-";
|
||||
|
||||
String CLIENT_THREAD_POOL_NAME = "DubboClientHandler";
|
||||
|
||||
String CLIENT_THREAD_POOL_PREFIX = CLIENT_THREAD_POOL_NAME + "-";
|
||||
|
||||
String REST_PROTOCOL = "rest";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -186,7 +186,7 @@ public class ModuleConfig extends AbstractConfig {
|
|||
}
|
||||
|
||||
public void setRegistry(RegistryConfig registry) {
|
||||
List<RegistryConfig> registries = new ArrayList<>(1);
|
||||
List<RegistryConfig> registries = new ArrayList<RegistryConfig>(1);
|
||||
registries.add(registry);
|
||||
this.registries = registries;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ import static org.apache.dubbo.common.constants.CommonConstants.EXTRA_KEYS_KEY;
|
|||
import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;
|
||||
import static org.apache.dubbo.common.constants.RegistryConstants.ENABLE_EMPTY_PROTECTION_KEY;
|
||||
import static org.apache.dubbo.common.constants.RegistryConstants.REGISTER_MODE_KEY;
|
||||
import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;
|
||||
import static org.apache.dubbo.common.constants.RemotingConstants.BACKUP_KEY;
|
||||
import static org.apache.dubbo.common.utils.PojoUtils.updatePropertyIfAbsent;
|
||||
|
||||
|
|
@ -220,6 +221,7 @@ public class RegistryConfig extends AbstractConfig {
|
|||
}
|
||||
|
||||
@Override
|
||||
@Parameter(key = REGISTRY_CLUSTER_KEY)
|
||||
public String getId() {
|
||||
return super.getId();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ public final class ClassUtils {
|
|||
* @return methods list
|
||||
*/
|
||||
public static List<Method> getPublicNonStaticMethods(final Class<?> clazz) {
|
||||
List<Method> result = new ArrayList<>();
|
||||
List<Method> result = new ArrayList<Method>();
|
||||
|
||||
Method[] methods = clazz.getMethods();
|
||||
for (Method method : methods) {
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ public class ProviderModel extends ServiceModel {
|
|||
}
|
||||
|
||||
public List<ProviderMethodModel> getAllMethodModels() {
|
||||
List<ProviderMethodModel> result = new ArrayList<>();
|
||||
List<ProviderMethodModel> result = new ArrayList<ProviderMethodModel>();
|
||||
for (List<ProviderMethodModel> models : methods.values()) {
|
||||
result.addAll(models);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -190,6 +190,7 @@ org.thymeleaf.
|
|||
org.yaml.snakeyaml.tokens.
|
||||
pstore.shaded.org.apache.commons.collections.
|
||||
sun.print.
|
||||
sun.rmi.
|
||||
sun.rmi.server.
|
||||
sun.rmi.transport.
|
||||
weblogic.ejb20.internal.
|
||||
weblogic.jms.common.
|
||||
|
|
|
|||
|
|
@ -1132,22 +1132,4 @@ class URLTest {
|
|||
assertEquals(20881, url.getPort());
|
||||
assertEquals("apache", url.getParameter("name"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testToServiceString() {
|
||||
URL url = URL.valueOf(
|
||||
"zookeeper://10.20.130.230:4444/org.apache.dubbo.metadata.report.MetadataReport?version=1.0.0&application=vic&group=aaa");
|
||||
assertEquals(
|
||||
"zookeeper://10.20.130.230:4444/aaa/org.apache.dubbo.metadata.report.MetadataReport:1.0.0",
|
||||
url.toServiceString());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testToServiceStringWithParameters() {
|
||||
URL url = URL.valueOf(
|
||||
"zookeeper://10.20.130.230:4444/org.apache.dubbo.metadata.report.MetadataReport?version=1.0.0&application=vic&group=aaa&namespace=test");
|
||||
assertEquals(
|
||||
"zookeeper://10.20.130.230:4444/aaa/org.apache.dubbo.metadata.report.MetadataReport:1.0.0?namespace=test",
|
||||
url.toServiceString("namespace"));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,7 +22,6 @@ import java.lang.reflect.Method;
|
|||
import java.lang.reflect.Modifier;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import javassist.ClassPool;
|
||||
|
||||
|
|
@ -57,8 +56,7 @@ class ClassGeneratorTest {
|
|||
ClassGenerator cg = ClassGenerator.newInstance();
|
||||
|
||||
// add className, interface, superClass
|
||||
String className = BaseClass.class.getPackage().getName() + ".TestClass"
|
||||
+ UUID.randomUUID().toString().replace("-", "");
|
||||
String className = BaseClass.class.getPackage().getName() + ".TestClass";
|
||||
cg.setClassName(className);
|
||||
cg.addInterface(BaseInterface.class);
|
||||
cg.setSuperClass(BaseClass.class);
|
||||
|
|
@ -186,7 +184,7 @@ class ClassGeneratorTest {
|
|||
fname.setAccessible(true);
|
||||
|
||||
ClassGenerator cg = ClassGenerator.newInstance();
|
||||
cg.setClassName(Bean.class.getName() + "$Builder" + UUID.randomUUID().toString());
|
||||
cg.setClassName(Bean.class.getName() + "$Builder");
|
||||
cg.addInterface(Builder.class);
|
||||
|
||||
cg.addField("public static java.lang.reflect.Field FNAME;");
|
||||
|
|
@ -213,7 +211,7 @@ class ClassGeneratorTest {
|
|||
fname.setAccessible(true);
|
||||
|
||||
ClassGenerator cg = ClassGenerator.newInstance();
|
||||
cg.setClassName(Bean.class.getName() + "$Builder2" + UUID.randomUUID().toString());
|
||||
cg.setClassName(Bean.class.getName() + "$Builder2");
|
||||
cg.addInterface(Builder.class);
|
||||
|
||||
cg.addField("FNAME", Modifier.PUBLIC | Modifier.STATIC, java.lang.reflect.Field.class);
|
||||
|
|
|
|||
|
|
@ -45,7 +45,8 @@ class ExtensionDirectorTest {
|
|||
// 2. Child ExtensionDirector can get extension instance from parent
|
||||
// 3. Parent ExtensionDirector can't get extension instance from child
|
||||
|
||||
ExtensionDirector fwExtensionDirector = FrameworkModel.defaultModel().getExtensionDirector();
|
||||
ExtensionDirector fwExtensionDirector =
|
||||
new ExtensionDirector(null, ExtensionScope.FRAMEWORK, FrameworkModel.defaultModel());
|
||||
ExtensionDirector appExtensionDirector =
|
||||
new ExtensionDirector(fwExtensionDirector, ExtensionScope.APPLICATION, ApplicationModel.defaultModel());
|
||||
ExtensionDirector moduleExtensionDirector = new ExtensionDirector(
|
||||
|
|
|
|||
|
|
@ -36,8 +36,7 @@ class GsonUtilsTest {
|
|||
Assertions.fail();
|
||||
} catch (RuntimeException ex) {
|
||||
Assertions.assertEquals(
|
||||
"Generic serialization [gson] Json syntax exception thrown when parsing (message:{'name':'Tom','age':} type:class org.apache.dubbo.common.json.GsonUtilsTest$User) error:com.google.gson.stream.MalformedJsonException: Expected value at line 1 column 21 path $.age\n"
|
||||
+ "See https://github.com/google/gson/blob/main/Troubleshooting.md#malformed-json",
|
||||
"Generic serialization [gson] Json syntax exception thrown when parsing (message:{'name':'Tom','age':} type:class org.apache.dubbo.common.json.GsonUtilsTest$User) error:com.google.gson.stream.MalformedJsonException: Expected value at line 1 column 21 path $.age",
|
||||
ex.getMessage());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,13 +16,9 @@
|
|||
*/
|
||||
package org.apache.dubbo.common.store.support;
|
||||
|
||||
import org.apache.dubbo.common.store.DataStoreUpdateListener;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||
|
|
@ -61,30 +57,4 @@ class SimpleDataStoreTest {
|
|||
dataStore.remove("component", "key");
|
||||
assertNotEquals(map, dataStore.get("component"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testNotify() {
|
||||
DataStoreUpdateListener listener = Mockito.mock(DataStoreUpdateListener.class);
|
||||
dataStore.addListener(listener);
|
||||
|
||||
ArgumentCaptor<String> componentNameCaptor = ArgumentCaptor.forClass(String.class);
|
||||
ArgumentCaptor<String> keyCaptor = ArgumentCaptor.forClass(String.class);
|
||||
ArgumentCaptor<Object> valueCaptor = ArgumentCaptor.forClass(Object.class);
|
||||
|
||||
dataStore.put("name", "key", "1");
|
||||
Mockito.verify(listener).onUpdate(componentNameCaptor.capture(), keyCaptor.capture(), valueCaptor.capture());
|
||||
assertEquals("name", componentNameCaptor.getValue());
|
||||
assertEquals("key", keyCaptor.getValue());
|
||||
assertEquals("1", valueCaptor.getValue());
|
||||
|
||||
dataStore.remove("name", "key");
|
||||
Mockito.verify(listener, Mockito.times(2))
|
||||
.onUpdate(componentNameCaptor.capture(), keyCaptor.capture(), valueCaptor.capture());
|
||||
assertEquals("name", componentNameCaptor.getValue());
|
||||
assertEquals("key", keyCaptor.getValue());
|
||||
assertNull(valueCaptor.getValue());
|
||||
|
||||
dataStore.remove("name2", "key");
|
||||
Mockito.verify(listener, Mockito.times(0)).onUpdate("name2", "key", null);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,49 +63,6 @@ class JsonUtilsTest {
|
|||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void testIsJson() {
|
||||
JsonUtils.setJson(null);
|
||||
// prefer use fastjson2
|
||||
System.setProperty("dubbo.json-framework.prefer", "fastjson2");
|
||||
Assertions.assertTrue(
|
||||
JsonUtils.getJson().isJson("{\"title\":\"Java Programming\",\"author\":\"John Doe\",\"pages\":300}"));
|
||||
Assertions.assertFalse(JsonUtils.getJson().isJson("This is not a JSON string"));
|
||||
Assertions.assertTrue(
|
||||
JsonUtils.getJson().isJson("[{\"title\":\"Java Programming\"}, {\"title\":\"Python Programming\"}]"));
|
||||
System.clearProperty("dubbo.json-framework.prefer");
|
||||
|
||||
// prefer use fastjson
|
||||
JsonUtils.setJson(null);
|
||||
System.setProperty("dubbo.json-framework.prefer", "fastjson");
|
||||
Assertions.assertTrue(
|
||||
JsonUtils.getJson().isJson("{\"title\":\"Java Programming\",\"author\":\"John Doe\",\"pages\":300}"));
|
||||
Assertions.assertFalse(JsonUtils.getJson().isJson("This is not a JSON string"));
|
||||
Assertions.assertTrue(
|
||||
JsonUtils.getJson().isJson("[{\"title\":\"Java Programming\"}, {\"title\":\"Python Programming\"}]"));
|
||||
System.clearProperty("dubbo.json-framework.prefer");
|
||||
|
||||
// prefer use gson
|
||||
JsonUtils.setJson(null);
|
||||
System.setProperty("dubbo.json-framework.prefer", "gson");
|
||||
Assertions.assertTrue(
|
||||
JsonUtils.getJson().isJson("{\"title\":\"Java Programming\",\"author\":\"John Doe\",\"pages\":300}"));
|
||||
Assertions.assertFalse(JsonUtils.getJson().isJson("This is not a JSON string"));
|
||||
Assertions.assertTrue(
|
||||
JsonUtils.getJson().isJson("[{\"title\":\"Java Programming\"}, {\"title\":\"Python Programming\"}]"));
|
||||
System.clearProperty("dubbo.json-framework.prefer");
|
||||
|
||||
// prefer use jackson
|
||||
JsonUtils.setJson(null);
|
||||
System.setProperty("dubbo.json-framework.prefer", "jackson");
|
||||
Assertions.assertTrue(
|
||||
JsonUtils.getJson().isJson("{\"title\":\"Java Programming\",\"author\":\"John Doe\",\"pages\":300}"));
|
||||
Assertions.assertFalse(JsonUtils.getJson().isJson("This is not a JSON string"));
|
||||
Assertions.assertTrue(
|
||||
JsonUtils.getJson().isJson("[{\"title\":\"Java Programming\"}, {\"title\":\"Python Programming\"}]"));
|
||||
System.clearProperty("dubbo.json-framework.prefer");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetJson1() {
|
||||
Assertions.assertNotNull(JsonUtils.getJson());
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@
|
|||
package org.apache.dubbo.common.version;
|
||||
|
||||
import org.apache.dubbo.common.Version;
|
||||
import org.apache.dubbo.common.constants.CommonConstants;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
|
|
@ -111,7 +110,7 @@ class VersionTest {
|
|||
ClassLoader classLoader = new ClassLoader(originClassLoader) {
|
||||
@Override
|
||||
public Class<?> loadClass(String name) throws ClassNotFoundException {
|
||||
if ("org.apache.dubbo.common.Version".equals(name)) {
|
||||
if (name.equals("org.apache.dubbo.common.Version")) {
|
||||
return findClass(name);
|
||||
}
|
||||
return super.loadClass(name);
|
||||
|
|
@ -146,13 +145,15 @@ class VersionTest {
|
|||
|
||||
@Override
|
||||
public Enumeration<URL> getResources(String name) throws IOException {
|
||||
if (name.equals(CommonConstants.DUBBO_VERSIONS_KEY + "/dubbo-common")) {
|
||||
|
||||
if (name.equals("META-INF/versions/dubbo-common")) {
|
||||
return super.getResources("META-INF/test-versions/dubbo-common");
|
||||
}
|
||||
return super.getResources(name);
|
||||
}
|
||||
};
|
||||
return classLoader.loadClass("org.apache.dubbo.common.Version");
|
||||
Class<?> versionClass = classLoader.loadClass("org.apache.dubbo.common.Version");
|
||||
return versionClass;
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ import static org.apache.dubbo.common.constants.CommonConstants.METHOD_KEY;
|
|||
@Deprecated
|
||||
public abstract class AbstractCacheFactory implements CacheFactory {
|
||||
|
||||
private final ConcurrentMap<String, Cache> caches = new ConcurrentHashMap<>();
|
||||
private final ConcurrentMap<String, Cache> caches = new ConcurrentHashMap<String, Cache>();
|
||||
|
||||
@Override
|
||||
public Cache getCache(URL url, Invocation invocation) {
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ public class ServiceConfig<T> extends org.apache.dubbo.config.ServiceConfig<T> {
|
|||
if (providers == null || providers.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
List<ProtocolConfig> protocols = new ArrayList<>(providers.size());
|
||||
List<ProtocolConfig> protocols = new ArrayList<ProtocolConfig>(providers.size());
|
||||
for (ProviderConfig provider : providers) {
|
||||
protocols.add(convertProviderToProtocol(provider));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,8 +57,8 @@ public class Page {
|
|||
}
|
||||
|
||||
private static List<List<String>> stringToList(String str) {
|
||||
List<List<String>> rows = new ArrayList<>();
|
||||
List<String> row = new ArrayList<>();
|
||||
List<List<String>> rows = new ArrayList<List<String>>();
|
||||
List<String> row = new ArrayList<String>();
|
||||
row.add(str);
|
||||
rows.add(row);
|
||||
return rows;
|
||||
|
|
|
|||
|
|
@ -49,8 +49,8 @@ public class PageServlet extends HttpServlet {
|
|||
private static final long serialVersionUID = -8370312705453328501L;
|
||||
private static PageServlet INSTANCE;
|
||||
protected final Random random = new Random();
|
||||
protected final Map<String, PageHandler> pages = new ConcurrentHashMap<>();
|
||||
protected final List<PageHandler> menus = new ArrayList<>();
|
||||
protected final Map<String, PageHandler> pages = new ConcurrentHashMap<String, PageHandler>();
|
||||
protected final List<PageHandler> menus = new ArrayList<PageHandler>();
|
||||
|
||||
public static PageServlet getInstance() {
|
||||
return INSTANCE;
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ public class ResourceFilter implements Filter {
|
|||
|
||||
private final long start = System.currentTimeMillis();
|
||||
|
||||
private final List<String> resources = new ArrayList<>();
|
||||
private final List<String> resources = new ArrayList<String>();
|
||||
|
||||
public void init(FilterConfig filterConfig) throws ServletException {
|
||||
String config = filterConfig.getInitParameter("resources");
|
||||
|
|
|
|||
|
|
@ -35,11 +35,11 @@ public class HomePageHandler implements PageHandler {
|
|||
|
||||
@Override
|
||||
public Page handle(URL url) {
|
||||
List<List<String>> rows = new ArrayList<>();
|
||||
List<List<String>> rows = new ArrayList<List<String>>();
|
||||
for (PageHandler handler : PageServlet.getInstance().getMenus()) {
|
||||
String uri = ExtensionLoader.getExtensionLoader(PageHandler.class).getExtensionName(handler);
|
||||
Menu menu = handler.getClass().getAnnotation(Menu.class);
|
||||
List<String> row = new ArrayList<>();
|
||||
List<String> row = new ArrayList<String>();
|
||||
row.add("<a href=\"" + uri + ".html\">" + menu.name() + "</a>");
|
||||
row.add(menu.desc());
|
||||
rows.add(row);
|
||||
|
|
|
|||
|
|
@ -97,8 +97,8 @@ public class LogPageHandler implements PageHandler {
|
|||
}
|
||||
}
|
||||
Level level = LogManager.getRootLogger().getLevel();
|
||||
List<List<String>> rows = new ArrayList<>();
|
||||
List<String> row = new ArrayList<>();
|
||||
List<List<String>> rows = new ArrayList<List<String>>();
|
||||
List<String> row = new ArrayList<String>();
|
||||
row.add(content);
|
||||
rows.add(row);
|
||||
return new Page(
|
||||
|
|
|
|||
|
|
@ -40,14 +40,14 @@ public class StatusPageHandler implements PageHandler {
|
|||
|
||||
@Override
|
||||
public Page handle(URL url) {
|
||||
List<List<String>> rows = new ArrayList<>();
|
||||
List<List<String>> rows = new ArrayList<List<String>>();
|
||||
Set<String> names =
|
||||
ExtensionLoader.getExtensionLoader(StatusChecker.class).getSupportedExtensions();
|
||||
Map<String, Status> statuses = new HashMap<>();
|
||||
Map<String, Status> statuses = new HashMap<String, Status>();
|
||||
for (String name : names) {
|
||||
StatusChecker checker =
|
||||
ExtensionLoader.getExtensionLoader(StatusChecker.class).getExtension(name);
|
||||
List<String> row = new ArrayList<>();
|
||||
List<String> row = new ArrayList<String>();
|
||||
row.add(name);
|
||||
Status status = checker.check();
|
||||
if (status != null && !Status.Level.UNKNOWN.equals(status.getLevel())) {
|
||||
|
|
@ -61,7 +61,7 @@ public class StatusPageHandler implements PageHandler {
|
|||
if ("status".equals(url.getPath())) {
|
||||
return new Page("", "", "", status.getLevel().toString());
|
||||
} else {
|
||||
List<String> row = new ArrayList<>();
|
||||
List<String> row = new ArrayList<String>();
|
||||
row.add("summary");
|
||||
row.add(getLevelHtml(status.getLevel()));
|
||||
row.add("<a href=\"/status\" target=\"_blank\">summary</a>");
|
||||
|
|
|
|||
|
|
@ -44,49 +44,49 @@ public class SystemPageHandler implements PageHandler {
|
|||
|
||||
@Override
|
||||
public Page handle(URL url) {
|
||||
List<List<String>> rows = new ArrayList<>();
|
||||
List<List<String>> rows = new ArrayList<List<String>>();
|
||||
List<String> row;
|
||||
|
||||
row = new ArrayList<>();
|
||||
row = new ArrayList<String>();
|
||||
row.add("Version");
|
||||
row.add(Version.getVersion(SystemPageHandler.class, "2.0.0"));
|
||||
rows.add(row);
|
||||
|
||||
row = new ArrayList<>();
|
||||
row = new ArrayList<String>();
|
||||
row.add("Host");
|
||||
String address = NetUtils.getLocalHost();
|
||||
row.add(NetUtils.getHostName(address) + "/" + address);
|
||||
rows.add(row);
|
||||
|
||||
row = new ArrayList<>();
|
||||
row = new ArrayList<String>();
|
||||
row.add("OS");
|
||||
row.add(System.getProperty("os.name") + " " + System.getProperty("os.version"));
|
||||
rows.add(row);
|
||||
|
||||
row = new ArrayList<>();
|
||||
row = new ArrayList<String>();
|
||||
row.add("JVM");
|
||||
row.add(System.getProperty("java.runtime.name") + " " + System.getProperty("java.runtime.version") + ",<br/>"
|
||||
+ System.getProperty("java.vm.name") + " " + System.getProperty("java.vm.version") + " "
|
||||
+ System.getProperty("java.vm.info", ""));
|
||||
rows.add(row);
|
||||
|
||||
row = new ArrayList<>();
|
||||
row = new ArrayList<String>();
|
||||
row.add("CPU");
|
||||
row.add(System.getProperty("os.arch", "") + ", "
|
||||
+ String.valueOf(Runtime.getRuntime().availableProcessors()) + " cores");
|
||||
rows.add(row);
|
||||
|
||||
row = new ArrayList<>();
|
||||
row = new ArrayList<String>();
|
||||
row.add("Locale");
|
||||
row.add(Locale.getDefault().toString() + "/" + System.getProperty("file.encoding"));
|
||||
rows.add(row);
|
||||
|
||||
row = new ArrayList<>();
|
||||
row = new ArrayList<String>();
|
||||
row.add("Uptime");
|
||||
row.add(formatUptime(ManagementFactory.getRuntimeMXBean().getUptime()));
|
||||
rows.add(row);
|
||||
|
||||
row = new ArrayList<>();
|
||||
row = new ArrayList<String>();
|
||||
row.add("Time");
|
||||
row.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS Z").format(new Date()));
|
||||
rows.add(row);
|
||||
|
|
|
|||
|
|
@ -353,7 +353,7 @@ public class RpcContext {
|
|||
final T o = callable.call();
|
||||
// local invoke will return directly
|
||||
if (o != null) {
|
||||
FutureTask<T> f = new FutureTask<>(new Callable<T>() {
|
||||
FutureTask<T> f = new FutureTask<T>(new Callable<T>() {
|
||||
@Override
|
||||
public T call() throws Exception {
|
||||
return o;
|
||||
|
|
|
|||
|
|
@ -162,14 +162,14 @@ public class RpcInvocation implements Invocation, Serializable {
|
|||
|
||||
public void setAttachment(String key, String value) {
|
||||
if (attachments == null) {
|
||||
attachments = new HashMap<>();
|
||||
attachments = new HashMap<String, String>();
|
||||
}
|
||||
attachments.put(key, value);
|
||||
}
|
||||
|
||||
public void setAttachmentIfAbsent(String key, String value) {
|
||||
if (attachments == null) {
|
||||
attachments = new HashMap<>();
|
||||
attachments = new HashMap<String, String>();
|
||||
}
|
||||
if (!attachments.containsKey(key)) {
|
||||
attachments.put(key, value);
|
||||
|
|
@ -181,7 +181,7 @@ public class RpcInvocation implements Invocation, Serializable {
|
|||
return;
|
||||
}
|
||||
if (this.attachments == null) {
|
||||
this.attachments = new HashMap<>();
|
||||
this.attachments = new HashMap<String, String>();
|
||||
}
|
||||
this.attachments.putAll(attachments);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,7 +54,6 @@ public final class {{className}} {
|
|||
private static final StubServiceDescriptor serviceDescriptor = new StubServiceDescriptor(SERVICE_NAME,{{interfaceClassName}}.class);
|
||||
|
||||
static {
|
||||
org.apache.dubbo.rpc.protocol.tri.service.SchemaDescriptorRegistry.addSchemaDescriptor(SERVICE_NAME,{{outerClassName}}.getDescriptor());
|
||||
StubSuppliers.addSupplier(SERVICE_NAME, {{className}}::newStub);
|
||||
StubSuppliers.addSupplier({{interfaceClassName}}.JAVA_SERVICE_NAME, {{className}}::newStub);
|
||||
StubSuppliers.addDescriptor(SERVICE_NAME, serviceDescriptor);
|
||||
|
|
|
|||
|
|
@ -236,7 +236,7 @@
|
|||
<dependency>
|
||||
<groupId>org.testcontainers</groupId>
|
||||
<artifactId>testcontainers</artifactId>
|
||||
<version>1.19.8</version>
|
||||
<version>1.19.6</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
|
|
|
|||
|
|
@ -346,7 +346,6 @@ public class ReferenceConfig<T> extends ReferenceConfigBase<T> {
|
|||
if (CommonConstants.NATIVE_STUB.equals(getProxy())) {
|
||||
serviceDescriptor = StubSuppliers.getServiceDescriptor(interfaceName);
|
||||
repository.registerService(serviceDescriptor);
|
||||
setInterface(serviceDescriptor.getInterfaceName());
|
||||
} else {
|
||||
serviceDescriptor = repository.registerService(interfaceClass);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -128,7 +128,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
|
|||
/**
|
||||
* A random port cache, the different protocols who have no port specified have different random port
|
||||
*/
|
||||
private static final Map<String, Integer> RANDOM_PORT_MAP = new HashMap<>();
|
||||
private static final Map<String, Integer> RANDOM_PORT_MAP = new HashMap<String, Integer>();
|
||||
|
||||
private Protocol protocolSPI;
|
||||
|
||||
|
|
@ -651,7 +651,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
|
|||
|
||||
private Map<String, String> buildAttributes(ProtocolConfig protocolConfig) {
|
||||
|
||||
Map<String, String> map = new HashMap<>();
|
||||
Map<String, String> map = new HashMap<String, String>();
|
||||
map.put(SIDE_KEY, PROVIDER_SIDE);
|
||||
|
||||
// append params with basic configs,
|
||||
|
|
|
|||
|
|
@ -329,7 +329,7 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
|
|||
}
|
||||
}
|
||||
metadataReportInstance.init(validMetadataReportConfigs);
|
||||
if (!metadataReportInstance.isInitialized()) {
|
||||
if (!metadataReportInstance.inited()) {
|
||||
throw new IllegalStateException(String.format(
|
||||
"%s MetadataConfigs found, but none of them is valid.", metadataReportConfigs.size()));
|
||||
}
|
||||
|
|
@ -382,9 +382,6 @@ public class DefaultApplicationDeployer extends AbstractDeployer<ApplicationMode
|
|||
Optional<MetricsConfig> configOptional = configManager.getMetrics();
|
||||
// If no specific metrics type is configured and there is no Prometheus dependency in the dependencies.
|
||||
MetricsConfig metricsConfig = configOptional.orElse(new MetricsConfig(applicationModel));
|
||||
if (PROTOCOL_PROMETHEUS.equals(metricsConfig.getProtocol()) && !isSupportPrometheus()) {
|
||||
return;
|
||||
}
|
||||
if (StringUtils.isBlank(metricsConfig.getProtocol())) {
|
||||
metricsConfig.setProtocol(isSupportPrometheus() ? PROTOCOL_PROMETHEUS : PROTOCOL_DEFAULT);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -82,7 +82,6 @@ import java.util.stream.Collectors;
|
|||
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_NAMESPACE_KEY;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_MONITOR_ADDRESS;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_PROTOCOL;
|
||||
|
|
@ -109,7 +108,6 @@ import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_REGIST
|
|||
import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_REGISTER_MODE_INTERFACE;
|
||||
import static org.apache.dubbo.common.constants.RegistryConstants.DUBBO_REGISTER_MODE_DEFAULT_KEY;
|
||||
import static org.apache.dubbo.common.constants.RegistryConstants.REGISTER_MODE_KEY;
|
||||
import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;
|
||||
import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;
|
||||
import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PROTOCOL;
|
||||
import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_TYPE_KEY;
|
||||
|
|
@ -211,7 +209,7 @@ public class ConfigValidationUtils {
|
|||
address = ANYHOST_VALUE;
|
||||
}
|
||||
if (!RegistryConfig.NO_AVAILABLE.equalsIgnoreCase(address)) {
|
||||
Map<String, String> map = new HashMap<>();
|
||||
Map<String, String> map = new HashMap<String, String>();
|
||||
AbstractConfig.appendParameters(map, application);
|
||||
AbstractConfig.appendParameters(map, config);
|
||||
map.put(PATH_KEY, RegistryService.class.getName());
|
||||
|
|
@ -219,14 +217,6 @@ public class ConfigValidationUtils {
|
|||
if (!map.containsKey(PROTOCOL_KEY)) {
|
||||
map.put(PROTOCOL_KEY, DUBBO_PROTOCOL);
|
||||
}
|
||||
String registryCluster = config.getId();
|
||||
if (isEmpty(registryCluster)) {
|
||||
registryCluster = DEFAULT_KEY;
|
||||
}
|
||||
if (map.containsKey(CONFIG_NAMESPACE_KEY)) {
|
||||
registryCluster += ":" + map.get(CONFIG_NAMESPACE_KEY);
|
||||
}
|
||||
map.put(REGISTRY_CLUSTER_KEY, registryCluster);
|
||||
List<URL> urls = UrlUtils.parseURLs(address, map);
|
||||
|
||||
for (URL url : urls) {
|
||||
|
|
@ -319,7 +309,7 @@ public class ConfigValidationUtils {
|
|||
}
|
||||
|
||||
public static URL loadMonitor(AbstractInterfaceConfig interfaceConfig, URL registryURL) {
|
||||
Map<String, String> map = new HashMap<>();
|
||||
Map<String, String> map = new HashMap<String, String>();
|
||||
map.put(INTERFACE_KEY, MonitorService.class.getName());
|
||||
AbstractInterfaceConfig.appendRuntimeParameters(map);
|
||||
// set ip
|
||||
|
|
|
|||
|
|
@ -37,8 +37,6 @@ import org.apache.dubbo.config.metadata.ExporterDeployListener;
|
|||
import org.apache.dubbo.config.provider.impl.DemoServiceImpl;
|
||||
import org.apache.dubbo.config.utils.ConfigValidationUtils;
|
||||
import org.apache.dubbo.metadata.MetadataService;
|
||||
import org.apache.dubbo.metadata.report.MetadataReport;
|
||||
import org.apache.dubbo.metadata.report.MetadataReportInstance;
|
||||
import org.apache.dubbo.monitor.MonitorService;
|
||||
import org.apache.dubbo.registry.RegistryService;
|
||||
import org.apache.dubbo.rpc.Exporter;
|
||||
|
|
@ -52,14 +50,10 @@ import java.io.FileOutputStream;
|
|||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import org.junit.jupiter.api.AfterAll;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
|
|
@ -67,15 +61,10 @@ import org.junit.jupiter.api.BeforeAll;
|
|||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.io.TempDir;
|
||||
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_NAMESPACE_KEY;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_MONITOR_ADDRESS;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;
|
||||
import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_SECONDS_KEY;
|
||||
import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;
|
||||
import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;
|
||||
import static org.apache.dubbo.metadata.MetadataConstants.REPORT_CONSUMER_URL_KEY;
|
||||
import static org.hamcrest.CoreMatchers.anything;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.hamcrest.Matchers.hasEntry;
|
||||
|
|
@ -150,29 +139,13 @@ class DubboBootstrapTest {
|
|||
|
||||
@Test
|
||||
void testLoadRegistries() {
|
||||
SysProps.setProperty("dubbo.registry.address", "addr1");
|
||||
|
||||
ServiceConfig serviceConfig = new ServiceConfig();
|
||||
serviceConfig.setInterface(DemoService.class);
|
||||
serviceConfig.setRef(new DemoServiceImpl());
|
||||
serviceConfig.setApplication(new ApplicationConfig("testLoadRegistries"));
|
||||
|
||||
String registryId = "nacosRegistry";
|
||||
String namespace1 = "test";
|
||||
RegistryConfig registryConfig = new RegistryConfig();
|
||||
registryConfig.setId(registryId);
|
||||
registryConfig.setAddress("nacos://addr1:8848");
|
||||
Map<String, String> registryParamMap = Maps.newHashMap();
|
||||
registryParamMap.put(CONFIG_NAMESPACE_KEY, namespace1);
|
||||
registryConfig.setParameters(registryParamMap);
|
||||
|
||||
String namespace2 = "test2";
|
||||
RegistryConfig registryConfig2 = new RegistryConfig();
|
||||
registryConfig2.setAddress("polaris://addr1:9999");
|
||||
Map<String, String> registryParamMap2 = Maps.newHashMap();
|
||||
registryParamMap2.put(CONFIG_NAMESPACE_KEY, namespace2);
|
||||
registryConfig2.setParameters(registryParamMap2);
|
||||
|
||||
serviceConfig.setRegistries(Arrays.asList(registryConfig, registryConfig2));
|
||||
|
||||
// load configs from props
|
||||
DubboBootstrap.getInstance().initialize();
|
||||
|
||||
|
|
@ -181,103 +154,15 @@ class DubboBootstrapTest {
|
|||
// ApplicationModel.defaultModel().getEnvironment().setDynamicConfiguration(new
|
||||
// CompositeDynamicConfiguration());
|
||||
List<URL> urls = ConfigValidationUtils.loadRegistries(serviceConfig, true);
|
||||
Assertions.assertEquals(4, urls.size());
|
||||
|
||||
Map<String, List<URL>> urlsMap =
|
||||
urls.stream().collect(Collectors.groupingBy(url -> url.getParameter(REGISTRY_KEY)));
|
||||
Assertions.assertEquals(2, urlsMap.get("nacos").size());
|
||||
for (URL url : urlsMap.get("nacos")) {
|
||||
Assertions.assertTrue(url.getProtocol().contains("registry"));
|
||||
Assertions.assertEquals("addr1:8848", url.getAddress());
|
||||
Assertions.assertEquals(RegistryService.class.getName(), url.getPath());
|
||||
Assertions.assertEquals(registryId + ":" + namespace1, url.getParameter(REGISTRY_CLUSTER_KEY));
|
||||
Assertions.assertTrue(url.getParameters().containsKey("timestamp"));
|
||||
Assertions.assertTrue(url.getParameters().containsKey("pid"));
|
||||
Assertions.assertTrue(url.getParameters().containsKey("registry"));
|
||||
Assertions.assertTrue(url.getParameters().containsKey("dubbo"));
|
||||
}
|
||||
|
||||
Assertions.assertEquals(2, urlsMap.get("polaris").size());
|
||||
for (URL url : urlsMap.get("polaris")) {
|
||||
Assertions.assertTrue(url.getProtocol().contains("registry"));
|
||||
Assertions.assertEquals("addr1:9999", url.getAddress());
|
||||
Assertions.assertEquals(RegistryService.class.getName(), url.getPath());
|
||||
Assertions.assertEquals(DEFAULT_KEY + ":" + namespace2, url.getParameter(REGISTRY_CLUSTER_KEY));
|
||||
Assertions.assertTrue(url.getParameters().containsKey("timestamp"));
|
||||
Assertions.assertTrue(url.getParameters().containsKey("pid"));
|
||||
Assertions.assertTrue(url.getParameters().containsKey("registry"));
|
||||
Assertions.assertTrue(url.getParameters().containsKey("dubbo"));
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void testRegistryWithMetadataReport() {
|
||||
ServiceConfig serviceConfig = new ServiceConfig();
|
||||
serviceConfig.setInterface(DemoService.class);
|
||||
serviceConfig.setRef(new DemoServiceImpl());
|
||||
|
||||
List<RegistryConfig> registryConfigs = new ArrayList<>();
|
||||
List<MetadataReportConfig> metadataReportConfigs = new ArrayList<>();
|
||||
|
||||
String registryId = "nacosRegistry";
|
||||
String namespace1 = "test";
|
||||
RegistryConfig registryConfig = new RegistryConfig();
|
||||
registryConfig.setId(registryId);
|
||||
registryConfig.setAddress(zkServerAddress);
|
||||
Map<String, String> registryParamMap = Maps.newHashMap();
|
||||
registryParamMap.put(CONFIG_NAMESPACE_KEY, namespace1);
|
||||
registryConfig.setParameters(registryParamMap);
|
||||
registryConfigs.add(registryConfig);
|
||||
|
||||
MetadataReportConfig metadataReportConfig = new MetadataReportConfig();
|
||||
metadataReportConfig.setRegistry(registryId);
|
||||
metadataReportConfig.setAddress(registryConfig.getAddress());
|
||||
Map<String, String> metadataParamMap = Maps.newHashMap();
|
||||
metadataParamMap.put(CONFIG_NAMESPACE_KEY, namespace1);
|
||||
metadataParamMap.put(REPORT_CONSUMER_URL_KEY, Boolean.TRUE.toString());
|
||||
metadataReportConfig.setParameters(metadataParamMap);
|
||||
metadataReportConfig.setReportMetadata(true);
|
||||
metadataReportConfigs.add(metadataReportConfig);
|
||||
|
||||
String namespace2 = "test2";
|
||||
RegistryConfig registryConfig2 = new RegistryConfig();
|
||||
registryConfig2.setAddress(zkServerAddress);
|
||||
Map<String, String> registryParamMap2 = Maps.newHashMap();
|
||||
registryParamMap2.put(CONFIG_NAMESPACE_KEY, namespace2);
|
||||
registryConfig2.setParameters(registryParamMap2);
|
||||
registryConfigs.add(registryConfig2);
|
||||
|
||||
MetadataReportConfig metadataReportConfig2 = new MetadataReportConfig();
|
||||
metadataReportConfig2.setAddress(registryConfig2.getAddress());
|
||||
Map<String, String> metadataParamMap2 = Maps.newHashMap();
|
||||
metadataParamMap2.put(CONFIG_NAMESPACE_KEY, namespace2);
|
||||
metadataParamMap2.put(REPORT_CONSUMER_URL_KEY, Boolean.TRUE.toString());
|
||||
metadataReportConfig2.setParameters(metadataParamMap2);
|
||||
metadataReportConfig2.setReportMetadata(true);
|
||||
metadataReportConfigs.add(metadataReportConfig2);
|
||||
|
||||
serviceConfig.setRegistries(registryConfigs);
|
||||
|
||||
DubboBootstrap.getInstance()
|
||||
.application(new ApplicationConfig("testRegistryWithMetadataReport"))
|
||||
.registries(registryConfigs)
|
||||
.metadataReports(metadataReportConfigs)
|
||||
.service(serviceConfig)
|
||||
.protocol(new ProtocolConfig(CommonConstants.DUBBO_PROTOCOL, -1))
|
||||
.start();
|
||||
|
||||
ApplicationModel applicationModel = DubboBootstrap.getInstance().getApplicationModel();
|
||||
MetadataReportInstance metadataReportInstance =
|
||||
applicationModel.getBeanFactory().getBean(MetadataReportInstance.class);
|
||||
|
||||
Map<String, MetadataReport> metadataReports = metadataReportInstance.getMetadataReports(true);
|
||||
Assertions.assertEquals(2, metadataReports.size());
|
||||
|
||||
List<URL> urls = ConfigValidationUtils.loadRegistries(serviceConfig, true);
|
||||
Assertions.assertEquals(4, urls.size());
|
||||
|
||||
Assertions.assertEquals(2, urls.size());
|
||||
for (URL url : urls) {
|
||||
Assertions.assertTrue(metadataReports.containsKey(url.getParameter(REGISTRY_CLUSTER_KEY)));
|
||||
Assertions.assertTrue(url.getProtocol().contains("registry"));
|
||||
Assertions.assertEquals("addr1:9090", url.getAddress());
|
||||
Assertions.assertEquals(RegistryService.class.getName(), url.getPath());
|
||||
Assertions.assertTrue(url.getParameters().containsKey("timestamp"));
|
||||
Assertions.assertTrue(url.getParameters().containsKey("pid"));
|
||||
Assertions.assertTrue(url.getParameters().containsKey("registry"));
|
||||
Assertions.assertTrue(url.getParameters().containsKey("dubbo"));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,13 +17,10 @@
|
|||
package org.apache.dubbo.config.deploy;
|
||||
|
||||
import org.apache.dubbo.common.utils.Assert;
|
||||
import org.apache.dubbo.config.MetricsConfig;
|
||||
import org.apache.dubbo.rpc.model.ApplicationModel;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.apache.dubbo.common.constants.MetricsConstants.PROTOCOL_PROMETHEUS;
|
||||
|
||||
class DefaultApplicationDeployerTest {
|
||||
|
||||
@Test
|
||||
|
|
@ -32,13 +29,4 @@ class DefaultApplicationDeployerTest {
|
|||
new DefaultApplicationDeployer(ApplicationModel.defaultModel()).isSupportPrometheus();
|
||||
Assert.assertTrue(supportPrometheus, "DefaultApplicationDeployer.isSupportPrometheus() should return true");
|
||||
}
|
||||
|
||||
@Test
|
||||
void isImportPrometheus() {
|
||||
MetricsConfig metricsConfig = new MetricsConfig();
|
||||
metricsConfig.setProtocol("prometheus");
|
||||
boolean importPrometheus = PROTOCOL_PROMETHEUS.equals(metricsConfig.getProtocol())
|
||||
&& !DefaultApplicationDeployer.isSupportPrometheus();
|
||||
Assert.assertTrue(!importPrometheus, " should return false");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -172,6 +172,7 @@ class MultipleRegistryCenterExportMetadataIntegrationTest implements Integration
|
|||
@AfterEach
|
||||
public void tearDown() throws IOException {
|
||||
DubboBootstrap.reset();
|
||||
PROVIDER_APPLICATION_NAME = null;
|
||||
serviceConfig = null;
|
||||
// The exported service has been unexported
|
||||
Assertions.assertTrue(serviceListener.getExportedServices().isEmpty());
|
||||
|
|
|
|||
|
|
@ -239,6 +239,7 @@ class MultipleRegistryCenterExportProviderIntegrationTest implements Integration
|
|||
@AfterEach
|
||||
public void tearDown() throws IOException {
|
||||
DubboBootstrap.reset();
|
||||
PROVIDER_APPLICATION_NAME = null;
|
||||
serviceConfig = null;
|
||||
// The exported service has been unexported
|
||||
Assertions.assertTrue(serviceListener.getExportedServices().isEmpty());
|
||||
|
|
|
|||
|
|
@ -185,6 +185,7 @@ class MultipleRegistryCenterInjvmIntegrationTest implements IntegrationTest {
|
|||
@AfterEach
|
||||
public void tearDown() throws IOException {
|
||||
DubboBootstrap.reset();
|
||||
PROVIDER_APPLICATION_NAME = null;
|
||||
serviceConfig = null;
|
||||
// The exported service has been unexported
|
||||
Assertions.assertTrue(serviceListener.getExportedServices().isEmpty());
|
||||
|
|
|
|||
|
|
@ -201,6 +201,7 @@ class MultipleRegistryCenterServiceDiscoveryRegistryIntegrationTest implements I
|
|||
@AfterEach
|
||||
public void tearDown() throws IOException {
|
||||
DubboBootstrap.reset();
|
||||
PROVIDER_APPLICATION_NAME = null;
|
||||
serviceConfig = null;
|
||||
// TODO: we need to check whether this scenario is normal
|
||||
// TODO: the Exporter and ServiceDiscoveryRegistry are same in multiple registry center
|
||||
|
|
|
|||
|
|
@ -169,6 +169,7 @@ class SingleRegistryCenterExportMetadataIntegrationTest implements IntegrationTe
|
|||
@AfterEach
|
||||
public void tearDown() throws IOException {
|
||||
DubboBootstrap.reset();
|
||||
PROVIDER_APPLICATION_NAME = null;
|
||||
serviceConfig = null;
|
||||
// The exported service has been unexported
|
||||
Assertions.assertTrue(serviceListener.getExportedServices().isEmpty());
|
||||
|
|
|
|||
|
|
@ -240,6 +240,7 @@ class SingleRegistryCenterExportProviderIntegrationTest implements IntegrationTe
|
|||
@AfterEach
|
||||
public void tearDown() throws IOException {
|
||||
DubboBootstrap.reset();
|
||||
PROVIDER_APPLICATION_NAME = null;
|
||||
serviceConfig = null;
|
||||
// The exported service has been unexported
|
||||
Assertions.assertTrue(serviceListener.getExportedServices().isEmpty());
|
||||
|
|
|
|||
|
|
@ -185,6 +185,7 @@ class SingleRegistryCenterInjvmIntegrationTest implements IntegrationTest {
|
|||
@AfterEach
|
||||
public void tearDown() throws IOException {
|
||||
DubboBootstrap.reset();
|
||||
PROVIDER_APPLICATION_NAME = null;
|
||||
serviceConfig = null;
|
||||
// The exported service has been unexported
|
||||
Assertions.assertTrue(serviceListener.getExportedServices().isEmpty());
|
||||
|
|
|
|||
|
|
@ -35,7 +35,6 @@ class ReferenceCacheTest {
|
|||
public void setUp() throws Exception {
|
||||
DubboBootstrap.reset();
|
||||
MockReferenceConfig.setCounter(0);
|
||||
XxxMockReferenceConfig.setCounter(0);
|
||||
SimpleReferenceCache.CACHE_HOLDER.clear();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@
|
|||
<dependency>
|
||||
<groupId>org.aspectj</groupId>
|
||||
<artifactId>aspectjweaver</artifactId>
|
||||
<version>1.9.22.1</version>
|
||||
<version>1.9.21.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
|
|
|
|||
|
|
@ -78,7 +78,8 @@ public abstract class AbstractAnnotationBeanPostProcessor
|
|||
private final Class<? extends Annotation>[] annotationTypes;
|
||||
|
||||
private final ConcurrentMap<String, AbstractAnnotationBeanPostProcessor.AnnotatedInjectionMetadata>
|
||||
injectionMetadataCache = new ConcurrentHashMap<>(CACHE_SIZE);
|
||||
injectionMetadataCache = new ConcurrentHashMap<
|
||||
String, AbstractAnnotationBeanPostProcessor.AnnotatedInjectionMetadata>(CACHE_SIZE);
|
||||
|
||||
private ConfigurableListableBeanFactory beanFactory;
|
||||
|
||||
|
|
@ -97,7 +98,7 @@ public abstract class AbstractAnnotationBeanPostProcessor
|
|||
}
|
||||
|
||||
private static <T> Collection<T> combine(Collection<? extends T>... elements) {
|
||||
List<T> allElements = new ArrayList<>();
|
||||
List<T> allElements = new ArrayList<T>();
|
||||
for (Collection<? extends T> e : elements) {
|
||||
allElements.addAll(e);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ public abstract class AnnotationUtils {
|
|||
|
||||
Set<String> ignoreAttributeNamesSet = new HashSet<>(Arrays.asList(ignoreAttributeNames));
|
||||
|
||||
Map<String, Object> actualAttributes = new LinkedHashMap<>();
|
||||
Map<String, Object> actualAttributes = new LinkedHashMap<String, Object>();
|
||||
|
||||
for (Map.Entry<String, Object> annotationAttribute : annotationAttributes.entrySet()) {
|
||||
|
||||
|
|
@ -143,7 +143,7 @@ public abstract class AnnotationUtils {
|
|||
|
||||
if (ignoreDefaultValue && !isEmpty(annotationAttributes)) {
|
||||
|
||||
List<String> attributeNamesToIgnore = new LinkedList<>(asList(ignoreAttributeNames));
|
||||
List<String> attributeNamesToIgnore = new LinkedList<String>(asList(ignoreAttributeNames));
|
||||
|
||||
for (Map.Entry<String, Object> annotationAttribute : annotationAttributes.entrySet()) {
|
||||
String attributeName = annotationAttribute.getKey();
|
||||
|
|
@ -444,11 +444,21 @@ public abstract class AnnotationUtils {
|
|||
(_k) -> ClassUtils.isPresent(ANNOTATED_ELEMENT_UTILS_CLASS_NAME, classLoader))) {
|
||||
Class<?> annotatedElementUtilsClass = resolveClassName(ANNOTATED_ELEMENT_UTILS_CLASS_NAME, classLoader);
|
||||
// getMergedAnnotation method appears in the Spring Framework 4.2
|
||||
Method getMergedAnnotationMethod =
|
||||
findMethod(annotatedElementUtilsClass, "getMergedAnnotation", AnnotatedElement.class, Class.class);
|
||||
Method getMergedAnnotationMethod = findMethod(
|
||||
annotatedElementUtilsClass,
|
||||
"getMergedAnnotation",
|
||||
AnnotatedElement.class,
|
||||
Class.class,
|
||||
boolean.class,
|
||||
boolean.class);
|
||||
if (getMergedAnnotationMethod != null) {
|
||||
mergedAnnotation =
|
||||
(Annotation) invokeMethod(getMergedAnnotationMethod, null, annotatedElement, annotationType);
|
||||
mergedAnnotation = (Annotation) invokeMethod(
|
||||
getMergedAnnotationMethod,
|
||||
null,
|
||||
annotatedElement,
|
||||
annotationType,
|
||||
classValuesAsString,
|
||||
nestedAnnotationsAsMap);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ public abstract class PropertySourcesUtils {
|
|||
public static Map<String, Object> getSubProperties(
|
||||
PropertySources propertySources, PropertyResolver propertyResolver, String prefix) {
|
||||
|
||||
Map<String, Object> subProperties = new LinkedHashMap<>();
|
||||
Map<String, Object> subProperties = new LinkedHashMap<String, Object>();
|
||||
|
||||
String normalizedPrefix = normalizePrefix(prefix);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,19 +1,19 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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.
|
||||
~ 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.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ public class Main {
|
|||
args = COMMA_SPLIT_PATTERN.split(config);
|
||||
}
|
||||
|
||||
final List<Container> containers = new ArrayList<>();
|
||||
final List<Container> containers = new ArrayList<Container>();
|
||||
for (int i = 0; i < args.length; i++) {
|
||||
containers.add(LOADER.getExtension(args[i]));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,19 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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.
|
||||
~ 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.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
|||
|
|
@ -1,19 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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.
|
||||
~ 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.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
|||
|
|
@ -1,19 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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.
|
||||
~ 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.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
|||
|
|
@ -1,19 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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.
|
||||
~ 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.
|
||||
-->
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue