package org.maltparser.core.syntaxgraph;
import java.util.Observable;
import java.util.Set;
import org.maltparser.core.exception.MaltChainedException;
import org.maltparser.core.symbol.SymbolTable;
/**
*
*
* @author Johan Hall
*/
public abstract class GraphElement extends Observable implements Element {
private SyntaxGraph belongsToGraph;
private LabelSet labelSet;
public GraphElement() {
belongsToGraph = null;
labelSet = null;
}
/**
* Adds a label (a string value) to the symbol table and to the graph
* element.
*
* @param table the symbol table
* @param symbol a label symbol
* @throws MaltChainedException
*/
public void addLabel(SymbolTable table, String symbol) throws MaltChainedException {
table.addSymbol(symbol);
addLabel(table, table.getSymbolStringToCode(symbol));
}
/**
* Adds a label (an integer value) to the symbol table and to the graph
* element.
*
* @param table the symbol table
* @param code a label code
* @throws MaltChainedException
*/
public void addLabel(SymbolTable table, int code) throws MaltChainedException {
if (table.getSymbolCodeToString(code) != null) {
if (labelSet == null) {
if (belongsToGraph == null) {
throw new SyntaxGraphException("The graph element doesn't belong to any graph. ");
}
labelSet = belongsToGraph.checkOutNewLabelSet();
}
labelSet.put(table, code);
setChanged();
notifyObservers(table);
}
}
/**
* Adds the labels of the label set to the label set of the graph element.
*
* @param labels a label set.
* @throws MaltChainedException
*/
public void addLabel(LabelSet labels) throws MaltChainedException {
if (labels != null) {
for (SymbolTable table : labels.keySet()) {
addLabel(table, labels.get(table));
}
}
}
/**
* Returns <i>true</i> if the graph element has a label for the symbol
* table, otherwise <i>false</i>.
*
* @param table the symbol table
* @return <i>true</i> if the graph element has a label for the symbol
* table, otherwise <i>false</i>.
* @throws MaltChainedException
*/
public boolean hasLabel(SymbolTable table) throws MaltChainedException {
if (labelSet != null) {
return labelSet.containsKey(table);
}
return false;
}
/**
* Returns the label symbol(a string representation) of the symbol table if
* it exists, otherwise an exception is thrown.
*
* @param table the symbol table
* @return the label (a string representation) of the symbol table if it
* exists.
* @throws MaltChainedException
*/
public String getLabelSymbol(SymbolTable table) throws MaltChainedException {
Integer code = labelSet.get(table);
if (code == null) {
throw new SyntaxGraphException("No label symbol available for label '" + table.getName() + "'.");
}
return table.getSymbolCodeToString(code);
}
/**
* Returns the label code (an integer representation) of the symbol table if
* it exists, otherwise an exception is thrown.
*
* @param table the symbol table
* @return the label code (an integer representation) of the symbol table if
* it exists
* @throws MaltChainedException
*/
public int getLabelCode(SymbolTable table) throws MaltChainedException {
Integer code = labelSet.get(table);
if (code == null) {
throw new SyntaxGraphException("No label symbol available for label '" + table.getName() + "'.");
}
// if (code != null) {
// return -1;
// }
return code.intValue();
}
/**
* Returns <i>true</i> if the graph element has one or more labels,
* otherwise <i>false</i>.
*
* @return <i>true</i> if the graph element has one or more labels,
* otherwise <i>false</i>.
*/
public boolean isLabeled() {
if (labelSet == null) {
return false;
}
return labelSet.size() > 0;
}
/**
* Returns the number of labels of the graph element.
*
* @return the number of labels of the graph element.
*/
public int nLabels() {
if (labelSet == null) {
return 0;
}
return labelSet.size();
}
/**
* Returns a set of symbol tables (labeling functions or label types) that
* labels the graph element.
*
* @return a set of symbol tables (labeling functions or label types)
*/
public Set<SymbolTable> getLabelTypes() {
if (labelSet == null) {
return null;
}
return labelSet.keySet();
}
/**
* Returns the label set.
*
* @return the label set.
*/
public LabelSet getLabelSet() {
return labelSet;
}
public void removeLabel(SymbolTable table) throws MaltChainedException {
if (labelSet != null) {
labelSet.remove(table);
}
}
public void removeLabels() throws MaltChainedException {
if (labelSet != null && belongsToGraph != null) {
belongsToGraph.checkInLabelSet(labelSet);
}
labelSet = null;
}
/**
* Returns the graph (structure) in which the graph element belongs to.
*
* @return the graph (structure) in which the graph element belongs to.
*/
public SyntaxGraph getBelongsToGraph() {
return belongsToGraph;
}
/**
* Sets the graph (structure) in which the graph element belongs to.
*
* @param belongsToGraph a graph (structure).
*/
public void setBelongsToGraph(SyntaxGraph belongsToGraph) {
this.belongsToGraph = belongsToGraph;
addObserver(belongsToGraph);
}
/**
* Resets the graph element.
*
* @throws MaltChainedException
*/
public void clear() throws MaltChainedException {
if (labelSet != null && belongsToGraph != null) {
belongsToGraph.checkInLabelSet(labelSet);
}
labelSet = null;
deleteObserver(belongsToGraph);
belongsToGraph = null;
}
@Override
public boolean equals(Object obj) {
GraphElement ge = (GraphElement) obj;
return belongsToGraph == ge.getBelongsToGraph() && labelSet == null ? ge.getLabelSet() == null : labelSet.equals(ge.getLabelSet());
}
@Override
public int hashCode() {
int hash = 7;
hash = 31 * hash + (null == belongsToGraph ? 0 : belongsToGraph.hashCode());
return 31 * hash + (null == labelSet ? 0 : labelSet.hashCode());
}
public int compareTo(GraphElement o) {
final int BEFORE = -1;
final int EQUAL = 0;
final int AFTER = 1;
if (this == o) {
return EQUAL;
}
if (this.labelSet == null && o.labelSet != null) {
return BEFORE;
}
if (this.labelSet != null && o.labelSet == null) {
return AFTER;
}
if (this.labelSet == null && o.labelSet == null) {
return EQUAL;
}
int comparison;
for (SymbolTable table : labelSet.keySet()) {
Integer ocode = o.labelSet.get(table);
Integer tcode = labelSet.get(table);
if (ocode != null && tcode != null) {
if (!ocode.equals(tcode)) {
try {
comparison = table.getSymbolCodeToString(tcode).compareTo(table.getSymbolCodeToString(ocode));
if (comparison != EQUAL) {
return comparison;
}
} catch (MaltChainedException e) {
}
}
}
}
return EQUAL;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
if (labelSet != null) {
for (SymbolTable table : labelSet.keySet()) {
try {
sb.append(table.getName());
sb.append(':');
sb.append(getLabelSymbol(table));
} catch (MaltChainedException e) {
System.err.println("Print error : " + e.getMessageChain());
}
sb.append(' ');
}
}
return sb.toString();
}
}