<?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.
-->
<features name="default">
    <feature name="spring" version="${spring.version}">
        <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.aopalliance/${aopalliance.version}</bundle>
        <bundle>mvn:org.springframework/spring-core/${spring.version}</bundle>
        <bundle>mvn:org.springframework/spring-beans/${spring.version}</bundle>
        <bundle>mvn:org.springframework/spring-context/${spring.version}</bundle>
        <bundle>mvn:org.springframework/spring-aop/${spring.version}</bundle>
        <bundle>mvn:org.springframework/spring-context-support/${spring.version}</bundle>
    </feature>
    <feature name="spring-dm" version="${spring.osgi.version}">
        <feature version="${spring.version}">spring</feature>
        <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.cglib/${cglib.version}</bundle>
        <bundle>mvn:org.springframework.osgi/spring-osgi-io/${spring.osgi.version}</bundle>
        <bundle>mvn:org.springframework.osgi/spring-osgi-core/${spring.osgi.version}</bundle>
        <bundle>mvn:org.springframework.osgi/spring-osgi-extender/${spring.osgi.version}</bundle>
        <bundle>mvn:org.springframework.osgi/spring-osgi-annotation/${spring.osgi.version}</bundle>
        <bundle>mvn:org.apache.felix.karaf.deployer/org.apache.felix.karaf.deployer.spring/${version}</bundle>
    </feature>
    <feature name="wrapper" version="${version}">
        <bundle>mvn:org.apache.felix.karaf.gshell/org.apache.felix.karaf.gshell.wrapper/${version}</bundle>
    </feature>
    <feature name="obr" version="${version}">
        <bundle>mvn:org.apache.felix/org.apache.felix.bundlerepository/${felix.bundlerepository.version}</bundle>
        <bundle>mvn:org.apache.felix.karaf.gshell/org.apache.felix.karaf.gshell.obr/${version}</bundle>
    </feature>
    <feature name="http" version="${version}">
        <config name="org.ops4j.pax.web">
          org.osgi.service.http.port=8181
        </config>
        <bundle>mvn:org.apache.geronimo.specs/geronimo-servlet_2.5_spec/${geronimo.servlet.version}</bundle>
        <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.jetty-bundle/${jetty.bundle.version}</bundle>
        <bundle>mvn:org.ops4j.pax.web/pax-web-bundle/${pax.web.version}</bundle>
    </feature>
    <feature name="webconsole" version="${version}">
        <feature version="${version}">http</feature>
        <config name="org.apache.felix.webconsole.internal.servlet.OsgiManager">
          username=karaf
          password=karaf
        </config>
        <bundle>mvn:org.apache.felix/org.apache.felix.metatype/${felix.metatype.version}</bundle>
        <bundle>mvn:org.apache.felix/org.apache.felix.webconsole/${felix.webconsole.version}</bundle>
        <!-- TODO: uncomment when FELIX-1133 is resolved
        <bundle>mvn:org.apache.felix.karaf.webconsole/org.apache.felix.karaf.webconsole.branding/${version}</bundle>
        -->
        <bundle>mvn:org.apache.felix.karaf.webconsole/org.apache.felix.karaf.webconsole.features/${version}</bundle>
        <bundle>mvn:org.apache.felix.karaf.webconsole/org.apache.felix.karaf.webconsole.gogo/${version}</bundle>
    </feature>
    <feature name="ssh" version="${version}">
        <config name="org.apache.felix.karaf.gshell.ssh">
            sshPort=8101
            sshRealm=karaf
        </config>
        <bundle>mvn:org.apache.mina/mina-core/${mina.version}</bundle>
        <bundle>mvn:org.apache.sshd/sshd-core/${sshd.version}</bundle>
        <bundle>mvn:org.apache.felix.karaf.gshell/org.apache.felix.karaf.gshell.ssh/${version}</bundle>
    </feature>
    <feature name="management" version="${version}">
        <bundle>mvn:org.apache.felix.karaf/org.apache.felix.karaf.management/${version}</bundle>
        <bundle>mvn:org.osgi/org.osgi.impl.bundle.jmx/${osgi.jmx.version}</bundle>
    </feature>
</features>
