<!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.dependency.impl;<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.Factory;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import org.apache.felix.ipojo.dependency.interceptors.ServiceBindingInterceptor;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import org.apache.felix.ipojo.dependency.interceptors.ServiceRankingInterceptor;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import org.apache.felix.ipojo.dependency.interceptors.ServiceTrackingInterceptor;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import org.apache.felix.ipojo.dependency.interceptors.TransformedServiceReference;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import org.apache.felix.ipojo.util.*;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import org.osgi.framework.Constants;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import org.osgi.framework.Filter;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import org.osgi.framework.ServiceReference;<a name="line.30"></a>
<span class="sourceLineNo">031</span><a name="line.31"></a>
<span class="sourceLineNo">032</span>import java.util.*;<a name="line.32"></a>
<span class="sourceLineNo">033</span><a name="line.33"></a>
<span class="sourceLineNo">034</span>import static org.apache.felix.ipojo.util.DependencyModel.DependencyEventType;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import static org.apache.felix.ipojo.util.DependencyModel.DependencyEventType.ARRIVAL;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import static org.apache.felix.ipojo.util.DependencyModel.DependencyEventType.DEPARTURE;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import static org.apache.felix.ipojo.util.DependencyModel.DependencyEventType.MODIFIED;<a name="line.37"></a>
<span class="sourceLineNo">038</span><a name="line.38"></a>
<span class="sourceLineNo">039</span>/**<a name="line.39"></a>
<span class="sourceLineNo">040</span> * This class is handling the transformations between the base service set and the selected service set.<a name="line.40"></a>
<span class="sourceLineNo">041</span> * It handles the matching services and the selected service set.<a name="line.41"></a>
<span class="sourceLineNo">042</span> * As this class is tied to the dependency model, it reuses the same locks objects.<a name="line.42"></a>
<span class="sourceLineNo">043</span> */<a name="line.43"></a>
<span class="sourceLineNo">044</span>public class ServiceReferenceManager implements TrackerCustomizer {<a name="line.44"></a>
<span class="sourceLineNo">045</span><a name="line.45"></a>
<span class="sourceLineNo">046</span>    /**<a name="line.46"></a>
<span class="sourceLineNo">047</span>     * The dependency.<a name="line.47"></a>
<span class="sourceLineNo">048</span>     */<a name="line.48"></a>
<span class="sourceLineNo">049</span>    private final DependencyModel m_dependency;<a name="line.49"></a>
<span class="sourceLineNo">050</span>    /**<a name="line.50"></a>
<span class="sourceLineNo">051</span>     * The list of all matching service references. This list is a<a name="line.51"></a>
<span class="sourceLineNo">052</span>     * subset of tracked references. This set is computed according<a name="line.52"></a>
<span class="sourceLineNo">053</span>     * to the filter and the {@link DependencyModel#match(ServiceReference)} method.<a name="line.53"></a>
<span class="sourceLineNo">054</span>     */<a name="line.54"></a>
<span class="sourceLineNo">055</span>    private final Map&lt;ServiceReference, TransformedServiceReference&gt; m_matchingReferences = new<a name="line.55"></a>
<span class="sourceLineNo">056</span>            LinkedHashMap&lt;ServiceReference, TransformedServiceReference&gt;();<a name="line.56"></a>
<span class="sourceLineNo">057</span>    /**<a name="line.57"></a>
<span class="sourceLineNo">058</span>     * The comparator to sort service references.<a name="line.58"></a>
<span class="sourceLineNo">059</span>     */<a name="line.59"></a>
<span class="sourceLineNo">060</span>    private Comparator&lt;ServiceReference&gt; m_comparator;<a name="line.60"></a>
<span class="sourceLineNo">061</span>    /**<a name="line.61"></a>
<span class="sourceLineNo">062</span>     * The LDAP filter object selecting service references<a name="line.62"></a>
<span class="sourceLineNo">063</span>     * from the set of providers providing the required specification.<a name="line.63"></a>
<span class="sourceLineNo">064</span>     */<a name="line.64"></a>
<span class="sourceLineNo">065</span>    private Filter m_filter;<a name="line.65"></a>
<span class="sourceLineNo">066</span>    /**<a name="line.66"></a>
<span class="sourceLineNo">067</span>     * The list of selected service references.<a name="line.67"></a>
<span class="sourceLineNo">068</span>     */<a name="line.68"></a>
<span class="sourceLineNo">069</span>    private List&lt;? extends ServiceReference&gt; m_selectedReferences = new ArrayList&lt;ServiceReference&gt;();<a name="line.69"></a>
<span class="sourceLineNo">070</span>    /**<a name="line.70"></a>
<span class="sourceLineNo">071</span>     * The service ranking interceptor.<a name="line.71"></a>
<span class="sourceLineNo">072</span>     */<a name="line.72"></a>
<span class="sourceLineNo">073</span>    private ServiceRankingInterceptor m_rankingInterceptor;<a name="line.73"></a>
<span class="sourceLineNo">074</span>    /**<a name="line.74"></a>
<span class="sourceLineNo">075</span>     * Service Ranking Interceptor trackers.<a name="line.75"></a>
<span class="sourceLineNo">076</span>     */<a name="line.76"></a>
<span class="sourceLineNo">077</span>    private Tracker m_rankingInterceptorTracker;<a name="line.77"></a>
<span class="sourceLineNo">078</span><a name="line.78"></a>
<span class="sourceLineNo">079</span>    /**<a name="line.79"></a>
<span class="sourceLineNo">080</span>     * Service Tracking Interceptor trackers.<a name="line.80"></a>
<span class="sourceLineNo">081</span>     */<a name="line.81"></a>
<span class="sourceLineNo">082</span>    private Tracker m_trackingInterceptorTracker;<a name="line.82"></a>
<span class="sourceLineNo">083</span><a name="line.83"></a>
<span class="sourceLineNo">084</span>    /**<a name="line.84"></a>
<span class="sourceLineNo">085</span>     * Service Binding Interceptor trackers.<a name="line.85"></a>
<span class="sourceLineNo">086</span>     */<a name="line.86"></a>
<span class="sourceLineNo">087</span>    private Tracker m_bindingInterceptorTracker;<a name="line.87"></a>
<span class="sourceLineNo">088</span><a name="line.88"></a>
<span class="sourceLineNo">089</span>    /**<a name="line.89"></a>
<span class="sourceLineNo">090</span>     * The set of tracking interceptors.<a name="line.90"></a>
<span class="sourceLineNo">091</span>     * TODO this set should be sorted according to the OSGi ranking policy.<a name="line.91"></a>
<span class="sourceLineNo">092</span>     * The filter is always the last interceptor.<a name="line.92"></a>
<span class="sourceLineNo">093</span>     */<a name="line.93"></a>
<span class="sourceLineNo">094</span>    private LinkedList&lt;ServiceTrackingInterceptor&gt; m_trackingInterceptors = new<a name="line.94"></a>
<span class="sourceLineNo">095</span>            LinkedList&lt;ServiceTrackingInterceptor&gt;();<a name="line.95"></a>
<span class="sourceLineNo">096</span><a name="line.96"></a>
<span class="sourceLineNo">097</span>    /**<a name="line.97"></a>
<span class="sourceLineNo">098</span>     * The set of binding interceptors.<a name="line.98"></a>
<span class="sourceLineNo">099</span>     * TODO this set should be sorted according to the OSGi ranking policy.<a name="line.99"></a>
<span class="sourceLineNo">100</span>     */<a name="line.100"></a>
<span class="sourceLineNo">101</span>    private LinkedList&lt;ServiceBindingInterceptor&gt; m_bindingInterceptors = new<a name="line.101"></a>
<span class="sourceLineNo">102</span>            LinkedList&lt;ServiceBindingInterceptor&gt;();<a name="line.102"></a>
<span class="sourceLineNo">103</span><a name="line.103"></a>
<span class="sourceLineNo">104</span>    /**<a name="line.104"></a>
<span class="sourceLineNo">105</span>     * Creates the service reference manager.<a name="line.105"></a>
<span class="sourceLineNo">106</span>     *<a name="line.106"></a>
<span class="sourceLineNo">107</span>     * @param dep        the dependency<a name="line.107"></a>
<span class="sourceLineNo">108</span>     * @param filter     the filter<a name="line.108"></a>
<span class="sourceLineNo">109</span>     * @param comparator the comparator<a name="line.109"></a>
<span class="sourceLineNo">110</span>     */<a name="line.110"></a>
<span class="sourceLineNo">111</span>    public ServiceReferenceManager(DependencyModel dep, Filter filter, Comparator&lt;ServiceReference&gt; comparator) {<a name="line.111"></a>
<span class="sourceLineNo">112</span>        m_dependency = dep;<a name="line.112"></a>
<span class="sourceLineNo">113</span>        m_filter = filter;<a name="line.113"></a>
<span class="sourceLineNo">114</span>        // The Filter based service tracking interceptor needs to be created every time even if the filter is null.<a name="line.114"></a>
<span class="sourceLineNo">115</span>        // This arises from the potential re-implementation of the match method in the dependency implementation.<a name="line.115"></a>
<span class="sourceLineNo">116</span>        // It must be the last interceptor as the chain ends on the filter matching. (FELIX-4199)<a name="line.116"></a>
<span class="sourceLineNo">117</span>        m_trackingInterceptors.addLast(new FilterBasedServiceTrackingInterceptor(m_filter));<a name="line.117"></a>
<span class="sourceLineNo">118</span><a name="line.118"></a>
<span class="sourceLineNo">119</span>        if (comparator != null) {<a name="line.119"></a>
<span class="sourceLineNo">120</span>            m_comparator = comparator;<a name="line.120"></a>
<span class="sourceLineNo">121</span>            m_rankingInterceptor = new ComparatorBasedServiceRankingInterceptor(comparator);<a name="line.121"></a>
<span class="sourceLineNo">122</span>        } else {<a name="line.122"></a>
<span class="sourceLineNo">123</span>            m_rankingInterceptor = new EmptyBasedServiceRankingInterceptor();<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><a name="line.126"></a>
<span class="sourceLineNo">127</span>    public void open() {<a name="line.127"></a>
<span class="sourceLineNo">128</span>        // The opening order matters, first binding, then ranking and finally tracking.<a name="line.128"></a>
<span class="sourceLineNo">129</span>        m_bindingInterceptorTracker = new Tracker(m_dependency.getBundleContext(),<a name="line.129"></a>
<span class="sourceLineNo">130</span>                ServiceBindingInterceptor.class.getName(),<a name="line.130"></a>
<span class="sourceLineNo">131</span>                new TrackerCustomizer() {<a name="line.131"></a>
<span class="sourceLineNo">132</span><a name="line.132"></a>
<span class="sourceLineNo">133</span>                    public boolean addingService(ServiceReference reference) {<a name="line.133"></a>
<span class="sourceLineNo">134</span>                        return DependencyProperties.match(reference, m_dependency);<a name="line.134"></a>
<span class="sourceLineNo">135</span>                    }<a name="line.135"></a>
<span class="sourceLineNo">136</span><a name="line.136"></a>
<span class="sourceLineNo">137</span>                    public void addedService(ServiceReference reference) {<a name="line.137"></a>
<span class="sourceLineNo">138</span>                        ServiceBindingInterceptor interceptor = (ServiceBindingInterceptor) m_bindingInterceptorTracker<a name="line.138"></a>
<span class="sourceLineNo">139</span>                                .getService(reference);<a name="line.139"></a>
<span class="sourceLineNo">140</span>                        if (interceptor != null) {<a name="line.140"></a>
<span class="sourceLineNo">141</span>                            addBindingInterceptor(interceptor);<a name="line.141"></a>
<span class="sourceLineNo">142</span>                        } else {<a name="line.142"></a>
<span class="sourceLineNo">143</span>                            m_dependency.getComponentInstance().getFactory().getLogger().log(Log.ERROR,<a name="line.143"></a>
<span class="sourceLineNo">144</span>                                    "Cannot retrieve the interceptor object from service reference " + reference<a name="line.144"></a>
<span class="sourceLineNo">145</span>                                            .getProperty(Constants.SERVICE_ID) + " - " + reference.getProperty<a name="line.145"></a>
<span class="sourceLineNo">146</span>                                            (Factory.INSTANCE_NAME_PROPERTY));<a name="line.146"></a>
<span class="sourceLineNo">147</span>                        }<a name="line.147"></a>
<span class="sourceLineNo">148</span>                    }<a name="line.148"></a>
<span class="sourceLineNo">149</span><a name="line.149"></a>
<span class="sourceLineNo">150</span>                    public void modifiedService(ServiceReference reference, Object service) {<a name="line.150"></a>
<span class="sourceLineNo">151</span>                        // Not supported.<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>                    public void removedService(ServiceReference reference, Object service) {<a name="line.154"></a>
<span class="sourceLineNo">155</span>                        if (service != null &amp;&amp; service instanceof ServiceBindingInterceptor &amp;&amp;<a name="line.155"></a>
<span class="sourceLineNo">156</span>                                m_bindingInterceptors.contains(service)<a name="line.156"></a>
<span class="sourceLineNo">157</span>                                ) {<a name="line.157"></a>
<span class="sourceLineNo">158</span>                            removeBindingInterceptor((ServiceBindingInterceptor) service);<a name="line.158"></a>
<span class="sourceLineNo">159</span>                        }<a name="line.159"></a>
<span class="sourceLineNo">160</span>                    }<a name="line.160"></a>
<span class="sourceLineNo">161</span>                }<a name="line.161"></a>
<span class="sourceLineNo">162</span>        );<a name="line.162"></a>
<span class="sourceLineNo">163</span>        m_bindingInterceptorTracker.open();<a name="line.163"></a>
<span class="sourceLineNo">164</span><a name="line.164"></a>
<span class="sourceLineNo">165</span>        // Initialize the service interceptor tracker.<a name="line.165"></a>
<span class="sourceLineNo">166</span>        m_rankingInterceptorTracker = new Tracker(m_dependency.getBundleContext(), ServiceRankingInterceptor.class.getName(),<a name="line.166"></a>
<span class="sourceLineNo">167</span>                new TrackerCustomizer() {<a name="line.167"></a>
<span class="sourceLineNo">168</span><a name="line.168"></a>
<span class="sourceLineNo">169</span>                    public boolean addingService(ServiceReference reference) {<a name="line.169"></a>
<span class="sourceLineNo">170</span>                        return DependencyProperties.match(reference, m_dependency);<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>                    public void addedService(ServiceReference reference) {<a name="line.173"></a>
<span class="sourceLineNo">174</span>                        ServiceRankingInterceptor interceptor = (ServiceRankingInterceptor) m_rankingInterceptorTracker<a name="line.174"></a>
<span class="sourceLineNo">175</span>                                .getService(reference);<a name="line.175"></a>
<span class="sourceLineNo">176</span>                        if (interceptor != null) {<a name="line.176"></a>
<span class="sourceLineNo">177</span>                            setRankingInterceptor(interceptor);<a name="line.177"></a>
<span class="sourceLineNo">178</span>                        } else {<a name="line.178"></a>
<span class="sourceLineNo">179</span>                            m_dependency.getComponentInstance().getFactory().getLogger().log(Log.ERROR,<a name="line.179"></a>
<span class="sourceLineNo">180</span>                                    "Cannot retrieve the interceptor object from service reference " + reference<a name="line.180"></a>
<span class="sourceLineNo">181</span>                                            .getProperty(Constants.SERVICE_ID) + " - " + reference.getProperty<a name="line.181"></a>
<span class="sourceLineNo">182</span>                                            (Factory.INSTANCE_NAME_PROPERTY));<a name="line.182"></a>
<span class="sourceLineNo">183</span>                        }<a name="line.183"></a>
<span class="sourceLineNo">184</span>                    }<a name="line.184"></a>
<span class="sourceLineNo">185</span><a name="line.185"></a>
<span class="sourceLineNo">186</span>                    public void modifiedService(ServiceReference reference, Object service) {<a name="line.186"></a>
<span class="sourceLineNo">187</span>                        // Not supported yet.<a name="line.187"></a>
<span class="sourceLineNo">188</span>                        // TODO it would be nice to support the modification of the interceptor TARGET property.<a name="line.188"></a>
<span class="sourceLineNo">189</span>                    }<a name="line.189"></a>
<span class="sourceLineNo">190</span><a name="line.190"></a>
<span class="sourceLineNo">191</span>                    public void removedService(ServiceReference reference, Object service) {<a name="line.191"></a>
<span class="sourceLineNo">192</span>                        if (service == m_rankingInterceptor) {<a name="line.192"></a>
<span class="sourceLineNo">193</span>                            m_rankingInterceptor.close(m_dependency);<a name="line.193"></a>
<span class="sourceLineNo">194</span>                            // Do we have another one ?<a name="line.194"></a>
<span class="sourceLineNo">195</span>                            ServiceReference anotherReference = m_rankingInterceptorTracker.getServiceReference();<a name="line.195"></a>
<span class="sourceLineNo">196</span>                            if (anotherReference != null) {<a name="line.196"></a>
<span class="sourceLineNo">197</span>                                ServiceRankingInterceptor interceptor = (ServiceRankingInterceptor) m_rankingInterceptorTracker<a name="line.197"></a>
<span class="sourceLineNo">198</span>                                        .getService(anotherReference);<a name="line.198"></a>
<span class="sourceLineNo">199</span>                                if (interceptor != null) setRankingInterceptor(interceptor);<a name="line.199"></a>
<span class="sourceLineNo">200</span>                            } else if (m_comparator != null) {<a name="line.200"></a>
<span class="sourceLineNo">201</span>                                // If we have a comparator, we restore the comparator.<a name="line.201"></a>
<span class="sourceLineNo">202</span>                                setComparator(m_comparator);<a name="line.202"></a>
<span class="sourceLineNo">203</span>                            } else {<a name="line.203"></a>
<span class="sourceLineNo">204</span>                                // If we have neither comparator nor interceptor use an empty interceptor.<a name="line.204"></a>
<span class="sourceLineNo">205</span>                                setRankingInterceptor(new EmptyBasedServiceRankingInterceptor());<a name="line.205"></a>
<span class="sourceLineNo">206</span>                            }<a name="line.206"></a>
<span class="sourceLineNo">207</span>                        }<a name="line.207"></a>
<span class="sourceLineNo">208</span>                    }<a name="line.208"></a>
<span class="sourceLineNo">209</span>                });<a name="line.209"></a>
<span class="sourceLineNo">210</span>        m_rankingInterceptorTracker.open();<a name="line.210"></a>
<span class="sourceLineNo">211</span><a name="line.211"></a>
<span class="sourceLineNo">212</span>        m_trackingInterceptorTracker = new Tracker(m_dependency.getBundleContext(),<a name="line.212"></a>
<span class="sourceLineNo">213</span>                ServiceTrackingInterceptor.class.getName(),<a name="line.213"></a>
<span class="sourceLineNo">214</span>                new TrackerCustomizer() {<a name="line.214"></a>
<span class="sourceLineNo">215</span><a name="line.215"></a>
<span class="sourceLineNo">216</span>                    public boolean addingService(ServiceReference reference) {<a name="line.216"></a>
<span class="sourceLineNo">217</span>                        return DependencyProperties.match(reference, m_dependency);<a name="line.217"></a>
<span class="sourceLineNo">218</span>                    }<a name="line.218"></a>
<span class="sourceLineNo">219</span><a name="line.219"></a>
<span class="sourceLineNo">220</span>                    public void addedService(ServiceReference reference) {<a name="line.220"></a>
<span class="sourceLineNo">221</span>                        ServiceTrackingInterceptor interceptor = (ServiceTrackingInterceptor) m_trackingInterceptorTracker<a name="line.221"></a>
<span class="sourceLineNo">222</span>                                .getService(reference);<a name="line.222"></a>
<span class="sourceLineNo">223</span><a name="line.223"></a>
<span class="sourceLineNo">224</span>                        if (interceptor != null) {<a name="line.224"></a>
<span class="sourceLineNo">225</span>                            addTrackingInterceptor(interceptor);<a name="line.225"></a>
<span class="sourceLineNo">226</span>                        } else {<a name="line.226"></a>
<span class="sourceLineNo">227</span>                            m_dependency.getComponentInstance().getFactory().getLogger().log(Log.ERROR,<a name="line.227"></a>
<span class="sourceLineNo">228</span>                                    "Cannot retrieve the interceptor object from service reference " + reference<a name="line.228"></a>
<span class="sourceLineNo">229</span>                                            .getProperty(Constants.SERVICE_ID) + " - " + reference.getProperty<a name="line.229"></a>
<span class="sourceLineNo">230</span>                                            (Factory.INSTANCE_NAME_PROPERTY));<a name="line.230"></a>
<span class="sourceLineNo">231</span>                        }<a name="line.231"></a>
<span class="sourceLineNo">232</span>                    }<a name="line.232"></a>
<span class="sourceLineNo">233</span><a name="line.233"></a>
<span class="sourceLineNo">234</span>                    public void modifiedService(ServiceReference reference, Object service) {<a name="line.234"></a>
<span class="sourceLineNo">235</span>                        // Not supported yet.<a name="line.235"></a>
<span class="sourceLineNo">236</span>                        // TODO it would be nice to support the modification of the interceptor TARGET property.<a name="line.236"></a>
<span class="sourceLineNo">237</span>                    }<a name="line.237"></a>
<span class="sourceLineNo">238</span><a name="line.238"></a>
<span class="sourceLineNo">239</span>                    public void removedService(ServiceReference reference, Object service) {<a name="line.239"></a>
<span class="sourceLineNo">240</span>                        if (service != null &amp;&amp; service instanceof ServiceTrackingInterceptor &amp;&amp;<a name="line.240"></a>
<span class="sourceLineNo">241</span>                                m_trackingInterceptors.contains(service)<a name="line.241"></a>
<span class="sourceLineNo">242</span>                                ) {<a name="line.242"></a>
<span class="sourceLineNo">243</span>                            removeTrackingInterceptor((ServiceTrackingInterceptor) service);<a name="line.243"></a>
<span class="sourceLineNo">244</span>                        }<a name="line.244"></a>
<span class="sourceLineNo">245</span>                    }<a name="line.245"></a>
<span class="sourceLineNo">246</span>                });<a name="line.246"></a>
<span class="sourceLineNo">247</span><a name="line.247"></a>
<span class="sourceLineNo">248</span>        m_trackingInterceptorTracker.open();<a name="line.248"></a>
<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
<span class="sourceLineNo">250</span><a name="line.250"></a>
<span class="sourceLineNo">251</span>    private void addTrackingInterceptor(ServiceTrackingInterceptor interceptor) {<a name="line.251"></a>
<span class="sourceLineNo">252</span>        // A new interceptor arrives. Insert it at the beginning of the list.<a name="line.252"></a>
<span class="sourceLineNo">253</span>        ChangeSet changeset;<a name="line.253"></a>
<span class="sourceLineNo">254</span>        try {<a name="line.254"></a>
<span class="sourceLineNo">255</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.255"></a>
<span class="sourceLineNo">256</span>            m_trackingInterceptors.addFirst(interceptor);<a name="line.256"></a>
<span class="sourceLineNo">257</span>            interceptor.open(m_dependency);<a name="line.257"></a>
<span class="sourceLineNo">258</span>            changeset = computeChangesInMatchingServices();<a name="line.258"></a>
<span class="sourceLineNo">259</span>        } finally {<a name="line.259"></a>
<span class="sourceLineNo">260</span>            m_dependency.releaseWriteLockIfHeld();<a name="line.260"></a>
<span class="sourceLineNo">261</span>        }<a name="line.261"></a>
<span class="sourceLineNo">262</span>        m_dependency.onChange(changeset);<a name="line.262"></a>
<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
<span class="sourceLineNo">264</span><a name="line.264"></a>
<span class="sourceLineNo">265</span>    private void removeTrackingInterceptor(ServiceTrackingInterceptor interceptor) {<a name="line.265"></a>
<span class="sourceLineNo">266</span>        ChangeSet changeset;<a name="line.266"></a>
<span class="sourceLineNo">267</span>        try {<a name="line.267"></a>
<span class="sourceLineNo">268</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.268"></a>
<span class="sourceLineNo">269</span>            m_trackingInterceptors.remove(interceptor);<a name="line.269"></a>
<span class="sourceLineNo">270</span>            interceptor.close(m_dependency);<a name="line.270"></a>
<span class="sourceLineNo">271</span>            changeset = computeChangesInMatchingServices();<a name="line.271"></a>
<span class="sourceLineNo">272</span>        } finally {<a name="line.272"></a>
<span class="sourceLineNo">273</span>            m_dependency.releaseWriteLockIfHeld();<a name="line.273"></a>
<span class="sourceLineNo">274</span>        }<a name="line.274"></a>
<span class="sourceLineNo">275</span>        m_dependency.onChange(changeset);<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>    private void addBindingInterceptor(ServiceBindingInterceptor interceptor) {<a name="line.278"></a>
<span class="sourceLineNo">279</span>        // A new interceptor arrives, open it.<a name="line.279"></a>
<span class="sourceLineNo">280</span>        // Binding interceptor cannot modify existing bindings.<a name="line.280"></a>
<span class="sourceLineNo">281</span>        try {<a name="line.281"></a>
<span class="sourceLineNo">282</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.282"></a>
<span class="sourceLineNo">283</span>            m_bindingInterceptors.add(interceptor);<a name="line.283"></a>
<span class="sourceLineNo">284</span>            interceptor.open(m_dependency);<a name="line.284"></a>
<span class="sourceLineNo">285</span>        } finally {<a name="line.285"></a>
<span class="sourceLineNo">286</span>            m_dependency.releaseWriteLockIfHeld();<a name="line.286"></a>
<span class="sourceLineNo">287</span>        }<a name="line.287"></a>
<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
<span class="sourceLineNo">289</span><a name="line.289"></a>
<span class="sourceLineNo">290</span>    private void removeBindingInterceptor(ServiceBindingInterceptor interceptor) {<a name="line.290"></a>
<span class="sourceLineNo">291</span>        try {<a name="line.291"></a>
<span class="sourceLineNo">292</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.292"></a>
<span class="sourceLineNo">293</span>            m_bindingInterceptors.remove(interceptor);<a name="line.293"></a>
<span class="sourceLineNo">294</span>            interceptor.close(m_dependency);<a name="line.294"></a>
<span class="sourceLineNo">295</span>        } finally {<a name="line.295"></a>
<span class="sourceLineNo">296</span>            m_dependency.releaseWriteLockIfHeld();<a name="line.296"></a>
<span class="sourceLineNo">297</span>        }<a name="line.297"></a>
<span class="sourceLineNo">298</span>    }<a name="line.298"></a>
<span class="sourceLineNo">299</span><a name="line.299"></a>
<span class="sourceLineNo">300</span>    public Object weavingServiceBinding(DependencyModel.ServiceBindingHolder sbh) {<a name="line.300"></a>
<span class="sourceLineNo">301</span>        Object svc = sbh.service;<a name="line.301"></a>
<span class="sourceLineNo">302</span>        try {<a name="line.302"></a>
<span class="sourceLineNo">303</span>            m_dependency.acquireReadLockIfNotHeld();<a name="line.303"></a>
<span class="sourceLineNo">304</span>            for (ServiceBindingInterceptor interceptor : m_bindingInterceptors) {<a name="line.304"></a>
<span class="sourceLineNo">305</span>                // Interceptor are not allowed to return null.<a name="line.305"></a>
<span class="sourceLineNo">306</span>                svc = interceptor.getService(m_dependency, sbh.reference, svc);<a name="line.306"></a>
<span class="sourceLineNo">307</span>            }<a name="line.307"></a>
<span class="sourceLineNo">308</span>        } finally {<a name="line.308"></a>
<span class="sourceLineNo">309</span>            m_dependency.releaseReadLockIfHeld();<a name="line.309"></a>
<span class="sourceLineNo">310</span>        }<a name="line.310"></a>
<span class="sourceLineNo">311</span>        return svc;<a name="line.311"></a>
<span class="sourceLineNo">312</span>    }<a name="line.312"></a>
<span class="sourceLineNo">313</span><a name="line.313"></a>
<span class="sourceLineNo">314</span>    public void unweavingServiceBinding(DependencyModel.ServiceBindingHolder sbh) {<a name="line.314"></a>
<span class="sourceLineNo">315</span>        try {<a name="line.315"></a>
<span class="sourceLineNo">316</span>            m_dependency.acquireReadLockIfNotHeld();<a name="line.316"></a>
<span class="sourceLineNo">317</span>            for (ServiceBindingInterceptor interceptor : m_bindingInterceptors) {<a name="line.317"></a>
<span class="sourceLineNo">318</span>                interceptor.ungetService(m_dependency, sbh.reference);<a name="line.318"></a>
<span class="sourceLineNo">319</span>            }<a name="line.319"></a>
<span class="sourceLineNo">320</span>        } finally {<a name="line.320"></a>
<span class="sourceLineNo">321</span>            m_dependency.releaseReadLockIfHeld();<a name="line.321"></a>
<span class="sourceLineNo">322</span>        }<a name="line.322"></a>
<span class="sourceLineNo">323</span>    }<a name="line.323"></a>
<span class="sourceLineNo">324</span><a name="line.324"></a>
<span class="sourceLineNo">325</span>    private ChangeSet computeChangesInMatchingServices() {<a name="line.325"></a>
<span class="sourceLineNo">326</span>        if (m_dependency.getTracker() == null || m_dependency.getTracker().getServiceReferences() == null) {<a name="line.326"></a>
<span class="sourceLineNo">327</span>            // Tracker closed, no problem<a name="line.327"></a>
<span class="sourceLineNo">328</span>            m_dependency.getComponentInstance().getFactory().getLogger().log(Logger.DEBUG,<a name="line.328"></a>
<span class="sourceLineNo">329</span>                    "Tracker closed when recomputing dependency " + m_dependency.getId());<a name="line.329"></a>
<span class="sourceLineNo">330</span>            return new ChangeSet(Collections.&lt;ServiceReference&gt;emptyList(),<a name="line.330"></a>
<span class="sourceLineNo">331</span>                    Collections.&lt;ServiceReference&gt;emptyList(),<a name="line.331"></a>
<span class="sourceLineNo">332</span>                    Collections.&lt;ServiceReference&gt;emptyList(),<a name="line.332"></a>
<span class="sourceLineNo">333</span>                    null,<a name="line.333"></a>
<span class="sourceLineNo">334</span>                    null,<a name="line.334"></a>
<span class="sourceLineNo">335</span>                    null,<a name="line.335"></a>
<span class="sourceLineNo">336</span>                    null);<a name="line.336"></a>
<span class="sourceLineNo">337</span>        }<a name="line.337"></a>
<span class="sourceLineNo">338</span>        // The set of interceptor has changed.<a name="line.338"></a>
<span class="sourceLineNo">339</span>        try {<a name="line.339"></a>
<span class="sourceLineNo">340</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.340"></a>
<span class="sourceLineNo">341</span>            // The tracker is open, we must recheck all services.<a name="line.341"></a>
<span class="sourceLineNo">342</span>            ServiceReference oldBest = getFirstService();<a name="line.342"></a>
<span class="sourceLineNo">343</span>            // Recompute the matching services.<a name="line.343"></a>
<span class="sourceLineNo">344</span>            m_matchingReferences.clear();<a name="line.344"></a>
<span class="sourceLineNo">345</span>            final List&lt;ServiceReference&gt; serviceReferencesList = m_dependency.getTracker().getServiceReferencesList();<a name="line.345"></a>
<span class="sourceLineNo">346</span>            if (serviceReferencesList != null) {<a name="line.346"></a>
<span class="sourceLineNo">347</span>                for (ServiceReference reference : serviceReferencesList) {<a name="line.347"></a>
<span class="sourceLineNo">348</span>                    TransformedServiceReference ref = new TransformedServiceReferenceImpl(reference);<a name="line.348"></a>
<span class="sourceLineNo">349</span>                    ref = accept(ref);<a name="line.349"></a>
<span class="sourceLineNo">350</span>                    if (ref != null) {<a name="line.350"></a>
<span class="sourceLineNo">351</span>                        m_matchingReferences.put(reference, ref);<a name="line.351"></a>
<span class="sourceLineNo">352</span>                    }<a name="line.352"></a>
<span class="sourceLineNo">353</span>                }<a name="line.353"></a>
<span class="sourceLineNo">354</span>            }<a name="line.354"></a>
<span class="sourceLineNo">355</span>            m_dependency.getComponentInstance().getFactory().getLogger().log(Logger.DEBUG,<a name="line.355"></a>
<span class="sourceLineNo">356</span>                    "Matching services have been recomputed: " + ServiceReferenceUtils.toString(m_matchingReferences.values()));<a name="line.356"></a>
<span class="sourceLineNo">357</span><a name="line.357"></a>
<span class="sourceLineNo">358</span><a name="line.358"></a>
<span class="sourceLineNo">359</span>            // We have the new matching set.<a name="line.359"></a>
<span class="sourceLineNo">360</span>            List&lt;ServiceReference&gt; beforeRanking = getSelectedServices();<a name="line.360"></a>
<span class="sourceLineNo">361</span><a name="line.361"></a>
<span class="sourceLineNo">362</span>            final List&lt;ServiceReference&gt; allServices = getMatchingServices();<a name="line.362"></a>
<span class="sourceLineNo">363</span>            List&lt;ServiceReference&gt; references;<a name="line.363"></a>
<span class="sourceLineNo">364</span>            if (allServices.isEmpty()) {<a name="line.364"></a>
<span class="sourceLineNo">365</span>                references = Collections.emptyList();<a name="line.365"></a>
<span class="sourceLineNo">366</span>            } else {<a name="line.366"></a>
<span class="sourceLineNo">367</span>                m_dependency.getComponentInstance().getFactory().getLogger().log(Logger.DEBUG,<a name="line.367"></a>
<span class="sourceLineNo">368</span>                        "iPOJO &gt;&gt; Calling getServiceReferences on the interceptor " + m_rankingInterceptor);<a name="line.368"></a>
<span class="sourceLineNo">369</span>                references = m_rankingInterceptor.getServiceReferences(m_dependency, allServices);<a name="line.369"></a>
<span class="sourceLineNo">370</span>            }<a name="line.370"></a>
<span class="sourceLineNo">371</span><a name="line.371"></a>
<span class="sourceLineNo">372</span>            RankingResult result = computeDifferences(beforeRanking, references);<a name="line.372"></a>
<span class="sourceLineNo">373</span>            m_selectedReferences = result.selected;<a name="line.373"></a>
<span class="sourceLineNo">374</span><a name="line.374"></a>
<span class="sourceLineNo">375</span>            ServiceReference newFirst = getFirstService();<a name="line.375"></a>
<span class="sourceLineNo">376</span>            ServiceReference modified = null;<a name="line.376"></a>
<span class="sourceLineNo">377</span>            if (ServiceReferenceUtils.haveSameServiceId(oldBest, newFirst) &amp;&amp; ServiceReferenceUtils<a name="line.377"></a>
<span class="sourceLineNo">378</span>                    .haveSameProperties(oldBest, newFirst)) {<a name="line.378"></a>
<span class="sourceLineNo">379</span>                modified = newFirst;<a name="line.379"></a>
<span class="sourceLineNo">380</span>            }<a name="line.380"></a>
<span class="sourceLineNo">381</span>            return new ChangeSet(getSelectedServices(), result.departures, result.arrivals, oldBest, getFirstService(),<a name="line.381"></a>
<span class="sourceLineNo">382</span>                    null, modified);<a name="line.382"></a>
<span class="sourceLineNo">383</span>        } finally {<a name="line.383"></a>
<span class="sourceLineNo">384</span>            m_dependency.releaseWriteLockIfHeld();<a name="line.384"></a>
<span class="sourceLineNo">385</span>        }<a name="line.385"></a>
<span class="sourceLineNo">386</span>    }<a name="line.386"></a>
<span class="sourceLineNo">387</span><a name="line.387"></a>
<span class="sourceLineNo">388</span>    public List&lt;ServiceReference&gt; getMatchingServices() {<a name="line.388"></a>
<span class="sourceLineNo">389</span>        try {<a name="line.389"></a>
<span class="sourceLineNo">390</span>            m_dependency.acquireReadLockIfNotHeld();<a name="line.390"></a>
<span class="sourceLineNo">391</span>            return new ArrayList&lt;ServiceReference&gt;(m_matchingReferences.values());<a name="line.391"></a>
<span class="sourceLineNo">392</span>        } finally {<a name="line.392"></a>
<span class="sourceLineNo">393</span>            m_dependency.releaseReadLockIfHeld();<a name="line.393"></a>
<span class="sourceLineNo">394</span>        }<a name="line.394"></a>
<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
<span class="sourceLineNo">396</span><a name="line.396"></a>
<span class="sourceLineNo">397</span>    public List&lt;ServiceReference&gt; getSelectedServices() {<a name="line.397"></a>
<span class="sourceLineNo">398</span>        try {<a name="line.398"></a>
<span class="sourceLineNo">399</span>            m_dependency.acquireReadLockIfNotHeld();<a name="line.399"></a>
<span class="sourceLineNo">400</span>            return new ArrayList&lt;ServiceReference&gt;(m_selectedReferences);<a name="line.400"></a>
<span class="sourceLineNo">401</span>        } finally {<a name="line.401"></a>
<span class="sourceLineNo">402</span>            m_dependency.releaseReadLockIfHeld();<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>    public ServiceReference getFirstService() {<a name="line.406"></a>
<span class="sourceLineNo">407</span>        try {<a name="line.407"></a>
<span class="sourceLineNo">408</span>            m_dependency.acquireReadLockIfNotHeld();<a name="line.408"></a>
<span class="sourceLineNo">409</span>            if (m_selectedReferences.isEmpty()) {<a name="line.409"></a>
<span class="sourceLineNo">410</span>                return null;<a name="line.410"></a>
<span class="sourceLineNo">411</span>            }<a name="line.411"></a>
<span class="sourceLineNo">412</span>            return m_selectedReferences.get(0);<a name="line.412"></a>
<span class="sourceLineNo">413</span>        } finally {<a name="line.413"></a>
<span class="sourceLineNo">414</span>            m_dependency.releaseReadLockIfHeld();<a name="line.414"></a>
<span class="sourceLineNo">415</span>        }<a name="line.415"></a>
<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
<span class="sourceLineNo">417</span><a name="line.417"></a>
<span class="sourceLineNo">418</span>    public boolean contains(ServiceReference ref) {<a name="line.418"></a>
<span class="sourceLineNo">419</span>        try {<a name="line.419"></a>
<span class="sourceLineNo">420</span>            m_dependency.acquireReadLockIfNotHeld();<a name="line.420"></a>
<span class="sourceLineNo">421</span>            return m_selectedReferences.contains(ref);<a name="line.421"></a>
<span class="sourceLineNo">422</span>        } finally {<a name="line.422"></a>
<span class="sourceLineNo">423</span>            m_dependency.releaseReadLockIfHeld();<a name="line.423"></a>
<span class="sourceLineNo">424</span>        }<a name="line.424"></a>
<span class="sourceLineNo">425</span>    }<a name="line.425"></a>
<span class="sourceLineNo">426</span><a name="line.426"></a>
<span class="sourceLineNo">427</span>    public void reset() {<a name="line.427"></a>
<span class="sourceLineNo">428</span>        try {<a name="line.428"></a>
<span class="sourceLineNo">429</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.429"></a>
<span class="sourceLineNo">430</span>            m_rankingInterceptor.close(m_dependency);<a name="line.430"></a>
<span class="sourceLineNo">431</span>            for (ServiceTrackingInterceptor interceptor : m_trackingInterceptors) {<a name="line.431"></a>
<span class="sourceLineNo">432</span>                interceptor.close(m_dependency);<a name="line.432"></a>
<span class="sourceLineNo">433</span>            }<a name="line.433"></a>
<span class="sourceLineNo">434</span>            m_trackingInterceptors.clear();<a name="line.434"></a>
<span class="sourceLineNo">435</span>            m_matchingReferences.clear();<a name="line.435"></a>
<span class="sourceLineNo">436</span>            m_selectedReferences = new ArrayList&lt;TransformedServiceReference&gt;();<a name="line.436"></a>
<span class="sourceLineNo">437</span>        } finally {<a name="line.437"></a>
<span class="sourceLineNo">438</span>            m_dependency.releaseWriteLockIfHeld();<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>    }<a name="line.441"></a>
<span class="sourceLineNo">442</span><a name="line.442"></a>
<span class="sourceLineNo">443</span>    public boolean addingService(ServiceReference reference) {<a name="line.443"></a>
<span class="sourceLineNo">444</span>        // We accept all service references except if we are frozen or broken. In these case, just ignore everything.<a name="line.444"></a>
<span class="sourceLineNo">445</span><a name="line.445"></a>
<span class="sourceLineNo">446</span>        // We are doing two tests, we must get the read lock<a name="line.446"></a>
<span class="sourceLineNo">447</span>        try {<a name="line.447"></a>
<span class="sourceLineNo">448</span>            m_dependency.acquireReadLockIfNotHeld();<a name="line.448"></a>
<span class="sourceLineNo">449</span>            return !(m_dependency.getState() == DependencyModel.BROKEN || m_dependency.isFrozen());<a name="line.449"></a>
<span class="sourceLineNo">450</span>        } finally {<a name="line.450"></a>
<span class="sourceLineNo">451</span>            m_dependency.releaseReadLockIfHeld();<a name="line.451"></a>
<span class="sourceLineNo">452</span>        }<a name="line.452"></a>
<span class="sourceLineNo">453</span>    }<a name="line.453"></a>
<span class="sourceLineNo">454</span><a name="line.454"></a>
<span class="sourceLineNo">455</span>    /**<a name="line.455"></a>
<span class="sourceLineNo">456</span>     * Checks if the given reference is accepted.<a name="line.456"></a>
<span class="sourceLineNo">457</span>     * This method is called when holding the write lock on the dependency.<a name="line.457"></a>
<span class="sourceLineNo">458</span>     *<a name="line.458"></a>
<span class="sourceLineNo">459</span>     * @param reference the reference<a name="line.459"></a>
<span class="sourceLineNo">460</span>     * @param &lt;S&gt; the service interface<a name="line.460"></a>
<span class="sourceLineNo">461</span>     * @return the transformed reference, null if rejected<a name="line.461"></a>
<span class="sourceLineNo">462</span>     */<a name="line.462"></a>
<span class="sourceLineNo">463</span>    private &lt;S&gt; TransformedServiceReference&lt;S&gt; accept(TransformedServiceReference&lt;S&gt; reference) {<a name="line.463"></a>
<span class="sourceLineNo">464</span>        TransformedServiceReference&lt;S&gt; accumulator = reference;<a name="line.464"></a>
<span class="sourceLineNo">465</span>        for (ServiceTrackingInterceptor interceptor : m_trackingInterceptors) {<a name="line.465"></a>
<span class="sourceLineNo">466</span>            TransformedServiceReference&lt;S&gt; accepted = interceptor.accept(m_dependency,<a name="line.466"></a>
<span class="sourceLineNo">467</span>                    m_dependency.getBundleContext(), accumulator);<a name="line.467"></a>
<span class="sourceLineNo">468</span>            if (accepted != null) {<a name="line.468"></a>
<span class="sourceLineNo">469</span>                accumulator = accepted;<a name="line.469"></a>
<span class="sourceLineNo">470</span>            } else {<a name="line.470"></a>
<span class="sourceLineNo">471</span>                // refused by an interceptor<a name="line.471"></a>
<span class="sourceLineNo">472</span>                m_dependency.getComponentInstance().getFactory().getLogger().log(Log.INFO,<a name="line.472"></a>
<span class="sourceLineNo">473</span>                        "The service reference " + reference.getProperty(Constants.SERVICE_ID) + " was rejected by " +<a name="line.473"></a>
<span class="sourceLineNo">474</span>                                "interceptor " + interceptor);<a name="line.474"></a>
<span class="sourceLineNo">475</span>                return null;<a name="line.475"></a>
<span class="sourceLineNo">476</span>            }<a name="line.476"></a>
<span class="sourceLineNo">477</span>        }<a name="line.477"></a>
<span class="sourceLineNo">478</span><a name="line.478"></a>
<span class="sourceLineNo">479</span>        return accumulator;<a name="line.479"></a>
<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
<span class="sourceLineNo">481</span><a name="line.481"></a>
<span class="sourceLineNo">482</span>    public void addedService(ServiceReference reference) {<a name="line.482"></a>
<span class="sourceLineNo">483</span>        // A service was added to the tracker.<a name="line.483"></a>
<span class="sourceLineNo">484</span><a name="line.484"></a>
<span class="sourceLineNo">485</span>        // First, check is the tracking interceptors are accepting it.<a name="line.485"></a>
<span class="sourceLineNo">486</span>        // The transformed reference is creates and check outside of the protected region.<a name="line.486"></a>
<span class="sourceLineNo">487</span>        TransformedServiceReference ref = new TransformedServiceReferenceImpl(reference);<a name="line.487"></a>
<span class="sourceLineNo">488</span><a name="line.488"></a>
<span class="sourceLineNo">489</span>        boolean match;<a name="line.489"></a>
<span class="sourceLineNo">490</span>        try {<a name="line.490"></a>
<span class="sourceLineNo">491</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.491"></a>
<span class="sourceLineNo">492</span>            ref = accept(ref);<a name="line.492"></a>
<span class="sourceLineNo">493</span>            if (ref != null) {<a name="line.493"></a>
<span class="sourceLineNo">494</span>                m_matchingReferences.put(reference, ref);<a name="line.494"></a>
<span class="sourceLineNo">495</span>            }<a name="line.495"></a>
<span class="sourceLineNo">496</span>            match = ref != null;<a name="line.496"></a>
<span class="sourceLineNo">497</span>        } finally {<a name="line.497"></a>
<span class="sourceLineNo">498</span>            m_dependency.releaseWriteLockIfHeld();<a name="line.498"></a>
<span class="sourceLineNo">499</span>        }<a name="line.499"></a>
<span class="sourceLineNo">500</span><a name="line.500"></a>
<span class="sourceLineNo">501</span>        if (match) {<a name="line.501"></a>
<span class="sourceLineNo">502</span>            // Callback invoked outside of locks.<a name="line.502"></a>
<span class="sourceLineNo">503</span>            // The called method is taking the write lock anyway.<a name="line.503"></a>
<span class="sourceLineNo">504</span>            onNewMatchingService(ref);<a name="line.504"></a>
<span class="sourceLineNo">505</span>            m_dependency.notifyListeners(ARRIVAL, ref, null);<a name="line.505"></a>
<span class="sourceLineNo">506</span>        }<a name="line.506"></a>
<span class="sourceLineNo">507</span>    }<a name="line.507"></a>
<span class="sourceLineNo">508</span><a name="line.508"></a>
<span class="sourceLineNo">509</span>    private void onNewMatchingService(TransformedServiceReference reference) {<a name="line.509"></a>
<span class="sourceLineNo">510</span>        ServiceReference oldFirst;<a name="line.510"></a>
<span class="sourceLineNo">511</span>        RankingResult result;<a name="line.511"></a>
<span class="sourceLineNo">512</span>        try {<a name="line.512"></a>
<span class="sourceLineNo">513</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.513"></a>
<span class="sourceLineNo">514</span>            // We store the currently 'first' service reference.<a name="line.514"></a>
<span class="sourceLineNo">515</span>            oldFirst = getFirstService();<a name="line.515"></a>
<span class="sourceLineNo">516</span><a name="line.516"></a>
<span class="sourceLineNo">517</span>            // We apply our ranking strategy.<a name="line.517"></a>
<span class="sourceLineNo">518</span>            result = applyRankingOnArrival(reference);<a name="line.518"></a>
<span class="sourceLineNo">519</span>            // Set the selected services.<a name="line.519"></a>
<span class="sourceLineNo">520</span>            m_selectedReferences = result.selected;<a name="line.520"></a>
<span class="sourceLineNo">521</span>        } finally {<a name="line.521"></a>
<span class="sourceLineNo">522</span>            m_dependency.releaseWriteLockIfHeld();<a name="line.522"></a>
<span class="sourceLineNo">523</span>        }<a name="line.523"></a>
<span class="sourceLineNo">524</span>        // Fire the event (outside from the synchronized region)<a name="line.524"></a>
<span class="sourceLineNo">525</span>        fireUpdate(getSelectedServices(), result.departures, result.arrivals, oldFirst,<a name="line.525"></a>
<span class="sourceLineNo">526</span>                getFirstService(), null, null);<a name="line.526"></a>
<span class="sourceLineNo">527</span>    }<a name="line.527"></a>
<span class="sourceLineNo">528</span><a name="line.528"></a>
<span class="sourceLineNo">529</span>    private void onModificationOfAMatchingService(TransformedServiceReference reference, Object service) {<a name="line.529"></a>
<span class="sourceLineNo">530</span>        ServiceReference oldFirst;<a name="line.530"></a>
<span class="sourceLineNo">531</span>        RankingResult result;<a name="line.531"></a>
<span class="sourceLineNo">532</span>        try {<a name="line.532"></a>
<span class="sourceLineNo">533</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.533"></a>
<span class="sourceLineNo">534</span>            // We store the currently 'first' service reference.<a name="line.534"></a>
<span class="sourceLineNo">535</span>            oldFirst = getFirstService();<a name="line.535"></a>
<span class="sourceLineNo">536</span><a name="line.536"></a>
<span class="sourceLineNo">537</span>            // We apply our ranking strategy.<a name="line.537"></a>
<span class="sourceLineNo">538</span>            result = applyRankingOnModification(reference);<a name="line.538"></a>
<span class="sourceLineNo">539</span>            // Set the selected services.<a name="line.539"></a>
<span class="sourceLineNo">540</span>            m_selectedReferences = result.selected;<a name="line.540"></a>
<span class="sourceLineNo">541</span>        } finally {<a name="line.541"></a>
<span class="sourceLineNo">542</span>            m_dependency.releaseWriteLockIfHeld();<a name="line.542"></a>
<span class="sourceLineNo">543</span>        }<a name="line.543"></a>
<span class="sourceLineNo">544</span>        // Fire the event (outside from the synchronized region)<a name="line.544"></a>
<span class="sourceLineNo">545</span>        fireUpdate(getSelectedServices(), result.departures, result.arrivals, oldFirst,<a name="line.545"></a>
<span class="sourceLineNo">546</span>                getFirstService(), service, reference);<a name="line.546"></a>
<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
<span class="sourceLineNo">548</span><a name="line.548"></a>
<span class="sourceLineNo">549</span>    private RankingResult applyRankingOnModification(ServiceReference reference) {<a name="line.549"></a>
<span class="sourceLineNo">550</span>        // TODO we are holding the lock here.<a name="line.550"></a>
<span class="sourceLineNo">551</span>        List&lt;ServiceReference&gt; beforeRanking = getSelectedServices();<a name="line.551"></a>
<span class="sourceLineNo">552</span>        List&lt;ServiceReference&gt; references = m_rankingInterceptor.onServiceModified(m_dependency, getMatchingServices(),<a name="line.552"></a>
<span class="sourceLineNo">553</span>                reference);<a name="line.553"></a>
<span class="sourceLineNo">554</span>        return computeDifferences(beforeRanking, references);<a name="line.554"></a>
<span class="sourceLineNo">555</span>    }<a name="line.555"></a>
<span class="sourceLineNo">556</span><a name="line.556"></a>
<span class="sourceLineNo">557</span>    private void fireUpdate(List&lt;ServiceReference&gt; selectedServices, List&lt;ServiceReference&gt; departures,<a name="line.557"></a>
<span class="sourceLineNo">558</span>                            List&lt;ServiceReference&gt; arrivals, ServiceReference oldFirst,<a name="line.558"></a>
<span class="sourceLineNo">559</span>                            ServiceReference firstService, Object service, ServiceReference modified) {<a name="line.559"></a>
<span class="sourceLineNo">560</span>        ChangeSet set = new ChangeSet(selectedServices, departures, arrivals, oldFirst, firstService, service, modified);<a name="line.560"></a>
<span class="sourceLineNo">561</span>        m_dependency.onChange(set);<a name="line.561"></a>
<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
<span class="sourceLineNo">563</span><a name="line.563"></a>
<span class="sourceLineNo">564</span>    private RankingResult applyRankingOnArrival(ServiceReference ref) {<a name="line.564"></a>
<span class="sourceLineNo">565</span>        // TODO we are holding the lock here.<a name="line.565"></a>
<span class="sourceLineNo">566</span>        List&lt;ServiceReference&gt; beforeRanking = getSelectedServices();<a name="line.566"></a>
<span class="sourceLineNo">567</span>        List&lt;ServiceReference&gt; references = m_rankingInterceptor.onServiceArrival(m_dependency, getMatchingServices(),<a name="line.567"></a>
<span class="sourceLineNo">568</span>                ref);<a name="line.568"></a>
<span class="sourceLineNo">569</span>        // compute the differences<a name="line.569"></a>
<span class="sourceLineNo">570</span>        return computeDifferences(beforeRanking, references);<a name="line.570"></a>
<span class="sourceLineNo">571</span><a name="line.571"></a>
<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
<span class="sourceLineNo">573</span><a name="line.573"></a>
<span class="sourceLineNo">574</span>    private RankingResult applyRankingOnDeparture(ServiceReference ref) {<a name="line.574"></a>
<span class="sourceLineNo">575</span>        // TODO we are holding the lock here.<a name="line.575"></a>
<span class="sourceLineNo">576</span>        List&lt;ServiceReference&gt; beforeRanking = getSelectedServices();<a name="line.576"></a>
<span class="sourceLineNo">577</span>        List&lt;ServiceReference&gt; references = m_rankingInterceptor.onServiceDeparture(m_dependency, getMatchingServices(),<a name="line.577"></a>
<span class="sourceLineNo">578</span>                ref);<a name="line.578"></a>
<span class="sourceLineNo">579</span>        return computeDifferences(beforeRanking, references);<a name="line.579"></a>
<span class="sourceLineNo">580</span>    }<a name="line.580"></a>
<span class="sourceLineNo">581</span><a name="line.581"></a>
<span class="sourceLineNo">582</span>    private RankingResult computeDifferences(List&lt;ServiceReference&gt; beforeRanking, List&lt;ServiceReference&gt; ranked) {<a name="line.582"></a>
<span class="sourceLineNo">583</span>        // compute the differences<a name="line.583"></a>
<span class="sourceLineNo">584</span>        List&lt;ServiceReference&gt; departures = new ArrayList&lt;ServiceReference&gt;();<a name="line.584"></a>
<span class="sourceLineNo">585</span>        List&lt;ServiceReference&gt; arrivals = new ArrayList&lt;ServiceReference&gt;();<a name="line.585"></a>
<span class="sourceLineNo">586</span>        // All references that are no more in the set are considered as leaving services.<a name="line.586"></a>
<span class="sourceLineNo">587</span>        for (ServiceReference old : beforeRanking) {<a name="line.587"></a>
<span class="sourceLineNo">588</span>            if (!ServiceReferenceUtils.containsReferenceById(ranked, old)) {<a name="line.588"></a>
<span class="sourceLineNo">589</span>                departures.add(old);<a name="line.589"></a>
<span class="sourceLineNo">590</span>            }<a name="line.590"></a>
<span class="sourceLineNo">591</span>        }<a name="line.591"></a>
<span class="sourceLineNo">592</span>        // All references that are in `references` but not in `beforeRanking` are new services<a name="line.592"></a>
<span class="sourceLineNo">593</span>        for (ServiceReference newRef : ranked) {<a name="line.593"></a>
<span class="sourceLineNo">594</span>            if (!ServiceReferenceUtils.containsReferenceById(beforeRanking, newRef)) {<a name="line.594"></a>
<span class="sourceLineNo">595</span>                arrivals.add(newRef);<a name="line.595"></a>
<span class="sourceLineNo">596</span>            }<a name="line.596"></a>
<span class="sourceLineNo">597</span>        }<a name="line.597"></a>
<span class="sourceLineNo">598</span><a name="line.598"></a>
<span class="sourceLineNo">599</span>        return new RankingResult(departures, arrivals, ranked);<a name="line.599"></a>
<span class="sourceLineNo">600</span>    }<a name="line.600"></a>
<span class="sourceLineNo">601</span><a name="line.601"></a>
<span class="sourceLineNo">602</span>    public void modifiedService(ServiceReference reference, Object service) {<a name="line.602"></a>
<span class="sourceLineNo">603</span>        // We are handling a modified event, we have three case to handle<a name="line.603"></a>
<span class="sourceLineNo">604</span>        // 1) the service was matching and does not match anymore -&gt; it's a departure.<a name="line.604"></a>
<span class="sourceLineNo">605</span>        // 2) the service was not matching and matches -&gt; it's an arrival<a name="line.605"></a>
<span class="sourceLineNo">606</span>        // 3) the service was matching and still matches -&gt; it's a modification.<a name="line.606"></a>
<span class="sourceLineNo">607</span><a name="line.607"></a>
<span class="sourceLineNo">608</span>        // The dependency event to send<a name="line.608"></a>
<span class="sourceLineNo">609</span>        DependencyEventType eventType = null;<a name="line.609"></a>
<span class="sourceLineNo">610</span>        ServiceReference&lt;?&gt; eventRef = null;<a name="line.610"></a>
<span class="sourceLineNo">611</span><a name="line.611"></a>
<span class="sourceLineNo">612</span>        try {<a name="line.612"></a>
<span class="sourceLineNo">613</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.613"></a>
<span class="sourceLineNo">614</span><a name="line.614"></a>
<span class="sourceLineNo">615</span>            if (m_matchingReferences.containsKey(reference)) {<a name="line.615"></a>
<span class="sourceLineNo">616</span>                // do we still accept the reference<a name="line.616"></a>
<span class="sourceLineNo">617</span>                TransformedServiceReference initial = m_matchingReferences.get(reference);<a name="line.617"></a>
<span class="sourceLineNo">618</span>                TransformedServiceReference accepted = new TransformedServiceReferenceImpl(reference);<a name="line.618"></a>
<span class="sourceLineNo">619</span>                accepted = accept(accepted);<a name="line.619"></a>
<span class="sourceLineNo">620</span>                if (accepted == null) {<a name="line.620"></a>
<span class="sourceLineNo">621</span>                    // case 1<a name="line.621"></a>
<span class="sourceLineNo">622</span>                    m_matchingReferences.remove(reference);<a name="line.622"></a>
<span class="sourceLineNo">623</span>                    onDepartureOfAMatchingService(initial, service);<a name="line.623"></a>
<span class="sourceLineNo">624</span>                    eventType = DEPARTURE;<a name="line.624"></a>
<span class="sourceLineNo">625</span>                    eventRef = initial;<a name="line.625"></a>
<span class="sourceLineNo">626</span>                } else {<a name="line.626"></a>
<span class="sourceLineNo">627</span>                    // Do we have a real change<a name="line.627"></a>
<span class="sourceLineNo">628</span>                    if (!ServiceReferenceUtils.haveSameProperties(initial, accepted)) {<a name="line.628"></a>
<span class="sourceLineNo">629</span>                        // case 3<a name="line.629"></a>
<span class="sourceLineNo">630</span>                        m_matchingReferences.put(reference, accepted);<a name="line.630"></a>
<span class="sourceLineNo">631</span>                        onModificationOfAMatchingService(accepted, service);<a name="line.631"></a>
<span class="sourceLineNo">632</span>                        eventType = MODIFIED;<a name="line.632"></a>
<span class="sourceLineNo">633</span>                        eventRef = accepted;<a name="line.633"></a>
<span class="sourceLineNo">634</span>                    }<a name="line.634"></a>
<span class="sourceLineNo">635</span>                }<a name="line.635"></a>
<span class="sourceLineNo">636</span>            } else {<a name="line.636"></a>
<span class="sourceLineNo">637</span>                // Base does not contain the service, let's try to add it.<a name="line.637"></a>
<span class="sourceLineNo">638</span>                TransformedServiceReference transformed = new TransformedServiceReferenceImpl(reference);<a name="line.638"></a>
<span class="sourceLineNo">639</span>                transformed = accept(transformed);<a name="line.639"></a>
<span class="sourceLineNo">640</span>                if (transformed != null) {<a name="line.640"></a>
<span class="sourceLineNo">641</span>                    // case 2<a name="line.641"></a>
<span class="sourceLineNo">642</span>                    m_matchingReferences.put(reference, transformed);<a name="line.642"></a>
<span class="sourceLineNo">643</span>                    onNewMatchingService(transformed);<a name="line.643"></a>
<span class="sourceLineNo">644</span>                    eventType = ARRIVAL;<a name="line.644"></a>
<span class="sourceLineNo">645</span>                    eventRef = transformed;<a name="line.645"></a>
<span class="sourceLineNo">646</span>                }<a name="line.646"></a>
<span class="sourceLineNo">647</span>            }<a name="line.647"></a>
<span class="sourceLineNo">648</span>        } finally {<a name="line.648"></a>
<span class="sourceLineNo">649</span>            m_dependency.releaseWriteLockIfHeld();<a name="line.649"></a>
<span class="sourceLineNo">650</span>        }<a name="line.650"></a>
<span class="sourceLineNo">651</span><a name="line.651"></a>
<span class="sourceLineNo">652</span>        if (eventType != null) {<a name="line.652"></a>
<span class="sourceLineNo">653</span>            m_dependency.notifyListeners(eventType, eventRef, service);<a name="line.653"></a>
<span class="sourceLineNo">654</span>        }<a name="line.654"></a>
<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
<span class="sourceLineNo">656</span><a name="line.656"></a>
<span class="sourceLineNo">657</span>    public void onDepartureOfAMatchingService(TransformedServiceReference reference, Object service) {<a name="line.657"></a>
<span class="sourceLineNo">658</span>        ServiceReference oldFirst;<a name="line.658"></a>
<span class="sourceLineNo">659</span>        RankingResult result = null;<a name="line.659"></a>
<span class="sourceLineNo">660</span>        try {<a name="line.660"></a>
<span class="sourceLineNo">661</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.661"></a>
<span class="sourceLineNo">662</span>            // We store the currently 'first' service reference.<a name="line.662"></a>
<span class="sourceLineNo">663</span>            oldFirst = getFirstService();<a name="line.663"></a>
<span class="sourceLineNo">664</span>            // We apply our ranking strategy.<a name="line.664"></a>
<span class="sourceLineNo">665</span>            result = applyRankingOnDeparture(reference);<a name="line.665"></a>
<span class="sourceLineNo">666</span>            // Set the selected services.<a name="line.666"></a>
<span class="sourceLineNo">667</span>            m_selectedReferences = result.selected;<a name="line.667"></a>
<span class="sourceLineNo">668</span>        } finally {<a name="line.668"></a>
<span class="sourceLineNo">669</span>            m_dependency.releaseWriteLockIfHeld();<a name="line.669"></a>
<span class="sourceLineNo">670</span>        }<a name="line.670"></a>
<span class="sourceLineNo">671</span>        // Fire the event (outside from the synchronized region)<a name="line.671"></a>
<span class="sourceLineNo">672</span>        fireUpdate(getSelectedServices(), result.departures, result.arrivals, oldFirst,<a name="line.672"></a>
<span class="sourceLineNo">673</span>                getFirstService(), service, null);<a name="line.673"></a>
<span class="sourceLineNo">674</span>    }<a name="line.674"></a>
<span class="sourceLineNo">675</span><a name="line.675"></a>
<span class="sourceLineNo">676</span>    public void removedService(ServiceReference reference, Object service) {<a name="line.676"></a>
<span class="sourceLineNo">677</span>        // A service is leaving<a name="line.677"></a>
<span class="sourceLineNo">678</span>        // 1 - the service was in the matching set =&gt; real departure<a name="line.678"></a>
<span class="sourceLineNo">679</span>        // 2 - the service was not in the matching set =&gt; nothing do do.<a name="line.679"></a>
<span class="sourceLineNo">680</span><a name="line.680"></a>
<span class="sourceLineNo">681</span>        TransformedServiceReference initial = null;<a name="line.681"></a>
<span class="sourceLineNo">682</span>        try {<a name="line.682"></a>
<span class="sourceLineNo">683</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.683"></a>
<span class="sourceLineNo">684</span>            initial = m_matchingReferences.remove(reference);<a name="line.684"></a>
<span class="sourceLineNo">685</span>            if (initial != null) {<a name="line.685"></a>
<span class="sourceLineNo">686</span>                // Case 1<a name="line.686"></a>
<span class="sourceLineNo">687</span>                onDepartureOfAMatchingService(initial, service);<a name="line.687"></a>
<span class="sourceLineNo">688</span>            }<a name="line.688"></a>
<span class="sourceLineNo">689</span>            // else case 2.<a name="line.689"></a>
<span class="sourceLineNo">690</span>        } finally {<a name="line.690"></a>
<span class="sourceLineNo">691</span>            m_dependency.releaseWriteLockIfHeld();<a name="line.691"></a>
<span class="sourceLineNo">692</span>        }<a name="line.692"></a>
<span class="sourceLineNo">693</span><a name="line.693"></a>
<span class="sourceLineNo">694</span>        // Call the listeners outside the locked region.<a name="line.694"></a>
<span class="sourceLineNo">695</span>        if (initial != null) {<a name="line.695"></a>
<span class="sourceLineNo">696</span>            m_dependency.notifyListeners(DEPARTURE, initial, service);<a name="line.696"></a>
<span class="sourceLineNo">697</span>        }<a name="line.697"></a>
<span class="sourceLineNo">698</span><a name="line.698"></a>
<span class="sourceLineNo">699</span>    }<a name="line.699"></a>
<span class="sourceLineNo">700</span><a name="line.700"></a>
<span class="sourceLineNo">701</span>    /**<a name="line.701"></a>
<span class="sourceLineNo">702</span>     * A new filter is set.<a name="line.702"></a>
<span class="sourceLineNo">703</span>     * We have to recompute the set of matching services.<a name="line.703"></a>
<span class="sourceLineNo">704</span>     *<a name="line.704"></a>
<span class="sourceLineNo">705</span>     * @param filter  the new filter<a name="line.705"></a>
<span class="sourceLineNo">706</span>     * @param tracker the tracker<a name="line.706"></a>
<span class="sourceLineNo">707</span>     */<a name="line.707"></a>
<span class="sourceLineNo">708</span>    public ChangeSet setFilter(Filter filter, Tracker tracker) {<a name="line.708"></a>
<span class="sourceLineNo">709</span>        try {<a name="line.709"></a>
<span class="sourceLineNo">710</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.710"></a>
<span class="sourceLineNo">711</span>            m_filter = filter;<a name="line.711"></a>
<span class="sourceLineNo">712</span><a name="line.712"></a>
<span class="sourceLineNo">713</span>            if (!m_trackingInterceptors.isEmpty()) {<a name="line.713"></a>
<span class="sourceLineNo">714</span>                ServiceTrackingInterceptor interceptor = m_trackingInterceptors.getLast();<a name="line.714"></a>
<span class="sourceLineNo">715</span>                if (interceptor != null &amp;&amp; interceptor instanceof FilterBasedServiceTrackingInterceptor) {<a name="line.715"></a>
<span class="sourceLineNo">716</span>                    // Remove it first.<a name="line.716"></a>
<span class="sourceLineNo">717</span>                    m_trackingInterceptors.removeLast();<a name="line.717"></a>
<span class="sourceLineNo">718</span>                }<a name="line.718"></a>
<span class="sourceLineNo">719</span>            }<a name="line.719"></a>
<span class="sourceLineNo">720</span><a name="line.720"></a>
<span class="sourceLineNo">721</span>            if (m_filter != null) {<a name="line.721"></a>
<span class="sourceLineNo">722</span>                // Add the new one.<a name="line.722"></a>
<span class="sourceLineNo">723</span>                ServiceTrackingInterceptor newInterceptor = new FilterBasedServiceTrackingInterceptor(m_filter);<a name="line.723"></a>
<span class="sourceLineNo">724</span>                m_trackingInterceptors.addLast(newInterceptor);<a name="line.724"></a>
<span class="sourceLineNo">725</span>            }<a name="line.725"></a>
<span class="sourceLineNo">726</span><a name="line.726"></a>
<span class="sourceLineNo">727</span>            if (tracker == null) {<a name="line.727"></a>
<span class="sourceLineNo">728</span>                // Tracker closed, no problem<a name="line.728"></a>
<span class="sourceLineNo">729</span>                return new ChangeSet(Collections.&lt;ServiceReference&gt;emptyList(),<a name="line.729"></a>
<span class="sourceLineNo">730</span>                        Collections.&lt;ServiceReference&gt;emptyList(),<a name="line.730"></a>
<span class="sourceLineNo">731</span>                        Collections.&lt;ServiceReference&gt;emptyList(),<a name="line.731"></a>
<span class="sourceLineNo">732</span>                        null,<a name="line.732"></a>
<span class="sourceLineNo">733</span>                        null,<a name="line.733"></a>
<span class="sourceLineNo">734</span>                        null,<a name="line.734"></a>
<span class="sourceLineNo">735</span>                        null);<a name="line.735"></a>
<span class="sourceLineNo">736</span>            } else {<a name="line.736"></a>
<span class="sourceLineNo">737</span>                // The tracker is open, we must recheck all services.<a name="line.737"></a>
<span class="sourceLineNo">738</span>                ServiceReference oldBest = getFirstService();<a name="line.738"></a>
<span class="sourceLineNo">739</span><a name="line.739"></a>
<span class="sourceLineNo">740</span>                // Recompute the matching services.<a name="line.740"></a>
<span class="sourceLineNo">741</span>                m_matchingReferences.clear();<a name="line.741"></a>
<span class="sourceLineNo">742</span>                final List&lt;ServiceReference&gt; serviceReferencesList = tracker.getServiceReferencesList();<a name="line.742"></a>
<span class="sourceLineNo">743</span>                if (serviceReferencesList != null) {<a name="line.743"></a>
<span class="sourceLineNo">744</span>                    for (ServiceReference reference : serviceReferencesList) {<a name="line.744"></a>
<span class="sourceLineNo">745</span>                        TransformedServiceReference ref = new TransformedServiceReferenceImpl(reference);<a name="line.745"></a>
<span class="sourceLineNo">746</span>                        ref = accept(ref);<a name="line.746"></a>
<span class="sourceLineNo">747</span>                        if (ref != null) {<a name="line.747"></a>
<span class="sourceLineNo">748</span>                            m_matchingReferences.put(reference, ref);<a name="line.748"></a>
<span class="sourceLineNo">749</span>                        }<a name="line.749"></a>
<span class="sourceLineNo">750</span>                    }<a name="line.750"></a>
<span class="sourceLineNo">751</span>                }<a name="line.751"></a>
<span class="sourceLineNo">752</span><a name="line.752"></a>
<span class="sourceLineNo">753</span>                // We have the new matching set.<a name="line.753"></a>
<span class="sourceLineNo">754</span><a name="line.754"></a>
<span class="sourceLineNo">755</span>                List&lt;ServiceReference&gt; beforeRanking = getSelectedServices();<a name="line.755"></a>
<span class="sourceLineNo">756</span><a name="line.756"></a>
<span class="sourceLineNo">757</span>                final List&lt;ServiceReference&gt; allServices = getMatchingServices();<a name="line.757"></a>
<span class="sourceLineNo">758</span>                List&lt;ServiceReference&gt; references;<a name="line.758"></a>
<span class="sourceLineNo">759</span>                if (allServices.isEmpty()) {<a name="line.759"></a>
<span class="sourceLineNo">760</span>                    references = Collections.emptyList();<a name="line.760"></a>
<span class="sourceLineNo">761</span>                } else {<a name="line.761"></a>
<span class="sourceLineNo">762</span>                    references = m_rankingInterceptor.getServiceReferences(m_dependency, allServices);<a name="line.762"></a>
<span class="sourceLineNo">763</span>                }<a name="line.763"></a>
<span class="sourceLineNo">764</span><a name="line.764"></a>
<span class="sourceLineNo">765</span>                RankingResult result = computeDifferences(beforeRanking, references);<a name="line.765"></a>
<span class="sourceLineNo">766</span>                m_selectedReferences = result.selected;<a name="line.766"></a>
<span class="sourceLineNo">767</span>                return new ChangeSet(getSelectedServices(), result.departures, result.arrivals, oldBest, getFirstService(),<a name="line.767"></a>
<span class="sourceLineNo">768</span>                        null, null);<a name="line.768"></a>
<span class="sourceLineNo">769</span>            }<a name="line.769"></a>
<span class="sourceLineNo">770</span>        } finally {<a name="line.770"></a>
<span class="sourceLineNo">771</span>            m_dependency.releaseWriteLockIfHeld();<a name="line.771"></a>
<span class="sourceLineNo">772</span>        }<a name="line.772"></a>
<span class="sourceLineNo">773</span>    }<a name="line.773"></a>
<span class="sourceLineNo">774</span><a name="line.774"></a>
<span class="sourceLineNo">775</span>    public boolean isEmpty() {<a name="line.775"></a>
<span class="sourceLineNo">776</span>        try {<a name="line.776"></a>
<span class="sourceLineNo">777</span>            m_dependency.acquireReadLockIfNotHeld();<a name="line.777"></a>
<span class="sourceLineNo">778</span>            return m_selectedReferences.isEmpty();<a name="line.778"></a>
<span class="sourceLineNo">779</span>        } finally {<a name="line.779"></a>
<span class="sourceLineNo">780</span>            m_dependency.releaseReadLockIfHeld();<a name="line.780"></a>
<span class="sourceLineNo">781</span>        }<a name="line.781"></a>
<span class="sourceLineNo">782</span>    }<a name="line.782"></a>
<span class="sourceLineNo">783</span><a name="line.783"></a>
<span class="sourceLineNo">784</span>    public Comparator&lt;ServiceReference&gt; getComparator() {<a name="line.784"></a>
<span class="sourceLineNo">785</span>        try {<a name="line.785"></a>
<span class="sourceLineNo">786</span>            m_dependency.acquireReadLockIfNotHeld();<a name="line.786"></a>
<span class="sourceLineNo">787</span>            return m_comparator;<a name="line.787"></a>
<span class="sourceLineNo">788</span>        } finally {<a name="line.788"></a>
<span class="sourceLineNo">789</span>            m_dependency.releaseReadLockIfHeld();<a name="line.789"></a>
<span class="sourceLineNo">790</span>        }<a name="line.790"></a>
<span class="sourceLineNo">791</span>    }<a name="line.791"></a>
<span class="sourceLineNo">792</span><a name="line.792"></a>
<span class="sourceLineNo">793</span>    public void setComparator(Comparator&lt;ServiceReference&gt; cmp) {<a name="line.793"></a>
<span class="sourceLineNo">794</span>        try {<a name="line.794"></a>
<span class="sourceLineNo">795</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.795"></a>
<span class="sourceLineNo">796</span>            if (cmp == null) {<a name="line.796"></a>
<span class="sourceLineNo">797</span>                m_comparator = new ServiceReferenceRankingComparator();<a name="line.797"></a>
<span class="sourceLineNo">798</span>            } else {<a name="line.798"></a>
<span class="sourceLineNo">799</span>                m_comparator = cmp;<a name="line.799"></a>
<span class="sourceLineNo">800</span>            }<a name="line.800"></a>
<span class="sourceLineNo">801</span>            // Be aware that this method will release the lock to call the dependency callback.<a name="line.801"></a>
<span class="sourceLineNo">802</span>            setRankingInterceptor(new ComparatorBasedServiceRankingInterceptor(m_comparator));<a name="line.802"></a>
<span class="sourceLineNo">803</span>        } finally {<a name="line.803"></a>
<span class="sourceLineNo">804</span>            m_dependency.releaseWriteLockIfHeld();<a name="line.804"></a>
<span class="sourceLineNo">805</span>        }<a name="line.805"></a>
<span class="sourceLineNo">806</span>    }<a name="line.806"></a>
<span class="sourceLineNo">807</span><a name="line.807"></a>
<span class="sourceLineNo">808</span>    public Filter getFilter() {<a name="line.808"></a>
<span class="sourceLineNo">809</span>        try {<a name="line.809"></a>
<span class="sourceLineNo">810</span>            m_dependency.acquireReadLockIfNotHeld();<a name="line.810"></a>
<span class="sourceLineNo">811</span>            return m_filter;<a name="line.811"></a>
<span class="sourceLineNo">812</span>        } finally {<a name="line.812"></a>
<span class="sourceLineNo">813</span>            m_dependency.releaseReadLockIfHeld();<a name="line.813"></a>
<span class="sourceLineNo">814</span>        }<a name="line.814"></a>
<span class="sourceLineNo">815</span>    }<a name="line.815"></a>
<span class="sourceLineNo">816</span><a name="line.816"></a>
<span class="sourceLineNo">817</span>    public void setRankingInterceptor(ServiceRankingInterceptor interceptor) {<a name="line.817"></a>
<span class="sourceLineNo">818</span>        m_dependency.getComponentInstance().getFactory().getLogger().log(Log.INFO, "Dependency " + m_dependency.getId<a name="line.818"></a>
<span class="sourceLineNo">819</span>                () + " is getting a new ranking interceptor : " + interceptor);<a name="line.819"></a>
<span class="sourceLineNo">820</span>        ChangeSet changeSet;<a name="line.820"></a>
<span class="sourceLineNo">821</span>        try {<a name="line.821"></a>
<span class="sourceLineNo">822</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.822"></a>
<span class="sourceLineNo">823</span>            ServiceReference oldBest = getFirstService();<a name="line.823"></a>
<span class="sourceLineNo">824</span>            List&lt;ServiceReference&gt; beforeRanking = getSelectedServices();<a name="line.824"></a>
<span class="sourceLineNo">825</span>            m_rankingInterceptor = interceptor;<a name="line.825"></a>
<span class="sourceLineNo">826</span>            m_rankingInterceptor.open(m_dependency);<a name="line.826"></a>
<span class="sourceLineNo">827</span><a name="line.827"></a>
<span class="sourceLineNo">828</span>            final List&lt;ServiceReference&gt; allServices = getMatchingServices();<a name="line.828"></a>
<span class="sourceLineNo">829</span>            List&lt;ServiceReference&gt; references = Collections.emptyList();<a name="line.829"></a>
<span class="sourceLineNo">830</span>            if (!allServices.isEmpty()) {<a name="line.830"></a>
<span class="sourceLineNo">831</span>                references = m_rankingInterceptor.getServiceReferences(m_dependency, allServices);<a name="line.831"></a>
<span class="sourceLineNo">832</span>            }<a name="line.832"></a>
<span class="sourceLineNo">833</span>            RankingResult result = computeDifferences(beforeRanking, references);<a name="line.833"></a>
<span class="sourceLineNo">834</span>            m_selectedReferences = result.selected;<a name="line.834"></a>
<span class="sourceLineNo">835</span>            changeSet = new ChangeSet(getSelectedServices(), result.departures, result.arrivals, oldBest,<a name="line.835"></a>
<span class="sourceLineNo">836</span>                    getFirstService(), null, null);<a name="line.836"></a>
<span class="sourceLineNo">837</span>        } finally {<a name="line.837"></a>
<span class="sourceLineNo">838</span>            m_dependency.releaseWriteLockIfHeld();<a name="line.838"></a>
<span class="sourceLineNo">839</span>        }<a name="line.839"></a>
<span class="sourceLineNo">840</span>        // Calling onChange outside of the lock.<a name="line.840"></a>
<span class="sourceLineNo">841</span>        m_dependency.onChange(changeSet);<a name="line.841"></a>
<span class="sourceLineNo">842</span>    }<a name="line.842"></a>
<span class="sourceLineNo">843</span><a name="line.843"></a>
<span class="sourceLineNo">844</span>    public void close() {<a name="line.844"></a>
<span class="sourceLineNo">845</span>        reset();<a name="line.845"></a>
<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
<span class="sourceLineNo">847</span><a name="line.847"></a>
<span class="sourceLineNo">848</span>    public void invalidateMatchingServices() {<a name="line.848"></a>
<span class="sourceLineNo">849</span>        ChangeSet changeset;<a name="line.849"></a>
<span class="sourceLineNo">850</span>        try {<a name="line.850"></a>
<span class="sourceLineNo">851</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.851"></a>
<span class="sourceLineNo">852</span>            m_matchingReferences.clear();<a name="line.852"></a>
<span class="sourceLineNo">853</span>            changeset = computeChangesInMatchingServices();<a name="line.853"></a>
<span class="sourceLineNo">854</span>        } finally {<a name="line.854"></a>
<span class="sourceLineNo">855</span>            m_dependency.releaseWriteLockIfHeld();<a name="line.855"></a>
<span class="sourceLineNo">856</span>        }<a name="line.856"></a>
<span class="sourceLineNo">857</span>        m_dependency.onChange(changeset);<a name="line.857"></a>
<span class="sourceLineNo">858</span>    }<a name="line.858"></a>
<span class="sourceLineNo">859</span><a name="line.859"></a>
<span class="sourceLineNo">860</span>    public void invalidateSelectedServices() {<a name="line.860"></a>
<span class="sourceLineNo">861</span>        ChangeSet changeset;<a name="line.861"></a>
<span class="sourceLineNo">862</span>        try {<a name="line.862"></a>
<span class="sourceLineNo">863</span>            m_dependency.acquireWriteLockIfNotHeld();<a name="line.863"></a>
<span class="sourceLineNo">864</span>            ServiceReference oldBest = getFirstService();<a name="line.864"></a>
<span class="sourceLineNo">865</span>            List&lt;ServiceReference&gt; beforeRanking = getSelectedServices();<a name="line.865"></a>
<span class="sourceLineNo">866</span>            m_selectedReferences.clear();<a name="line.866"></a>
<span class="sourceLineNo">867</span>            final List&lt;ServiceReference&gt; allServices = getMatchingServices();<a name="line.867"></a>
<span class="sourceLineNo">868</span>            List&lt;ServiceReference&gt; references = Collections.emptyList();<a name="line.868"></a>
<span class="sourceLineNo">869</span>            if (!allServices.isEmpty()) {<a name="line.869"></a>
<span class="sourceLineNo">870</span>                references = m_rankingInterceptor.getServiceReferences(m_dependency, allServices);<a name="line.870"></a>
<span class="sourceLineNo">871</span>            }<a name="line.871"></a>
<span class="sourceLineNo">872</span>            RankingResult result = computeDifferences(beforeRanking, references);<a name="line.872"></a>
<span class="sourceLineNo">873</span>            m_selectedReferences = result.selected;<a name="line.873"></a>
<span class="sourceLineNo">874</span>            changeset = new ChangeSet(getSelectedServices(), result.departures, result.arrivals, oldBest,<a name="line.874"></a>
<span class="sourceLineNo">875</span>                    getFirstService(), null, null);<a name="line.875"></a>
<span class="sourceLineNo">876</span>        } finally {<a name="line.876"></a>
<span class="sourceLineNo">877</span>            m_dependency.releaseWriteLockIfHeld();<a name="line.877"></a>
<span class="sourceLineNo">878</span>        }<a name="line.878"></a>
<span class="sourceLineNo">879</span><a name="line.879"></a>
<span class="sourceLineNo">880</span>        m_dependency.onChange(changeset);<a name="line.880"></a>
<span class="sourceLineNo">881</span>    }<a name="line.881"></a>
<span class="sourceLineNo">882</span><a name="line.882"></a>
<span class="sourceLineNo">883</span>    /**<a name="line.883"></a>
<span class="sourceLineNo">884</span>     * Gets the list of tracking interceptors attached to the current service dependency.<a name="line.884"></a>
<span class="sourceLineNo">885</span>     * @return the list of service references of the tracking interceptors participating to the resolution of the<a name="line.885"></a>
<span class="sourceLineNo">886</span>     * current service dependency. An empty list is returned is there are no participating interceptors.<a name="line.886"></a>
<span class="sourceLineNo">887</span>     * @since 1.11.0<a name="line.887"></a>
<span class="sourceLineNo">888</span>     */<a name="line.888"></a>
<span class="sourceLineNo">889</span>    public List&lt;ServiceReference&gt; getTrackingInterceptorReferences() {<a name="line.889"></a>
<span class="sourceLineNo">890</span>        try {<a name="line.890"></a>
<span class="sourceLineNo">891</span>            m_dependency.acquireReadLockIfNotHeld();<a name="line.891"></a>
<span class="sourceLineNo">892</span>            if (m_trackingInterceptorTracker != null) {<a name="line.892"></a>
<span class="sourceLineNo">893</span>                List&lt;ServiceReference&gt; refs = m_trackingInterceptorTracker.getUsedServiceReferences();<a name="line.893"></a>
<span class="sourceLineNo">894</span>                if (refs != null) {<a name="line.894"></a>
<span class="sourceLineNo">895</span>                    return refs;<a name="line.895"></a>
<span class="sourceLineNo">896</span>                }<a name="line.896"></a>
<span class="sourceLineNo">897</span>            }<a name="line.897"></a>
<span class="sourceLineNo">898</span>            return Collections.emptyList();<a name="line.898"></a>
<span class="sourceLineNo">899</span>        } finally {<a name="line.899"></a>
<span class="sourceLineNo">900</span>            m_dependency.releaseReadLockIfHeld();<a name="line.900"></a>
<span class="sourceLineNo">901</span>        }<a name="line.901"></a>
<span class="sourceLineNo">902</span>    }<a name="line.902"></a>
<span class="sourceLineNo">903</span><a name="line.903"></a>
<span class="sourceLineNo">904</span>    /**<a name="line.904"></a>
<span class="sourceLineNo">905</span>     * Gets the list of binding interceptors attached to the current service dependency.<a name="line.905"></a>
<span class="sourceLineNo">906</span>     * @return the list of service references of the binding interceptors participating to the resolution of the<a name="line.906"></a>
<span class="sourceLineNo">907</span>     * current service dependency. An empty list is returned is there are no participating interceptors.<a name="line.907"></a>
<span class="sourceLineNo">908</span>     * @since 1.11.0<a name="line.908"></a>
<span class="sourceLineNo">909</span>     */<a name="line.909"></a>
<span class="sourceLineNo">910</span>    public List&lt;ServiceReference&gt; getBindingInterceptorReferences() {<a name="line.910"></a>
<span class="sourceLineNo">911</span>        try {<a name="line.911"></a>
<span class="sourceLineNo">912</span>            m_dependency.acquireReadLockIfNotHeld();<a name="line.912"></a>
<span class="sourceLineNo">913</span>            if (m_bindingInterceptorTracker != null) {<a name="line.913"></a>
<span class="sourceLineNo">914</span>                List&lt;ServiceReference&gt; refs = m_bindingInterceptorTracker.getUsedServiceReferences();<a name="line.914"></a>
<span class="sourceLineNo">915</span>                if (refs != null) {<a name="line.915"></a>
<span class="sourceLineNo">916</span>                    return refs;<a name="line.916"></a>
<span class="sourceLineNo">917</span>                }<a name="line.917"></a>
<span class="sourceLineNo">918</span>            }<a name="line.918"></a>
<span class="sourceLineNo">919</span>            return Collections.emptyList();<a name="line.919"></a>
<span class="sourceLineNo">920</span>        } finally {<a name="line.920"></a>
<span class="sourceLineNo">921</span>            m_dependency.releaseReadLockIfHeld();<a name="line.921"></a>
<span class="sourceLineNo">922</span>        }<a name="line.922"></a>
<span class="sourceLineNo">923</span>    }<a name="line.923"></a>
<span class="sourceLineNo">924</span><a name="line.924"></a>
<span class="sourceLineNo">925</span>    /**<a name="line.925"></a>
<span class="sourceLineNo">926</span>     * Gets the service reference of the currently attached ranking interceptor. As only one ranking interceptor can<a name="line.926"></a>
<span class="sourceLineNo">927</span>     * be attached at a point on time, this is not a list but only one reference.<a name="line.927"></a>
<span class="sourceLineNo">928</span>     * @return the service reference of the ranking interceptor participating to the resolution of the current<a name="line.928"></a>
<span class="sourceLineNo">929</span>     * service dependency. {@code null} if no (external) ranking interceptor is currently attached.<a name="line.929"></a>
<span class="sourceLineNo">930</span>     * @since 1.11.0<a name="line.930"></a>
<span class="sourceLineNo">931</span>     */<a name="line.931"></a>
<span class="sourceLineNo">932</span>    public ServiceReference getRankingInterceptorReference() {<a name="line.932"></a>
<span class="sourceLineNo">933</span>        try {<a name="line.933"></a>
<span class="sourceLineNo">934</span>            m_dependency.acquireReadLockIfNotHeld();<a name="line.934"></a>
<span class="sourceLineNo">935</span>            if (m_rankingInterceptorTracker != null) {<a name="line.935"></a>
<span class="sourceLineNo">936</span>                List&lt;ServiceReference&gt; references = m_rankingInterceptorTracker.getUsedServiceReferences();<a name="line.936"></a>
<span class="sourceLineNo">937</span>                if (references != null  &amp;&amp; ! references.isEmpty()) {<a name="line.937"></a>
<span class="sourceLineNo">938</span>                    return references.get(0);<a name="line.938"></a>
<span class="sourceLineNo">939</span>                }<a name="line.939"></a>
<span class="sourceLineNo">940</span>            }<a name="line.940"></a>
<span class="sourceLineNo">941</span>            return null;<a name="line.941"></a>
<span class="sourceLineNo">942</span>        } finally {<a name="line.942"></a>
<span class="sourceLineNo">943</span>            m_dependency.releaseReadLockIfHeld();<a name="line.943"></a>
<span class="sourceLineNo">944</span>        }<a name="line.944"></a>
<span class="sourceLineNo">945</span>    }<a name="line.945"></a>
<span class="sourceLineNo">946</span><a name="line.946"></a>
<span class="sourceLineNo">947</span>    private class RankingResult {<a name="line.947"></a>
<span class="sourceLineNo">948</span>        final List&lt;ServiceReference&gt; departures;<a name="line.948"></a>
<span class="sourceLineNo">949</span>        final List&lt;ServiceReference&gt; arrivals;<a name="line.949"></a>
<span class="sourceLineNo">950</span>        final List&lt;ServiceReference&gt; selected;<a name="line.950"></a>
<span class="sourceLineNo">951</span><a name="line.951"></a>
<span class="sourceLineNo">952</span>        private RankingResult(List&lt;ServiceReference&gt; departures, List&lt;ServiceReference&gt; arrivals,<a name="line.952"></a>
<span class="sourceLineNo">953</span>                              List&lt;ServiceReference&gt; selected) {<a name="line.953"></a>
<span class="sourceLineNo">954</span>            this.departures = departures;<a name="line.954"></a>
<span class="sourceLineNo">955</span>            this.arrivals = arrivals;<a name="line.955"></a>
<span class="sourceLineNo">956</span>            this.selected = selected;<a name="line.956"></a>
<span class="sourceLineNo">957</span>        }<a name="line.957"></a>
<span class="sourceLineNo">958</span>    }<a name="line.958"></a>
<span class="sourceLineNo">959</span><a name="line.959"></a>
<span class="sourceLineNo">960</span>    public class ChangeSet {<a name="line.960"></a>
<span class="sourceLineNo">961</span>        public final List&lt;ServiceReference&gt; selected;<a name="line.961"></a>
<span class="sourceLineNo">962</span>        public final List&lt;ServiceReference&gt; departures;<a name="line.962"></a>
<span class="sourceLineNo">963</span>        public final List&lt;ServiceReference&gt; arrivals;<a name="line.963"></a>
<span class="sourceLineNo">964</span>        public final ServiceReference oldFirstReference;<a name="line.964"></a>
<span class="sourceLineNo">965</span>        public final ServiceReference newFirstReference;<a name="line.965"></a>
<span class="sourceLineNo">966</span>        public final Object service;<a name="line.966"></a>
<span class="sourceLineNo">967</span>        public final ServiceReference modified;<a name="line.967"></a>
<span class="sourceLineNo">968</span><a name="line.968"></a>
<span class="sourceLineNo">969</span>        public ChangeSet(List&lt;ServiceReference&gt; selectedServices,<a name="line.969"></a>
<span class="sourceLineNo">970</span>                         List&lt;ServiceReference&gt; departures, List&lt;ServiceReference&gt; arrivals,<a name="line.970"></a>
<span class="sourceLineNo">971</span>                         ServiceReference oldFirst, ServiceReference newFirst,<a name="line.971"></a>
<span class="sourceLineNo">972</span>                         Object service, ServiceReference modified) {<a name="line.972"></a>
<span class="sourceLineNo">973</span>            this.selected = selectedServices;<a name="line.973"></a>
<span class="sourceLineNo">974</span>            this.departures = departures;<a name="line.974"></a>
<span class="sourceLineNo">975</span>            this.arrivals = arrivals;<a name="line.975"></a>
<span class="sourceLineNo">976</span>            this.oldFirstReference = oldFirst;<a name="line.976"></a>
<span class="sourceLineNo">977</span>            this.newFirstReference = newFirst;<a name="line.977"></a>
<span class="sourceLineNo">978</span>            this.service = service;<a name="line.978"></a>
<span class="sourceLineNo">979</span>            this.modified = modified;<a name="line.979"></a>
<span class="sourceLineNo">980</span>        }<a name="line.980"></a>
<span class="sourceLineNo">981</span>    }<a name="line.981"></a>
<span class="sourceLineNo">982</span>}<a name="line.982"></a>




























































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