<?xml version="1.0" encoding="UTF-8"?>

<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you 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.
-->

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.apache.maven.its.itsample</groupId>
    <artifactId>parent</artifactId>
    <version>1</version>
  </parent>

  <artifactId>checkstyle-test</artifactId>

  <name>Checkstyle Test</name>

  <build>

    <!--This extension is installed by the IT prior to invoking this build. See ../checkstyle-assembly-->
    <extensions>
      <extension>
        <groupId>org.apache.maven.its.itsample</groupId>
        <artifactId>checkstyle-assembly</artifactId>
        <version>1.0</version>
      </extension>
    </extensions>

  <!-- Typically the tests will not rely on actual plugins and should be self-contained, in this case the problem was most
  often experienced with Checkstyle so it makes it a valid test. Notice however that it is pinned to a known released version 
  so the test won't randomly fail in the future if the plugin behavior changes.
  
  If the extension listed above isn't correctly installed on the plugin classpath, this invocation will fail to find the custom rule -->
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <version>2.1</version>
        <inherited>true</inherited>
        <executions>
          <execution>
            <id>STC Checks</id>
            <phase>verify</phase>
            <goals>
              <goal>checkstyle</goal>
            </goals>
            <configuration>
              <configLocation>stc_checks.xml</configLocation>
              <failsOnError>true</failsOnError>
              <cacheFile>${project.build.directory}/checkstyle-cachefile</cacheFile>
              <consoleOutput>true</consoleOutput>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
