<?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="alx.rya">
    <feature name='org.eclipse.rdf4j.runtime' version="2.3.1">
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-model/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-runtime/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-query/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryalgebra-model/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryparser-api/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryparser-serql/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryparser-sparql/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryresultio-api/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryresultio-binary/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryresultio-sparqljson/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryresultio-text/2.3.1</bundle>
        <bundle>wrap:mvn:net.sf.opencsv/opencsv/2.0</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-repository-api/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-repository-manager/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-repository-event/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-repository-sail/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-sail-memory/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-sail-inferencer/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryalgebra-evaluation/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-repository-sparql/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-repository-http/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-http-client/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-repository-dataset/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-repository-contextaware/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-http-protocol/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-rio-ntriples/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-rio-api/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-rio-binary/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-rio-n3/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-rio-trix/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-rio-turtle/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-rio-trig/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-sail-api/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-sail-nativerdf/2.3.1</bundle>
        <!--bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-sail-rdbms/2.3.1</bundle>
        <bundle>wrap:mvn:commons-dbcp/commons-dbcp/1.3</bundle>
        <bundle>wrap:mvn:commons-pool/commons-pool/1.3</bundle-->
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryresultio-sparqlxml/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-util/2.3.1</bundle>
        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-rio-rdfxml/2.3.1</bundle>
    </feature>
    <feature name='tinkerpop.blueprints' version='1.2'>
        <bundle>wrap:mvn:com.tinkerpop.blueprints/blueprints-core/1.2</bundle>
        <bundle>mvn:org.codehaus.jettison/jettison/1.3</bundle>
        <bundle>wrap:mvn:stax/stax-api/1.0.1</bundle>
        <!--bundle>wrap:mvn:org.codehaus.jackson/jackson-jaxrs/1.8.5</bundle-->
        <bundle>mvn:org.codehaus.jackson/jackson-core-asl/1.8.5</bundle>
        <bundle>mvn:org.codehaus.jackson/jackson-mapper-asl/1.8.5</bundle>
    </feature>
    <feature name='rya.sail' version='3.0.4'>
        <!--<feature version="[2.3,3.0)">org.eclipse.rdf4j.runtime</feature>-->
        <feature version="1.2">tinkerpop.blueprints</feature>
        <feature version="[10,12)">google.guava</feature>
        <bundle>mvn:org.apache.rya/rdf4j-runtime-osgi/2.3.1s</bundle>
        <bundle>wrap:mvn:org.apache.rya/rya.api/3.0.4-SNAPSHOT</bundle>
        <bundle>wrap:mvn:org.apache.rya/rya.sail.impl/3.0.4-SNAPSHOT</bundle>
    </feature>
    <feature name="cloudbase.rya" version="3.0.4">
        <feature version="1.0.5">org.apache.alx.connect.cloudbase.connect</feature>
        <feature version="[10,12)">google.guava</feature>
        <bundle>wrap:mvn:org.apache.rya/cloudbase.rya/3.0.4-SNAPSHOT</bundle>
        <bundle>wrap:mvn:org.apache.rya/cloudbase.utils/1.0.1-SNAPSHOT</bundle>
    </feature>
    <feature name="accumulo.rya" version="3.0.4">
        <feature version="1.0.5">org.apache.alx.accumulo.connect</feature>
        <feature version="[10,12)">google.guava</feature>
        <bundle>wrap:mvn:org.apache.rya/accumulo.rya/3.0.4-SNAPSHOT</bundle>
    </feature>
    <feature name='alx.rya' version='3.0.4'>
        <feature version="0.7.1">pax-web</feature>
        <feature version="[10,12)">google.guava</feature>
        <feature version="3.0.4">rya.sail</feature>
        <feature version="3.0.4">accumulo.rya</feature>
        <!--Ehcache should already be part of alx: net.sf.ehcache:ehcache-core:jar:1.7.1:compile-->
        <bundle>mvn:org.apache.rya/alx.rya/3.0.4-SNAPSHOT</bundle>
    </feature>
    <feature name='alx.rya.console' version='3.0.4'>
        <feature version="3.0.4">alx.rya</feature>
        <bundle>mvn:org.apache.rya/alx.rya.console/3.0.4-SNAPSHOT</bundle>
    </feature>
</features>
