    001    package org.maltparser.core.flow.system.elem;
    002
    003    import java.util.LinkedHashMap;
    004
    005    import org.maltparser.core.exception.MaltChainedException;
    006    import org.maltparser.core.flow.FlowException;
    007    import org.maltparser.core.flow.item.ChartItem;
    008    import org.maltparser.core.flow.system.FlowChartSystem;
    009    import org.maltparser.core.plugin.PluginLoader;
    010    import org.w3c.dom.Element;
    011    import org.w3c.dom.NodeList;
    012    /**
    013    *
    014    *
    015    * @author Johan Hall
    016    */
    017    public class ChartElement {
    018            private String item;
    019            private Class<? extends ChartItem> chartItemClass;
    020            private LinkedHashMap<String,ChartAttribute> attributes;
    021
    022            public ChartElement() {
    023                    attributes = new LinkedHashMap<String,ChartAttribute>();
    024            }
    025
    026            public String getItem() {
    027                    return item;
    028            }
    029
    030            public void setItem(String item) {
    031                    this.item = item;
    032            }
    033
    034            public void addAttribute(String name, ChartAttribute attribute) {
    035                    attributes.put(name, attribute);
    036            }
    037
    038            public ChartAttribute getAttribute(String name) {
    039                    return attributes.get(name);
    040            }
    041
    042            public Class<? extends ChartItem> getChartItemClass() {
    043                    return chartItemClass;
    044            }
    045
    046
    047            public LinkedHashMap<String, ChartAttribute> getAttributes() {
    048                    return attributes;
    049            }
    050
    051            public void read(Element chartElem, FlowChartSystem flowChartSystem) throws MaltChainedException {
    052                    setItem(chartElem.getAttribute("item"));
    053                    String chartItemClassName = chartElem.getAttribute("class");
    054                    Class<?> clazz = null;
    055                    try {
    056                            if (PluginLoader.instance() != null) {
    057                                    clazz = PluginLoader.instance().getClass(chartItemClassName);
    058                            }
    059                            if (clazz == null) {
    060                                    clazz = Class.forName(chartItemClassName);
    061                            }
    062                            this.chartItemClass = clazz.asSubclass(org.maltparser.core.flow.item.ChartItem.class);
    063                    } catch (ClassCastException e) {
    064                            throw new FlowException("The class '"+clazz.getName()+"' is not a subclass of '"+org.maltparser.core.flow.item.ChartItem.class.getName()+"'. ", e);
    065                    } catch (ClassNotFoundException e) {
    066                            throw new FlowException("The class "+chartItemClassName+"  could not be found. ", e);
    067                    }
    068                    NodeList attrElements = chartElem.getElementsByTagName("attribute");
    069                    for (int i = 0; i < attrElements.getLength(); i++) {
    070                            ChartAttribute attribute = new ChartAttribute();
    071                            attribute.read((Element)attrElements.item(i),flowChartSystem);
    072                            attributes.put(((Element)attrElements.item(i)).getAttribute("name"), attribute);
    073                    }
    074            }
    075
    076            public String toString() {
    077                    StringBuilder sb = new StringBuilder();
    078                    sb.append("    ");
    079                    sb.append(item);
    080                    sb.append(' ');
    081                    sb.append(chartItemClass.getName());
    082                    sb.append('\n');
    083                    for (String key : attributes.keySet()) {
    084                            sb.append("       ");
    085                            sb.append(attributes.get(key));
    086                            sb.append('\n');
    087                    }
    088                    return sb.toString();
    089            }
    090    }