package org.iplantc.phyloviewer.model; import java.io.File; import java.io.IOException; import java.io.Reader; import java.util.List; import org.iplantc.phyloparser.exception.ParserException; import org.iplantc.phyloparser.model.FileData; import org.iplantc.phyloparser.model.Node; import org.iplantc.phyloparser.model.block.Block; import org.iplantc.phyloparser.model.block.TreesBlock; public class NewickParser { public NewickParser() { } public org.iplantc.phyloviewer.shared.model.Tree parse(File file) { org.iplantc.phyloparser.parser.NewickParser parser = new org.iplantc.phyloparser.parser.NewickParser(); try { FileData data = parser.parse(file); return getTree(data); } catch(IOException e) { } catch(ParserException e) { } return null; } public org.iplantc.phyloviewer.shared.model.Tree parse(Reader reader) { org.iplantc.phyloparser.parser.NewickParser parser = new org.iplantc.phyloparser.parser.NewickParser(); try { FileData data = parser.parse(reader, false); return getTree(data); } catch(IOException e) { } catch(ParserException e) { } return null; } private org.iplantc.phyloviewer.shared.model.Tree getTree(FileData data) { org.iplantc.phyloparser.model.Tree tree = null; List<Block> blocks = data.getBlocks(); for(Block block : blocks) { if(block instanceof TreesBlock) { TreesBlock trees = (TreesBlock)block; tree = trees.getTrees().get(0); } } ConvertDataModels converter = new ConvertDataModels(); org.iplantc.phyloviewer.shared.model.Node node = converter.convertDataModels(tree.getRoot()); tree = null; org.iplantc.phyloviewer.shared.model.Tree myTree = new org.iplantc.phyloviewer.shared.model.Tree(); myTree.setRootNode(node); return myTree; } private class ConvertDataModels { int nextId = 0; public org.iplantc.phyloviewer.shared.model.Node convertDataModels( org.iplantc.phyloparser.model.Node node) { List<Node> myChildren = node.getChildren(); int len = myChildren.size(); org.iplantc.phyloviewer.shared.model.Node[] children = new org.iplantc.phyloviewer.shared.model.Node[len]; int id = nextId++; for(int i = 0;i < len;i++) { Node myChild = myChildren.get(i); org.iplantc.phyloviewer.shared.model.Node child = convertDataModels(myChild); children[i] = child; } String label = node.getName(); // create a Node for the current node org.iplantc.phyloviewer.shared.model.Node rNode = new org.iplantc.phyloviewer.shared.model.Node( id, label); rNode.setChildren(children); rNode.setBranchLength(node.getBranchLength()); return rNode; } } }