<?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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.apache.maven.plugins.compiler.it</groupId>
  <artifactId>mcompiler-21_methodname-change</artifactId>
  <version>1.0-SNAPSHOT</version>

  <description>
    This IT tests what happens if the method name in a single class BeanA gets changed.
    In this case 'mvn compile' (without a clean) should fail as  BeanA2
    still uses the old method of BeanA.
  </description>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>@project.version@</version>
        </plugin>      
      </plugins>
    </pluginManagement> 
    <plugins>
      <plugin>
        <!-- Called as second invoker goal to simulate file adjustment -->
        <groupId>org.codehaus.gmaven</groupId>
        <artifactId>groovy-maven-plugin</artifactId>
        <version>2.1.1</version>
        <configuration>
          <source>
            def beanAFile = new File( project.basedir, 'src/main/java/BeanA.java' )
            
            processFileInplace( beanAFile ) { text -> 
              text.replaceAll( /getI/, 'getI_doesntexistanymore')
            }
            
            def processFileInplace(file, Closure processText) {
              def text = file.text
              file.write(processText(text))
            }
          </source>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.21</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>
</project>
