001    package org.maltparser.core.syntaxgraph;
002    
003    import java.util.SortedMap;
004    
005    import org.maltparser.core.exception.MaltChainedException;
006    import org.maltparser.core.symbol.SymbolTable;
007    
008    /**
009    *
010    *
011    * @author Johan Hall
012    */
013    public class RootLabels {
014            public final static String DEFAULT_ROOTSYMBOL = "ROOT";
015            private LabelSet rootLabelCodes;
016    
017            public RootLabels() {
018                    rootLabelCodes = new LabelSet();
019            }
020            
021            public void setRootLabels(String rootLabelOption, SortedMap<String, SymbolTable> edgeSymbolTables) throws MaltChainedException {
022                    if (edgeSymbolTables == null) {
023                            return;
024                    } else if (rootLabelOption == null || rootLabelOption.trim().length() == 0) {
025                            for (SymbolTable table : edgeSymbolTables.values()) {
026                                    rootLabelCodes.put(table, table.addSymbol(RootLabels.DEFAULT_ROOTSYMBOL));
027                            }
028                    } else if (rootLabelOption.trim().indexOf(',') == -1) {
029                            int index = rootLabelOption.trim().indexOf('=');
030                            if (index == -1) {
031                                    for (SymbolTable table : edgeSymbolTables.values()) {
032                                            rootLabelCodes.put(table, table.addSymbol(rootLabelOption.trim()));
033                                    }
034                            } else {
035                                    String name = rootLabelOption.trim().substring(0, index);
036                                    if (edgeSymbolTables.get(name) == null) {
037                                            throw new SyntaxGraphException("The symbol table '"+ name+"' cannot be found when defining the root symbol. ");
038                                    } else {
039                                            rootLabelCodes.put(edgeSymbolTables.get(name), edgeSymbolTables.get(name).addSymbol(rootLabelOption.trim().substring(index+1)));
040                                            if (edgeSymbolTables.size() > 1) {
041                                                    for (SymbolTable table : edgeSymbolTables.values()) {
042                                                            if (!table.getName().equals(name)) {
043                                                                    rootLabelCodes.put(table, table.addSymbol(RootLabels.DEFAULT_ROOTSYMBOL));                                      
044                                                            }
045                                                    }
046                                            }
047                                    }
048                            }
049                    } else {
050                            String[] items = rootLabelOption.trim().split(",");
051                            for (int i=0; i<items.length; i++) {
052                                    int index = items[i].trim().indexOf('=');
053                                    if (index == -1) {
054                                            throw new SyntaxGraphException("The root symbol is undefinied. ");
055                                    } else {
056                                            String name = items[i].trim().substring(0, index);
057                                            if (edgeSymbolTables.get(name) == null) {
058                                                    throw new SyntaxGraphException("The symbol table'"+ name+"' cannot be found when defining the root symbol. ");
059                                            } else {
060                                                    rootLabelCodes.put(edgeSymbolTables.get(name), edgeSymbolTables.get(name).addSymbol(items[i].trim().substring(index+1)));
061                                            }
062                                    }
063                            }
064                            for (SymbolTable table : edgeSymbolTables.values()) {
065                                    if (!rootLabelCodes.containsKey(table)) {
066                                            rootLabelCodes.put(table, table.addSymbol(RootLabels.DEFAULT_ROOTSYMBOL));                                      
067                                    }
068                            }
069                    }
070            }
071            
072            public void setDefaultRootLabel(SymbolTable table, String defaultRootSymbol) throws MaltChainedException {
073                    rootLabelCodes.put(table, table.addSymbol(defaultRootSymbol));  
074            }
075            
076            public Integer getDefaultRootLabelCode(SymbolTable table) throws MaltChainedException {
077                    Integer res = rootLabelCodes.get(table);
078                    if (res == null) {
079                            return table.addSymbol(RootLabels.DEFAULT_ROOTSYMBOL);
080                    }
081                    return res;
082            }
083            
084            public LabelSet getDefaultRootLabels() throws MaltChainedException {
085                    return new LabelSet(rootLabelCodes);
086            }
087            
088            public String getDefaultRootLabelSymbol(SymbolTable table) throws MaltChainedException {
089                    return table.getSymbolCodeToString(getDefaultRootLabelCode(table));
090            }
091            
092            
093            public boolean checkRootLabelCodes(LabelSet rlc) {
094                    if (rlc == null && rootLabelCodes == null) {
095                            return true; // or false ?
096                    } else if ((rlc == null && rootLabelCodes != null) || (rlc != null && rootLabelCodes == null)) {
097                            return false;
098                    } else if (rlc.size() != rootLabelCodes.size()) {
099                            return false;
100                    } else {
101                            for (SymbolTable table : rootLabelCodes.keySet()) {
102                                    if (!rootLabelCodes.get(table).equals(rlc.get(table))) {
103                                            return false;
104                                    }
105                            }
106                            return true;
107                    }
108            }
109    }