<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">

<!--

    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.
-->

  <modelVersion>4.0.0</modelVersion>
  
      <parent>
        <groupId>org.apache.servicemix.examples</groupId>
        <artifactId>examples</artifactId>
        <version>4.3.0-SNAPSHOT</version>
    </parent>

  <groupId>org.apache.servicemix.examples</groupId>
  <artifactId>web</artifactId>
  <packaging>war</packaging>
  <name>Apache ServiceMix4 :: Demos :: web</name>
  
  <properties>
    <jetty.port>8080</jetty.port>
    <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
  </properties>


  <dependencies>
    <dependency>
      <groupId>org.apache.karaf</groupId>
      <artifactId>org.apache.karaf.main</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.karaf.jaas</groupId>
      <artifactId>org.apache.karaf.jaas.boot</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.geronimo.specs</groupId>
      <artifactId>geronimo-servlet_3.0_spec</artifactId>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.servicemix</groupId>
      <artifactId>apache-servicemix</artifactId>
      <version>${project.version}</version>
      <type>zip</type>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
          <warSourceDirectory>src/main/webapp/</warSourceDirectory>
          <webResources>
            <resource>
              <directory>target/smx4</directory>
            </resource>
          </webResources>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>maven-jetty-plugin</artifactId>
        <configuration>
          <connectors>
            <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
              <port>${jetty.port}</port>
              <maxIdleTime>60000</maxIdleTime>
            </connector>
          </connectors>
          <systemProperties>
            <!-- enable easy connection to JConsole -->
            <systemProperty>
              <name>com.sun.management.jmxremote</name>
              <value />
            </systemProperty>
          </systemProperties>
          <scanIntervalSeconds>10</scanIntervalSeconds>
          <webAppSourceDirectory>${basedir}/target/${artifactId}-${version}</webAppSourceDirectory>
          <webApp>${basedir}/target/${artifactId}-${version}.war</webApp>
        </configuration>
      </plugin>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-dependency-plugin</artifactId>
          <version>2.0</version>
          <executions>
              <execution>
                  <id>unpack-unix</id>
                  <phase>generate-resources</phase>
                  <goals>
                      <goal>unpack</goal>
                  </goals>
                  <configuration>
                      <artifactItems>
                          <artifactItem>
                              <groupId>org.apache.servicemix</groupId>
                              <artifactId>apache-servicemix</artifactId>
                              <version>${pom.version}</version>                     
                              <!--<groupId>org.apache.karaf</groupId>
                              <artifactId>apache-karaf</artifactId>
                              <version>2.1.0</version>
                              -->

                              <type>zip</type>
                              <overWrite>true</overWrite>
                              <outputDirectory>${project.build.directory}/smx4/WEB-INF</outputDirectory>
                              <excludes>**/lib/*,**/*.txt,**/bin/*,**/demos/**,**/lib,**/bin,**/demos</excludes>
                          </artifactItem>
                      </artifactItems>
                  </configuration>
              </execution>
        </executions>
      </plugin>
      <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-antrun-plugin</artifactId>
          <executions>
              <execution>
                  <id>copy-servicemix</id>
                  <phase>process-resources</phase>
                  <goals>
                      <goal>run</goal>
                  </goals>
                  <configuration>
                      <tasks>
                          <move todir="${project.build.directory}/smx4/WEB-INF/servicemix">
                              <fileset dir="${project.build.directory}/smx4/WEB-INF/apache-servicemix-${pom.version}" /> 
                              <!--      <fileset dir="${project.build.directory}/smx4/WEB-INF/apache-karaf-2.1.0" /> -->
                          </move>
                      </tasks>
                  </configuration>
              </execution>
          </executions>
      </plugin>
    </plugins>
  </build>

</project>
