<?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>gmaven-plugin</artifactId>
        <version>1.4</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>
      </plugin>
    </plugins>
  </build>
</project>
