/*
* #%L
* gitools-ui-app
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.ui.app.datasources.biomart.panel;
import org.gitools.datasources.biomart.restful.model.AttributeCollection;
import org.gitools.datasources.biomart.restful.model.AttributeDescription;
import org.gitools.datasources.biomart.restful.model.AttributeGroup;
import org.gitools.datasources.biomart.restful.model.AttributePage;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import java.util.List;
/**
* @noinspection ALL
*/
public class AttributesTreeModel extends DefaultTreeModel {
/**
* @noinspection UnusedDeclaration
*/
private static final long serialVersionUID = 8325493802045161663L;
public static class AttributeWrapper {
public enum NodeType {
ROOT, PAGE, GROUP, COLLECTION, ATTRIBUTE
}
private final Object object;
private final NodeType type;
private String name;
public AttributeWrapper(Object object) {
this.object = object;
type = nodeType(object);
name = nodeName(object, type);
if (name.endsWith(":")) {
name = name.substring(0, name.length() - 1);
}
}
private NodeType nodeType(Object o) {
if (o == this) {
return NodeType.ROOT;
} else if (o instanceof AttributePage) {
return NodeType.PAGE;
} else if (o instanceof AttributeGroup) {
return NodeType.GROUP;
} else if (o instanceof AttributeCollection) {
return NodeType.COLLECTION;
}
return NodeType.ATTRIBUTE;
}
private String nodeName(Object o, NodeType type) {
String nodeName = "unknown type";
switch (type) {
case ROOT:
return "root";
case PAGE:
AttributePage page = ((AttributePage) object);
nodeName = page.getDisplayName();
if (nodeName == null) {
nodeName = page.getDescription();
}
if (nodeName == null) {
nodeName = "Attribute page without name";
}
break;
case GROUP:
AttributeGroup group = ((AttributeGroup) object);
nodeName = group.getDisplayName();
if (nodeName == null) {
nodeName = group.getDescription();
}
if (nodeName == null) {
nodeName = group.getInternalName();
}
if (nodeName == null) {
nodeName = "Attribute group without name";
}
break;
case COLLECTION:
AttributeCollection coll = ((AttributeCollection) object);
nodeName = coll.getDisplayName();
if (nodeName == null) {
nodeName = coll.getDescription();
}
if (nodeName == null) {
nodeName = coll.getInternalName();
}
if (nodeName == null) {
nodeName = "Attribute collection without name";
}
break;
case ATTRIBUTE:
AttributeDescription desc = ((AttributeDescription) object);
nodeName = desc.getDisplayName();
if (nodeName == null) {
nodeName = desc.getDescription();
}
if (nodeName == null) {
nodeName = desc.getInternalName();
}
if (nodeName == null) {
nodeName = "Attribute group without name";
}
break;
}
return nodeName;
}
public String getName() {
return name;
}
public NodeType getType() {
return type;
}
public Object getObject() {
return object;
}
@Override
public String toString() {
return name;
}
}
public AttributesTreeModel(List<AttributePage> pages) {
this(pages, "");
}
public AttributesTreeModel(List<AttributePage> pages, String filterText) {
super(new DefaultMutableTreeNode("root"));
filterText = filterText.toLowerCase();
DefaultMutableTreeNode node = (DefaultMutableTreeNode) getRoot();
for (AttributePage page : pages) {
if (!page.isHidden() && !page.isHideDisplay()) {
if (page.getOutFormats().toLowerCase().contains("tsv")) {
DefaultMutableTreeNode pageNode = new DefaultMutableTreeNode(new AttributeWrapper(page));
if (populatePage(pageNode, page.getAttributeGroups(), filterText) > 0) {
node.add(pageNode);
}
}
}
}
}
private int populatePage(DefaultMutableTreeNode node, List<AttributeGroup> groups, String filterText) {
for (AttributeGroup group : groups) {
DefaultMutableTreeNode groupNode = new DefaultMutableTreeNode(new AttributeWrapper(group));
if (populateGroup(groupNode, group.getAttributeCollections(), filterText) > 0) {
node.add(groupNode);
}
}
return node.getChildCount();
}
private int populateGroup(DefaultMutableTreeNode node, List<AttributeCollection> collections, String filterText) {
for (AttributeCollection coll : collections) {
DefaultMutableTreeNode collNode = new DefaultMutableTreeNode(new AttributeWrapper(coll));
if (populateCollection(collNode, coll.getAttributeDescriptions(), filterText) > 0) {
node.add(collNode);
}
}
return node.getChildCount();
}
private int populateCollection(DefaultMutableTreeNode node, List<AttributeDescription> attrs, String filterText) {
for (AttributeDescription attr : attrs) {
if (attr.getDisplayName() != null) //xrp: identified null displayNames
{
AttributeWrapper aw = new AttributeWrapper(attr);
if (filterText.isEmpty() || aw.getName().toLowerCase().contains(filterText)) {
node.add(new DefaultMutableTreeNode(aw));
}
}
}
return node.getChildCount();
}
}