All Downloads are FREE. Search and download functionalities are using the official Maven repository.

hudson.scheduler.BaseParser Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 *
 * Copyright (c) 2004-2012 Oracle Corporation.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * 
*    Kohsuke Kawaguchi
 *
 *
 *
 *******************************************************************************/ 

package hudson.scheduler;

import org.antlr.runtime.Parser;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.RecognizerSharedState;
import org.antlr.runtime.Token;
import org.antlr.runtime.TokenStream;

/**
 * @author Kohsuke Kawaguchi
 */
abstract class BaseParser extends Parser {

    private static final int[] LOWER_BOUNDS = new int[]{0, 0, 1, 0, 0};
    private static final int[] UPPER_BOUNDS = new int[]{59, 23, 31, 12, 7};

    protected BaseParser(TokenStream tokenStream) {
        super(tokenStream);
    }

    protected BaseParser(TokenStream stream, RecognizerSharedState sharedState) {
        super(stream, sharedState);
    }

    protected long doRange(int start, int end, int step, int field) throws RecognitionException {
        rangeCheck(start, field);
        rangeCheck(end, field);
        if (step <= 0) {
            error(Messages.BaseParser_MustBePositive(step));
        }
        if (start > end) {
            error(Messages.BaseParser_StartEndReversed(end, start));
        }

        long bits = 0;
        for (int i = start; i <= end; i += step) {
            bits |= 1L << i;
        }
        return bits;
    }

    protected long doRange(int step, int field) throws RecognitionException {
        return doRange(LOWER_BOUNDS[field], UPPER_BOUNDS[field], step, field);
    }

    protected void rangeCheck(int value, int field) throws RecognitionException {
        if (value < LOWER_BOUNDS[field] || UPPER_BOUNDS[field] < value) {
            error(Messages.BaseParser_OutOfRange(value, LOWER_BOUNDS[field], UPPER_BOUNDS[field]));
        }
    }

    private void error(String msg) throws RecognitionException {
        Token token = getTokenStream().LT(0);
        throw new SemanticException(
                msg,
                token.getLine(),
                token.getCharPositionInLine());
    }

    public static class SemanticException extends RecognitionException {

        String msg;
        Throwable throwable;

        public SemanticException(String msg, int line, int charPositionInLine) {
            super();
            this.msg = msg;
            this.line = line;
            this.charPositionInLine = charPositionInLine;
        }

        public SemanticException(String msg, Throwable e) {
            super();
            this.msg = msg;
            this.throwable = e;
        }

        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder("SemanticException: ");
            sb.append(msg);
            if (line > 0 || charPositionInLine > 0) {
                sb.append(" at [").append(line).append(',').append(charPositionInLine);
            }
            if (throwable != null) {
                sb.append(" from ").append(throwable.toString());
            }
            return sb.toString();
        }

        @Override
        public String getMessage() {
            return msg;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy