/* * Copyright 2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.xd.dirt.job.dsl; /** * Holder for a kind of token, the associated data and its position in the input data stream (start/end). * * @author Andy Clement */ public class Token { TokenKind kind; // the kind of token String data; // any extra data for this token instance, e.g. the text for an identifier token int startpos; // index of first character int endpos; // index of char after the last character /** * Constructor for use when there is no particular data for the token */ Token(TokenKind tokenKind, int startpos, int endpos) { this.kind = tokenKind; this.startpos = startpos; this.endpos = endpos; } /** * Constructor for use when there is extra data to associate with a token. For example the text for an identifier * token. */ Token(TokenKind tokenKind, char[] tokenData, int pos, int endpos) { this(tokenKind, pos, endpos); this.data = new String(tokenData.clone()); } public TokenKind getKind() { return kind; } @Override public String toString() { StringBuilder s = new StringBuilder(); s.append("[").append(kind.toString()); if (kind.hasPayload()) { s.append(":").append(data); } s.append("]"); s.append("(").append(startpos).append(",").append(endpos).append(")"); return s.toString(); } public boolean isIdentifier() { return kind == TokenKind.IDENTIFIER; } public String stringValue() { return data; } @Override public int hashCode() { return this.kind.ordinal() * 37 + (this.startpos + this.endpos) * 37 + (this.kind.hasPayload() ? this.data.hashCode() : 0); } @Override public boolean equals(Object o) { if (!(o instanceof Token)) { return false; } Token token = (Token) o; boolean basicmatch = this.kind == token.kind && this.startpos == token.startpos && this.endpos == token.endpos; if (!basicmatch) return false; if (this.kind.hasPayload()) { if (!this.data.equals(token.data)) { return false; } } return true; } public boolean isKind(TokenKind desiredKind) { return kind == desiredKind; } }