<!--
 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.
-->
<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>
  <parent>
    <groupId>org.apache.aries.blueprint</groupId>
    <artifactId>blueprint</artifactId>
    <version>0.3.2-SNAPSHOT</version>
  </parent>

  <artifactId>org.apache.aries.blueprint.core</artifactId>
  <packaging>bundle</packaging>
  <name>Apache Aries Blueprint Core</name>
  <description>
      This bundle contains the core implementation of Blueprint 
      along with the "ext" namespace handler.
  </description>

  <properties>
      <aries.osgi.activator>
          org.apache.aries.blueprint.container.BlueprintExtender
      </aries.osgi.activator>
      <aries.osgi.export.pkg>
          !org.apache.aries.blueprint.annotation*,
          org.apache.aries.blueprint*
      </aries.osgi.export.pkg>
      <aries.osgi.import>
          !org.apache.aries.blueprint*,
        org.apache.aries.util.tracker;resolution:=optional,
        org.osgi.service.event*;resolution:=optional,
        org.osgi.service.framework;resolution:=optional,
        org.apache.aries.blueprint.annotation.service;resolution:=optional,
        org.apache.aries.quiesce.manager;version="[0.2,1.0)";resolution:=optional,
        org.apache.aries.quiesce.participant;version="[0.2,1.0)";resolution:=optional,
        *
      </aries.osgi.import>
      <aries.osgi.export.service>
          org.apache.aries.blueprint.ParserService
      </aries.osgi.export.service>
  </properties>
  
  <dependencies>
      <dependency>
          <groupId>org.apache.aries.blueprint</groupId>
          <artifactId>org.apache.aries.blueprint.api</artifactId>
      </dependency>
      <dependency>
          <groupId>org.apache.aries.blueprint</groupId>
          <artifactId>org.apache.aries.blueprint.annotation.api</artifactId>
          <optional>true</optional>
      </dependency>
      <dependency>
          <groupId>org.apache.aries</groupId>
          <artifactId>org.apache.aries.util</artifactId>
      </dependency>
      <dependency>
          <groupId>org.osgi</groupId>
          <artifactId>org.osgi.core</artifactId>
          <scope>provided</scope>
      </dependency>
      <dependency>
          <groupId>org.osgi</groupId>
          <artifactId>org.osgi.compendium</artifactId>
          <scope>provided</scope>
      </dependency>
      <dependency>
          <groupId>org.eclipse</groupId>
          <artifactId>osgi</artifactId>
          <scope>provided</scope>
      </dependency>
      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
      </dependency>
      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-simple</artifactId>
          <scope>test</scope>
      </dependency>
      <dependency>
          <groupId>asm</groupId>
          <artifactId>asm-all</artifactId>
          <optional>true</optional>
      </dependency>
      <dependency>
      	<groupId>org.apache.aries.quiesce</groupId>
      	<artifactId>org.apache.aries.quiesce.api</artifactId>
      	<scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>org.apache.aries.testsupport</groupId>
        <artifactId>org.apache.aries.testsupport.unit</artifactId>
      </dependency>            
      <dependency>
      	<groupId>org.apache.aries.proxy</groupId>
      	<artifactId>org.apache.aries.proxy.api</artifactId>
      </dependency>
  </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
            <resource>
                <directory>../blueprint-api/src/main/resources/org/osgi/service/blueprint</directory>
                <targetPath>org/apache/aries/blueprint</targetPath>
                <includes>
                    <include>blueprint.xsd</include>
                </includes>
            </resource>
        </resources>
    </build>
  
</project>
