001package org.maltparser.core.flow.system.elem;
002
003import java.util.LinkedHashMap;
004
005import org.maltparser.core.exception.MaltChainedException;
006import org.maltparser.core.flow.FlowException;
007import org.maltparser.core.flow.item.ChartItem;
008import org.maltparser.core.flow.system.FlowChartSystem;
009import org.maltparser.core.plugin.PluginLoader;
010import org.w3c.dom.Element;
011import org.w3c.dom.NodeList;
012/**
013*
014*
015* @author Johan Hall
016*/
017public 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}