// Path: stylechecker/src/main/java/com/sqatntu/ThrowingErrorListener.java
// public class ThrowingErrorListener extends BaseErrorListener {
// 
//   @Override
//   public void syntaxError(
//       Recognizer<?, ?> recognizer,
//       Object offendingSymbol,
//       int line,
//       int charPositionInLine,
//       String message,
//       RecognitionException error)
//       throws ParseCancellationException {
//     throw new ParseCancellationException("line " + line + ":" + charPositionInLine + " " + message);
//   }
// }
// 
// Path: stylechecker/src/main/java/com/sqatntu/stylechecker/StyleChecker.java
// 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;
//   }
// }
// 
// Path: stylechecker/src/main/java/com/sqatntu/stylechecker/configuration/ConfigurationLoader.java
// public interface ConfigurationLoader {
//   Configuration loadFileConfiguration(String filePath) throws IOException;
// 
//   Configuration loadJsonConfiguration(String json);
// }
// 
// Path: stylechecker/src/main/java/com/sqatntu/stylechecker/configuration/JsonConfigurationLoader.java
// public class JsonConfigurationLoader implements ConfigurationLoader {
// 
//   @Override
//   public Configuration loadFileConfiguration(String filePath) throws IOException {
//     File configurationFile = new File(filePath);
//     String configurationJson = FileUtils.readFileToString(configurationFile);
// 
//     return loadJsonConfiguration(configurationJson);
//   }
// 
//   @Override
//   public Configuration loadJsonConfiguration(String json) {
//     GsonBuilder gsonBuilder = new GsonBuilder();
//     gsonBuilder.registerTypeAdapter(DefaultConfiguration.class, new ConfigurationDeserializer());
// 
//     Gson gson = gsonBuilder.create();
//     DefaultConfiguration configuration =
//         gson.fromJson(json, DefaultConfiguration.class);
// 
//     return configuration;
//   }
// }
// 
// Path: stylechecker/src/main/java/com/sqatntu/stylechecker/report/StyleReport.java
// public class StyleReport {
// 
//   List<StyleReportContent> reportContents;
// 
//   public StyleReport() {
//     reportContents = new ArrayList<>();
//   }
// 
//   public List<StyleReportContent> getReportContents() {
//     return ImmutableList.<StyleReportContent>builder().addAll(reportContents).build();
//   }
// 
//   public void addReportContents(StyleReportContent reportContents) {
//     this.reportContents.add(reportContents);
//   }
// }


import javax.inject.Singleton;
import com.sqatntu.ThrowingErrorListener;
import com.sqatntu.stylechecker.StyleChecker;
import com.sqatntu.stylechecker.configuration.ConfigurationLoader;
import com.sqatntu.stylechecker.configuration.JsonConfigurationLoader;
import com.sqatntu.stylechecker.report.StyleReport;
import dagger.Module;
import dagger.Provides;
/*
 * 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.injection;



/**
 * A module that provides all required dependencies for {@link StyleChecker}
 */
@Module(injects = {StyleChecker.class})
public class StyleCheckerModule {

  @Provides
  @Singleton
  ConfigurationLoader provideConfigurationLoader() {
    return new JsonConfigurationLoader();
  }

  @Provides
  StyleReport provideStyleReport() {
    return new StyleReport();
  }

  @Provides
  @Singleton
  ThrowingErrorListener provideThrowingErrorListener() {
// Path: stylechecker/src/main/java/com/sqatntu/ThrowingErrorListener.java
// public class ThrowingErrorListener extends BaseErrorListener {
// 
//   @Override
//   public void syntaxError(
//       Recognizer<?, ?> recognizer,
//       Object offendingSymbol,
//       int line,
//       int charPositionInLine,
//       String message,
//       RecognitionException error)
//       throws ParseCancellationException {
//     throw new ParseCancellationException("line " + line + ":" + charPositionInLine + " " + message);
//   }
// }
// 
// Path: stylechecker/src/main/java/com/sqatntu/stylechecker/StyleChecker.java
// 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;
//   }
// }
// 
// Path: stylechecker/src/main/java/com/sqatntu/stylechecker/configuration/ConfigurationLoader.java
// public interface ConfigurationLoader {
//   Configuration loadFileConfiguration(String filePath) throws IOException;
// 
//   Configuration loadJsonConfiguration(String json);
// }
// 
// Path: stylechecker/src/main/java/com/sqatntu/stylechecker/configuration/JsonConfigurationLoader.java
// public class JsonConfigurationLoader implements ConfigurationLoader {
// 
//   @Override
//   public Configuration loadFileConfiguration(String filePath) throws IOException {
//     File configurationFile = new File(filePath);
//     String configurationJson = FileUtils.readFileToString(configurationFile);
// 
//     return loadJsonConfiguration(configurationJson);
//   }
// 
//   @Override
//   public Configuration loadJsonConfiguration(String json) {
//     GsonBuilder gsonBuilder = new GsonBuilder();
//     gsonBuilder.registerTypeAdapter(DefaultConfiguration.class, new ConfigurationDeserializer());
// 
//     Gson gson = gsonBuilder.create();
//     DefaultConfiguration configuration =
//         gson.fromJson(json, DefaultConfiguration.class);
// 
//     return configuration;
//   }
// }
// 
// Path: stylechecker/src/main/java/com/sqatntu/stylechecker/report/StyleReport.java
// public class StyleReport {
// 
//   List<StyleReportContent> reportContents;
// 
//   public StyleReport() {
//     reportContents = new ArrayList<>();
//   }
// 
//   public List<StyleReportContent> getReportContents() {
//     return ImmutableList.<StyleReportContent>builder().addAll(reportContents).build();
//   }
// 
//   public void addReportContents(StyleReportContent reportContents) {
//     this.reportContents.add(reportContents);
//   }
// }


// Path: stylechecker/src/main/java/com/sqatntu/stylechecker/injection/StyleCheckerModule.java
import javax.inject.Singleton;
import com.sqatntu.ThrowingErrorListener;
import com.sqatntu.stylechecker.StyleChecker;
import com.sqatntu.stylechecker.configuration.ConfigurationLoader;
import com.sqatntu.stylechecker.configuration.JsonConfigurationLoader;
import com.sqatntu.stylechecker.report.StyleReport;
import dagger.Module;
import dagger.Provides;

/*
 * 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.injection;



/**
 * A module that provides all required dependencies for {@link StyleChecker}
 */
@Module(injects = {StyleChecker.class})
public class StyleCheckerModule {

  @Provides
  @Singleton
  ConfigurationLoader provideConfigurationLoader() {
    return new JsonConfigurationLoader();
  }

  @Provides
  StyleReport provideStyleReport() {
    return new StyleReport();
  }

  @Provides
  @Singleton
  ThrowingErrorListener provideThrowingErrorListener() {
    return new ThrowingErrorListener();