kopia lustrzana https://github.com/JOSM/MapWithAI
Fix #22440: NPE in MapWithAIInfo#getConflationUrl
Signed-off-by: Taylor Smock <tsmock@meta.com>pull/4/head v1.9.19
rodzic
ff3a9d38c3
commit
88a48a5fdb
|
@ -453,7 +453,29 @@ public class MapWithAIInfo extends
|
||||||
return getNonConflatedUrl();
|
return getNonConflatedUrl();
|
||||||
}
|
}
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append(conflationUrl.replace("{id}", this.id));
|
if (this.conflationUrl.contains("{id}") && this.id != null) {
|
||||||
|
sb.append(conflationUrl.replace("{id}", this.id));
|
||||||
|
} else if (this.conflationUrl.contains("{id}")) {
|
||||||
|
// We need to trigger synchronization. This means that the current download
|
||||||
|
// may won't be conflated.
|
||||||
|
// But this should automatically correct the behavior for the next attempt.
|
||||||
|
final MapWithAILayerInfo mwli = MapWithAILayerInfo.getInstance();
|
||||||
|
mwli.load(false, () -> {
|
||||||
|
Optional<MapWithAIInfo> defaultLayer = mwli.getAllDefaultLayers().stream().filter(this::equals)
|
||||||
|
.findFirst();
|
||||||
|
if (defaultLayer.isPresent()) {
|
||||||
|
this.id = defaultLayer.get().id;
|
||||||
|
} else {
|
||||||
|
MapWithAIInfo newInfo = mwli.getAllDefaultLayers().stream()
|
||||||
|
.filter(layer -> Objects.equals(this.url, layer.url) && Objects.nonNull(layer.id))
|
||||||
|
.findFirst().orElse(this);
|
||||||
|
this.id = newInfo.id;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return getNonConflatedUrl();
|
||||||
|
} else {
|
||||||
|
sb.append(conflationUrl);
|
||||||
|
}
|
||||||
|
|
||||||
List<String> parametersString = getConflationParameterString();
|
List<String> parametersString = getConflationParameterString();
|
||||||
if (!parametersString.isEmpty()) {
|
if (!parametersString.isEmpty()) {
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
// License: GPL. For details, see LICENSE file.
|
// License: GPL. For details, see LICENSE file.
|
||||||
package org.openstreetmap.josm.plugins.mapwithai.data.mapwithai;
|
package org.openstreetmap.josm.plugins.mapwithai.data.mapwithai;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertSame;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
import javax.json.Json;
|
import javax.json.Json;
|
||||||
import javax.json.JsonArray;
|
import javax.json.JsonArray;
|
||||||
|
@ -15,15 +19,21 @@ import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.params.ParameterizedTest;
|
import org.junit.jupiter.params.ParameterizedTest;
|
||||||
import org.junit.jupiter.params.provider.Arguments;
|
import org.junit.jupiter.params.provider.Arguments;
|
||||||
import org.junit.jupiter.params.provider.MethodSource;
|
import org.junit.jupiter.params.provider.MethodSource;
|
||||||
|
import org.openstreetmap.josm.TestUtils;
|
||||||
|
import org.openstreetmap.josm.gui.MainApplication;
|
||||||
|
import org.openstreetmap.josm.gui.util.GuiHelper;
|
||||||
import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
|
import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
|
||||||
import org.openstreetmap.josm.tools.Logging;
|
import org.openstreetmap.josm.tools.Logging;
|
||||||
|
|
||||||
|
import mockit.Mock;
|
||||||
|
import mockit.MockUp;
|
||||||
import nl.jqno.equalsverifier.EqualsVerifier;
|
import nl.jqno.equalsverifier.EqualsVerifier;
|
||||||
import nl.jqno.equalsverifier.Warning;
|
import nl.jqno.equalsverifier.Warning;
|
||||||
|
|
||||||
|
@ -117,4 +127,73 @@ class MapWithAIInfoTest {
|
||||||
EqualsVerifier.forClass(MapWithAIInfo.class).suppress(Warning.NONFINAL_FIELDS)
|
EqualsVerifier.forClass(MapWithAIInfo.class).suppress(Warning.NONFINAL_FIELDS)
|
||||||
.withOnlyTheseFields("url", "sourceType").usingGetClass().verify();
|
.withOnlyTheseFields("url", "sourceType").usingGetClass().verify();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Non-regression test for #22440: NPE in
|
||||||
|
* {@link MapWithAIInfo#getConflationUrl}. This is caused by the
|
||||||
|
* {@link MapWithAIInfo#getId()} being {@code null}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void testNonRegression22440UpdateFallback() {
|
||||||
|
TestUtils.assumeWorkingJMockit();
|
||||||
|
MapWithAIInfo info = new MapWithAIInfo("22440", "https://test.example", null);
|
||||||
|
info.setConflationUrl("https://test.example/{id}");
|
||||||
|
info.setConflation(true);
|
||||||
|
MapWithAILayerInfo.getInstance().clear();
|
||||||
|
MapWithAILayerInfo.getInstance().add(info);
|
||||||
|
AtomicBoolean updateCalled = new AtomicBoolean();
|
||||||
|
new MockUp<MapWithAILayerInfo>() {
|
||||||
|
@Mock
|
||||||
|
public void load(boolean fastFail, MapWithAILayerInfo.FinishListener listener) {
|
||||||
|
updateCalled.set(true);
|
||||||
|
listener.onFinish();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
assertDoesNotThrow(info::getUrlExpanded);
|
||||||
|
MainApplication.worker.submit(() -> {
|
||||||
|
/* Sync thread */ });
|
||||||
|
GuiHelper.runInEDTAndWait(() -> {
|
||||||
|
/* Sync thread */ });
|
||||||
|
assertTrue(updateCalled.get());
|
||||||
|
assertEquals(1, MapWithAILayerInfo.getInstance().getLayers().size());
|
||||||
|
assertSame(info, MapWithAILayerInfo.getInstance().getLayers().get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Non-regression test for #22440: NPE in
|
||||||
|
* {@link MapWithAIInfo#getConflationUrl}. This is caused by the
|
||||||
|
* {@link MapWithAIInfo#getId()} being {@code null}.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
void testNonRegression22440Update() {
|
||||||
|
TestUtils.assumeWorkingJMockit();
|
||||||
|
MapWithAIInfo info = new MapWithAIInfo("22440", "https://test.example", null);
|
||||||
|
info.setConflationUrl("https://test.example/{id}");
|
||||||
|
info.setConflation(true);
|
||||||
|
MapWithAILayerInfo.getInstance().clear();
|
||||||
|
MapWithAILayerInfo.getInstance().add(info);
|
||||||
|
AtomicBoolean updateCalled = new AtomicBoolean();
|
||||||
|
new MockUp<MapWithAILayerInfo>() {
|
||||||
|
@Mock
|
||||||
|
public void load(boolean fastFail, MapWithAILayerInfo.FinishListener listener) {
|
||||||
|
updateCalled.set(true);
|
||||||
|
listener.onFinish();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
public List<MapWithAIInfo> getAllDefaultLayers() {
|
||||||
|
return Collections.singletonList(new MapWithAIInfo("22440Update", "https://test.example", "22"));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
assertNull(info.getId());
|
||||||
|
assertDoesNotThrow(info::getUrlExpanded);
|
||||||
|
MainApplication.worker.submit(() -> {
|
||||||
|
/* Sync thread */ });
|
||||||
|
GuiHelper.runInEDTAndWait(() -> {
|
||||||
|
/* Sync thread */ });
|
||||||
|
assertTrue(updateCalled.get());
|
||||||
|
assertEquals(1, MapWithAILayerInfo.getInstance().getLayers().size());
|
||||||
|
assertSame(info, MapWithAILayerInfo.getInstance().getLayers().get(0));
|
||||||
|
assertEquals("22", info.getId());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue