Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ protected void buildTransportMap() {

protected Transport chooseOneTransport(List<Transport> group) {
group.sort((t1, t2) -> {
return t1.getOrder() - t2.getOrder();
return Integer.compare(t1.getOrder(), t2.getOrder());
});

for (Transport transport : group) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -176,21 +176,21 @@ public void testChooseOneTransportSecond(@Mocked Transport t1, @Mocked Transport
new Expectations() {
{
t1.getOrder();
result = 1;
result = Integer.MAX_VALUE;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's better to add it as a new test case

t1.canInit();
result = false;
result = true;

t2.getOrder();
result = 2;
result = -1000;
t2.canInit();
result = true;
result = false;
}
};

TransportManager manager = new TransportManager();
List<Transport> group = Arrays.asList(t1, t2);

Assert.assertEquals(t2, manager.chooseOneTransport(group));
Assert.assertEquals(t1, manager.chooseOneTransport(group));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,13 @@
package io.servicecomb.foundation.common.utils;

import java.lang.reflect.Method;
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.ServiceLoader;
import java.util.stream.Collectors;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -58,25 +61,38 @@ public static <T> List<T> getAllService(Class<T> serviceType) {
ServiceLoader.load(serviceType).forEach(service -> {
list.add(service);
});

return list;
}

public static <T> List<T> getSortedService(Class<T> serviceType) {
List<Entry<Integer, T>> serviceEntries = new ArrayList<>();
ServiceLoader<T> serviceLoader = ServiceLoader.load(serviceType);
serviceLoader.forEach(service -> {
int serviceOrder = 0;
Method getOrder = ReflectionUtils.findMethod(service.getClass(), "getOrder");
if (getOrder != null) {
serviceOrder = (int) ReflectionUtils.invokeMethod(getOrder, service);
}

Entry<Integer, T> entry = new SimpleEntry<>(serviceOrder, service);
serviceEntries.add(entry);
});

return serviceEntries.stream()
.sorted((e1, e2) -> {
return Integer.compare(e1.getKey(), e2.getKey());
})
.map(e -> e.getValue())
.collect(Collectors.toList());
}

public static <T> T getPriorityHighestService(Class<T> serviceType) {
String methodName = "getOrder";
Method getOrder = ReflectionUtils.findMethod(serviceType, methodName);
if (getOrder == null) {
throw new Error(String.format("method %s not exists in class %s", methodName, serviceType.getName()));
List<T> services = getSortedService(serviceType);
if (services.isEmpty()) {
return null;
}

int order = Integer.MAX_VALUE;
T highestService = null;
for (T service : getAllService(serviceType)) {
int serviceOrder = (int) ReflectionUtils.invokeMethod(getOrder, service);
if (serviceOrder <= order) {
order = serviceOrder;
highestService = service;
}
}
return highestService;
return services.get(0);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,18 @@

package io.servicecomb.foundation.common.utils;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.ServiceLoader;

import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.core.Ordered;

import mockit.Deencapsulation;
import mockit.Expectations;
import mockit.Mocked;

/**
* Test SPIServiceUtils
Expand All @@ -36,4 +46,27 @@ public void testGetTargetServiceNotNull() {
SPIServiceDef service = SPIServiceUtils.getTargetService(SPIServiceDef.class);
Assert.assertTrue(SPIServiceDef.class.isInstance(service));
}

@Test
public void testSort(@Mocked Ordered o1, @Mocked Ordered o2) {
Map<String, Ordered> map = new LinkedHashMap<>();
map.put("a", o1);
map.put("b", o2);

ServiceLoader<Ordered> serviceLoader = ServiceLoader.load(Ordered.class);
Deencapsulation.setField(serviceLoader, "providers", map);
new Expectations(ServiceLoader.class) {
{
o1.getOrder();
result = -1;
o2.getOrder();
result = Integer.MAX_VALUE;
ServiceLoader.load(Ordered.class);
result = serviceLoader;
}
};

Assert.assertThat(SPIServiceUtils.getSortedService(Ordered.class), Matchers.contains(o1, o2));
Assert.assertThat(SPIServiceUtils.getPriorityHighestService(Ordered.class), Matchers.is(o1));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ private int doSort(ConfigModelWrapper w1, ConfigModelWrapper w2) {
return 1;
}
// min order load first
int result = m1.getOrder() - m2.getOrder();
int result = Integer.compare(m1.getOrder(), m2.getOrder());
if (result != 0) {
return result;
}
Expand All @@ -135,6 +135,6 @@ private int doSort(ConfigModelWrapper w1, ConfigModelWrapper w2) {
}

private int doFinalSort(ConfigModelWrapper w1, ConfigModelWrapper w2) {
return w1.addOrder - w2.addOrder;
return Integer.compare(w1.addOrder, w2.addOrder);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ public void configsSortedByInsertionOrder() throws MalformedURLException {

@Test
public void configsSortedBySpecifiedOrder() throws MalformedURLException {
loader.getConfigModels().add(createConfigModel("jar", 2, "a"));
loader.getConfigModels().add(createConfigModel("jar", 1, "b"));
loader.getConfigModels().add(createConfigModel("jar", 0, "c"));
loader.getConfigModels().add(createConfigModel("jar", -10, "c"));
loader.getConfigModels().add(createConfigModel("jar", Integer.MAX_VALUE, "a"));

loader.sort();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public void registerPerfStat(PerfStat perfStat, int index) {

@Override
public int compare(PerfStatMonitor o1, PerfStatMonitor o2) {
return o1.getIndex() - o2.getIndex();
return Integer.compare(o1.getIndex(), o2.getIndex());
}
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@

package io.servicecomb.foundation.metrics.performance;

import java.util.stream.Collectors;

import org.hamcrest.Matchers;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
Expand Down Expand Up @@ -51,4 +54,14 @@ public void testOnCycle() {
oPerfStatMonitorMgr.onCycle(System.currentTimeMillis(), 10);
Assert.assertEquals(1, oPerfStatMonitorMgr.getMonitorPerfStat().size());
}

@Test
public void testSort() {
oPerfStatMonitorMgr.registerPerfStat(new PerfStatSuccFail("a"), -1);
oPerfStatMonitorMgr.registerPerfStat(new PerfStatSuccFail("b"), Integer.MAX_VALUE);

Assert.assertThat(
oPerfStatMonitorMgr.getMonitorList().stream().map(ps -> ps.getName()).collect(Collectors.toList()),
Matchers.contains("a", "b"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,7 @@ public class CompositeSwaggerGeneratorContext implements EmbeddedValueResolverAw
private List<SwaggerGeneratorContext> contextList;

public CompositeSwaggerGeneratorContext() {
contextList = SPIServiceUtils.getAllService(SwaggerGeneratorContext.class);

contextList.sort((context1, context2) -> {
return context1.getOrder() - context2.getOrder();
});
contextList = SPIServiceUtils.getSortedService(SwaggerGeneratorContext.class);

for (SwaggerGeneratorContext context : contextList) {
LOGGER.info("Found swagger generator context: {}", context.getClass().getName());
Expand Down