001    package org.expasy.jpl.commons.collection.symbol;
002    
003    
004    import java.util.HashMap;
005    import java.util.Map;
006    import java.util.Set;
007    import org.expasy.jpl.commons.collection.symbol.Symbol.SymbolType;
008    import org.expasy.jpl.commons.collection.tree.TreeView;
009    
010    
011    /**
012     * Generic data symbol manager to include in jpl.
013     * 
014     * @author nikitin
015     * 
016     * @param <T>
017     * 
018     * @version 1.0
019     * 
020     */
021    public abstract class AbstractDataSymbolRegister<T> implements
022        DataSymbolRegister<T> {
023            
024            private static final long serialVersionUID = -6039773204711212086L;
025            
026            private Map<Character, T> letter2data;
027            
028            protected Map<Symbol<T>, T> sym2data;
029            
030            /** the symbol type */
031            private SymbolType<T> type;
032            
033            /** data symbol alphabet */
034            private AlphabetImpl<T> alphabet;
035            
036            protected AbstractDataSymbolRegister(SymbolType<T> type) {
037                    this.type = type;
038                    
039                    // Char -> T-data
040                    letter2data = createDataMap();
041                    
042                    // Symbol -> T-data
043                    sym2data = new HashMap<Symbol<T>, T>();
044                    
045                    alphabet = (AlphabetImpl<T>) type.getAlphabet();
046                    
047                    for (Symbol<T> leaveSymbol : alphabet.getSymbolLeaves()) {
048                            
049                            // get molecule from symbol name character
050                            T data = letter2data.get(leaveSymbol.getName());
051                            
052                            // link terminal symbols to amino-acids
053                            link(leaveSymbol, data);
054                    }
055            }
056            
057            public T lookupData(Symbol<T> symbol) {
058                    return sym2data.get(symbol);
059            }
060            
061            public boolean hasSymbol(char symbol) {
062                    return sym2data.containsKey(symbol);
063            }
064            
065            public int getSymbolNumber() {
066                    return sym2data.size();
067            }
068            
069            public Symbol<T> lookupSymbol(char name) {
070                    return type.getAlphabet().lookupSymbol(name);
071            }
072            
073            public TreeView<? extends Symbol<T>> lookupSymbolNode(char name) {
074                    return type.getAlphabet().lookupSymbolNode(name);
075            }
076            
077            public Set<Character> getLetters() {
078                    return letter2data.keySet();
079            }
080            
081            public String getRegEx() {
082                    return type.getAlphabet().getRegEx();
083            }
084            
085            public String toString() {
086                    return type.getAlphabet().toString();
087            }
088            
089            public abstract T lookupData(char name);
090            
091            public abstract void link(Symbol<T> symbol, T data);
092            
093            public abstract Map<Character, T> createDataMap();
094            
095    }