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    }