    001    package org.maltparser.parser.history.action;
    002
    003
    004    import java.lang.reflect.Constructor;
    005    import java.lang.reflect.InvocationTargetException;
    006
    007    import org.maltparser.core.exception.MaltChainedException;
    008    import org.maltparser.parser.history.GuideHistory;
    009    import org.maltparser.parser.history.HistoryException;
    010    import org.maltparser.parser.history.History;
    011    import org.maltparser.parser.history.container.TableContainer;
    012    import org.maltparser.parser.history.container.TableContainer.RelationToNextDecision;
    013    import org.maltparser.parser.history.kbest.KBestList;
    014    /**
    015    *
    016    * @author Johan Hall
    017    * @since 1.1
    018    **/
    019    public class SimpleDecisionAction implements  SingleDecision {
    020            protected History history;
    021            protected int decision;
    022            protected KBestList kBestList;
    023            protected TableContainer tableContainer;
    024
    025            public SimpleDecisionAction(History history, TableContainer tableContainer) throws MaltChainedException {
    026                    setHistory(history);
    027                    setTableContainer(tableContainer);
    028                    createKBestList();
    029                    clear();
    030            }
    031
    032            /* Action interface */
    033            public void clear() {
    034                    decision = -1;
    035                    if (kBestList != null) {
    036                            kBestList.reset();
    037                    }
    038            }
    039
    040            public int numberOfDecisions() {
    041                    return 1;
    042            }
    043
    044            /* SingleDecision interface */
    045            public void addDecision(int code) throws MaltChainedException {
    046                    if (code == -1 || !tableContainer.containCode(code)) {
    047                            decision = -1;
    048                    }
    049                    decision = code;
    050            }
    051
    052            public void addDecision(String symbol) throws MaltChainedException {
    053                    decision = tableContainer.getCode(symbol);
    054            }
    055
    056            public int getDecisionCode() throws MaltChainedException {
    057                    return decision;
    058            }
    059
    060            public int getDecisionCode(String symbol) throws MaltChainedException {
    061                    return tableContainer.getCode(symbol);
    062            }
    063
    064            public String getDecisionSymbol() throws MaltChainedException {
    065                    return tableContainer.getSymbol(decision);
    066            }
    067
    068            public boolean updateFromKBestList() throws MaltChainedException {
    069                    if (kBestList == null) {
    070                            return false;
    071                    }
    072                    return kBestList.updateActionWithNextKBest();
    073            }
    074
    075            public boolean continueWithNextDecision() throws MaltChainedException {
    076                    return tableContainer.continueWithNextDecision(decision);
    077            }
    078
    079            public GuideHistory getGuideHistory() {
    080                    return (GuideHistory)history;
    081            }
    082
    083            /* Getters and Setters */
    084            public History getActionHistory() {
    085                    return history;
    086            }
    087
    088            protected void setHistory(History history) {
    089                    this.history = history;
    090            }
    091
    092            public TableContainer getTableContainer() {
    093                    return tableContainer;
    094            }
    095
    096            public KBestList getKBestList() throws MaltChainedException {
    097                    return kBestList;
    098            }
    099
    100            public RelationToNextDecision getRelationToNextDecision() {
    101                    return tableContainer.getRelationToNextDecision();
    102            }
    103
    104            protected void setTableContainer(TableContainer tableContainer) {
    105                    this.tableContainer = tableContainer;
    106            }
    107
    108
    109            private void createKBestList() throws MaltChainedException {
    110                    final Class<?> kBestListClass = history.getKBestListClass();
    111                    if (kBestListClass == null) {
    112                            return;
    113                    }
    114                    final Class<?>[] argTypes = { java.lang.Integer.class, org.maltparser.parser.history.action.SingleDecision.class };
    115
    116                    final Object[] arguments = new Object[2];
    117                    arguments[0] = history.getKBestSize();
    118                    arguments[1] = this;
    119                    try {
    120                            final Constructor<?> constructor = kBestListClass.getConstructor(argTypes);
    121                            kBestList = (KBestList)constructor.newInstance(arguments);
    122                    } catch (NoSuchMethodException e) {
    123                            throw new HistoryException("The kBestlist '"+kBestListClass.getName()+"' cannot be initialized. ", e);
    124                    } catch (InstantiationException e) {
    125                            throw new HistoryException("The kBestlist '"+kBestListClass.getName()+"' cannot be initialized. ", e);
    126                    } catch (IllegalAccessException e) {
    127                            throw new HistoryException("The kBestlist '"+kBestListClass.getName()+"' cannot be initialized. ", e);
    128                    } catch (InvocationTargetException e) {
    129                            throw new HistoryException("The kBestlist '"+kBestListClass.getName()+"' cannot be initialized. ", e);
    130                    }
    131            }
    132
    133            public String toString() {
    134                    final StringBuilder sb = new StringBuilder();
    135                    sb.append(decision);
    136                    return sb.toString();
    137            }
    138    }