<!--
  ~ 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>

    <groupId>org.apache.geronimo.devtools</groupId>
    <artifactId>org.apache.geronimo.st.v22.ui</artifactId>
    <packaging>jar</packaging>
    <name>${artifactId}</name>

    <parent>
        <groupId>org.apache.geronimo.devtools</groupId>
        <artifactId>eclipse-plugins-parent</artifactId>
        <version>4.0.0-SNAPSHOT</version>
    </parent>

    <build>
        <resources>
            <resource>
                <directory>..</directory>
                <filtering>true</filtering>
                <includes>
                    <include>about.html</include>
                </includes>
            </resource>
            <resource>
                <directory>.</directory>
                <includes>
                    <include>plugin.xml</include>
                    <include>plugin.properties</include>
                    <include>.options</include>
                </includes>
            </resource>
            <resource>
                <targetPath>org/apache/geronimo/st/v22/ui/internal</targetPath>
                <directory>src/main/java/org/apache/geronimo/st/v22/ui/internal</directory>
                <includes>
                    <include>Messages.properties</include>
                </includes>
            </resource>
            <!-- The Geronimo covention puts license and notice for artifacts shipped in this jar 
                 in the jar's meta-inf directory -->
            <resource>
                <targetPath>META-INF</targetPath>
                <directory>.</directory>
                <includes>
                    <include>LICENSE.txt</include>
                    <include>NOTICE.txt</include>
                </includes>
            </resource>
	        <!-- GERONIMODEVTOOLS-406 Display license and notice in Eclipse Update Manager 
                 See also http://www.eclipse.org/legal/guidetolegaldoc.php
                 about.html references about_files to show licenses and notices to the user
                 at install time using Eclipse Update Manager, and after install.
              -->
	    	<resource>
	    		<targetPath>about_files</targetPath>
	    		<directory>.</directory>
	    		<includes>
	    			<include>LICENSE.txt</include>
	    			<include>NOTICE.txt</include>
	    		</includes>
	    	</resource>
	    	<resource>
	    		<targetPath>about_files</targetPath>
	    		<directory>../..</directory>
                <filtering>true</filtering>
	    		<includes>
                    <include>PLUGIN_RELEASE-NOTES.txt</include>
	    		</includes>
	    	</resource>
	    	<resource>
                <targetPath>META-INF</targetPath>
                <directory>target/maven-shared-archive-resources/META-INF/</directory>
                <excludes>
                    <exclude>LICENSE</exclude>
                    <exclude>NOTICE</exclude>
                </excludes>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.geronimo.devtools</groupId>
                <artifactId>maven-eclipsepde-plugin</artifactId>
            </plugin>
			<plugin>
				<groupId>com.google.code.maven-replacer-plugin</groupId>
				<artifactId>maven-replacer-plugin</artifactId>
			</plugin>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
            </plugin>
           <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                  <execution>
                    <goals>
                      <goal>sign</goal>
                    </goals>
                  </execution>
                </executions>
                <configuration>
                  <keystore>../../${keystoreFile}</keystore>
                  <alias>${keystoreAlias}</alias>
                  <storepass>${keystoreStorepass}</storepass>
                  <keypass>${keystoreKeypass}</keypass>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-dependency-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.apache.geronimo.devtools</groupId>
            <artifactId>eclipse</artifactId>
            <version>${version}</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.devtools</groupId>
            <artifactId>org.apache.geronimo.jee.v21.jaxbmodel</artifactId>
            <version>${version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.devtools</groupId>
            <artifactId>org.apache.geronimo.jee.v22.jaxbmodel</artifactId>
            <version>${version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.devtools</groupId>
            <artifactId>org.apache.geronimo.runtime.common</artifactId>
            <version>${version}</version>
        </dependency>
         <dependency>
            <groupId>org.apache.geronimo.devtools</groupId>
            <artifactId>org.apache.geronimo.st.v22.core</artifactId>
            <version>${version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.devtools</groupId>
            <artifactId>org.apache.geronimo.st.core</artifactId>
            <version>${version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.devtools</groupId>
            <artifactId>org.apache.geronimo.st.v21.core</artifactId>
            <version>${version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.devtools</groupId>
            <artifactId>org.apache.geronimo.st.ui</artifactId>
            <version>${version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.devtools</groupId>
            <artifactId>org.apache.geronimo.st.v21.ui</artifactId>
            <version>${version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.geronimo.devtools</groupId>
            <artifactId>org.apache.geronimo.jaxbmodel.common</artifactId>
            <version>${version}</version>
        </dependency>
    </dependencies>
</project>
