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==this) {
111                            return 0;
112                    }
113                    
114                    if (o==null) {
115                            return -1;
116                    }
117                    
118                    if (o instanceof Token) {
119                            Token t=(Token) o;
120                            if (t.getLine()==getLine()) {
121                                    if (t.getColumn()==getColumn()) {
122                                            if (getText()==null) {
123                                                    return t.getText()==null ? 0 : 1;
124                                            }
125                                            
126                                            return t.getText()==null ? -1 : getText().compareTo(t.getText());
127                                    }
128                                    
129                                    return getColumn()-t.getColumn();
130                            }
131                            
132                            return getLine()-t.getLine();
133                    }
134                    
135                    return hashCode() - o.hashCode();
136            }       
137            
138            public boolean equals(Object obj) {
139                    if (obj==this) {
140                            return true;
141                    }
142                    
143                    if (obj==null) {
144                            return false;                   
145                    }
146                    
147                    if (obj instanceof Token && getClass().equals(obj.getClass())) {
148                            Token t=(Token) obj;
149                            return getType() == t.getType()
150                                    && ((getText() == null && t.getText() == null)
151                                            || (getText() != null
152                                                    && t.getText() != null
153                                                    && getText().equals(t.getText())));
154                    }
155                    
156                    return super.equals(obj);
157            }
158            
159            public int hashCode() {
160                    int ret=getType();
161                    ret^=getClass().getName().hashCode();
162                    
163                    if (getText()!=null) {
164                            ret^=getText().hashCode();
165                    }
166                    return ret;
167            }
168    
169            public boolean accept(Visitor visitor) {
170                    for (Token t=this; t!=null; t=t.getNextToken()) {
171                            if (visitor.visit(t)) {
172                                    if (visitor instanceof PoliteVisitor) {
173                                            ((PoliteVisitor) visitor).leave(t);
174                                    }
175                            } else {
176                                    return false;
177                            }
178                    }
179                    return true;
180            }
181    
182            public Integer getSourceId() {
183                    return null;
184            }
185    }