001    /*
002    @license.text@
003     */
004    
005    package biz.hammurapi.antlr;
006    
007    import antlr.CommonToken;
008    import biz.hammurapi.legacy.review.SourceMarker;
009    import biz.hammurapi.util.PoliteVisitor;
010    import biz.hammurapi.util.Visitable;
011    import biz.hammurapi.util.Visitor;
012    
013    
014    /**
015     *
016     * @author  Pavel Vlasov
017     * @version $Revision: 1.4 $
018     */
019    public class Token extends CommonToken implements SourceMarker, Comparable, Visitable {
020        public Token() {
021            super();
022        }
023        
024        public Token(String s) { 
025            super(s); 
026        }
027        
028        public Token(int t, String txt) { 
029            super(t,txt);
030        }
031        
032        private Token nextToken;
033        private Token prevToken;
034        
035        public void setNextToken(Token token) {
036            if (nextToken!=token) {
037                    nextToken=token;
038                    if (nextToken!=null) {
039                        nextToken.prevToken=this;
040                    }
041                    
042                    if (listener!=null) {
043                            listener.onNextTokenChanged(this);
044                    }
045            }
046        }
047        
048        public Token getNextToken() {
049            return nextToken;
050        }
051        
052        public void setPrevToken(Token token) {
053            if (prevToken!=token) {
054                    prevToken=token;
055                    if (prevToken!=null) {
056                        prevToken.nextToken=this;
057                    }
058                    
059                    if (listener!=null) {
060                            listener.onPrevTokenChanged(this);
061                    }
062            }
063        }
064        
065        public Token getPrevToken() {
066            return prevToken;
067        }        
068        
069        private TokenListener listener;    
070        
071            /**
072             * @return Returns the listener.
073             */
074            public TokenListener getListener() {
075                    return listener;
076            }
077    
078            /**
079             * @param listener The listener to set.
080             */
081            public void setListener(TokenListener listener) {
082                    this.listener = listener;
083            }
084    
085            /* (non-Javadoc)
086             * @see antlr.Token#setText(java.lang.String)
087             */
088            public void setText(String newText) {
089                    super.setText(newText);
090                    if (listener!=null) {
091                            listener.onTextChanged(this);
092                    }
093            }
094            
095            private String sourceURL;
096    
097            public String getSourceURL() {
098                    return sourceURL;
099            }
100            
101            /**
102             * Sets source URL for this and all subsequent tokens.
103             * @param sourceURL
104             */
105            public void setSourceURL(String sourceURL) {
106                    this.sourceURL=sourceURL;
107            }
108    
109            public int compareTo(Object o) {
110                    if (o instanceof Token) {
111                            Token t=(Token) o;
112                            if (t.getLine()==getLine()) {
113                                    if (t.getColumn()==getColumn()) {
114                                            if (getText()==null) {
115                                                    return t.getText()==null ? 0 : 1;
116                                            }
117                                            
118                                            return t.getText()==null ? -1 : getText().compareTo(t.getText());
119                                    }
120                                    
121                                    return getColumn()-t.getColumn();
122                            }
123                            
124                            return getLine()-t.getLine();
125                    }
126                    
127                    return 1;
128            }       
129            
130            public boolean equals(Object obj) {
131                    if (obj==this) {
132                            return true;
133                    }
134                    
135                    if (obj==null) {
136                            return false;                   
137                    }
138                    
139                    if (obj instanceof Token && getClass().equals(obj.getClass())) {
140                            Token t=(Token) obj;
141                            return getType() == t.getType()
142                                    && ((getText() == null && t.getText() == null)
143                                            || (getText() != null
144                                                    && t.getText() != null
145                                                    && getText().equals(t.getText())));
146                    }
147                    
148                    return super.equals(obj);
149            }
150            
151            public int hashCode() {
152                    int ret=getType();
153                    ret^=getClass().getName().hashCode();
154                    
155                    if (getText()!=null) {
156                            ret^=getText().hashCode();
157                    }
158                    return ret;
159            }
160    
161            public boolean accept(Visitor visitor) {
162                    for (Token t=this; t!=null; t=t.getNextToken()) {
163                            if (visitor.visit(t)) {
164                                    if (visitor instanceof PoliteVisitor) {
165                                            ((PoliteVisitor) visitor).leave(t);
166                                    }
167                            } else {
168                                    return false;
169                            }
170                    }
171                    return true;
172            }
173    
174            public Integer getSourceId() {
175                    return null;
176            }
177    }