Skip to content
Snippets Groups Projects
Commit fc0310de authored by Piotr Gawron's avatar Piotr Gawron
Browse files

string<->species mapping is case insensitive

this is used by ColorSchemaReader
parent f7933cb2
No related branches found
No related tags found
1 merge request!141Resolve "Overlays: user data upload"
package lcsb.mapviewer.converter.model.celldesigner.species;
import lcsb.mapviewer.common.exception.InvalidStateException;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerAntisenseRna;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerComplexSpecies;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerDegraded;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerDrug;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerGene;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerIon;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerPhenotype;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerProtein;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerRna;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerSimpleMolecule;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerSpecies;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerUnknown;
import lcsb.mapviewer.model.map.species.AntisenseRna;
import lcsb.mapviewer.model.map.species.Complex;
import lcsb.mapviewer.model.map.species.Degraded;
import lcsb.mapviewer.model.map.species.Drug;
import lcsb.mapviewer.model.map.species.Element;
import lcsb.mapviewer.model.map.species.Gene;
import lcsb.mapviewer.model.map.species.Ion;
import lcsb.mapviewer.model.map.species.Phenotype;
import lcsb.mapviewer.model.map.species.Protein;
import lcsb.mapviewer.model.map.species.Rna;
import lcsb.mapviewer.model.map.species.SimpleMolecule;
import lcsb.mapviewer.model.map.species.Unknown;
/**
* This enum contains information about mapping between CellDesigner xml nodes
* and classes that extend {@link CellDesignerSpecies}.
*
* @author Piotr Gawron
*
*/
public enum SpeciesMapping {
/**
* {@link Protein}.
*/
PROTEIN(CellDesignerProtein.class, Protein.class, "PROTEIN"), //
/**
* {@link Gene}.
*/
GENE(CellDesignerGene.class, Gene.class, "GENE"), //
/**
* {@link ComplexSpecies}.
*/
COMPLEX(CellDesignerComplexSpecies.class, Complex.class, "COMPLEX"), //
/**
* {@link SimpleMolecule}.
*/
SIMPLE_MOLECULE(CellDesignerSimpleMolecule.class, SimpleMolecule.class, "SIMPLE_MOLECULE"), //
/**
* {@link Ion}.
*/
ION(CellDesignerIon.class, Ion.class, "ION"), //
/**
* {@link Phenotype}.
*/
PHENOTYPE(CellDesignerPhenotype.class, Phenotype.class, "PHENOTYPE"), //
/**
* {@link Drug}.
*/
DRUG(CellDesignerDrug.class, Drug.class, "DRUG"), //
/**
* {@link Rna}.
*/
RNA(CellDesignerRna.class, Rna.class, "RNA"), //
/**
* {@link AntisenseRna}.
*/
ANTISENSE_RNA(CellDesignerAntisenseRna.class, AntisenseRna.class, "ANTISENSE_RNA"), //
/**
* {@link Unknown}.
*/
UNKNOWN(CellDesignerUnknown.class, Unknown.class, "UNKNOWN"), //
/**
* {@link Degraded}.
*/
DEGRADED(CellDesignerDegraded.class, Degraded.class, "DEGRADED");
/**
* CellDesigner xml node type.
*/
private String cellDesignerString;
/**
* Class that should be used to represent cell designer node.
*/
private Class<? extends CellDesignerSpecies<?>> cellDesignerClazz;
/**
* Model class that represent the species.
*/
private Class<? extends Element> modelClazz;
/**
* Default constructor.
*
* @param cellDesignerClazz
* {@link #clazz}
* @param modelClazz
* {@link #clazz class} in model corresponding to celldesigner object
* @param cellDesignerString
* {@link #cellDesignerString}
*/
SpeciesMapping(Class<?> cellDesignerClazz, Class<? extends Element> modelClazz, String cellDesignerString) {
this.cellDesignerString = cellDesignerString;
this.setCellDesignerClazz(cellDesignerClazz);
this.modelClazz = modelClazz;
}
/**
* Sets new cellDesignerClazz value.
*
* @param cellDesignerClazz2
* new cellDesignerClazz value
*/
@SuppressWarnings("unchecked")
private void setCellDesignerClazz(Class<?> cellDesignerClazz2) {
cellDesignerClazz = (Class<? extends CellDesignerSpecies<?>>) cellDesignerClazz2;
}
/**
* @return the cellDesignerString
* @see #cellDesignerString
*/
public String getCellDesignerString() {
return cellDesignerString;
}
/**
* @return the clazz
* @see #clazz
*/
public Class<? extends CellDesignerSpecies<?>> getCellDesignerClazz() {
return cellDesignerClazz;
}
/**
* Returns model class that represent the species.
*
* @return model class that represent the species
*/
public Class<? extends Element> getModelClazz() {
return modelClazz;
}
/**
* Creates instance of {@link CellDesignerSpecies} specific for this
* {@link SpeciesMapping}.
*
* @param result
* parameter that should be passed to the constructor
* @return new instance of {@link CellDesignerSpecies} specific for this
* {@link SpeciesMapping}.
*/
public CellDesignerSpecies<?> createSpecies(CellDesignerSpecies<?> result) {
try {
return cellDesignerClazz.getConstructor(result.getClass()).newInstance(result);
} catch (Exception e) {
throw new InvalidStateException(e);
}
}
/**
* Returns {@link SpeciesMapping} for given CellDesigner xml node name.
*
* @param string
* CellDesigner xml node name
* @return {@link SpeciesMapping} for given CellDesigner xml node name
*/
public static SpeciesMapping getMappingByString(String string) {
for (SpeciesMapping mapping : SpeciesMapping.values()) {
if (mapping.getCellDesignerString().equals(string)) {
return mapping;
}
}
return null;
}
/**
* Returns {@link SpeciesMapping} for given {@link CellDesignerSpecies} class.
*
* @param searchClazz
* {@link CellDesignerSpecies} class
* @return {@link SpeciesMapping} for given {@link CellDesignerSpecies} class
*/
public static SpeciesMapping getMappingByModelClass(Class<? extends Element> searchClazz) {
for (SpeciesMapping mapping : SpeciesMapping.values()) {
if (mapping.getModelClazz().isAssignableFrom(searchClazz)) {
return mapping;
}
}
return null;
}
}
package lcsb.mapviewer.converter.model.celldesigner.species;
import lcsb.mapviewer.common.exception.InvalidStateException;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerAntisenseRna;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerComplexSpecies;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerDegraded;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerDrug;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerGene;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerIon;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerPhenotype;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerProtein;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerRna;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerSimpleMolecule;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerSpecies;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerUnknown;
import lcsb.mapviewer.model.map.species.AntisenseRna;
import lcsb.mapviewer.model.map.species.Complex;
import lcsb.mapviewer.model.map.species.Degraded;
import lcsb.mapviewer.model.map.species.Drug;
import lcsb.mapviewer.model.map.species.Element;
import lcsb.mapviewer.model.map.species.Gene;
import lcsb.mapviewer.model.map.species.Ion;
import lcsb.mapviewer.model.map.species.Phenotype;
import lcsb.mapviewer.model.map.species.Protein;
import lcsb.mapviewer.model.map.species.Rna;
import lcsb.mapviewer.model.map.species.SimpleMolecule;
import lcsb.mapviewer.model.map.species.Unknown;
/**
* This enum contains information about mapping between CellDesigner xml nodes
* and classes that extend {@link CellDesignerSpecies}.
*
* @author Piotr Gawron
*
*/
public enum SpeciesMapping {
/**
* {@link Protein}.
*/
PROTEIN(CellDesignerProtein.class, Protein.class, "PROTEIN"), //
/**
* {@link Gene}.
*/
GENE(CellDesignerGene.class, Gene.class, "GENE"), //
/**
* {@link ComplexSpecies}.
*/
COMPLEX(CellDesignerComplexSpecies.class, Complex.class, "COMPLEX"), //
/**
* {@link SimpleMolecule}.
*/
SIMPLE_MOLECULE(CellDesignerSimpleMolecule.class, SimpleMolecule.class, "SIMPLE_MOLECULE"), //
/**
* {@link Ion}.
*/
ION(CellDesignerIon.class, Ion.class, "ION"), //
/**
* {@link Phenotype}.
*/
PHENOTYPE(CellDesignerPhenotype.class, Phenotype.class, "PHENOTYPE"), //
/**
* {@link Drug}.
*/
DRUG(CellDesignerDrug.class, Drug.class, "DRUG"), //
/**
* {@link Rna}.
*/
RNA(CellDesignerRna.class, Rna.class, "RNA"), //
/**
* {@link AntisenseRna}.
*/
ANTISENSE_RNA(CellDesignerAntisenseRna.class, AntisenseRna.class, "ANTISENSE_RNA"), //
/**
* {@link Unknown}.
*/
UNKNOWN(CellDesignerUnknown.class, Unknown.class, "UNKNOWN"), //
/**
* {@link Degraded}.
*/
DEGRADED(CellDesignerDegraded.class, Degraded.class, "DEGRADED");
/**
* CellDesigner xml node type.
*/
private String cellDesignerString;
/**
* Class that should be used to represent cell designer node.
*/
private Class<? extends CellDesignerSpecies<?>> cellDesignerClazz;
/**
* Model class that represent the species.
*/
private Class<? extends Element> modelClazz;
/**
* Default constructor.
*
* @param cellDesignerClazz
* {@link #clazz}
* @param modelClazz
* {@link #clazz class} in model corresponding to CellDesigner object
* @param cellDesignerString
* {@link #cellDesignerString}
*/
SpeciesMapping(Class<?> cellDesignerClazz, Class<? extends Element> modelClazz, String cellDesignerString) {
this.cellDesignerString = cellDesignerString;
this.setCellDesignerClazz(cellDesignerClazz);
this.modelClazz = modelClazz;
}
/**
* Sets new cellDesignerClazz value.
*
* @param cellDesignerClazz2
* new cellDesignerClazz value
*/
@SuppressWarnings("unchecked")
private void setCellDesignerClazz(Class<?> cellDesignerClazz2) {
cellDesignerClazz = (Class<? extends CellDesignerSpecies<?>>) cellDesignerClazz2;
}
/**
* @return the cellDesignerString
* @see #cellDesignerString
*/
public String getCellDesignerString() {
return cellDesignerString;
}
/**
* @return the clazz
* @see #clazz
*/
public Class<? extends CellDesignerSpecies<?>> getCellDesignerClazz() {
return cellDesignerClazz;
}
/**
* Returns model class that represent the species.
*
* @return model class that represent the species
*/
public Class<? extends Element> getModelClazz() {
return modelClazz;
}
/**
* Creates instance of {@link CellDesignerSpecies} specific for this
* {@link SpeciesMapping}.
*
* @param result
* parameter that should be passed to the constructor
* @return new instance of {@link CellDesignerSpecies} specific for this
* {@link SpeciesMapping}.
*/
public CellDesignerSpecies<?> createSpecies(CellDesignerSpecies<?> result) {
try {
return cellDesignerClazz.getConstructor(result.getClass()).newInstance(result);
} catch (Exception e) {
throw new InvalidStateException(e);
}
}
/**
* Returns {@link SpeciesMapping} for given CellDesigner xml node name.
*
* @param string
* CellDesigner xml node name
* @return {@link SpeciesMapping} for given CellDesigner xml node name
*/
public static SpeciesMapping getMappingByString(String string) {
for (SpeciesMapping mapping : SpeciesMapping.values()) {
if (mapping.getCellDesignerString().equalsIgnoreCase(string)) {
return mapping;
}
}
return null;
}
/**
* Returns {@link SpeciesMapping} for given {@link CellDesignerSpecies} class.
*
* @param searchClazz
* {@link CellDesignerSpecies} class
* @return {@link SpeciesMapping} for given {@link CellDesignerSpecies} class
*/
public static SpeciesMapping getMappingByModelClass(Class<? extends Element> searchClazz) {
for (SpeciesMapping mapping : SpeciesMapping.values()) {
if (mapping.getModelClazz().isAssignableFrom(searchClazz)) {
return mapping;
}
}
return null;
}
}
package lcsb.mapviewer.converter.model.celldesigner.species;
import static org.junit.Assert.*;
import java.lang.reflect.Field;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Test;
import lcsb.mapviewer.common.exception.InvalidStateException;
import lcsb.mapviewer.common.exception.NotImplementedException;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerSpecies;
import lcsb.mapviewer.model.map.species.Protein;
public class SpeciesMappingTest {
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testAllValues() {
for (SpeciesMapping value : SpeciesMapping.values()) {
assertNotNull(SpeciesMapping.valueOf(value.toString()));
}
}
@Test
public void testCreateInvalidSpeciesImpl() throws Exception {
// artificial implementation of Species that is invalid
class InvalidSpecies extends CellDesignerSpecies<Protein> {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unused")
public InvalidSpecies() {
throw new NotImplementedException();
}
}
// mopdify one of the elements of SpeciesMapping so it will have invalid
// implementation
SpeciesMapping typeToModify = SpeciesMapping.ANTISENSE_RNA;
Class<? extends CellDesignerSpecies<?>> clazz = typeToModify.getCellDesignerClazz();
try {
Field field = typeToModify.getClass().getDeclaredField("cellDesignerClazz");
field.setAccessible(true);
field.set(typeToModify, InvalidSpecies.class);
// and check if we catch properly information about problematic
// implementation
typeToModify.createSpecies(new CellDesignerSpecies<Protein>());
fail("Exceptione expected");
} catch (InvalidStateException e) {
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
// restore correct values for the modified type (if not then other test
// might fail...)
Field field = typeToModify.getClass().getDeclaredField("cellDesignerClazz");
field.setAccessible(true);
field.set(typeToModify, clazz);
}
}
}
package lcsb.mapviewer.converter.model.celldesigner.species;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.lang.reflect.Field;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Test;
import lcsb.mapviewer.common.exception.InvalidStateException;
import lcsb.mapviewer.common.exception.NotImplementedException;
import lcsb.mapviewer.converter.model.celldesigner.structure.CellDesignerSpecies;
import lcsb.mapviewer.model.map.species.Protein;
public class SpeciesMappingTest {
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void testAllValues() {
for (SpeciesMapping value : SpeciesMapping.values()) {
assertNotNull(SpeciesMapping.valueOf(value.toString()));
}
}
@Test
public void testGetMappingByStringCaseInsensitive() throws Exception {
SpeciesMapping mapping = SpeciesMapping.getMappingByString("PHENOTYPE");
assertNotNull(mapping);
mapping = SpeciesMapping.getMappingByString("phenotype");
assertNotNull(mapping);
}
@Test
public void testCreateInvalidSpeciesImpl() throws Exception {
// artificial implementation of Species that is invalid
class InvalidSpecies extends CellDesignerSpecies<Protein> {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unused")
public InvalidSpecies() {
throw new NotImplementedException();
}
}
// modify one of the elements of SpeciesMapping so it will have invalid
// implementation
SpeciesMapping typeToModify = SpeciesMapping.ANTISENSE_RNA;
Class<? extends CellDesignerSpecies<?>> clazz = typeToModify.getCellDesignerClazz();
try {
Field field = typeToModify.getClass().getDeclaredField("cellDesignerClazz");
field.setAccessible(true);
field.set(typeToModify, InvalidSpecies.class);
// and check if we catch properly information about problematic
// implementation
typeToModify.createSpecies(new CellDesignerSpecies<Protein>());
fail("Exceptione expected");
} catch (InvalidStateException e) {
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
// restore correct values for the modified type (if not then other test
// might fail...)
Field field = typeToModify.getClass().getDeclaredField("cellDesignerClazz");
field.setAccessible(true);
field.set(typeToModify, clazz);
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment