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 }