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

parser of sbml function

parent 7c4d21e2
No related branches found
No related tags found
1 merge request!186Resolve "upload of sbml"
Showing
with 1184 additions and 943 deletions
package lcsb.mapviewer.converter.model.celldesigner.function;
import java.util.HashSet;
import java.util.Set;
import org.w3c.dom.Node;
import lcsb.mapviewer.common.XmlParser;
import lcsb.mapviewer.common.exception.InvalidXmlSchemaException;
import lcsb.mapviewer.model.map.SbmlFunction;
public class FunctionCollectionXmlParser extends XmlParser {
private FunctionXmlParser functionParser = new FunctionXmlParser();
public Set<SbmlFunction> parseXmlFunctionCollection(Node functionsNode) throws InvalidXmlSchemaException {
Set<SbmlFunction> result = new HashSet<>();
for (Node node : super.getNodes("functionDefinition", functionsNode.getChildNodes())) {
result.add(functionParser.parseFunction(node));
}
return result;
}
}
package lcsb.mapviewer.converter.model.celldesigner.function;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.w3c.dom.Node;
import lcsb.mapviewer.common.XmlParser;
import lcsb.mapviewer.common.exception.InvalidXmlSchemaException;
import lcsb.mapviewer.model.map.SbmlFunction;
public class FunctionXmlParser extends XmlParser {
Logger logger = Logger.getLogger(FunctionXmlParser.class);
public SbmlFunction parseFunction(Node functionNode) throws InvalidXmlSchemaException {
String functionId = getNodeAttr("id", functionNode);
SbmlFunction result = new SbmlFunction(functionId);
result.setName(getNodeAttr("name", functionNode));
Node mathDefinition = getNode("math", functionNode);
if (mathDefinition == null) {
throw new InvalidXmlSchemaException("Function " + functionId + " doesn't contain MathML definition (math node)");
}
result.setDefinition(nodeToString(mathDefinition));
result.setArguments(parseArgumentsFromMath(mathDefinition, functionId));
return result;
}
private List<String> parseArgumentsFromMath(Node mathDefinition, String functionId) throws InvalidXmlSchemaException {
List<String> result = new ArrayList<>();
Node lambdaDefinition = getNode("lambda", mathDefinition);
if (lambdaDefinition == null) {
throw new InvalidXmlSchemaException("Function " + functionId + " doesn't contain valid MathML lambda node");
}
List<Node> variables = super.getNodes("bvar", lambdaDefinition.getChildNodes());
for (Node node : variables) {
result.add(getNodeValue(getNode("ci", node)).trim());
}
return result;
}
}
package lcsb.mapviewer.converter.model.celldesigner.function;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import org.junit.Test;
import lcsb.mapviewer.common.exception.InvalidXmlSchemaException;
import lcsb.mapviewer.converter.model.celldesigner.CellDesignerTestFunctions;
import lcsb.mapviewer.model.map.SbmlFunction;
public class FunctionXmlParserTest extends CellDesignerTestFunctions {
FunctionXmlParser parser = new FunctionXmlParser();
@Test
public void testParseBasicData() throws InvalidXmlSchemaException, IOException {
SbmlFunction fun = parser
.parseFunction(super.getXmlDocumentFromFile("testFiles/function/simple.xml").getFirstChild());
assertNotNull(fun);
assertEquals(fun.getFunctionId(), "function_id");
assertEquals(fun.getName(), "Function name");
assertTrue(fun.getDefinition().indexOf("lambda") >= 0);
assertTrue(fun.getDefinition().indexOf("apply") >= 0);
}
@Test
public void testParseArgumentsData() throws InvalidXmlSchemaException, IOException {
SbmlFunction fun = parser
.parseFunction(super.getXmlDocumentFromFile("testFiles/function/simple.xml").getFirstChild());
assertNotNull(fun);
assertEquals(fun.getArguments().size(), 2);
assertEquals(fun.getArguments().get(0), "x");
}
@Test(expected = InvalidXmlSchemaException.class)
public void testParseInvalidDefinition() throws InvalidXmlSchemaException, IOException {
parser.parseFunction(super.getXmlDocumentFromFile("testFiles/function/invalid_definition.xml").getFirstChild());
}
@Test(expected = InvalidXmlSchemaException.class)
public void testParseInvalidMathMLNode() throws InvalidXmlSchemaException, IOException {
parser.parseFunction(super.getXmlDocumentFromFile("testFiles/function/invalid_math.xml").getFirstChild());
}
}
<?xml version="1.0" encoding="UTF-8"?>
<sbml xmlns="http://www.sbml.org/sbml/level2/version4" xmlns:celldesigner="http://www.sbml.org/2001/ns/celldesigner" level="2" version="4">
<model metaid="untitled" id="untitled">
<annotation>
<celldesigner:extension>
<celldesigner:modelVersion>4.0</celldesigner:modelVersion>
<celldesigner:modelDisplay sizeX="600" sizeY="400"/>
<celldesigner:listOfCompartmentAliases/>
<celldesigner:listOfComplexSpeciesAliases/>
<celldesigner:listOfSpeciesAliases/>
<celldesigner:listOfGroups/>
<celldesigner:listOfProteins/>
<celldesigner:listOfGenes/>
<celldesigner:listOfRNAs/>
<celldesigner:listOfAntisenseRNAs/>
<celldesigner:listOfLayers/>
<celldesigner:listOfBlockDiagrams/>
</celldesigner:extension>
</annotation>
<listOfFunctionDefinitions>
<functionDefinition metaid="function_id" id="function_id" name="Function name">
<math xmlns="http://www.w3.org/1998/Math/MathML">
<lambda>
<bvar>
<ci> x </ci>
</bvar>
<bvar>
<ci> y </ci>
</bvar>
<apply>
<plus/>
<ci> x </ci>
<ci> y </ci>
</apply>
</lambda>
</math>
</functionDefinition>
</listOfFunctionDefinitions>
<listOfUnitDefinitions>
<unitDefinition metaid="substance" id="substance" name="substance">
<listOfUnits>
<unit metaid="CDMT00004" kind="mole"/>
</listOfUnits>
</unitDefinition>
<unitDefinition metaid="volume" id="volume" name="volume">
<listOfUnits>
<unit metaid="CDMT00005" kind="litre"/>
</listOfUnits>
</unitDefinition>
<unitDefinition metaid="area" id="area" name="area">
<listOfUnits>
<unit metaid="CDMT00006" kind="metre" exponent="2"/>
</listOfUnits>
</unitDefinition>
<unitDefinition metaid="length" id="length" name="length">
<listOfUnits>
<unit metaid="CDMT00007" kind="metre"/>
</listOfUnits>
</unitDefinition>
<unitDefinition metaid="time" id="time" name="time">
<listOfUnits>
<unit metaid="CDMT00008" kind="second"/>
</listOfUnits>
</unitDefinition>
</listOfUnitDefinitions>
<listOfCompartments>
<compartment metaid="default" id="default" size="1" units="volume"/>
</listOfCompartments>
</model>
</sbml>
<functionDefinition metaid="function_id" id="function_id" name="Function name">
</functionDefinition>
<functionDefinition metaid="function_id" id="function_id" name="Function name">
<math xmlns="http://www.w3.org/1998/Math/MathML">
</math>
</functionDefinition>
<functionDefinition metaid="function_id" id="function_id" name="Function name">
<math xmlns="http://www.w3.org/1998/Math/MathML">
<lambda>
<bvar>
<ci> x </ci>
</bvar>
<bvar>
<ci> y </ci>
</bvar>
<apply>
<plus/>
<ci> x </ci>
<ci> y </ci>
</apply>
</lambda>
</math>
</functionDefinition>
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