<!--
	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>
    <groupId>org.apache.cxf.xjcplugins.tests</groupId>
	<artifactId>cxf-xjc-boolean-test</artifactId>
	<packaging>jar</packaging>
	<name>Apache CXF XJC Boolean Getter Plugin Tests</name>
	<url>http://cxf.apache.org</url>

	<parent>
        <groupId>org.apache.cxf.xjc-utils</groupId>
        <artifactId>xjc-utils</artifactId>
		<version>3.1.0</version>
	</parent>


	<dependencies>
		<dependency>
			<groupId>javax.xml.bind</groupId>
			<artifactId>jaxb-api</artifactId>
		</dependency>
		<dependency>
			<groupId>com.sun.xml.bind</groupId>
			<artifactId>jaxb-impl</artifactId>
		</dependency>
		<dependency>
			<groupId>com.sun.xml.bind</groupId>
			<artifactId>jaxb-xjc</artifactId>
		</dependency>
		<dependency>
			<groupId>com.sun.xml.bind</groupId>
			<artifactId>jaxb-core</artifactId>
		</dependency>

		<dependency>
			<groupId>jaxme</groupId>
			<artifactId>jaxme2</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
            <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-xjc-plugin</artifactId>
                <version>${project.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>xsdtojava-tests</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <xsdOptions>
                        <xsdOption>
                            <extension>true</extension>
                            <xsd>${basedir}/src/test/resources/schemas/configuration/foo.xsd</xsd>
                            <extensionArgs>
                                <arg>-Xbg</arg>
                            </extensionArgs>
                        </xsdOption>
                        <xsdOption>
                            <extension>true</extension>
                            <xsd>${basedir}/src/test/resources/schemas/configuration/foo1.xsd</xsd>
                            <extensionArgs>
                                <arg>-Xbgi</arg>
                            </extensionArgs>
                        </xsdOption>

                    </xsdOptions>
                    <extensions>
                        <extension>org.apache.cxf.xjcplugins:cxf-xjc-boolean:${project.version}</extension>
                    </extensions>
                </configuration>
            </plugin>
		</plugins>
	</build>


</project>
