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