diff --git a/commons/src/main/java/lcsb/mapviewer/common/TextFileUtils.java b/commons/src/main/java/lcsb/mapviewer/common/TextFileUtils.java index 824ae83c9397d9737e9bc99dfb5db90d5557961b..3f0b8226e2f641f8e1e90e306193866dd4770b76 100644 --- a/commons/src/main/java/lcsb/mapviewer/common/TextFileUtils.java +++ b/commons/src/main/java/lcsb/mapviewer/common/TextFileUtils.java @@ -15,50 +15,50 @@ import java.util.Map; */ public final class TextFileUtils { - /** - * Name of the param that contains number of columns. - */ - public static final String COLUMN_COUNT_PARAM = "__COLUMN_COUNT"; + /** + * Name of the param that contains number of columns. + */ + public static final String COLUMN_COUNT_PARAM = "__COLUMN_COUNT"; - /** - * Default constructor that prevents instatiation. - */ - private TextFileUtils() { + /** + * Default constructor that prevents instatiation. + */ + private TextFileUtils() { - } + } - /** - * Parses input stream to get parameters from header. {@link InputStream} - * should be a text file. Header parameters are lines at the beginning of the - * file starting with '#' character. - * - * @param is - * input stream for a file to process - * @return map with paramteres parsed from input stream - * @throws IOException - * thrown when there is a problem with accessing input stream - */ - public static Map<String, String> getHeaderParametersFromFile(InputStream is) throws IOException { - Map<String, String> result = new HashMap<String, String>(); - BufferedReader in = new BufferedReader(new InputStreamReader(is)); - String line = null; - while ((line = in.readLine()) != null) { - if (line.startsWith("#")) { - String tmp = line.substring(1); - if (tmp.indexOf("=") > 0) { - String key = tmp.substring(0, tmp.indexOf("=")).trim(); - String value = tmp.substring(tmp.indexOf("=") + 1).trim(); - result.put(key, value); - } - } else { - String key = COLUMN_COUNT_PARAM; - String value = line.split("\t").length + ""; - result.put(key, value); - break; - } - } - is.close(); - return result; - } + /** + * Parses input stream to get parameters from header. {@link InputStream} should + * be a text file. Header parameters are lines at the beginning of the file + * starting with '#' character. + * + * @param is + * input stream for a file to process + * @return map with parameters parsed from input stream + * @throws IOException + * thrown when there is a problem with accessing input stream + */ + public static Map<String, String> getHeaderParametersFromFile(InputStream is) throws IOException { + Map<String, String> result = new HashMap<>(); + BufferedReader in = new BufferedReader(new InputStreamReader(is)); + String line = null; + while ((line = in.readLine()) != null) { + if (line.startsWith("#")) { + String tmp = line.substring(1); + if (tmp.indexOf("=") > 0) { + String key = tmp.substring(0, tmp.indexOf("=")).trim(); + String value = tmp.substring(tmp.indexOf("=") + 1).trim(); + result.put(key, value); + } + } else { + String key = COLUMN_COUNT_PARAM; + String value = line.split("\t").length + ""; + result.put(key, value); + break; + } + } + is.close(); + return result; + } } diff --git a/model/src/main/java/lcsb/mapviewer/model/map/layout/ColorSchemaType.java b/model/src/main/java/lcsb/mapviewer/model/map/layout/ColorSchemaType.java new file mode 100644 index 0000000000000000000000000000000000000000..1c0072a4ed635fc87cb1db3ec8f795defe919b9e --- /dev/null +++ b/model/src/main/java/lcsb/mapviewer/model/map/layout/ColorSchemaType.java @@ -0,0 +1,19 @@ +package lcsb.mapviewer.model.map.layout; + +/** + * Type of the {@link ColorSchema}. + * + * @author Piotr Gawron + * + */ +public enum ColorSchemaType { + /** + * Generic color schema (used for expression levels, etc). + */ + GENERIC, + + /** + * Customized color schema used for highlighting genetic variants. + */ + GENETIC_VARIANT +} diff --git a/model/src/main/java/lcsb/mapviewer/model/map/layout/Layout.java b/model/src/main/java/lcsb/mapviewer/model/map/layout/Layout.java index 6e51b69dc6f9d99e8e1b7d01be16697e63a2f368..4e3537e542a2c4a6952a76012bfcbf52ad9c4082 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/layout/Layout.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/layout/Layout.java @@ -91,6 +91,13 @@ public class Layout implements Serializable { private boolean googleLicenseConsent = false; + /** + * Data overlay type. It can be null in such case it should be obtained from + * {@link #inputData}. + */ + @Enumerated(EnumType.STRING) + private ColorSchemaType colorSchemaType = null; + /** * If overlay contain hierarchical view then it might be fixed on some specific * level. This parameter defines the level at which it's fixed or contains null @@ -421,4 +428,12 @@ public class Layout implements Serializable { this.dataOverlayImageLayers = dataOverlayImageLayers; } + public ColorSchemaType getColorSchemaType() { + return colorSchemaType; + } + + public void setColorSchemaType(ColorSchemaType colorSchemaType) { + this.colorSchemaType = colorSchemaType; + } + } diff --git a/persist/src/main/resources/db/migration/12.2.0~alpha.0/V12.2.0.20181221__overlay_type_property_added.sql b/persist/src/main/resources/db/migration/12.2.0~alpha.0/V12.2.0.20181221__overlay_type_property_added.sql new file mode 100644 index 0000000000000000000000000000000000000000..dcf1b3feb5fb9bf83624f1c37cdcfff9e3339d17 --- /dev/null +++ b/persist/src/main/resources/db/migration/12.2.0~alpha.0/V12.2.0.20181221__overlay_type_property_added.sql @@ -0,0 +1 @@ +alter table layout_table add column color_schema_type character varying(255); \ No newline at end of file diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java index ade14766842c0596142c7054188a209ecd68d7a9..3030964b4d50e8140eca19c6e05c048f02fd54f0 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java @@ -1,8 +1,6 @@ package lcsb.mapviewer.api.configuration; -import java.io.File; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -28,6 +26,7 @@ import lcsb.mapviewer.converter.graphics.ImageGenerators; import lcsb.mapviewer.model.graphics.MapCanvasType; import lcsb.mapviewer.model.map.MiriamType; import lcsb.mapviewer.model.map.kinetics.SbmlUnitType; +import lcsb.mapviewer.model.map.layout.ColorSchemaType; import lcsb.mapviewer.model.map.model.SubmodelType; import lcsb.mapviewer.model.map.reaction.Reaction; import lcsb.mapviewer.model.map.species.Element; @@ -39,7 +38,6 @@ import lcsb.mapviewer.modelutils.map.ClassTreeNode; import lcsb.mapviewer.modelutils.map.ElementUtils; import lcsb.mapviewer.services.SecurityException; import lcsb.mapviewer.services.interfaces.IConfigurationService; -import lcsb.mapviewer.services.utils.data.ColorSchemaType; @Transactional @Service diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelRestImpl.java index e89cc3a92b6b6e609595068b96466c5a73f8a984..98534da8ffe5ac85a10f1ed7b0a736e408322bed 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/models/ModelRestImpl.java @@ -238,7 +238,7 @@ public class ModelRestImpl extends BaseRestImpl { Layout overlay = layoutService.getLayoutById(Integer.parseInt(overlayId.trim()), token); ColorSchemaReader reader = new ColorSchemaReader(); - Collection<ColorSchema> schemas = reader.readColorSchema(overlay.getInputData().getFileContent()); + Collection<ColorSchema> schemas = reader.readColorSchema(overlay.getInputData().getFileContent(), overlay.getColorSchemaType()); new ColorModelCommand(part, schemas, getUserService().getColorExtractorForUser(user)).execute(); } @@ -328,7 +328,7 @@ public class ModelRestImpl extends BaseRestImpl { if (overlay != null) { if (overlay.getInputData() != null) { ColorSchemaReader reader = new ColorSchemaReader(); - Collection<ColorSchema> schemas = reader.readColorSchema(overlay.getInputData().getFileContent()); + Collection<ColorSchema> schemas = reader.readColorSchema(overlay.getInputData().getFileContent(), overlay.getColorSchemaType()); new ColorModelCommand(colorModel, schemas, getUserService().getColorExtractorForUser(user)).execute(); } else if (overlay.getTitle().equals(BuildInLayout.CLEAN.getTitle())) { diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java index 6fc3eeb5912e5bdcca0368bf51fd5fd1325b6795..39de15b080fd6d3f3b38b9c21dbb4387d0cb2072 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java @@ -43,8 +43,8 @@ public class OverlayController extends BaseController { @CookieValue(value = Configuration.AUTH_TOKEN) String token, @PathVariable(value = "projectId") String projectId, @RequestParam(value = "creator", defaultValue = "") String creator, - @RequestParam(value = "publicOverlay", defaultValue = "") String publicOverlay - ) throws SecurityException, QueryException { + @RequestParam(value = "publicOverlay", defaultValue = "") String publicOverlay) + throws SecurityException, QueryException { return overlayRestImp.getOverlayList(token, projectId, creator, publicOverlay); } @@ -53,8 +53,7 @@ public class OverlayController extends BaseController { public Map<String, Object> getOverlayById( @CookieValue(value = Configuration.AUTH_TOKEN) String token, @PathVariable(value = "projectId") String projectId, - @PathVariable(value = "overlayId") String overlayId - ) throws SecurityException, QueryException { + @PathVariable(value = "overlayId") String overlayId) throws SecurityException, QueryException { return overlayRestImp.getOverlayById(token, projectId, overlayId); } @@ -76,8 +75,7 @@ public class OverlayController extends BaseController { @PathVariable(value = "modelId") String modelId, @PathVariable(value = "overlayId") String overlayId, @PathVariable(value = "reactionId") String reactionId, - @RequestParam(value = "columns", defaultValue = "") String columns - ) throws SecurityException, QueryException { + @RequestParam(value = "columns", defaultValue = "") String columns) throws SecurityException, QueryException { return overlayRestImp.getOverlayElement(token, projectId, Integer.valueOf(modelId), Integer.valueOf(overlayId), Integer.valueOf(reactionId), "REACTION", columns); } @@ -90,8 +88,7 @@ public class OverlayController extends BaseController { @PathVariable(value = "modelId") String modelId, @PathVariable(value = "overlayId") String overlayId, @PathVariable(value = "elementId") String reactionId, - @RequestParam(value = "columns", defaultValue = "") String columns - ) throws SecurityException, QueryException { + @RequestParam(value = "columns", defaultValue = "") String columns) throws SecurityException, QueryException { return overlayRestImp.getOverlayElement(token, projectId, Integer.valueOf(modelId), Integer.valueOf(overlayId), Integer.valueOf(reactionId), "ALIAS", columns); } @@ -106,10 +103,11 @@ public class OverlayController extends BaseController { @RequestParam(value = "content", defaultValue = "") String content, @RequestParam(value = "fileId", defaultValue = "") String fileId, @RequestParam(value = "filename") String filename, - @RequestParam(value = "googleLicenseConsent") String googleLicenseConsent, - @RequestParam(value = "type", defaultValue = "") String type - ) throws SecurityException, QueryException, IOException { - return overlayRestImp.addOverlay(token, projectId, name, description, content, fileId, filename, type, googleLicenseConsent); + @RequestParam(value = "googleLicenseConsent") String googleLicenseConsent, + @RequestParam(value = "type", defaultValue = "") String type) + throws SecurityException, QueryException, IOException { + return overlayRestImp.addOverlay(token, projectId, name, description, content, fileId, filename, type, + googleLicenseConsent); } @RequestMapping(value = "/projects/{projectId}/overlays/{overlayId}", method = { RequestMethod.DELETE }, produces = { @@ -117,8 +115,7 @@ public class OverlayController extends BaseController { public Map<String, Object> removeOverlay( @CookieValue(value = Configuration.AUTH_TOKEN) String token, @PathVariable(value = "projectId") String projectId, - @PathVariable(value = "overlayId") String overlayId - ) throws SecurityException, QueryException, IOException { + @PathVariable(value = "overlayId") String overlayId) throws SecurityException, QueryException, IOException { return overlayRestImp.removeOverlay(token, projectId, overlayId); } @@ -128,8 +125,8 @@ public class OverlayController extends BaseController { @RequestBody String body, @PathVariable(value = "projectId") String projectId, @PathVariable(value = "overlayId") String overlayId, - @CookieValue(value = Configuration.AUTH_TOKEN) String token - ) throws SecurityException, QueryException, IOException { + @CookieValue(value = Configuration.AUTH_TOKEN) String token) + throws SecurityException, QueryException, IOException { Map<String, Object> node = parseBody(body); Map<String, Object> data = getData(node, "overlay"); return overlayRestImp.updateOverlay(token, projectId, overlayId, data); @@ -140,8 +137,8 @@ public class OverlayController extends BaseController { public ResponseEntity<byte[]> getOverlaySource( @CookieValue(value = Configuration.AUTH_TOKEN) String token, @PathVariable(value = "projectId") String projectId, - @PathVariable(value = "overlayId") String overlayId - ) throws SecurityException, QueryException, JsonParseException, JsonMappingException, IOException { + @PathVariable(value = "overlayId") String overlayId) + throws SecurityException, QueryException, JsonParseException, JsonMappingException, IOException { FileEntry file = overlayRestImp.getOverlaySource(token, projectId, overlayId); MediaType type = MediaType.TEXT_PLAIN; 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 000bbc3e3ffbad9c2cba1c9acbe0b2293c1d1d6e..88c1282aa598d5867fb4e5faec7c3b947bf138ef 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 @@ -28,6 +28,7 @@ import lcsb.mapviewer.model.cache.FileEntry; import lcsb.mapviewer.model.cache.UploadedFileEntry; import lcsb.mapviewer.model.map.BioEntity; import lcsb.mapviewer.model.map.layout.ColorSchema; +import lcsb.mapviewer.model.map.layout.ColorSchemaType; import lcsb.mapviewer.model.map.layout.DataOverlayImageLayer; import lcsb.mapviewer.model.map.layout.GeneVariationColorSchema; import lcsb.mapviewer.model.map.layout.InvalidColorSchemaException; @@ -42,7 +43,6 @@ import lcsb.mapviewer.persist.dao.map.LayoutDao; import lcsb.mapviewer.services.SecurityException; import lcsb.mapviewer.services.interfaces.ILayoutService; import lcsb.mapviewer.services.interfaces.ILayoutService.CreateLayoutParams; -import lcsb.mapviewer.services.utils.data.ColorSchemaType; @Transactional @Service diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImplTest.java index 51eef85b9c446dcd9d6d4d798ffacc7abf2713c6..7c940c37e3e25ce57ce87e9a58c1af5b48f65912 100644 --- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImplTest.java +++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImplTest.java @@ -11,10 +11,10 @@ import com.google.gson.Gson; import lcsb.mapviewer.api.RestTestFunctions; import lcsb.mapviewer.model.Project; +import lcsb.mapviewer.model.map.layout.ColorSchemaType; import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.persist.dao.ProjectDao; import lcsb.mapviewer.services.interfaces.IProjectService; -import lcsb.mapviewer.services.utils.data.ColorSchemaType; public class OverlayRestImplTest extends RestTestFunctions { diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java index b2d15f274784b1d2797649c1364f6747e8e04544..54713f147be7290e11d16cd9d930d530498158b3 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java @@ -29,6 +29,7 @@ import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.common.exception.InvalidStateException; import lcsb.mapviewer.converter.graphics.MapGenerator; import lcsb.mapviewer.converter.graphics.MapGenerator.MapGeneratorParams; +import lcsb.mapviewer.converter.zip.ZipEntryFileFactory; import lcsb.mapviewer.model.Project; import lcsb.mapviewer.model.cache.UploadedFileEntry; import lcsb.mapviewer.model.map.BioEntity; @@ -392,11 +393,14 @@ public class LayoutService implements ILayoutService { return topLayout; } - @Override - public Layout createLayout(final CreateLayoutParams params) throws IOException, InvalidColorSchemaException { - ColorSchemaReader reader = new ColorSchemaReader(); - final Collection<ColorSchema> schemas = reader.readColorSchema(params.getColorInputStream(), - TextFileUtils.getHeaderParametersFromFile(params.getColorInputStream())); + @Override + public Layout createLayout(final CreateLayoutParams params) throws IOException, InvalidColorSchemaException { + ColorSchemaReader reader = new ColorSchemaReader(); + Map<String, String> parameters = TextFileUtils.getHeaderParametersFromFile(params.getColorInputStream()); + if (params.getColorSchemaType() != null) { + parameters.put(ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE, params.getColorSchemaType().name()); + } + final Collection<ColorSchema> schemas = reader.readColorSchema(params.getColorInputStream(), parameters); // check if we can color our model using this schema, // if not then exception will be thrown and passed up @@ -411,6 +415,7 @@ public class LayoutService implements ILayoutService { layoutDao.flush(); Layout topLayout = new Layout(params.getName(), false); + topLayout.setColorSchemaType(params.getColorSchemaType()); if (params.getUser() == null) { topLayout.setPublicLayout(true); } else { @@ -792,71 +797,76 @@ public class LayoutService implements ILayoutService { } } - @Override - public List<Pair<Element, ColorSchema>> getAliasesForLayout(Model model, int layoutId, String token) - throws SecurityException { - try { - ColorSchemaReader reader = new ColorSchemaReader(); - Collection<ColorSchema> schemas = reader.readColorSchema(getInputDataForLayout(layoutId, token)); - // colors here are not important - ColorModelCommand command = new ColorModelCommand(model, schemas, - new ColorExtractor(Color.BLACK, Color.BLACK, Color.BLACK)); - List<Pair<Element, ColorSchema>> result = new ArrayList<>(); - for (Map.Entry<Object, ColorSchema> entry : command.getModifiedElements().entrySet()) { - if (entry.getKey() instanceof Element) { - result.add(new Pair<Element, ColorSchema>((Element) entry.getKey(), entry.getValue())); - } - } - result.sort(LayoutService.ELEMENT_PAIR_COMPARATOR); - return result; - } catch (InvalidColorSchemaException e) { - throw new InvalidStateException(e); - } catch (IOException e) { - throw new InvalidStateException(e); + @Override + public List<Pair<Element, ColorSchema>> getAliasesForLayout(Model model, int layoutId, String token) + throws SecurityException { + try { + Collection<ColorSchema> schemas = createColorSchemaCollection(layoutId, token); + // colors here are not important + ColorModelCommand command = new ColorModelCommand(model, schemas, + new ColorExtractor(Color.BLACK, Color.BLACK, Color.BLACK)); + List<Pair<Element, ColorSchema>> result = new ArrayList<>(); + for (Map.Entry<Object, ColorSchema> entry : command.getModifiedElements().entrySet()) { + if (entry.getKey() instanceof Element) { + result.add(new Pair<Element, ColorSchema>((Element) entry.getKey(), entry.getValue())); } + } + result.sort(LayoutService.ELEMENT_PAIR_COMPARATOR); + return result; + } catch (InvalidColorSchemaException e) { + throw new InvalidStateException(e); + } catch (IOException e) { + throw new InvalidStateException(e); } + } - @Override - public List<Pair<Reaction, ColorSchema>> getReactionsForLayout(Model model, int layoutId, String token) - throws SecurityException { - try { - ColorSchemaReader reader = new ColorSchemaReader(); - Collection<ColorSchema> schemas = reader.readColorSchema(getInputDataForLayout(layoutId, token)); - // colors here are not important - ColorModelCommand command = new ColorModelCommand(model, schemas, - new ColorExtractor(Color.BLACK, Color.BLACK, Color.BLACK)); - List<Pair<Reaction, ColorSchema>> result = new ArrayList<>(); - for (Map.Entry<Object, ColorSchema> entry : command.getModifiedElements().entrySet()) { - if (entry.getKey() instanceof Reaction) { - result.add(new Pair<Reaction, ColorSchema>((Reaction) entry.getKey(), entry.getValue())); - } - } - result.sort(LayoutService.ELEMENT_PAIR_COMPARATOR); - return result; - } catch (InvalidColorSchemaException e) { - throw new InvalidStateException(e); - } catch (IOException e) { - throw new InvalidStateException(e); + private Collection<ColorSchema> createColorSchemaCollection(int overlayId, String token) + throws IOException, InvalidColorSchemaException, SecurityException { + ColorSchemaReader reader = new ColorSchemaReader(); + Layout overlay = getLayoutById(overlayId, token); + Collection<ColorSchema> schemas = reader.readColorSchema(getInputDataForLayout(overlayId, token), + overlay.getColorSchemaType()); + return schemas; + } + + @Override + public List<Pair<Reaction, ColorSchema>> getReactionsForLayout(Model model, int layoutId, String token) + throws SecurityException { + try { + Collection<ColorSchema> schemas = createColorSchemaCollection(layoutId, token); + // colors here are not important + ColorModelCommand command = new ColorModelCommand(model, schemas, + new ColorExtractor(Color.BLACK, Color.BLACK, Color.BLACK)); + List<Pair<Reaction, ColorSchema>> result = new ArrayList<>(); + for (Map.Entry<Object, ColorSchema> entry : command.getModifiedElements().entrySet()) { + if (entry.getKey() instanceof Reaction) { + result.add(new Pair<Reaction, ColorSchema>((Reaction) entry.getKey(), entry.getValue())); } + } + result.sort(LayoutService.ELEMENT_PAIR_COMPARATOR); + return result; + } catch (InvalidColorSchemaException e) { + throw new InvalidStateException(e); + } catch (IOException e) { + throw new InvalidStateException(e); } + } - @Override - public Map<Object, ColorSchema> getElementsForLayout(Model model, Integer layoutId, String token) - throws SecurityException { - try { - ColorSchemaReader reader = new ColorSchemaReader(); - Collection<ColorSchema> schemas; - schemas = reader.readColorSchema(getInputDataForLayout(layoutId, token)); - // colors here are not important - ColorModelCommand command = new ColorModelCommand(model, schemas, - new ColorExtractor(Color.BLACK, Color.BLACK, Color.BLACK)); - return command.getModifiedElements(); - } catch (InvalidColorSchemaException e) { - throw new InvalidStateException(e); - } catch (IOException e) { - throw new InvalidStateException(e); - } + @Override + public Map<Object, ColorSchema> getElementsForLayout(Model model, Integer layoutId, String token) + throws SecurityException { + try { + Collection<ColorSchema> schemas = createColorSchemaCollection(layoutId, token); + // colors here are not important + ColorModelCommand command = new ColorModelCommand(model, schemas, + new ColorExtractor(Color.BLACK, Color.BLACK, Color.BLACK)); + return command.getModifiedElements(); + } catch (InvalidColorSchemaException e) { + throw new InvalidStateException(e); + } catch (IOException e) { + throw new InvalidStateException(e); } + } @Override public EmailSender getEmailSender() { @@ -902,16 +912,15 @@ public class LayoutService implements ILayoutService { return layout; } - @Override - public Pair<Element, ColorSchema> getFullAliasForLayout(Model model, Integer id, int layoutId, String token) - throws SecurityException { - try { - ColorSchemaReader reader = new ColorSchemaReader(); - Collection<ColorSchema> schemas; - schemas = reader.readColorSchema(getInputDataForLayout(layoutId, token)); - // colors here are not important - ColorModelCommand command = new ColorModelCommand(model, schemas, - new ColorExtractor(Color.BLACK, Color.BLACK, Color.BLACK)); + @Override + public Pair<Element, ColorSchema> getFullAliasForLayout(Model model, Integer id, int layoutId, String token) + throws SecurityException { + try { + ColorSchemaReader reader = new ColorSchemaReader(); + Collection<ColorSchema> schemas = createColorSchemaCollection(layoutId, token); + // colors here are not important + ColorModelCommand command = new ColorModelCommand(model, schemas, + new ColorExtractor(Color.BLACK, Color.BLACK, Color.BLACK)); for (Map.Entry<Object, ColorSchema> entry : command.getModifiedElements().entrySet()) { if (entry.getKey() instanceof Element) { @@ -929,16 +938,14 @@ public class LayoutService implements ILayoutService { } } - @Override - public Pair<Reaction, ColorSchema> getFullReactionForLayout(Model model, Integer id, int layoutId, String token) - throws SecurityException { - try { - ColorSchemaReader reader = new ColorSchemaReader(); - Collection<ColorSchema> schemas; - schemas = reader.readColorSchema(getInputDataForLayout(layoutId, token)); - // colors here are not important - ColorModelCommand command = new ColorModelCommand(model, schemas, - new ColorExtractor(Color.BLACK, Color.BLACK, Color.BLACK)); + @Override + public Pair<Reaction, ColorSchema> getFullReactionForLayout(Model model, Integer id, int layoutId, String token) + throws SecurityException { + try { + Collection<ColorSchema> schemas = createColorSchemaCollection(layoutId, token); + // colors here are not important + ColorModelCommand command = new ColorModelCommand(model, schemas, + new ColorExtractor(Color.BLACK, Color.BLACK, Color.BLACK)); for (Map.Entry<Object, ColorSchema> entry : command.getModifiedElements().entrySet()) { if (entry.getKey() instanceof Reaction) { diff --git a/service/src/main/java/lcsb/mapviewer/services/interfaces/ILayoutService.java b/service/src/main/java/lcsb/mapviewer/services/interfaces/ILayoutService.java index 11f129385e07dc35a4ec6483414a8048a8f7db27..6901b0297a3486ba0ad5cea00d3f54bf0942b78a 100644 --- a/service/src/main/java/lcsb/mapviewer/services/interfaces/ILayoutService.java +++ b/service/src/main/java/lcsb/mapviewer/services/interfaces/ILayoutService.java @@ -11,6 +11,7 @@ import lcsb.mapviewer.commands.CommandExecutionException; import lcsb.mapviewer.common.Pair; import lcsb.mapviewer.model.Project; import lcsb.mapviewer.model.map.layout.ColorSchema; +import lcsb.mapviewer.model.map.layout.ColorSchemaType; import lcsb.mapviewer.model.map.layout.InvalidColorSchemaException; import lcsb.mapviewer.model.map.layout.Layout; import lcsb.mapviewer.model.map.model.Model; @@ -20,7 +21,6 @@ import lcsb.mapviewer.model.user.User; import lcsb.mapviewer.persist.dao.map.LayoutDao; import lcsb.mapviewer.services.SecurityException; import lcsb.mapviewer.services.utils.EmailSender; -import lcsb.mapviewer.services.utils.data.ColorSchemaType; /** * Service that manages layouts of the map. 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 983d3f3b82bcf22c83460240af8bf3d1650aff7b..9b77d4d774ecccb0ba3f232b2da2a0841b12a770 100644 --- a/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java +++ b/service/src/main/java/lcsb/mapviewer/services/utils/ColorSchemaReader.java @@ -8,7 +8,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -31,6 +30,7 @@ import lcsb.mapviewer.converter.zip.ZipEntryFileFactory; import lcsb.mapviewer.model.map.MiriamData; import lcsb.mapviewer.model.map.MiriamType; import lcsb.mapviewer.model.map.layout.ColorSchema; +import lcsb.mapviewer.model.map.layout.ColorSchemaType; import lcsb.mapviewer.model.map.layout.GeneVariation; import lcsb.mapviewer.model.map.layout.GeneVariationColorSchema; import lcsb.mapviewer.model.map.layout.GenericColorSchema; @@ -38,7 +38,6 @@ import lcsb.mapviewer.model.map.layout.InvalidColorSchemaException; import lcsb.mapviewer.model.map.layout.ReferenceGenomeType; import lcsb.mapviewer.model.map.species.Element; import lcsb.mapviewer.services.utils.data.ColorSchemaColumn; -import lcsb.mapviewer.services.utils.data.ColorSchemaType; /** * Class that reads information about set of {@link ColorSchema color schemas} @@ -726,9 +725,19 @@ public class ColorSchemaReader { * @throws InvalidColorSchemaException * thrown when color schema is invalid */ - public Collection<ColorSchema> readColorSchema(String filename) throws IOException, InvalidColorSchemaException { - return readColorSchema(new FileInputStream(filename), - TextFileUtils.getHeaderParametersFromFile(new FileInputStream(filename))); + public Collection<ColorSchema> readColorSchema(String filename, ColorSchemaType colorSchemaType) + throws IOException, InvalidColorSchemaException { + Map<String, String> params = TextFileUtils.getHeaderParametersFromFile(new FileInputStream(filename)); + if (colorSchemaType != null) { + params.put(ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE, colorSchemaType.name()); + } + + return readColorSchema(new FileInputStream(filename), params); + } + + Collection<ColorSchema> readColorSchema(String filename) + throws IOException, InvalidColorSchemaException { + return readColorSchema(filename, null); } /** @@ -740,7 +749,7 @@ public class ColorSchemaReader { * schemas) */ public Collection<ColorSchemaColumn> getSetColorSchemaColumns(Collection<ColorSchema> schemas) { - Set<ColorSchemaColumn> result = new HashSet<ColorSchemaColumn>(); + Set<ColorSchemaColumn> result = new HashSet<>(); for (ColorSchema schema : schemas) { if (schema.getColor() != null) { result.add(ColorSchemaColumn.COLOR); @@ -788,8 +797,12 @@ public class ColorSchemaReader { * @throws InvalidColorSchemaException * thrown when color schema is invalid */ - public Collection<ColorSchema> readColorSchema(byte[] inputData) throws IOException, InvalidColorSchemaException { - return readColorSchema(new ByteArrayInputStream(inputData), - TextFileUtils.getHeaderParametersFromFile(new ByteArrayInputStream(inputData))); + public Collection<ColorSchema> readColorSchema(byte[] inputData, ColorSchemaType colorSchemaType) + throws IOException, InvalidColorSchemaException { + Map<String, String> params = TextFileUtils.getHeaderParametersFromFile(new ByteArrayInputStream(inputData)); + if (colorSchemaType != null) { + params.put(ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE, colorSchemaType.name()); + } + return readColorSchema(new ByteArrayInputStream(inputData), params); } } diff --git a/service/src/main/java/lcsb/mapviewer/services/utils/data/ColorSchemaColumn.java b/service/src/main/java/lcsb/mapviewer/services/utils/data/ColorSchemaColumn.java index 6e593c9bf27b9f83744ae9f6599cbb392a71ad0b..838eeda5fee327c79a855b7cc0138f1e5601c9d1 100644 --- a/service/src/main/java/lcsb/mapviewer/services/utils/data/ColorSchemaColumn.java +++ b/service/src/main/java/lcsb/mapviewer/services/utils/data/ColorSchemaColumn.java @@ -3,6 +3,7 @@ package lcsb.mapviewer.services.utils.data; import java.util.HashSet; import java.util.Set; +import lcsb.mapviewer.model.map.layout.ColorSchemaType; import lcsb.mapviewer.model.map.layout.ReferenceGenome; import lcsb.mapviewer.model.map.layout.ReferenceGenomeType; diff --git a/service/src/main/java/lcsb/mapviewer/services/utils/data/ColorSchemaType.java b/service/src/main/java/lcsb/mapviewer/services/utils/data/ColorSchemaType.java deleted file mode 100644 index 108a4ce7b17c75c68e02d6c5c7c0c674a07e4549..0000000000000000000000000000000000000000 --- a/service/src/main/java/lcsb/mapviewer/services/utils/data/ColorSchemaType.java +++ /dev/null @@ -1,21 +0,0 @@ -package lcsb.mapviewer.services.utils.data; - -import lcsb.mapviewer.model.map.layout.ColorSchema; - -/** - * Type of the {@link ColorSchema}. - * - * @author Piotr Gawron - * - */ -public enum ColorSchemaType { - /** - * Generic color schema (used for expression levels, etc). - */ - GENERIC, - - /** - * Customized color schema used for highlightig genetic variants. - */ - GENETIC_VARIANT -} diff --git a/service/src/test/java/lcsb/mapviewer/services/impl/LayoutServiceTest.java b/service/src/test/java/lcsb/mapviewer/services/impl/LayoutServiceTest.java index 30aec7f8281dbe5c14250e749c48762751eb5cb1..9e2a8022b39ddef02196c5f042228654bf88685b 100644 --- a/service/src/test/java/lcsb/mapviewer/services/impl/LayoutServiceTest.java +++ b/service/src/test/java/lcsb/mapviewer/services/impl/LayoutServiceTest.java @@ -13,6 +13,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; @@ -28,6 +29,8 @@ import lcsb.mapviewer.common.TextFileUtils; import lcsb.mapviewer.converter.ConverterParams; import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser; import lcsb.mapviewer.model.Project; +import lcsb.mapviewer.model.map.layout.ColorSchema; +import lcsb.mapviewer.model.map.layout.ColorSchemaType; import lcsb.mapviewer.model.map.layout.DataOverlayImageLayer; import lcsb.mapviewer.model.map.layout.ColorSchema; import lcsb.mapviewer.model.map.layout.GeneVariationColorSchema; @@ -441,7 +444,7 @@ public class LayoutServiceTest extends ServiceTestFunctions { Model model = new CellDesignerXmlParser() .createModel(new ConverterParams().filename("testFiles/coloring/problematicModel2.xml")); - + project.addModel(model); projectService.addProject(project); @@ -497,4 +500,28 @@ public class LayoutServiceTest extends ServiceTestFunctions { } + @Test + public void testDataOverlayWithType() throws Exception { + try { + String layoutId = "Test"; + userService.setUserPrivilege(user, new Privilege(1, PrivilegeType.CUSTOM_LAYOUTS, user)); + CreateLayoutParams params = new CreateLayoutParams().name(layoutId). + directory("testDir"). + project(project). + colorInputStream(new FileInputStream("testFiles/coloring/gene_variants_without_type.txt")). + user(user).colorSchemaType(ColorSchemaType.GENETIC_VARIANT); + + Layout layout = layoutService.createLayout(params); + Map<Object, ColorSchema> result = layoutService.getElementsForLayout(model, layout.getId(), token); + assertNotNull(result); + layoutService.removeLayout(layout, null); + + + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + + } diff --git a/service/testFiles/coloring/gene_variants_without_type.txt b/service/testFiles/coloring/gene_variants_without_type.txt new file mode 100644 index 0000000000000000000000000000000000000000..b58ad1bb264649bb748d1a3887c97c15a5af5bf5 --- /dev/null +++ b/service/testFiles/coloring/gene_variants_without_type.txt @@ -0,0 +1,4 @@ +#GENOME_TYPE=UCSC +#GENOME_VERSION=hg38 +position original_dna alternative_dna name description color contig +10146 AC A DDX11L1 upstream #ff0000 chr1