package org.maltparser.core.syntaxgraph;
import java.util.SortedMap;
import org.maltparser.core.exception.MaltChainedException;
import org.maltparser.core.symbol.SymbolTable;
/**
*
*
* @author Johan Hall
*/
public class RootLabels {
public final static String DEFAULT_ROOTSYMBOL = "ROOT";
private final LabelSet rootLabelCodes;
public RootLabels() {
rootLabelCodes = new LabelSet();
}
public void setRootLabels(String rootLabelOption, SortedMap<String, SymbolTable> edgeSymbolTables) throws MaltChainedException {
if (edgeSymbolTables == null) {
return;
} else if (rootLabelOption == null || rootLabelOption.trim().length() == 0) {
for (SymbolTable table : edgeSymbolTables.values()) {
rootLabelCodes.put(table, table.addSymbol(RootLabels.DEFAULT_ROOTSYMBOL));
}
} else if (rootLabelOption.trim().indexOf(',') == -1) {
int index = rootLabelOption.trim().indexOf('=');
if (index == -1) {
for (SymbolTable table : edgeSymbolTables.values()) {
rootLabelCodes.put(table, table.addSymbol(rootLabelOption.trim()));
}
} else {
String name = rootLabelOption.trim().substring(0, index);
if (edgeSymbolTables.get(name) == null) {
throw new SyntaxGraphException("The symbol table '" + name + "' cannot be found when defining the root symbol. ");
} else {
rootLabelCodes.put(edgeSymbolTables.get(name), edgeSymbolTables.get(name).addSymbol(rootLabelOption.trim().substring(index + 1)));
if (edgeSymbolTables.size() > 1) {
for (SymbolTable table : edgeSymbolTables.values()) {
if (!table.getName().equals(name)) {
rootLabelCodes.put(table, table.addSymbol(RootLabels.DEFAULT_ROOTSYMBOL));
}
}
}
}
}
} else {
String[] items = rootLabelOption.trim().split(",");
for (int i = 0; i < items.length; i++) {
int index = items[i].trim().indexOf('=');
if (index == -1) {
throw new SyntaxGraphException("The root symbol is undefinied. ");
} else {
String name = items[i].trim().substring(0, index);
if (edgeSymbolTables.get(name) == null) {
throw new SyntaxGraphException("The symbol table'" + name + "' cannot be found when defining the root symbol. ");
} else {
rootLabelCodes.put(edgeSymbolTables.get(name), edgeSymbolTables.get(name).addSymbol(items[i].trim().substring(index + 1)));
}
}
}
for (SymbolTable table : edgeSymbolTables.values()) {
if (!rootLabelCodes.containsKey(table)) {
rootLabelCodes.put(table, table.addSymbol(RootLabels.DEFAULT_ROOTSYMBOL));
}
}
}
}
public void setDefaultRootLabel(SymbolTable table, String defaultRootSymbol) throws MaltChainedException {
rootLabelCodes.put(table, table.addSymbol(defaultRootSymbol));
}
public Integer getDefaultRootLabelCode(SymbolTable table) throws MaltChainedException {
Integer res = rootLabelCodes.get(table);
if (res == null) {
return table.addSymbol(RootLabels.DEFAULT_ROOTSYMBOL);
}
return res;
}
public LabelSet getDefaultRootLabels() throws MaltChainedException {
return new LabelSet(rootLabelCodes);
}
public String getDefaultRootLabelSymbol(SymbolTable table) throws MaltChainedException {
return table.getSymbolCodeToString(getDefaultRootLabelCode(table));
}
public boolean checkRootLabelCodes(LabelSet rlc) {
if (rlc == null && rootLabelCodes == null) {
return true; // or false ?
} else if ((rlc == null && rootLabelCodes != null) || (rlc != null && rootLabelCodes == null)) {
return false;
} else if (rlc.size() != rootLabelCodes.size()) {
return false;
} else {
for (SymbolTable table : rootLabelCodes.keySet()) {
if (!rootLabelCodes.get(table).equals(rlc.get(table))) {
return false;
}
}
return true;
}
}
}