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