<!--
  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.
-->
<ipojo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="org.apache.felix.ipojo http://people.apache.org/~clement/ipojo/schemas/core.xsd 
      org.apache.felix.ipojo.extender http://people.apache.org/~clement/ipojo/schemas/extender-pattern.xsd"
  xmlns="org.apache.felix.ipojo"
  xmlns:extender="org.apache.felix.ipojo.extender">
  <component
    classname="org.apache.felix.ipojo.junit4osgi.impl.JunitExtender">
    <extender:extender extension="Test-Suite"
      onArrival="onBundleArrival" onDeparture="onBundleDeparture" />
    <callback transition="invalidate" method="stopping" />
    <callback transition="validate" method="starting" />
    <requires field="m_log" optional="true" 
      default-implementation="org.apache.felix.ipojo.junit4osgi.impl.LogServiceImpl"/>
    <provides />
  </component>
  <instance
    component="org.apache.felix.ipojo.junit4osgi.impl.JunitExtender" />
</ipojo>
