<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
<span class="sourceLineNo">009</span> *<a name="line.9"></a>
<span class="sourceLineNo">010</span> *   http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
<span class="sourceLineNo">011</span> *<a name="line.11"></a>
<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing,<a name="line.12"></a>
<span class="sourceLineNo">013</span> * software distributed under the License is distributed on an<a name="line.13"></a>
<span class="sourceLineNo">014</span> * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<a name="line.14"></a>
<span class="sourceLineNo">015</span> * KIND, either express or implied.  See the License for the<a name="line.15"></a>
<span class="sourceLineNo">016</span> * specific language governing permissions and limitations<a name="line.16"></a>
<span class="sourceLineNo">017</span> * under the License.<a name="line.17"></a>
<span class="sourceLineNo">018</span> */<a name="line.18"></a>
<span class="sourceLineNo">019</span><a name="line.19"></a>
<span class="sourceLineNo">020</span>package org.apache.felix.ipojo.handlers.dependency;<a name="line.20"></a>
<span class="sourceLineNo">021</span><a name="line.21"></a>
<span class="sourceLineNo">022</span>import org.apache.felix.ipojo.ConfigurationException;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import org.apache.felix.ipojo.metadata.Element;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import org.apache.felix.ipojo.parser.FieldMetadata;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import org.apache.felix.ipojo.parser.MethodMetadata;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import org.apache.felix.ipojo.parser.PojoMetadata;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import org.apache.felix.ipojo.util.DependencyModel;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import org.osgi.framework.ServiceReference;<a name="line.28"></a>
<span class="sourceLineNo">029</span><a name="line.29"></a>
<span class="sourceLineNo">030</span>import java.util.*;<a name="line.30"></a>
<span class="sourceLineNo">031</span><a name="line.31"></a>
<span class="sourceLineNo">032</span>/**<a name="line.32"></a>
<span class="sourceLineNo">033</span> * Utility class checking the configuration of a dependency.<a name="line.33"></a>
<span class="sourceLineNo">034</span> */<a name="line.34"></a>
<span class="sourceLineNo">035</span>public class DependencyConfigurationChecker {<a name="line.35"></a>
<span class="sourceLineNo">036</span><a name="line.36"></a>
<span class="sourceLineNo">037</span>    public static void ensure(Dependency dependency, Element metadata, PojoMetadata manipulation) throws<a name="line.37"></a>
<span class="sourceLineNo">038</span>            ConfigurationException {<a name="line.38"></a>
<span class="sourceLineNo">039</span>        ensureThatAtLeastOneInjectionIsSpecified(dependency);<a name="line.39"></a>
<span class="sourceLineNo">040</span>        ensureThatTheFieldIsInComponentClass(dependency, manipulation);<a name="line.40"></a>
<span class="sourceLineNo">041</span>        ensureThatTheConstructorParameterIsCoherent(dependency, manipulation);<a name="line.41"></a>
<span class="sourceLineNo">042</span>        ensureThatCallbacksAreCoherent(dependency, manipulation);<a name="line.42"></a>
<span class="sourceLineNo">043</span>        deduceAggregationFromTheInjectionPoints(dependency, manipulation);<a name="line.43"></a>
<span class="sourceLineNo">044</span>        deduceTheServiceSpecification(dependency, manipulation);<a name="line.44"></a>
<span class="sourceLineNo">045</span>        checkTheServiceUnavailableAction(dependency, metadata);<a name="line.45"></a>
<span class="sourceLineNo">046</span>        checkTheConsistencyOfTheFromAttribute(dependency, metadata);<a name="line.46"></a>
<span class="sourceLineNo">047</span>        disableProxyForInconsistentTypes(dependency);<a name="line.47"></a>
<span class="sourceLineNo">048</span>    }<a name="line.48"></a>
<span class="sourceLineNo">049</span><a name="line.49"></a>
<span class="sourceLineNo">050</span>    /**<a name="line.50"></a>
<span class="sourceLineNo">051</span>     * Disables the proxy settings for types that does not support it: Vector, Array, and non interface specification.<a name="line.51"></a>
<span class="sourceLineNo">052</span>     * If the dependency is disabled, check that we are no constructor injection.<a name="line.52"></a>
<span class="sourceLineNo">053</span>     * @param dependency the dependency<a name="line.53"></a>
<span class="sourceLineNo">054</span>     */<a name="line.54"></a>
<span class="sourceLineNo">055</span>    private static void disableProxyForInconsistentTypes(Dependency dependency) throws ConfigurationException {<a name="line.55"></a>
<span class="sourceLineNo">056</span>        if (! dependency.getSpecification().isInterface()<a name="line.56"></a>
<span class="sourceLineNo">057</span>                || dependency.isAggregate()  &amp;&amp; dependency.getAggregateType() == AggregateDependencyInjectionType.ARRAY<a name="line.57"></a>
<span class="sourceLineNo">058</span>                || dependency.isAggregate()  &amp;&amp; dependency.getAggregateType() == AggregateDependencyInjectionType.VECTOR) {<a name="line.58"></a>
<span class="sourceLineNo">059</span>            dependency.setProxy(false);<a name="line.59"></a>
<span class="sourceLineNo">060</span>            if (dependency.getConstructorParameterIndex() != -1) {<a name="line.60"></a>
<span class="sourceLineNo">061</span>                throw new ConfigurationException("The dependency " + DependencyHandler.getDependencyIdentifier<a name="line.61"></a>
<span class="sourceLineNo">062</span>                        (dependency) + " has an inconsistent configuration. - reason: the service specification " +<a name="line.62"></a>
<span class="sourceLineNo">063</span>                        "or container do not support proxy, which is required for constructor injection");<a name="line.63"></a>
<span class="sourceLineNo">064</span>            }<a name="line.64"></a>
<span class="sourceLineNo">065</span>            dependency.getHandler().info("Proxy disabled for " + DependencyHandler.getDependencyIdentifier<a name="line.65"></a>
<span class="sourceLineNo">066</span>                    (dependency) + " - the service specification or container do not support proxy");<a name="line.66"></a>
<span class="sourceLineNo">067</span>        }<a name="line.67"></a>
<span class="sourceLineNo">068</span>    }<a name="line.68"></a>
<span class="sourceLineNo">069</span><a name="line.69"></a>
<span class="sourceLineNo">070</span>    /**<a name="line.70"></a>
<span class="sourceLineNo">071</span>     * Checks that the dependency callbacks are consistent:<a name="line.71"></a>
<span class="sourceLineNo">072</span>     * &lt;ul&gt;<a name="line.72"></a>
<span class="sourceLineNo">073</span>     *     &lt;li&gt;have a supported 'type'&lt;/li&gt;<a name="line.73"></a>
<span class="sourceLineNo">074</span>     *     &lt;li&gt;have a supported signature&lt;/li&gt;<a name="line.74"></a>
<span class="sourceLineNo">075</span>     * &lt;/ul&gt;<a name="line.75"></a>
<span class="sourceLineNo">076</span>     * If the method is not in the component class, a message is logged, as this verification cannot be used.<a name="line.76"></a>
<span class="sourceLineNo">077</span>     * If the method is found in the manipulation metadata, the callback parameters are set.<a name="line.77"></a>
<span class="sourceLineNo">078</span>     * @param dependency the dependency<a name="line.78"></a>
<span class="sourceLineNo">079</span>     * @param manipulation the manipulation<a name="line.79"></a>
<span class="sourceLineNo">080</span>     * @throws ConfigurationException if the methods do not obey to the previously mentioned rules.<a name="line.80"></a>
<span class="sourceLineNo">081</span>     */<a name="line.81"></a>
<span class="sourceLineNo">082</span>    private static void ensureThatCallbacksAreCoherent(Dependency dependency, PojoMetadata manipulation) throws<a name="line.82"></a>
<span class="sourceLineNo">083</span>            ConfigurationException {<a name="line.83"></a>
<span class="sourceLineNo">084</span>        DependencyCallback[] callbacks = dependency.getCallbacks();<a name="line.84"></a>
<span class="sourceLineNo">085</span>        if (callbacks != null) {<a name="line.85"></a>
<span class="sourceLineNo">086</span>            for (DependencyCallback callback : callbacks) {<a name="line.86"></a>
<span class="sourceLineNo">087</span>                MethodMetadata metadata = manipulation.getMethod(callback.getMethodName());<a name="line.87"></a>
<span class="sourceLineNo">088</span>                if (metadata == null) {<a name="line.88"></a>
<span class="sourceLineNo">089</span>                    dependency.getHandler().debug("A dependency callback " + callback.getMethodName() + " of " +<a name="line.89"></a>
<span class="sourceLineNo">090</span>                            DependencyHandler.getDependencyIdentifier(dependency) + " does not " +<a name="line.90"></a>
<span class="sourceLineNo">091</span>                            "exist in the implementation class, will try the parent classes");<a name="line.91"></a>
<span class="sourceLineNo">092</span>                } else {<a name="line.92"></a>
<span class="sourceLineNo">093</span>                    String[] parameters = metadata.getMethodArguments();<a name="line.93"></a>
<span class="sourceLineNo">094</span>                   switch(parameters.length) {<a name="line.94"></a>
<span class="sourceLineNo">095</span>                       case 0 : // Just a notification method.<a name="line.95"></a>
<span class="sourceLineNo">096</span>                            callback.setArgument(parameters);<a name="line.96"></a>
<span class="sourceLineNo">097</span>                            break;<a name="line.97"></a>
<span class="sourceLineNo">098</span>                       case 1 :<a name="line.98"></a>
<span class="sourceLineNo">099</span>                           // Can be the service object, service reference or properties<a name="line.99"></a>
<span class="sourceLineNo">100</span>                           callback.setArgument(parameters);<a name="line.100"></a>
<span class="sourceLineNo">101</span>                           break;<a name="line.101"></a>
<span class="sourceLineNo">102</span>                       case 2 :<a name="line.102"></a>
<span class="sourceLineNo">103</span>                           // Constraints on the second argument, must be a service reference, a dictionary or a map<a name="line.103"></a>
<span class="sourceLineNo">104</span>                           if (!ServiceReference.class.getName().equals(parameters[1])<a name="line.104"></a>
<span class="sourceLineNo">105</span>                               &amp;&amp; ! Dictionary.class.getName().equals(parameters[1])<a name="line.105"></a>
<span class="sourceLineNo">106</span>                               &amp;&amp; ! Map.class.getName().equals(parameters[1])) {<a name="line.106"></a>
<span class="sourceLineNo">107</span>                                throw new ConfigurationException("The method " + callback.getMethodName() + " of " +<a name="line.107"></a>
<span class="sourceLineNo">108</span>                                        DependencyHandler.getDependencyIdentifier(dependency) + " is not a valid " +<a name="line.108"></a>
<span class="sourceLineNo">109</span>                                        "dependency callback - reason: the second argument (" + parameters[1] +<a name="line.109"></a>
<span class="sourceLineNo">110</span>                                        ")  must be a service reference, a dictionary or a map.");<a name="line.110"></a>
<span class="sourceLineNo">111</span>                                }<a name="line.111"></a>
<span class="sourceLineNo">112</span>                           callback.setArgument(parameters);<a name="line.112"></a>
<span class="sourceLineNo">113</span>                           break;<a name="line.113"></a>
<span class="sourceLineNo">114</span>                       default:<a name="line.114"></a>
<span class="sourceLineNo">115</span>                           // Invalid signature.<a name="line.115"></a>
<span class="sourceLineNo">116</span>                           throw new ConfigurationException("The method " + callback.getMethodName() + " of " +<a name="line.116"></a>
<span class="sourceLineNo">117</span>                                   DependencyHandler.getDependencyIdentifier(dependency) + " is not a valid " +<a name="line.117"></a>
<span class="sourceLineNo">118</span>                                   "dependency callback - reason: the signature is invalid");<a name="line.118"></a>
<span class="sourceLineNo">119</span>                    }<a name="line.119"></a>
<span class="sourceLineNo">120</span>                }<a name="line.120"></a>
<span class="sourceLineNo">121</span>            }<a name="line.121"></a>
<span class="sourceLineNo">122</span>        }<a name="line.122"></a>
<span class="sourceLineNo">123</span>    }<a name="line.123"></a>
<span class="sourceLineNo">124</span><a name="line.124"></a>
<span class="sourceLineNo">125</span>    /**<a name="line.125"></a>
<span class="sourceLineNo">126</span>     * Checks whether the constructor parameter injection is suitable. this check verified that the constructor has<a name="line.126"></a>
<span class="sourceLineNo">127</span>     * enough parameter.<a name="line.127"></a>
<span class="sourceLineNo">128</span>     * @param dependency the dependency<a name="line.128"></a>
<span class="sourceLineNo">129</span>     * @param manipulation the manipulation metadata<a name="line.129"></a>
<span class="sourceLineNo">130</span>     * @throws ConfigurationException if the constructor is not suitable<a name="line.130"></a>
<span class="sourceLineNo">131</span>     */<a name="line.131"></a>
<span class="sourceLineNo">132</span>    private static void ensureThatTheConstructorParameterIsCoherent(Dependency dependency,<a name="line.132"></a>
<span class="sourceLineNo">133</span>                                                                    PojoMetadata manipulation) throws<a name="line.133"></a>
<span class="sourceLineNo">134</span>            ConfigurationException {<a name="line.134"></a>
<span class="sourceLineNo">135</span>        if (dependency.getConstructorParameterIndex() != -1) {<a name="line.135"></a>
<span class="sourceLineNo">136</span>            MethodMetadata[] constructors = manipulation.getConstructors();<a name="line.136"></a>
<span class="sourceLineNo">137</span>            if (constructors == null  || constructors.length == 0) {<a name="line.137"></a>
<span class="sourceLineNo">138</span>                throw new ConfigurationException("The constructor parameter attribute of " + DependencyHandler<a name="line.138"></a>
<span class="sourceLineNo">139</span>                        .getDependencyIdentifier(dependency) + " is inconsistent - reason: there is no constructor in" +<a name="line.139"></a>
<span class="sourceLineNo">140</span>                        " the component class (" + dependency.getHandler().getInstanceManager().getClassName() + ")");<a name="line.140"></a>
<span class="sourceLineNo">141</span>            }<a name="line.141"></a>
<span class="sourceLineNo">142</span><a name="line.142"></a>
<span class="sourceLineNo">143</span>            //TODO Consider only the first constructor. This is a limitation we should think about,<a name="line.143"></a>
<span class="sourceLineNo">144</span>            // how to determine which constructor to use. Only one constructor should have annotations,<a name="line.144"></a>
<span class="sourceLineNo">145</span>            // it could be use as hint.<a name="line.145"></a>
<span class="sourceLineNo">146</span>            MethodMetadata constructor = constructors[0];<a name="line.146"></a>
<span class="sourceLineNo">147</span>            if (! (constructor.getMethodArguments().length &gt; dependency.getConstructorParameterIndex())) {<a name="line.147"></a>
<span class="sourceLineNo">148</span>                throw new ConfigurationException("The constructor parameter attribute of " + DependencyHandler<a name="line.148"></a>
<span class="sourceLineNo">149</span>                        .getDependencyIdentifier(dependency) + " is inconsistent - reason: the constructor with the " +<a name="line.149"></a>
<span class="sourceLineNo">150</span>                        "signature " + Arrays.toString(constructor.getMethodArguments()) + " has not enough " +<a name="line.150"></a>
<span class="sourceLineNo">151</span>                        "parameters");<a name="line.151"></a>
<span class="sourceLineNo">152</span>            }<a name="line.152"></a>
<span class="sourceLineNo">153</span><a name="line.153"></a>
<span class="sourceLineNo">154</span>        }<a name="line.154"></a>
<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
<span class="sourceLineNo">156</span><a name="line.156"></a>
<span class="sourceLineNo">157</span>    /**<a name="line.157"></a>
<span class="sourceLineNo">158</span>     * Checks that the field used to inject the dependency is in the component class. If the dependency has no field,<a name="line.158"></a>
<span class="sourceLineNo">159</span>     * this method does nothing.<a name="line.159"></a>
<span class="sourceLineNo">160</span>     * @param dependency the dependency<a name="line.160"></a>
<span class="sourceLineNo">161</span>     * @param manipulation the manipulation metadata<a name="line.161"></a>
<span class="sourceLineNo">162</span>     * @throws ConfigurationException if the field used to inject the given dependency is not in the component class.<a name="line.162"></a>
<span class="sourceLineNo">163</span>     */<a name="line.163"></a>
<span class="sourceLineNo">164</span>    private static void ensureThatTheFieldIsInComponentClass(Dependency dependency, PojoMetadata manipulation) throws ConfigurationException {<a name="line.164"></a>
<span class="sourceLineNo">165</span>        if (dependency.getField() != null) {<a name="line.165"></a>
<span class="sourceLineNo">166</span>            FieldMetadata field = manipulation.getField(dependency.getField());<a name="line.166"></a>
<span class="sourceLineNo">167</span>            if (field == null) {<a name="line.167"></a>
<span class="sourceLineNo">168</span>                throw new ConfigurationException("Incorrect field injection for " + DependencyHandler<a name="line.168"></a>
<span class="sourceLineNo">169</span>                        .getDependencyIdentifier(dependency) + " - reason: the field " + dependency.getField() + " is" +<a name="line.169"></a>
<span class="sourceLineNo">170</span>                        " not in the component class (" + dependency.getHandler().getInstanceManager().getClassName()<a name="line.170"></a>
<span class="sourceLineNo">171</span>                      + ")");<a name="line.171"></a>
<span class="sourceLineNo">172</span>            }<a name="line.172"></a>
<span class="sourceLineNo">173</span>        }<a name="line.173"></a>
<span class="sourceLineNo">174</span>    }<a name="line.174"></a>
<span class="sourceLineNo">175</span><a name="line.175"></a>
<span class="sourceLineNo">176</span>    /**<a name="line.176"></a>
<span class="sourceLineNo">177</span>     * Determines if the dependency is aggregate from the field or constructor parameter used to inject the dependency.<a name="line.177"></a>
<span class="sourceLineNo">178</span>     * If the dependency just uses methods, this method does nothing. This method also check that dependencies set to<a name="line.178"></a>
<span class="sourceLineNo">179</span>     * aggregate have a valid injection type.<a name="line.179"></a>
<span class="sourceLineNo">180</span>     * @param dependency the dependency<a name="line.180"></a>
<span class="sourceLineNo">181</span>     * @param manipulation the manipulation metadata<a name="line.181"></a>
<span class="sourceLineNo">182</span>     * @throws ConfigurationException if the type of the field or constructor parameter used to inject the dependency<a name="line.182"></a>
<span class="sourceLineNo">183</span>     * is not suitable for aggregate dependencies.<a name="line.183"></a>
<span class="sourceLineNo">184</span>     */<a name="line.184"></a>
<span class="sourceLineNo">185</span>    private static void deduceAggregationFromTheInjectionPoints(Dependency dependency, PojoMetadata manipulation) throws ConfigurationException {<a name="line.185"></a>
<span class="sourceLineNo">186</span>        if (dependency.getField() != null) {<a name="line.186"></a>
<span class="sourceLineNo">187</span>            FieldMetadata field = manipulation.getField(dependency.getField());<a name="line.187"></a>
<span class="sourceLineNo">188</span>            String type = field.getFieldType();<a name="line.188"></a>
<span class="sourceLineNo">189</span>            if (type.endsWith("[]")) {<a name="line.189"></a>
<span class="sourceLineNo">190</span>                dependency.setAggregateType(AggregateDependencyInjectionType.ARRAY);<a name="line.190"></a>
<span class="sourceLineNo">191</span>            } else if (Collection.class.getName().equals(type)  || List.class.getName().equals(type)) {<a name="line.191"></a>
<span class="sourceLineNo">192</span>                dependency.setAggregateType(AggregateDependencyInjectionType.LIST);<a name="line.192"></a>
<span class="sourceLineNo">193</span>            } else if (Set.class.getName().equals(type)) {<a name="line.193"></a>
<span class="sourceLineNo">194</span>                dependency.setAggregateType(AggregateDependencyInjectionType.SET);<a name="line.194"></a>
<span class="sourceLineNo">195</span>            } else if (Vector.class.getName().equals(type)) {<a name="line.195"></a>
<span class="sourceLineNo">196</span>                dependency.setAggregateType(AggregateDependencyInjectionType.VECTOR);<a name="line.196"></a>
<span class="sourceLineNo">197</span>            } else if (dependency.isAggregate()) {<a name="line.197"></a>
<span class="sourceLineNo">198</span>                // Something wrong. The dependency has a field that is not suitable for aggregate dependencies<a name="line.198"></a>
<span class="sourceLineNo">199</span>                throw new ConfigurationException("The dependency " + DependencyHandler.getDependencyIdentifier<a name="line.199"></a>
<span class="sourceLineNo">200</span>                        (dependency) + " cannot be an aggregate dependency - reason: the type " + field.getFieldType<a name="line.200"></a>
<span class="sourceLineNo">201</span>                        () + " of the field " + field.getFieldName() + " is not suitable for aggregate " +<a name="line.201"></a>
<span class="sourceLineNo">202</span>                        "dependencies. Compatible types are array, vector, list, set and collection.");<a name="line.202"></a>
<span class="sourceLineNo">203</span>            }<a name="line.203"></a>
<span class="sourceLineNo">204</span>        }<a name="line.204"></a>
<span class="sourceLineNo">205</span>        if (dependency.getConstructorParameterIndex() != -1) {<a name="line.205"></a>
<span class="sourceLineNo">206</span>            String type = manipulation.getConstructors()[0].getMethodArguments()[dependency<a name="line.206"></a>
<span class="sourceLineNo">207</span>                    .getConstructorParameterIndex()];<a name="line.207"></a>
<span class="sourceLineNo">208</span>            if (type.endsWith("[]")) {<a name="line.208"></a>
<span class="sourceLineNo">209</span>                dependency.setAggregateType(AggregateDependencyInjectionType.ARRAY);<a name="line.209"></a>
<span class="sourceLineNo">210</span>            } else if (Collection.class.getName().equals(type)  || List.class.getName().equals(type)) {<a name="line.210"></a>
<span class="sourceLineNo">211</span>                dependency.setAggregateType(AggregateDependencyInjectionType.LIST);<a name="line.211"></a>
<span class="sourceLineNo">212</span>            } else if (Set.class.getName().equals(type)) {<a name="line.212"></a>
<span class="sourceLineNo">213</span>                dependency.setAggregateType(AggregateDependencyInjectionType.SET);<a name="line.213"></a>
<span class="sourceLineNo">214</span>            } else if (Vector.class.getName().equals(type)) {<a name="line.214"></a>
<span class="sourceLineNo">215</span>                dependency.setAggregateType(AggregateDependencyInjectionType.VECTOR);<a name="line.215"></a>
<span class="sourceLineNo">216</span>            } else if (dependency.isAggregate()) {<a name="line.216"></a>
<span class="sourceLineNo">217</span>                // Something wrong. The dependency has a field that is not suitable for aggregate dependencies<a name="line.217"></a>
<span class="sourceLineNo">218</span>                throw new ConfigurationException("The dependency " + DependencyHandler.getDependencyIdentifier<a name="line.218"></a>
<span class="sourceLineNo">219</span>                        (dependency) + " cannot be an aggregate dependency - reason: the type " + type<a name="line.219"></a>
<span class="sourceLineNo">220</span>                        + " of the constructor parameter " + dependency.getConstructorParameterIndex() + " is not suitable for aggregate " +<a name="line.220"></a>
<span class="sourceLineNo">221</span>                        "dependencies. Compatible types are array, vector, list, set and collection.");<a name="line.221"></a>
<span class="sourceLineNo">222</span>            }<a name="line.222"></a>
<span class="sourceLineNo">223</span>        }<a name="line.223"></a>
<span class="sourceLineNo">224</span>        //TODO We may not cover some cases such as inconsistency between the constructor and the field. However this<a name="line.224"></a>
<span class="sourceLineNo">225</span>        // should be very rare.<a name="line.225"></a>
<span class="sourceLineNo">226</span><a name="line.226"></a>
<span class="sourceLineNo">227</span>    }<a name="line.227"></a>
<span class="sourceLineNo">228</span><a name="line.228"></a>
<span class="sourceLineNo">229</span>    /**<a name="line.229"></a>
<span class="sourceLineNo">230</span>     * Checks that the dependency has at least one injection point.<a name="line.230"></a>
<span class="sourceLineNo">231</span>     * @param dependency the dependency<a name="line.231"></a>
<span class="sourceLineNo">232</span>     * @throws ConfigurationException if the dependency has no injection point<a name="line.232"></a>
<span class="sourceLineNo">233</span>     */<a name="line.233"></a>
<span class="sourceLineNo">234</span>    private static void ensureThatAtLeastOneInjectionIsSpecified(Dependency dependency) throws ConfigurationException {<a name="line.234"></a>
<span class="sourceLineNo">235</span>        if (dependency.getField() == null<a name="line.235"></a>
<span class="sourceLineNo">236</span>                &amp;&amp; (dependency.getCallbacks() == null  || dependency.getCallbacks().length == 0)<a name="line.236"></a>
<span class="sourceLineNo">237</span>                &amp;&amp; dependency.getConstructorParameterIndex() == -1) {<a name="line.237"></a>
<span class="sourceLineNo">238</span>            throw new ConfigurationException("The dependency " + DependencyHandler.getDependencyIdentifier<a name="line.238"></a>
<span class="sourceLineNo">239</span>                    (dependency) + " is invalid - reason: no injection specified, at least a field, " +<a name="line.239"></a>
<span class="sourceLineNo">240</span>                    "a method or a constructor parameter index must be set");<a name="line.240"></a>
<span class="sourceLineNo">241</span>        }<a name="line.241"></a>
<span class="sourceLineNo">242</span>    }<a name="line.242"></a>
<span class="sourceLineNo">243</span><a name="line.243"></a>
<span class="sourceLineNo">244</span>    /**<a name="line.244"></a>
<span class="sourceLineNo">245</span>     * Checks that the `from` attribute is used consistently:<a name="line.245"></a>
<span class="sourceLineNo">246</span>     * &lt;ul&gt;<a name="line.246"></a>
<span class="sourceLineNo">247</span>     * &lt;li&gt;Rule 1 : it cannot be used on aggregate dependency&lt;/li&gt;<a name="line.247"></a>
<span class="sourceLineNo">248</span>     * &lt;li&gt;Rule 2 : it cannot be used in combination with the `comparator` attribute&lt;/li&gt;<a name="line.248"></a>
<span class="sourceLineNo">249</span>     * &lt;li&gt;Rule 3 : it cannot be used in combination with the `dynamic-priority` binding policy&lt;/li&gt;<a name="line.249"></a>
<span class="sourceLineNo">250</span>     * &lt;/ul&gt;<a name="line.250"></a>
<span class="sourceLineNo">251</span>     *<a name="line.251"></a>
<span class="sourceLineNo">252</span>     * @param dependency the dependency<a name="line.252"></a>
<span class="sourceLineNo">253</span>     * @param metadata the dependency metadata<a name="line.253"></a>
<span class="sourceLineNo">254</span>     * @throws ConfigurationException if the `from` attribute is used inconsistently.<a name="line.254"></a>
<span class="sourceLineNo">255</span>     */<a name="line.255"></a>
<span class="sourceLineNo">256</span>    private static void checkTheConsistencyOfTheFromAttribute(Dependency dependency,<a name="line.256"></a>
<span class="sourceLineNo">257</span>                                                              Element metadata) throws ConfigurationException {<a name="line.257"></a>
<span class="sourceLineNo">258</span>        // Check if we have a from attribute.<a name="line.258"></a>
<span class="sourceLineNo">259</span>        if (metadata.getAttribute("from") != null) {<a name="line.259"></a>
<span class="sourceLineNo">260</span>            final String message = "The `from` attribute is not usable in " + DependencyHandler<a name="line.260"></a>
<span class="sourceLineNo">261</span>                    .getDependencyIdentifier(dependency) + " - reason: ";<a name="line.261"></a>
<span class="sourceLineNo">262</span>            // Rule 1<a name="line.262"></a>
<span class="sourceLineNo">263</span>            if (dependency.isAggregate()) {<a name="line.263"></a>
<span class="sourceLineNo">264</span>                throw new ConfigurationException(message + "the dependency is " +<a name="line.264"></a>
<span class="sourceLineNo">265</span>                        "aggregate");<a name="line.265"></a>
<span class="sourceLineNo">266</span>            }<a name="line.266"></a>
<span class="sourceLineNo">267</span>            // Rule 2<a name="line.267"></a>
<span class="sourceLineNo">268</span>            String comparator = metadata.getAttribute("comparator");<a name="line.268"></a>
<span class="sourceLineNo">269</span>            if (comparator != null) {<a name="line.269"></a>
<span class="sourceLineNo">270</span>                throw new ConfigurationException(message + "the dependency uses a comparator");<a name="line.270"></a>
<span class="sourceLineNo">271</span>            }<a name="line.271"></a>
<span class="sourceLineNo">272</span>            // Rule 3<a name="line.272"></a>
<span class="sourceLineNo">273</span>            if (dependency.getBindingPolicy() == DependencyModel.DYNAMIC_PRIORITY_BINDING_POLICY) {<a name="line.273"></a>
<span class="sourceLineNo">274</span>                throw new ConfigurationException(message + "the dependency uses the dynamic-priority " +<a name="line.274"></a>
<span class="sourceLineNo">275</span>                        "binding policy");<a name="line.275"></a>
<span class="sourceLineNo">276</span>            }<a name="line.276"></a>
<span class="sourceLineNo">277</span>        }<a name="line.277"></a>
<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
<span class="sourceLineNo">279</span><a name="line.279"></a>
<span class="sourceLineNo">280</span>    /**<a name="line.280"></a>
<span class="sourceLineNo">281</span>     * Checks that service unavailable actions are consistent.<a name="line.281"></a>
<span class="sourceLineNo">282</span>     * &lt;ul&gt;<a name="line.282"></a>
<span class="sourceLineNo">283</span>     * &lt;li&gt;Rule 1: Nullable, Exception, Default-Implementation... can only be used for scalar optional dependency&lt;/li&gt;<a name="line.283"></a>
<span class="sourceLineNo">284</span>     * &lt;li&gt;Rule 2: Only one can be used&lt;/li&gt;<a name="line.284"></a>
<span class="sourceLineNo">285</span>     * &lt;li&gt;Rule 3: Timeout can only be used on optional dependency&lt;/li&gt;<a name="line.285"></a>
<span class="sourceLineNo">286</span>     * &lt;/ul&gt;<a name="line.286"></a>
<span class="sourceLineNo">287</span>     *<a name="line.287"></a>
<span class="sourceLineNo">288</span>     * @param dependency the dependency<a name="line.288"></a>
<span class="sourceLineNo">289</span>     * @throws ConfigurationException if the dependency used inconsistent attributes<a name="line.289"></a>
<span class="sourceLineNo">290</span>     */<a name="line.290"></a>
<span class="sourceLineNo">291</span>    private static void checkTheServiceUnavailableAction(Dependency dependency,<a name="line.291"></a>
<span class="sourceLineNo">292</span>                                                         Element metadata) throws ConfigurationException {<a name="line.292"></a>
<span class="sourceLineNo">293</span>        if (metadata.containsAttribute("nullable") || dependency.getDefaultImplementation() != null  || dependency<a name="line.293"></a>
<span class="sourceLineNo">294</span>                .getException() != null) {<a name="line.294"></a>
<span class="sourceLineNo">295</span>            // Rule 1:<a name="line.295"></a>
<span class="sourceLineNo">296</span>            String message = "The `nullable`, `default-implementation` and `exception` attributes are not " +<a name="line.296"></a>
<span class="sourceLineNo">297</span>                    "usable in " + DependencyHandler.getDependencyIdentifier(dependency) + " - reason: ";<a name="line.297"></a>
<span class="sourceLineNo">298</span>            if (dependency.isAggregate()) {<a name="line.298"></a>
<span class="sourceLineNo">299</span>                throw  new ConfigurationException(message + "the dependency is aggregate");<a name="line.299"></a>
<span class="sourceLineNo">300</span>            }<a name="line.300"></a>
<span class="sourceLineNo">301</span>            if (! dependency.isOptional()) {<a name="line.301"></a>
<span class="sourceLineNo">302</span>                throw  new ConfigurationException(message + "the dependency is mandatory");<a name="line.302"></a>
<span class="sourceLineNo">303</span>            }<a name="line.303"></a>
<span class="sourceLineNo">304</span><a name="line.304"></a>
<span class="sourceLineNo">305</span>            // At this point, we know that the dependency is scalar and optional, and at least one attribute is set<a name="line.305"></a>
<span class="sourceLineNo">306</span><a name="line.306"></a>
<span class="sourceLineNo">307</span>            // Rule 2:<a name="line.307"></a>
<span class="sourceLineNo">308</span>            message = "Inconsistent use of the `nullable`, `default-implementation` and `exception` attributes are " +<a name="line.308"></a>
<span class="sourceLineNo">309</span>                    "not usable in " + DependencyHandler.getDependencyIdentifier(dependency) + " - reason: ";<a name="line.309"></a>
<span class="sourceLineNo">310</span>            if (metadata.containsAttribute("nullable")  &amp;&amp; dependency.getDefaultImplementation() != null) {<a name="line.310"></a>
<span class="sourceLineNo">311</span>                throw new ConfigurationException(message + "`nullable` and `default-implementation` cannot be " +<a name="line.311"></a>
<span class="sourceLineNo">312</span>                        "combined");<a name="line.312"></a>
<span class="sourceLineNo">313</span>            }<a name="line.313"></a>
<span class="sourceLineNo">314</span>            if (metadata.containsAttribute("nullable") &amp;&amp; dependency.getException() != null) {<a name="line.314"></a>
<span class="sourceLineNo">315</span>                throw new ConfigurationException(message + "`nullable` and `exception` cannot be combined");<a name="line.315"></a>
<span class="sourceLineNo">316</span>            }<a name="line.316"></a>
<span class="sourceLineNo">317</span>            if (dependency.getDefaultImplementation() != null  &amp;&amp; dependency.getException() != null) {<a name="line.317"></a>
<span class="sourceLineNo">318</span>                throw new ConfigurationException(message + "`exception` and `default-implementation` cannot be " +<a name="line.318"></a>
<span class="sourceLineNo">319</span>                        "combined");<a name="line.319"></a>
<span class="sourceLineNo">320</span>            }<a name="line.320"></a>
<span class="sourceLineNo">321</span>        }<a name="line.321"></a>
<span class="sourceLineNo">322</span><a name="line.322"></a>
<span class="sourceLineNo">323</span>        // Rule 3:<a name="line.323"></a>
<span class="sourceLineNo">324</span>        if (dependency.getTimeout() != 0  &amp;&amp; ! dependency.isOptional()) {<a name="line.324"></a>
<span class="sourceLineNo">325</span>            throw new ConfigurationException("The `timeout` attribute is not usable in " + DependencyHandler<a name="line.325"></a>
<span class="sourceLineNo">326</span>                    .getDependencyIdentifier(dependency) + " - reason: the dependency is not optional");<a name="line.326"></a>
<span class="sourceLineNo">327</span>        }<a name="line.327"></a>
<span class="sourceLineNo">328</span><a name="line.328"></a>
<span class="sourceLineNo">329</span><a name="line.329"></a>
<span class="sourceLineNo">330</span><a name="line.330"></a>
<span class="sourceLineNo">331</span><a name="line.331"></a>
<span class="sourceLineNo">332</span>    }<a name="line.332"></a>
<span class="sourceLineNo">333</span><a name="line.333"></a>
<span class="sourceLineNo">334</span>    /**<a name="line.334"></a>
<span class="sourceLineNo">335</span>     * Tries to determine the service specification to inject in the dependency.<a name="line.335"></a>
<span class="sourceLineNo">336</span>     * If the specification is already checked by the dependency, just checks the consistency.<a name="line.336"></a>
<span class="sourceLineNo">337</span>     *<a name="line.337"></a>
<span class="sourceLineNo">338</span>     * @param dependency   the dependency<a name="line.338"></a>
<span class="sourceLineNo">339</span>     * @param manipulation the manipulation metadata<a name="line.339"></a>
<span class="sourceLineNo">340</span>     * @throws ConfigurationException if the specification cannot be deduced, or when the set specification is not<a name="line.340"></a>
<span class="sourceLineNo">341</span>     *                                consistent.<a name="line.341"></a>
<span class="sourceLineNo">342</span>     */<a name="line.342"></a>
<span class="sourceLineNo">343</span>    private static void deduceTheServiceSpecification(Dependency dependency, PojoMetadata manipulation) throws<a name="line.343"></a>
<span class="sourceLineNo">344</span>            ConfigurationException {<a name="line.344"></a>
<span class="sourceLineNo">345</span><a name="line.345"></a>
<span class="sourceLineNo">346</span>        // Deduction algorithm<a name="line.346"></a>
<span class="sourceLineNo">347</span>        String fieldType = null;<a name="line.347"></a>
<span class="sourceLineNo">348</span>        String callbackType = null;<a name="line.348"></a>
<span class="sourceLineNo">349</span>        String constructorType = null;<a name="line.349"></a>
<span class="sourceLineNo">350</span>        // First check the field<a name="line.350"></a>
<span class="sourceLineNo">351</span>        if (dependency.getField() != null) {<a name="line.351"></a>
<span class="sourceLineNo">352</span>           fieldType = extractSpecificationFromField(dependency.getField(), manipulation);<a name="line.352"></a>
<span class="sourceLineNo">353</span>        }<a name="line.353"></a>
<span class="sourceLineNo">354</span>        if (dependency.getCallbacks() != null  &amp;&amp; dependency.getCallbacks().length != 0) {<a name="line.354"></a>
<span class="sourceLineNo">355</span>            callbackType = extractSpecificationFromMethods(dependency, dependency.getCallbacks(), manipulation);<a name="line.355"></a>
<span class="sourceLineNo">356</span>        }<a name="line.356"></a>
<span class="sourceLineNo">357</span>        if (dependency.getConstructorParameterIndex() != -1) {<a name="line.357"></a>
<span class="sourceLineNo">358</span>            constructorType = extractSpecificationFromConstructor(dependency.getConstructorParameterIndex(),<a name="line.358"></a>
<span class="sourceLineNo">359</span>                    manipulation);<a name="line.359"></a>
<span class="sourceLineNo">360</span>        }<a name="line.360"></a>
<span class="sourceLineNo">361</span><a name="line.361"></a>
<span class="sourceLineNo">362</span>        if (dependency.getSpecification() == null<a name="line.362"></a>
<span class="sourceLineNo">363</span>                &amp;&amp; fieldType == null  &amp;&amp; callbackType == null  &amp;&amp; constructorType == null) {<a name="line.363"></a>
<span class="sourceLineNo">364</span>            throw new ConfigurationException("The deduction of the service specification for " + DependencyHandler<a name="line.364"></a>
<span class="sourceLineNo">365</span>                    .getDependencyIdentifier(dependency) + " has failed - reason: when neither the field, " +<a name="line.365"></a>
<span class="sourceLineNo">366</span>                    "methods and constructor parameter have provided the service specification, " +<a name="line.366"></a>
<span class="sourceLineNo">367</span>                    "the `specification` attribute must be set");<a name="line.367"></a>
<span class="sourceLineNo">368</span><a name="line.368"></a>
<span class="sourceLineNo">369</span>        }<a name="line.369"></a>
<span class="sourceLineNo">370</span><a name="line.370"></a>
<span class="sourceLineNo">371</span>        // The Dependency.setSpecification method check whether the specification coming from the different sources<a name="line.371"></a>
<span class="sourceLineNo">372</span>        // are consistent.<a name="line.372"></a>
<span class="sourceLineNo">373</span>        if (fieldType != null) {<a name="line.373"></a>
<span class="sourceLineNo">374</span>            setSpecification(dependency, fieldType);<a name="line.374"></a>
<span class="sourceLineNo">375</span>        }<a name="line.375"></a>
<span class="sourceLineNo">376</span>        if (callbackType != null) {<a name="line.376"></a>
<span class="sourceLineNo">377</span>            setSpecification(dependency, callbackType);<a name="line.377"></a>
<span class="sourceLineNo">378</span>        }<a name="line.378"></a>
<span class="sourceLineNo">379</span>        if (constructorType != null) {<a name="line.379"></a>
<span class="sourceLineNo">380</span>            setSpecification(dependency, constructorType);<a name="line.380"></a>
<span class="sourceLineNo">381</span>        }<a name="line.381"></a>
<span class="sourceLineNo">382</span>    }<a name="line.382"></a>
<span class="sourceLineNo">383</span><a name="line.383"></a>
<span class="sourceLineNo">384</span>    private static String extractSpecificationFromMethods(Dependency dependency, DependencyCallback[] callbacks,<a name="line.384"></a>
<span class="sourceLineNo">385</span>                                                          PojoMetadata manipulation) throws ConfigurationException {<a name="line.385"></a>
<span class="sourceLineNo">386</span>        String type = null;<a name="line.386"></a>
<span class="sourceLineNo">387</span>        for (DependencyCallback callback : callbacks) {<a name="line.387"></a>
<span class="sourceLineNo">388</span>            MethodMetadata metadata = manipulation.getMethod(callback.getMethodName());<a name="line.388"></a>
<span class="sourceLineNo">389</span>            if (metadata != null) {<a name="line.389"></a>
<span class="sourceLineNo">390</span>                String[] parameters = metadata.getMethodArguments();<a name="line.390"></a>
<span class="sourceLineNo">391</span>                if (parameters.length == 1  || parameters.length == 2) {<a name="line.391"></a>
<span class="sourceLineNo">392</span>                    if (! ServiceReference.class.getName().equals(parameters[0])<a name="line.392"></a>
<span class="sourceLineNo">393</span>                        &amp;&amp; ! Dictionary.class.getName().equals(parameters[0])<a name="line.393"></a>
<span class="sourceLineNo">394</span>                        &amp;&amp; ! Map.class.getName().equals(parameters[0])) {<a name="line.394"></a>
<span class="sourceLineNo">395</span>                        if (type == null) {<a name="line.395"></a>
<span class="sourceLineNo">396</span>                            type = parameters[0];<a name="line.396"></a>
<span class="sourceLineNo">397</span>                        } else {<a name="line.397"></a>
<span class="sourceLineNo">398</span>                            if (! type.equals(parameters[0])) {<a name="line.398"></a>
<span class="sourceLineNo">399</span>                                throw new ConfigurationException("The callbacks of " + DependencyHandler<a name="line.399"></a>
<span class="sourceLineNo">400</span>                                        .getDependencyIdentifier(dependency) + " have inconsistent parameters");<a name="line.400"></a>
<span class="sourceLineNo">401</span>                            }<a name="line.401"></a>
<span class="sourceLineNo">402</span>                        }<a name="line.402"></a>
<span class="sourceLineNo">403</span>                    }<a name="line.403"></a>
<span class="sourceLineNo">404</span>                }<a name="line.404"></a>
<span class="sourceLineNo">405</span>            }<a name="line.405"></a>
<span class="sourceLineNo">406</span>        }<a name="line.406"></a>
<span class="sourceLineNo">407</span>        return type;<a name="line.407"></a>
<span class="sourceLineNo">408</span>    }<a name="line.408"></a>
<span class="sourceLineNo">409</span><a name="line.409"></a>
<span class="sourceLineNo">410</span>    private static String extractSpecificationFromConstructor(int index, PojoMetadata manipulation) {<a name="line.410"></a>
<span class="sourceLineNo">411</span>        // We can write the following instructions as everything was previously checked.<a name="line.411"></a>
<span class="sourceLineNo">412</span>        String type = manipulation.getConstructors()[0].getMethodArguments()[index];<a name="line.412"></a>
<span class="sourceLineNo">413</span>        if (type.endsWith("[]")) {<a name="line.413"></a>
<span class="sourceLineNo">414</span>            return type.substring(0, type.length() - 2);<a name="line.414"></a>
<span class="sourceLineNo">415</span>        }<a name="line.415"></a>
<span class="sourceLineNo">416</span>        if (AggregateDependencyInjectionType.AGGREGATE_TYPES.contains(type)) {<a name="line.416"></a>
<span class="sourceLineNo">417</span>            return null; // It's an aggregate<a name="line.417"></a>
<span class="sourceLineNo">418</span>        }<a name="line.418"></a>
<span class="sourceLineNo">419</span>        return type;<a name="line.419"></a>
<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
<span class="sourceLineNo">421</span><a name="line.421"></a>
<span class="sourceLineNo">422</span>    /**<a name="line.422"></a>
<span class="sourceLineNo">423</span>     * Extracts the service specification from the field.<a name="line.423"></a>
<span class="sourceLineNo">424</span>     * When this method is called, we know that the field is containing in the component class.<a name="line.424"></a>
<span class="sourceLineNo">425</span>     * @param field the field<a name="line.425"></a>
<span class="sourceLineNo">426</span>     * @param manipulation the manipulation metadata<a name="line.426"></a>
<span class="sourceLineNo">427</span>     * @return the service specification, or {@code null} if is cannot be extracted.<a name="line.427"></a>
<span class="sourceLineNo">428</span>     */<a name="line.428"></a>
<span class="sourceLineNo">429</span>    private static String extractSpecificationFromField(String field, PojoMetadata manipulation) {<a name="line.429"></a>
<span class="sourceLineNo">430</span>        FieldMetadata metadata = manipulation.getField(field);<a name="line.430"></a>
<span class="sourceLineNo">431</span>        if (metadata.getFieldType().endsWith("[]")) {<a name="line.431"></a>
<span class="sourceLineNo">432</span>            return metadata.getFieldType().substring(0, metadata.getFieldType().length() - 2);<a name="line.432"></a>
<span class="sourceLineNo">433</span>        }<a name="line.433"></a>
<span class="sourceLineNo">434</span>        if (AggregateDependencyInjectionType.AGGREGATE_TYPES.contains(metadata.getFieldType())) {<a name="line.434"></a>
<span class="sourceLineNo">435</span>            return null; // It's an aggregate<a name="line.435"></a>
<span class="sourceLineNo">436</span>        }<a name="line.436"></a>
<span class="sourceLineNo">437</span>        return metadata.getFieldType();<a name="line.437"></a>
<span class="sourceLineNo">438</span>    }<a name="line.438"></a>
<span class="sourceLineNo">439</span><a name="line.439"></a>
<span class="sourceLineNo">440</span>    /**<a name="line.440"></a>
<span class="sourceLineNo">441</span>     * Sets the dependency specification. If the dependency has already a specification set,<a name="line.441"></a>
<span class="sourceLineNo">442</span>     * throw an error if the current specification and the given one are not equal.<a name="line.442"></a>
<span class="sourceLineNo">443</span>     * @param dep the dependency<a name="line.443"></a>
<span class="sourceLineNo">444</span>     * @param className the service specification<a name="line.444"></a>
<span class="sourceLineNo">445</span>     * @throws ConfigurationException if the given specification is not loadable or if the dependency has already a<a name="line.445"></a>
<span class="sourceLineNo">446</span>     * specification set that is not the given one.<a name="line.446"></a>
<span class="sourceLineNo">447</span>     */<a name="line.447"></a>
<span class="sourceLineNo">448</span>    private static void setSpecification(Dependency dep, String className) throws ConfigurationException {<a name="line.448"></a>
<span class="sourceLineNo">449</span>        if (dep.getSpecification() != null  &amp;&amp; ! dep.getSpecification().getName().equals(className)) {<a name="line.449"></a>
<span class="sourceLineNo">450</span>            throw new ConfigurationException("Inconsistent service specification for " + DependencyHandler<a name="line.450"></a>
<span class="sourceLineNo">451</span>                    .getDependencyIdentifier(dep) + " - reason: mismatch between the current specification (" + dep<a name="line.451"></a>
<span class="sourceLineNo">452</span>                    .getSpecification().getName() + ") and the discovered specification (" + className + ")");<a name="line.452"></a>
<span class="sourceLineNo">453</span>        } else if (dep.getSpecification() == null) {<a name="line.453"></a>
<span class="sourceLineNo">454</span>            // Set the specification<a name="line.454"></a>
<span class="sourceLineNo">455</span>            try {<a name="line.455"></a>
<span class="sourceLineNo">456</span>                dep.setSpecification(dep.getBundleContext().getBundle().loadClass(className));<a name="line.456"></a>
<span class="sourceLineNo">457</span>            } catch (ClassNotFoundException e) {<a name="line.457"></a>
<span class="sourceLineNo">458</span>                throw new ConfigurationException("Cannot set the service specification of " + DependencyHandler<a name="line.458"></a>
<span class="sourceLineNo">459</span>                        .getDependencyIdentifier(dep) + " - reason: the class " + className + " cannot be loaded from" +<a name="line.459"></a>
<span class="sourceLineNo">460</span>                        " the bundle " + dep.getBundleContext().getBundle().getBundleId(), e);<a name="line.460"></a>
<span class="sourceLineNo">461</span>            }<a name="line.461"></a>
<span class="sourceLineNo">462</span>        }<a name="line.462"></a>
<span class="sourceLineNo">463</span>    }<a name="line.463"></a>
<span class="sourceLineNo">464</span><a name="line.464"></a>
<span class="sourceLineNo">465</span>}<a name="line.465"></a>




























































</pre>
</div>
</body>
</html>
