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

<plexus>
  <components>
    <component>
      <role>org.apache.maven.continuum.wagon.ServletServer</role>
      <implementation>org.apache.maven.continuum.wagon.ServletServer</implementation>
      <configuration>
        <port>10007</port>
        <contexts>
          <context>
            <id>/dav</id>
            <servlets>
              <servlet>
                <id>LOCALREPO</id>
                <path>/*</path>
                <servlet>it.could.webdav.DAVServlet</servlet>
                <parameters>
                  <property>
                    <name>rootPath</name>
                    <value>${basedir}/target</value>
                  </property>
                  <property>
                    <name>xmlOnly</name>
                    <value>false</value>
                  </property>
                </parameters>
              </servlet>
            </servlets>
          </context>
        </contexts>
      </configuration>
    </component>

    <component>
      <role>org.apache.maven.continuum.notification.Notifier</role>
      <role-hint>wagon</role-hint>
      <implementation>org.apache.maven.continuum.notification.wagon.WagonContinuumNotifier</implementation>
      <requirements>
        <requirement>
          <role>org.apache.maven.continuum.configuration.ConfigurationService</role>
        </requirement>
        <requirement>
          <role>org.apache.maven.artifact.manager.WagonManager</role>
        </requirement>
        <requirement>
          <role>org.apache.maven.project.MavenProjectBuilder</role>
        </requirement>
        <requirement>
          <role>org.apache.maven.settings.MavenSettingsBuilder</role>
        </requirement>
      </requirements>
      <configuration>
        <localRepository>~/.m2/repository</localRepository>
      </configuration>
    </component>

    <component>
      <role>org.apache.maven.continuum.configuration.ConfigurationService</role>
      <implementation>org.apache.maven.continuum.configuration.ConfigurationServiceMock</implementation>
    </component>

    <component>
      <role>org.apache.maven.artifact.manager.WagonManager</role>
      <implementation>org.apache.maven.artifact.manager.DefaultWagonManager</implementation>
    </component>

  </components>
</plexus>