com.sqatntu.stylechecker.StyleChecker.java Source code

Java tutorial

Introduction

Here is the source code for com.sqatntu.stylechecker.StyleChecker.java

Source

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2015 Andy Chong Chin Shin
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
 * and associated documentation files (the "Software"), to deal in the Software without restriction,
 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
 * is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or
 * substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 */

package com.sqatntu.stylechecker;

import com.sqatntu.ThrowingErrorListener;
import com.sqatntu.api.JavaLexer;
import com.sqatntu.api.JavaParser;
import com.sqatntu.stylechecker.configuration.Configuration;
import com.sqatntu.stylechecker.configuration.ConfigurationLoader;
import com.sqatntu.stylechecker.injection.StyleCheckerModule;
import com.sqatntu.stylechecker.listener.AllListeners;
import com.sqatntu.stylechecker.report.StyleReport;
import dagger.ObjectGraph;
import org.antlr.v4.runtime.ANTLRFileStream;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.misc.ParseCancellationException;
import org.antlr.v4.runtime.tree.ParseTreeWalker;

import java.io.IOException;

import javax.inject.Inject;

/**
 * StyleChecker provides only one method, i.e. the {@link #checkSourceCode} method.
 * The method accepts source code and style check configuration and performs style
 * checking by using Visitor pattern.
 */
public class StyleChecker {

    @Inject
    public StyleReport styleReport;

    @Inject
    ConfigurationLoader configurationLoader;

    @Inject
    ThrowingErrorListener throwingErrorListener;

    public StyleChecker() {
        ObjectGraph objectGraph = ObjectGraph.create(new StyleCheckerModule());
        objectGraph.inject(this);
    }

    @Deprecated
    public StyleReport checkFile(String filePath, String configPath) throws IOException {
        // Set up configuration loader
        Configuration configuration = configurationLoader.loadFileConfiguration(configPath);
        ANTLRFileStream stream = new ANTLRFileStream(filePath);

        return check(stream, configuration);
    }

    public StyleReport checkSourceCode(String sourceCode, String jsonConfig) throws StyleCheckerException {
        // Set up configuration loader
        Configuration configuration = configurationLoader.loadJsonConfiguration(jsonConfig);

        ANTLRInputStream stream = new ANTLRInputStream(sourceCode);

        try {
            return check(stream, configuration);
        } catch (ParseCancellationException e) {
            throw new StyleCheckerException(e.getMessage());
        }
    }

    private StyleReport check(CharStream stream, Configuration config) {
        JavaLexer lexer = new JavaLexer(stream);
        lexer.removeErrorListeners();
        lexer.addErrorListener(throwingErrorListener);

        CommonTokenStream tokens = new CommonTokenStream(lexer);

        JavaParser parser = new JavaParser(tokens);
        parser.removeErrorListeners();
        parser.addErrorListener(throwingErrorListener);

        JavaParser.CompilationUnitContext tree = parser.compilationUnit(); // parse

        AllListeners allListeners = new AllListeners(config, styleReport);
        ParseTreeWalker walker = new ParseTreeWalker(); // create standard walker
        walker.walk(allListeners, tree);

        return styleReport;
    }
}