From f84e94a29e53358a302cbf485ff4ce4a307a4ad8 Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Thu, 25 Jul 2019 16:55:36 +0200 Subject: [PATCH] provide info about deprecated columns in API --- .../projects/overlays/OverlayRestImpl.java | 17 +++++++++ .../services/utils/ColorSchemaReader.java | 34 +++++++++++++++-- .../web/OverlayControllerIntegrationTest.java | 37 +++++++++++++++++-- 3 files changed, 81 insertions(+), 7 deletions(-) diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImpl.java index 46a8341717..0ff7457c83 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImpl.java @@ -12,6 +12,7 @@ import org.springframework.transaction.annotation.Transactional; import lcsb.mapviewer.api.*; import lcsb.mapviewer.common.Pair; +import lcsb.mapviewer.common.exception.InvalidStateException; import lcsb.mapviewer.common.geometry.ColorParser; import lcsb.mapviewer.model.Project; import lcsb.mapviewer.model.cache.FileEntry; @@ -26,6 +27,8 @@ import lcsb.mapviewer.persist.dao.cache.UploadedFileEntryDao; import lcsb.mapviewer.persist.dao.map.LayoutDao; import lcsb.mapviewer.services.interfaces.ILayoutService; import lcsb.mapviewer.services.interfaces.ILayoutService.CreateLayoutParams; +import lcsb.mapviewer.services.utils.ColorSchemaReader; +import lcsb.mapviewer.services.utils.data.ColorSchemaColumn; @Transactional @Service @@ -78,6 +81,8 @@ public class OverlayRestImpl extends BaseRestImpl { result.put("description", overlay.getDescription()); result.put("publicOverlay", overlay.isPublicLayout()); result.put("defaultOverlay", overlay.isDefaultOverlay()); + + result.put("deprecatedColumns", getDeprecatedColumns(overlay)); result.put("googleLicenseConsent", overlay.isGoogleLicenseConsent()); List<Map<String, Object>> images = new ArrayList<>(); List<DataOverlayImageLayer> imageList = new ArrayList<>(overlay.getDataOverlayImageLayers()); @@ -97,6 +102,18 @@ public class OverlayRestImpl extends BaseRestImpl { return result; } + private String getDeprecatedColumns(Layout overlay) { + try { + String result = ""; + for (ColorSchemaColumn column : new ColorSchemaReader().getDeprecatedColumns(overlay)) { + result += column.name() + ","; + } + return result; + } catch (IOException | InvalidColorSchemaException e) { + throw new InvalidStateException(e); + } + } + public List<Map<String, Object>> getOverlayElements(String projectId, int overlayId, String columns) throws QueryException { diff --git a/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java b/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java index 72200ad594..a77487a00a 100644 --- a/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java +++ b/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java @@ -1,10 +1,9 @@ package lcsb.mapviewer.services.utils; -import java.awt.*; +import java.awt.Color; import java.io.*; import java.lang.reflect.Field; import java.util.*; -import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; @@ -12,8 +11,7 @@ import org.apache.logging.log4j.Logger; import lcsb.mapviewer.annotation.services.MiriamConnector; import lcsb.mapviewer.common.*; -import lcsb.mapviewer.common.exception.InvalidArgumentException; -import lcsb.mapviewer.common.exception.NotImplementedException; +import lcsb.mapviewer.common.exception.*; import lcsb.mapviewer.common.geometry.ColorParser; import lcsb.mapviewer.converter.model.celldesigner.species.SpeciesMapping; import lcsb.mapviewer.converter.zip.ZipEntryFileFactory; @@ -808,4 +806,32 @@ public class ColorSchemaReader { } return readColorSchema(new ByteArrayInputStream(inputData), params); } + + public List<ColorSchemaColumn> getDeprecatedColumns(Layout overlay) + throws IOException, InvalidColorSchemaException { + List<ColorSchemaColumn> result = new ArrayList<>(); + BufferedReader br = new BufferedReader( + new InputStreamReader(new ByteArrayInputStream(overlay.getInputData().getFileContent()))); + + String line = br.readLine(); + while (line != null && line.startsWith("#")) { + line = br.readLine(); + } + String[] columns = line.split("\t"); + + Map<ColorSchemaColumn, Integer> schemaColumns = new HashMap<>(); + parseColumns(columns, schemaColumns, ColorSchemaType.GENERIC); + for (ColorSchemaColumn column : schemaColumns.keySet()) { + try { + Field f = ColorSchemaColumn.class.getField(column.name()); + if (column.getDepractedColumnName() != null || f.isAnnotationPresent(Deprecated.class)) { + result.add(column); + } + } catch (NoSuchFieldException | SecurityException e) { + throw new InvalidStateException(e); + } + } + return result; + } + } diff --git a/web/src/test/java/lcsb/mapviewer/web/OverlayControllerIntegrationTest.java b/web/src/test/java/lcsb/mapviewer/web/OverlayControllerIntegrationTest.java index f0dfd1ee1f..705f1000d0 100644 --- a/web/src/test/java/lcsb/mapviewer/web/OverlayControllerIntegrationTest.java +++ b/web/src/test/java/lcsb/mapviewer/web/OverlayControllerIntegrationTest.java @@ -1,6 +1,6 @@ package lcsb.mapviewer.web; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -34,6 +34,7 @@ import lcsb.mapviewer.model.user.User; import lcsb.mapviewer.persist.dao.map.LayoutDao; import lcsb.mapviewer.services.interfaces.IModelService; import lcsb.mapviewer.services.interfaces.IUserService; +import lcsb.mapviewer.services.utils.data.ColorSchemaColumn; @RunWith(SpringJUnit4ClassRunner.class) @Transactional @@ -422,9 +423,8 @@ public class OverlayControllerIntegrationTest extends ControllerIntegrationTest .getAsJsonArray().size()); } - private Layout createOverlay(User admin) { + private Layout createOverlay(User admin, String content) { UploadedFileEntry file = new UploadedFileEntry(); - String content = "elementIdentifier\tvalue\n\t-1"; file.setFileContent(content.getBytes()); file.setLength(content.getBytes().length); @@ -436,6 +436,10 @@ public class OverlayControllerIntegrationTest extends ControllerIntegrationTest return overlay; } + private Layout createOverlay(User admin) { + return createOverlay(admin, "elementIdentifier\tvalue\n\t-1"); + } + @Test public void testGetReactionsForOverlay() throws Exception { User admin = createAdmin(TEST_ADMIN_LOGIN, TEST_ADMIN_PASSWORD); @@ -1028,4 +1032,31 @@ public class OverlayControllerIntegrationTest extends ControllerIntegrationTest .andExpect(status().is2xxSuccessful()); } + @Test + public void testDeprecatedOverlayInformation() throws Exception { + createAdmin(TEST_ADMIN_LOGIN, TEST_ADMIN_PASSWORD); + + Layout overlay = createOverlay(null, + "elementIdentifier\t" + ColorSchemaColumn.REACTION_IDENTIFIER + "\tvalue\n\t\t-1"); + overlay.setPublicLayout(true); + layoutDao.update(overlay); + + MockHttpSession session = createSession(TEST_ADMIN_LOGIN, TEST_ADMIN_PASSWORD); + + RequestBuilder request = get( + "/projects/" + TEST_PROJECT + "/overlays/" + overlay.getId() + "/") + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + .session(session); + + String response = mockMvc.perform(request) + .andExpect(status().is2xxSuccessful()) + .andReturn().getResponse().getContentAsString(); + String deprecatedColumns = new JsonParser() + .parse(response) + .getAsJsonObject().get("deprecatedColumns").getAsString(); + + assertNotNull(deprecatedColumns); + assertFalse(deprecatedColumns.isEmpty()); + } + } -- GitLab