<?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.
-->

<!-- $Rev$ $Date$ -->

<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.geronimo.genesis</groupId>
        <artifactId>genesis-java1.4-flava</artifactId>
        <version>2.0</version>
    </parent>

    <groupId>org.apache.geronimo.schema</groupId>
    <artifactId>geronimo-schema-j2ee_1.4</artifactId>
    <name>Geronimo Schema :: J2EE 1.4</name>

    <version>1.3</version>
    <packaging>bundle</packaging>

    <description>Geronimo project to build j2ee 1.4 schemas using xmlbeans</description>

    <scm>
        <connection>scm:svn:https://svn.apache.org/repos/asf/geronimo/components/geronimo-schema-j2ee_1.4/tags/geronimo-schema-j2ee_1.4-1.3</connection>
        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/geronimo/components/geronimo-schema-j2ee_1.4/tags/geronimo-schema-j2ee_1.4-1.3</developerConnection>
        <url>https://svn.apache.org/repos/asf/geronimo/components/geronimo-schema-j2ee_1.4/tags/geronimo-schema-j2ee_1.4-1.3</url>
    </scm>

    <dependencies>

        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>2.3.0</version>
        </dependency>

    </dependencies>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>xmlbeans-maven-plugin</artifactId>
                    <version>2.3.3</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>xmlbeans</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <quiet>false</quiet>
                        <noUpa>true</noUpa>
                        <noPvr>true</noPvr>
                        <noAnn>true</noAnn>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>

        <plugins>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>xmlbeans-maven-plugin</artifactId>
            </plugin>

            <!--<plugin>-->
            <!--<groupId>org.apache.maven.plugins</groupId>-->
            <!--<artifactId>maven-antrun-plugin</artifactId>-->
            <!--<executions>-->
            <!--<execution>-->
            <!--<id>cleanschemas</id>-->
            <!--<phase>process-sources</phase>-->
            <!--<goals>-->
            <!--<goal>run</goal>-->
            <!--</goals>-->
            <!--<configuration>-->
            <!--<tasks>-->
            <!--<delete>-->
            <!--<fileset dir="${project.build.outputDirectory}" includes="**/handler-chain.xsd" />-->
            <!--</delete>-->
            <!--</tasks>-->
            <!--</configuration>-->
            <!--</execution>-->
            <!--</executions>-->
            <!--</plugin>-->
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.0.1</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Implementation-Title>${project.name}</Implementation-Title>
                        <Implementation-Version>${project.version}</Implementation-Version>
                        <Import-Package>org.apache.xmlbeans.impl*;version="2.4",org.apache.xmlbeans.impl.schema;version="2.4",*</Import-Package>
                        <Export-Package>
                            org.apache.geronimo.xbeans.j2ee.impl,
                            org.apache.geronimo.xbeans.j2ee,
                            org.w3.xml.x1998.namespace.impl,
                            org.w3.xml.x1998.namespace,
                            schemaorg_apache_xmlbeans*,
                        </Export-Package>
                        <Bundle-DocURL>${project.url}</Bundle-DocURL>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>rat</id>
            <build>
                <plugins>
                    <plugin>
                        <!-- profile for rat verification.  To run, just build with -Prat -->
                        <groupId>org.apache.rat</groupId>
                        <artifactId>apache-rat-plugin</artifactId>
                        <version>0.6</version>
                        <executions>
                            <execution>
                                <phase>verify</phase>
                                <goals>
                                    <goal>check</goal>
                                </goals>
                            </execution>
                        </executions>
                        <configuration>
                            <reportFile>${project.build.directory}/${project.build.finalName}.rat</reportFile>
                            <excludeSubProjects>false</excludeSubProjects>
                            <excludes>
                                <exclude>**/application_1_4.xsd</exclude>
                                <exclude>**/application-client_1_4.xsd</exclude>
                                <exclude>**/connector_1_5.xsd</exclude>
                                <exclude>**/datatypes.dtd</exclude>
                                <exclude>**/ejb-jar_2_1.xsd</exclude>
                                <exclude>**/j2ee_1_4.xsd</exclude>
                                <exclude>**/j2ee_jaxrpc_mapping_1_1.xsd</exclude>
                                <exclude>**/j2ee_web_services_1_1.xsd</exclude>
                                <exclude>**/j2ee_web_services_client_1_1.xsd</exclude>
                                <exclude>**/jsp_2_0.xsd</exclude>
                                <exclude>**/web-app_2_4.xsd</exclude>
                                <exclude>**/web-jsptaglibrary_2_0.xsd</exclude>
                                <exclude>**/xml.xsd</exclude>
                                <exclude>**/XMLSchema.dtd</exclude>
                                <exclude>**/target/**/*</exclude>
                                <exclude>**/appended-resources/**/*</exclude>
                                <exclude>**/dependency-reduced-pom.xml</exclude>
                                <exclude>**/velocity.log</exclude>
                                <!-- manifest files don't support comments so don't contain the ASL2.0 header -->
                                <exclude>**/*.MF</exclude>
                                <!--RAT doesn't seem to recognize MIT style licenses-->
                                <exclude>manual/src/styles/print.css</exclude>
                            </excludes>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

