<!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>package org.apache.felix.ipojo.handlers.providedservice;<a name="line.19"></a>
<span class="sourceLineNo">020</span><a name="line.20"></a>
<span class="sourceLineNo">021</span>import java.lang.reflect.InvocationHandler;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import java.lang.reflect.Method;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import java.lang.reflect.Proxy;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.util.*;<a name="line.24"></a>
<span class="sourceLineNo">025</span><a name="line.25"></a>
<span class="sourceLineNo">026</span>import org.apache.felix.ipojo.*;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import org.apache.felix.ipojo.util.Callback;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import org.apache.felix.ipojo.util.Property;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import org.apache.felix.ipojo.util.SecurityHelper;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import org.osgi.framework.Bundle;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import org.osgi.framework.BundleContext;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import org.osgi.framework.Constants;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import org.osgi.framework.ServiceFactory;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import org.osgi.framework.ServiceReference;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import org.osgi.framework.ServiceRegistration;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import org.osgi.service.cm.ConfigurationAdmin;<a name="line.36"></a>
<span class="sourceLineNo">037</span><a name="line.37"></a>
<span class="sourceLineNo">038</span>/**<a name="line.38"></a>
<span class="sourceLineNo">039</span> * Provided Service represent a provided service by the component.<a name="line.39"></a>
<span class="sourceLineNo">040</span> *<a name="line.40"></a>
<span class="sourceLineNo">041</span> * @author &lt;a href="mailto:dev@felix.apache.org"&gt;Felix Project Team&lt;/a&gt;<a name="line.41"></a>
<span class="sourceLineNo">042</span> */<a name="line.42"></a>
<span class="sourceLineNo">043</span>public class ProvidedService implements ServiceFactory {<a name="line.43"></a>
<span class="sourceLineNo">044</span><a name="line.44"></a>
<span class="sourceLineNo">045</span>    /**<a name="line.45"></a>
<span class="sourceLineNo">046</span>     * Service State : REGISTRED.<a name="line.46"></a>
<span class="sourceLineNo">047</span>     */<a name="line.47"></a>
<span class="sourceLineNo">048</span>    public static final int REGISTERED = 1;<a name="line.48"></a>
<span class="sourceLineNo">049</span><a name="line.49"></a>
<span class="sourceLineNo">050</span>    /**<a name="line.50"></a>
<span class="sourceLineNo">051</span>     * Service State : UNREGISTRED.<a name="line.51"></a>
<span class="sourceLineNo">052</span>     */<a name="line.52"></a>
<span class="sourceLineNo">053</span>    public static final int UNREGISTERED = 0;<a name="line.53"></a>
<span class="sourceLineNo">054</span><a name="line.54"></a>
<span class="sourceLineNo">055</span>    /**<a name="line.55"></a>
<span class="sourceLineNo">056</span>     * Factory Policy : SINGLETON_FACTORY.<a name="line.56"></a>
<span class="sourceLineNo">057</span>     */<a name="line.57"></a>
<span class="sourceLineNo">058</span>    public static final int SINGLETON_STRATEGY = 0;<a name="line.58"></a>
<span class="sourceLineNo">059</span><a name="line.59"></a>
<span class="sourceLineNo">060</span>    /**<a name="line.60"></a>
<span class="sourceLineNo">061</span>     * Factory policy : SERVICE_FACTORY.<a name="line.61"></a>
<span class="sourceLineNo">062</span>     */<a name="line.62"></a>
<span class="sourceLineNo">063</span>    public static final int SERVICE_STRATEGY = 1;<a name="line.63"></a>
<span class="sourceLineNo">064</span><a name="line.64"></a>
<span class="sourceLineNo">065</span>    /**<a name="line.65"></a>
<span class="sourceLineNo">066</span>     * Factory policy : STATIC_FACTORY.<a name="line.66"></a>
<span class="sourceLineNo">067</span>     */<a name="line.67"></a>
<span class="sourceLineNo">068</span>    public static final int STATIC_STRATEGY = 2;<a name="line.68"></a>
<span class="sourceLineNo">069</span><a name="line.69"></a>
<span class="sourceLineNo">070</span>    /**<a name="line.70"></a>
<span class="sourceLineNo">071</span>     * Factory policy : INSTANCE.<a name="line.71"></a>
<span class="sourceLineNo">072</span>     * Creates one service object per instance consuming the service.<a name="line.72"></a>
<span class="sourceLineNo">073</span>     */<a name="line.73"></a>
<span class="sourceLineNo">074</span>    public static final int INSTANCE_STRATEGY = 3;<a name="line.74"></a>
<span class="sourceLineNo">075</span><a name="line.75"></a>
<span class="sourceLineNo">076</span>    /**<a name="line.76"></a>
<span class="sourceLineNo">077</span>     * Factory policy : CUSTOMIZED.<a name="line.77"></a>
<span class="sourceLineNo">078</span>     * Custom creation strategy<a name="line.78"></a>
<span class="sourceLineNo">079</span>     */<a name="line.79"></a>
<span class="sourceLineNo">080</span>    public static final int CUSTOM_STRATEGY = -1;<a name="line.80"></a>
<span class="sourceLineNo">081</span>    public static final String ALL_SPECIFICATIONS_FOR_CONTROLLERS = "ALL";<a name="line.81"></a>
<span class="sourceLineNo">082</span><a name="line.82"></a>
<span class="sourceLineNo">083</span>    /**<a name="line.83"></a>
<span class="sourceLineNo">084</span>     * At this time, it is only the java interface full name.<a name="line.84"></a>
<span class="sourceLineNo">085</span>     */<a name="line.85"></a>
<span class="sourceLineNo">086</span>    private String[] m_serviceSpecifications = new String[0];<a name="line.86"></a>
<span class="sourceLineNo">087</span><a name="line.87"></a>
<span class="sourceLineNo">088</span>    /**<a name="line.88"></a>
<span class="sourceLineNo">089</span>     * The service registration. is null when the service is not registered.<a name="line.89"></a>
<span class="sourceLineNo">090</span>     * m_serviceRegistration : ServiceRegistration<a name="line.90"></a>
<span class="sourceLineNo">091</span>     */<a name="line.91"></a>
<span class="sourceLineNo">092</span>    private ServiceRegistration m_serviceRegistration;<a name="line.92"></a>
<span class="sourceLineNo">093</span><a name="line.93"></a>
<span class="sourceLineNo">094</span>    /**<a name="line.94"></a>
<span class="sourceLineNo">095</span>     * Link to the owner handler. m_handler : Provided Service Handler<a name="line.95"></a>
<span class="sourceLineNo">096</span>     */<a name="line.96"></a>
<span class="sourceLineNo">097</span>    private ProvidedServiceHandler m_handler;<a name="line.97"></a>
<span class="sourceLineNo">098</span><a name="line.98"></a>
<span class="sourceLineNo">099</span>    /**<a name="line.99"></a>
<span class="sourceLineNo">100</span>     * The map of properties.<a name="line.100"></a>
<span class="sourceLineNo">101</span>     */<a name="line.101"></a>
<span class="sourceLineNo">102</span>    private Map&lt;String, Property&gt; m_properties = new TreeMap&lt;String, Property&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>     * Service providing policy.<a name="line.105"></a>
<span class="sourceLineNo">106</span>     */<a name="line.106"></a>
<span class="sourceLineNo">107</span>    private final int m_policy;<a name="line.107"></a>
<span class="sourceLineNo">108</span><a name="line.108"></a>
<span class="sourceLineNo">109</span>    /**<a name="line.109"></a>
<span class="sourceLineNo">110</span>     * Service Object creation policy.<a name="line.110"></a>
<span class="sourceLineNo">111</span>     */<a name="line.111"></a>
<span class="sourceLineNo">112</span>    private final CreationStrategy m_strategy;<a name="line.112"></a>
<span class="sourceLineNo">113</span><a name="line.113"></a>
<span class="sourceLineNo">114</span>    /**<a name="line.114"></a>
<span class="sourceLineNo">115</span>     * Were the properties updated during the processing.<a name="line.115"></a>
<span class="sourceLineNo">116</span>     */<a name="line.116"></a>
<span class="sourceLineNo">117</span>    private volatile boolean m_wasUpdated;<a name="line.117"></a>
<span class="sourceLineNo">118</span><a name="line.118"></a>
<span class="sourceLineNo">119</span>    /**<a name="line.119"></a>
<span class="sourceLineNo">120</span>     * Service Controller.<a name="line.120"></a>
<span class="sourceLineNo">121</span>     */<a name="line.121"></a>
<span class="sourceLineNo">122</span>    private Map&lt;String, ServiceController&gt; m_controllers = new HashMap&lt;String, ServiceController&gt;();<a name="line.122"></a>
<span class="sourceLineNo">123</span><a name="line.123"></a>
<span class="sourceLineNo">124</span>    /**<a name="line.124"></a>
<span class="sourceLineNo">125</span>     * Post-Registration callback.<a name="line.125"></a>
<span class="sourceLineNo">126</span>     */<a name="line.126"></a>
<span class="sourceLineNo">127</span>    private Callback m_postRegistration;<a name="line.127"></a>
<span class="sourceLineNo">128</span><a name="line.128"></a>
<span class="sourceLineNo">129</span>    /**<a name="line.129"></a>
<span class="sourceLineNo">130</span>     * Post-Unregistration callback.<a name="line.130"></a>
<span class="sourceLineNo">131</span>     */<a name="line.131"></a>
<span class="sourceLineNo">132</span>    private Callback m_postUnregistration;<a name="line.132"></a>
<span class="sourceLineNo">133</span><a name="line.133"></a>
<span class="sourceLineNo">134</span>    /**<a name="line.134"></a>
<span class="sourceLineNo">135</span>     * The published properties.<a name="line.135"></a>
<span class="sourceLineNo">136</span>     */<a name="line.136"></a>
<span class="sourceLineNo">137</span>    private Dictionary m_publishedProperties = new Properties();<a name="line.137"></a>
<span class="sourceLineNo">138</span><a name="line.138"></a>
<span class="sourceLineNo">139</span>    /**<a name="line.139"></a>
<span class="sourceLineNo">140</span>     * The provided service listeners.<a name="line.140"></a>
<span class="sourceLineNo">141</span>     */<a name="line.141"></a>
<span class="sourceLineNo">142</span>    private List&lt;ProvidedServiceListener&gt; m_listeners = new ArrayList&lt;ProvidedServiceListener&gt;();<a name="line.142"></a>
<span class="sourceLineNo">143</span><a name="line.143"></a>
<span class="sourceLineNo">144</span>    /**<a name="line.144"></a>
<span class="sourceLineNo">145</span>     * Creates a provided service object.<a name="line.145"></a>
<span class="sourceLineNo">146</span>     *<a name="line.146"></a>
<span class="sourceLineNo">147</span>     * @param handler the the provided service handler.<a name="line.147"></a>
<span class="sourceLineNo">148</span>     * @param specification the specifications provided by this provided service<a name="line.148"></a>
<span class="sourceLineNo">149</span>     * @param factoryPolicy the service providing policy<a name="line.149"></a>
<span class="sourceLineNo">150</span>     * @param creationStrategyClass the customized service object creation strategy.<a name="line.150"></a>
<span class="sourceLineNo">151</span>     * @param conf the instance configuration.<a name="line.151"></a>
<span class="sourceLineNo">152</span>     */<a name="line.152"></a>
<span class="sourceLineNo">153</span>    public ProvidedService(ProvidedServiceHandler handler, String[] specification, int factoryPolicy, Class creationStrategyClass, Dictionary conf) {<a name="line.153"></a>
<span class="sourceLineNo">154</span>        CreationStrategy strategy;<a name="line.154"></a>
<span class="sourceLineNo">155</span>        m_handler = handler;<a name="line.155"></a>
<span class="sourceLineNo">156</span><a name="line.156"></a>
<span class="sourceLineNo">157</span>        m_serviceSpecifications = specification;<a name="line.157"></a>
<span class="sourceLineNo">158</span><a name="line.158"></a>
<span class="sourceLineNo">159</span>        if (creationStrategyClass == null) {<a name="line.159"></a>
<span class="sourceLineNo">160</span>            m_policy = factoryPolicy;<a name="line.160"></a>
<span class="sourceLineNo">161</span>        } else {<a name="line.161"></a>
<span class="sourceLineNo">162</span>            m_policy = CUSTOM_STRATEGY;<a name="line.162"></a>
<span class="sourceLineNo">163</span>        }<a name="line.163"></a>
<span class="sourceLineNo">164</span><a name="line.164"></a>
<span class="sourceLineNo">165</span>        // Add instance name, factory name and factory version is set.<a name="line.165"></a>
<span class="sourceLineNo">166</span>        try {<a name="line.166"></a>
<span class="sourceLineNo">167</span>            addProperty(new Property(Factory.INSTANCE_NAME_PROPERTY, null, null, handler.getInstanceManager().getInstanceName(), String.class.getName(), handler.getInstanceManager(), handler));<a name="line.167"></a>
<span class="sourceLineNo">168</span>            addProperty(new Property("factory.name", null, null, handler.getInstanceManager().getFactory().getFactoryName(), String.class.getName(), handler.getInstanceManager(), handler));<a name="line.168"></a>
<span class="sourceLineNo">169</span><a name="line.169"></a>
<span class="sourceLineNo">170</span>            if (handler.getInstanceManager().getFactory().getVersion() != null) {<a name="line.170"></a>
<span class="sourceLineNo">171</span>                addProperty(new Property(Factory.FACTORY_VERSION_PROPERTY, null, null, handler.getInstanceManager().getFactory().getVersion(), String.class.getName(), handler.getInstanceManager(), handler));<a name="line.171"></a>
<span class="sourceLineNo">172</span>            }<a name="line.172"></a>
<span class="sourceLineNo">173</span><a name="line.173"></a>
<span class="sourceLineNo">174</span>            // Add the service.* if defined<a name="line.174"></a>
<span class="sourceLineNo">175</span>            if (conf.get(Constants.SERVICE_PID) != null) {<a name="line.175"></a>
<span class="sourceLineNo">176</span>                addProperty(new Property(Constants.SERVICE_PID, null, null, (String) conf.get(Constants.SERVICE_PID), String.class.getName(), handler.getInstanceManager(), handler));<a name="line.176"></a>
<span class="sourceLineNo">177</span>            }<a name="line.177"></a>
<span class="sourceLineNo">178</span>            if (conf.get(Constants.SERVICE_RANKING) != null) {<a name="line.178"></a>
<span class="sourceLineNo">179</span>                addProperty(new Property(Constants.SERVICE_RANKING, null, null, (String) conf.get(Constants.SERVICE_RANKING), "int", handler.getInstanceManager(), handler));<a name="line.179"></a>
<span class="sourceLineNo">180</span>            }<a name="line.180"></a>
<span class="sourceLineNo">181</span>            if (conf.get(Constants.SERVICE_VENDOR) != null) {<a name="line.181"></a>
<span class="sourceLineNo">182</span>                addProperty(new Property(Constants.SERVICE_VENDOR, null, null, (String) conf.get(Constants.SERVICE_VENDOR), String.class.getName(), handler.getInstanceManager(), handler));<a name="line.182"></a>
<span class="sourceLineNo">183</span>            }<a name="line.183"></a>
<span class="sourceLineNo">184</span>            if (conf.get(Constants.SERVICE_DESCRIPTION) != null) {<a name="line.184"></a>
<span class="sourceLineNo">185</span>                addProperty(new Property(Constants.SERVICE_DESCRIPTION, null, null, (String) conf.get(Constants.SERVICE_DESCRIPTION), String.class.getName(), handler.getInstanceManager(), handler));<a name="line.185"></a>
<span class="sourceLineNo">186</span>            }<a name="line.186"></a>
<span class="sourceLineNo">187</span><a name="line.187"></a>
<span class="sourceLineNo">188</span>        } catch (ConfigurationException e) {<a name="line.188"></a>
<span class="sourceLineNo">189</span>            m_handler.error("An exception occurs when adding instance.name and factory.name property : " + e.getMessage());<a name="line.189"></a>
<span class="sourceLineNo">190</span>        }<a name="line.190"></a>
<span class="sourceLineNo">191</span><a name="line.191"></a>
<span class="sourceLineNo">192</span>        if (creationStrategyClass != null) {<a name="line.192"></a>
<span class="sourceLineNo">193</span>            try {<a name="line.193"></a>
<span class="sourceLineNo">194</span>                strategy = (CreationStrategy) creationStrategyClass.newInstance();<a name="line.194"></a>
<span class="sourceLineNo">195</span>            } catch (IllegalAccessException e) {<a name="line.195"></a>
<span class="sourceLineNo">196</span>                strategy = null;<a name="line.196"></a>
<span class="sourceLineNo">197</span>                m_handler.error("["<a name="line.197"></a>
<span class="sourceLineNo">198</span>                        + m_handler.getInstanceManager().getInstanceName()<a name="line.198"></a>
<span class="sourceLineNo">199</span>                        + "] The customized service object creation policy "<a name="line.199"></a>
<span class="sourceLineNo">200</span>                        + "(" + creationStrategyClass.getName() + ") is not accessible: "<a name="line.200"></a>
<span class="sourceLineNo">201</span>                        + e.getMessage(), e);<a name="line.201"></a>
<span class="sourceLineNo">202</span>                getInstanceManager().stop();<a name="line.202"></a>
<span class="sourceLineNo">203</span>            } catch (InstantiationException e) {<a name="line.203"></a>
<span class="sourceLineNo">204</span>                strategy = null;<a name="line.204"></a>
<span class="sourceLineNo">205</span>                m_handler.error("["<a name="line.205"></a>
<span class="sourceLineNo">206</span>                        + m_handler.getInstanceManager().getInstanceName()<a name="line.206"></a>
<span class="sourceLineNo">207</span>                        + "] The customized service object creation policy "<a name="line.207"></a>
<span class="sourceLineNo">208</span>                        + "(" + creationStrategyClass.getName() + ") cannot be instantiated: "<a name="line.208"></a>
<span class="sourceLineNo">209</span>                        + e.getMessage(), e);<a name="line.209"></a>
<span class="sourceLineNo">210</span>                getInstanceManager().stop();<a name="line.210"></a>
<span class="sourceLineNo">211</span>            }<a name="line.211"></a>
<span class="sourceLineNo">212</span>        } else {<a name="line.212"></a>
<span class="sourceLineNo">213</span>            switch (factoryPolicy) {<a name="line.213"></a>
<span class="sourceLineNo">214</span>                case SINGLETON_STRATEGY:<a name="line.214"></a>
<span class="sourceLineNo">215</span>                    strategy = new SingletonStrategy();<a name="line.215"></a>
<span class="sourceLineNo">216</span>                    break;<a name="line.216"></a>
<span class="sourceLineNo">217</span>                case SERVICE_STRATEGY:<a name="line.217"></a>
<span class="sourceLineNo">218</span>                case STATIC_STRATEGY:<a name="line.218"></a>
<span class="sourceLineNo">219</span>                    // In this case, we need to try to create a new pojo object,<a name="line.219"></a>
<span class="sourceLineNo">220</span>                    // the factory method will handle the creation.<a name="line.220"></a>
<span class="sourceLineNo">221</span>                    strategy = new FactoryStrategy();<a name="line.221"></a>
<span class="sourceLineNo">222</span>                    break;<a name="line.222"></a>
<span class="sourceLineNo">223</span>                case INSTANCE_STRATEGY:<a name="line.223"></a>
<span class="sourceLineNo">224</span>                    strategy = new PerInstanceStrategy();<a name="line.224"></a>
<span class="sourceLineNo">225</span>                    break;<a name="line.225"></a>
<span class="sourceLineNo">226</span>                // Other policies:<a name="line.226"></a>
<span class="sourceLineNo">227</span>                // Thread : one service object per asking thread<a name="line.227"></a>
<span class="sourceLineNo">228</span>                // Consumer : one service object per consumer<a name="line.228"></a>
<span class="sourceLineNo">229</span>                default:<a name="line.229"></a>
<span class="sourceLineNo">230</span>                    strategy = null;<a name="line.230"></a>
<span class="sourceLineNo">231</span>                    List specs = Arrays.asList(m_serviceSpecifications);<a name="line.231"></a>
<span class="sourceLineNo">232</span>                    m_handler.error("["<a name="line.232"></a>
<span class="sourceLineNo">233</span>                            + m_handler.getInstanceManager().getInstanceName()<a name="line.233"></a>
<span class="sourceLineNo">234</span>                            + "] Unknown creation policy for " + specs + " : "<a name="line.234"></a>
<span class="sourceLineNo">235</span>                            + factoryPolicy);<a name="line.235"></a>
<span class="sourceLineNo">236</span>                    getInstanceManager().stop();<a name="line.236"></a>
<span class="sourceLineNo">237</span>                    break;<a name="line.237"></a>
<span class="sourceLineNo">238</span>            }<a name="line.238"></a>
<span class="sourceLineNo">239</span>        }<a name="line.239"></a>
<span class="sourceLineNo">240</span>        m_strategy = strategy;<a name="line.240"></a>
<span class="sourceLineNo">241</span>    }<a name="line.241"></a>
<span class="sourceLineNo">242</span><a name="line.242"></a>
<span class="sourceLineNo">243</span>    /**<a name="line.243"></a>
<span class="sourceLineNo">244</span>     * Add properties to the provided service.<a name="line.244"></a>
<span class="sourceLineNo">245</span>     * @param props : the properties to attached to the service registration<a name="line.245"></a>
<span class="sourceLineNo">246</span>     */<a name="line.246"></a>
<span class="sourceLineNo">247</span>    protected void setProperties(Property[] props) {<a name="line.247"></a>
<span class="sourceLineNo">248</span>        for (Property prop : props) {<a name="line.248"></a>
<span class="sourceLineNo">249</span>            addProperty(prop);<a name="line.249"></a>
<span class="sourceLineNo">250</span>        }<a name="line.250"></a>
<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
<span class="sourceLineNo">252</span><a name="line.252"></a>
<span class="sourceLineNo">253</span>    /**<a name="line.253"></a>
<span class="sourceLineNo">254</span>     * Add the given property to the property list.<a name="line.254"></a>
<span class="sourceLineNo">255</span>     *<a name="line.255"></a>
<span class="sourceLineNo">256</span>     * @param prop : the element to add<a name="line.256"></a>
<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
<span class="sourceLineNo">258</span>    private synchronized void addProperty(Property prop) {<a name="line.258"></a>
<span class="sourceLineNo">259</span>        m_properties.put(prop.getName(), prop);<a name="line.259"></a>
<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
<span class="sourceLineNo">261</span><a name="line.261"></a>
<span class="sourceLineNo">262</span>    /**<a name="line.262"></a>
<span class="sourceLineNo">263</span>     * Remove a property.<a name="line.263"></a>
<span class="sourceLineNo">264</span>     *<a name="line.264"></a>
<span class="sourceLineNo">265</span>     * @param name : the property to remove<a name="line.265"></a>
<span class="sourceLineNo">266</span>     * @return &lt;code&gt;true&lt;/code&gt; if the property was removed,<a name="line.266"></a>
<span class="sourceLineNo">267</span>     * &lt;code&gt;false&lt;/code&gt; otherwise.<a name="line.267"></a>
<span class="sourceLineNo">268</span>     */<a name="line.268"></a>
<span class="sourceLineNo">269</span>    private synchronized boolean removeProperty(String name) {<a name="line.269"></a>
<span class="sourceLineNo">270</span>        return m_properties.remove(name) != null;<a name="line.270"></a>
<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
<span class="sourceLineNo">272</span><a name="line.272"></a>
<span class="sourceLineNo">273</span>    /**<a name="line.273"></a>
<span class="sourceLineNo">274</span>     * Get the service reference of the service registration.<a name="line.274"></a>
<span class="sourceLineNo">275</span>     * @return the service reference of the provided service (null if the<a name="line.275"></a>
<span class="sourceLineNo">276</span>     * service is not published).<a name="line.276"></a>
<span class="sourceLineNo">277</span>     */<a name="line.277"></a>
<span class="sourceLineNo">278</span>    public ServiceReference getServiceReference() {<a name="line.278"></a>
<span class="sourceLineNo">279</span>        if (m_serviceRegistration == null) {<a name="line.279"></a>
<span class="sourceLineNo">280</span>            return null;<a name="line.280"></a>
<span class="sourceLineNo">281</span>        } else {<a name="line.281"></a>
<span class="sourceLineNo">282</span>            return m_serviceRegistration.getReference();<a name="line.282"></a>
<span class="sourceLineNo">283</span>        }<a name="line.283"></a>
<span class="sourceLineNo">284</span>    }<a name="line.284"></a>
<span class="sourceLineNo">285</span><a name="line.285"></a>
<span class="sourceLineNo">286</span>    /**<a name="line.286"></a>
<span class="sourceLineNo">287</span>     * Returns a service object for the dependency.<a name="line.287"></a>
<span class="sourceLineNo">288</span>     * @see org.osgi.framework.ServiceFactory#getService(org.osgi.framework.Bundle, org.osgi.framework.ServiceRegistration)<a name="line.288"></a>
<span class="sourceLineNo">289</span>     * @param bundle : the bundle<a name="line.289"></a>
<span class="sourceLineNo">290</span>     * @param registration : the service registration of the registered service<a name="line.290"></a>
<span class="sourceLineNo">291</span>     * @return a new service object or a already created service object (in the case of singleton) or &lt;code&gt;null&lt;/code&gt;<a name="line.291"></a>
<span class="sourceLineNo">292</span>     * if the instance is no more valid.<a name="line.292"></a>
<span class="sourceLineNo">293</span>     */<a name="line.293"></a>
<span class="sourceLineNo">294</span>    public Object getService(Bundle bundle, ServiceRegistration registration) {<a name="line.294"></a>
<span class="sourceLineNo">295</span>        if (getInstanceManager().getState() == InstanceManager.VALID) {<a name="line.295"></a>
<span class="sourceLineNo">296</span>            return m_strategy.getService(bundle, registration);<a name="line.296"></a>
<span class="sourceLineNo">297</span>        } else {<a name="line.297"></a>
<span class="sourceLineNo">298</span>            return null;<a name="line.298"></a>
<span class="sourceLineNo">299</span>        }<a name="line.299"></a>
<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
<span class="sourceLineNo">301</span><a name="line.301"></a>
<span class="sourceLineNo">302</span>    /**<a name="line.302"></a>
<span class="sourceLineNo">303</span>     * The unget method.<a name="line.303"></a>
<span class="sourceLineNo">304</span>     *<a name="line.304"></a>
<span class="sourceLineNo">305</span>     * @see org.osgi.framework.ServiceFactory#ungetService(org.osgi.framework.Bundle,<a name="line.305"></a>
<span class="sourceLineNo">306</span>     * org.osgi.framework.ServiceRegistration, java.lang.Object)<a name="line.306"></a>
<span class="sourceLineNo">307</span>     * @param bundle : bundle<a name="line.307"></a>
<span class="sourceLineNo">308</span>     * @param registration : service registration<a name="line.308"></a>
<span class="sourceLineNo">309</span>     * @param service : service object<a name="line.309"></a>
<span class="sourceLineNo">310</span>     */<a name="line.310"></a>
<span class="sourceLineNo">311</span>    public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {<a name="line.311"></a>
<span class="sourceLineNo">312</span>        m_strategy.ungetService(bundle, registration, service);<a name="line.312"></a>
<span class="sourceLineNo">313</span>    }<a name="line.313"></a>
<span class="sourceLineNo">314</span><a name="line.314"></a>
<span class="sourceLineNo">315</span>    /**<a name="line.315"></a>
<span class="sourceLineNo">316</span>     * Registers the service. The service object must be able to serve this<a name="line.316"></a>
<span class="sourceLineNo">317</span>     * service.<a name="line.317"></a>
<span class="sourceLineNo">318</span>     * This method also notifies the creation strategy of the publication.<a name="line.318"></a>
<span class="sourceLineNo">319</span>     */<a name="line.319"></a>
<span class="sourceLineNo">320</span>    public void registerService() {<a name="line.320"></a>
<span class="sourceLineNo">321</span>        ServiceRegistration reg = null;<a name="line.321"></a>
<span class="sourceLineNo">322</span>        Properties serviceProperties = null;<a name="line.322"></a>
<span class="sourceLineNo">323</span>        synchronized (this) {<a name="line.323"></a>
<span class="sourceLineNo">324</span>            if (m_serviceRegistration != null) {<a name="line.324"></a>
<span class="sourceLineNo">325</span>                return;<a name="line.325"></a>
<span class="sourceLineNo">326</span>            } else {<a name="line.326"></a>
<span class="sourceLineNo">327</span>                if (m_handler.getInstanceManager().getState() == ComponentInstance.VALID &amp;&amp; isAtLeastAServiceControllerValid()) {<a name="line.327"></a>
<span class="sourceLineNo">328</span>                    // Build the service properties list<a name="line.328"></a>
<span class="sourceLineNo">329</span><a name="line.329"></a>
<span class="sourceLineNo">330</span>                    BundleContext bc = m_handler.getInstanceManager().getContext();<a name="line.330"></a>
<span class="sourceLineNo">331</span>                    // Security check<a name="line.331"></a>
<span class="sourceLineNo">332</span>                    if (SecurityHelper.hasPermissionToRegisterServices(<a name="line.332"></a>
<span class="sourceLineNo">333</span>                            m_serviceSpecifications, bc)  &amp;&amp; SecurityHelper.canRegisterService(bc)) {<a name="line.333"></a>
<span class="sourceLineNo">334</span>                        serviceProperties = getServiceProperties();<a name="line.334"></a>
<span class="sourceLineNo">335</span>                        m_strategy.onPublication(getInstanceManager(),<a name="line.335"></a>
<span class="sourceLineNo">336</span>                                getServiceSpecificationsToRegister(),<a name="line.336"></a>
<span class="sourceLineNo">337</span>                                serviceProperties);<a name="line.337"></a>
<span class="sourceLineNo">338</span>                        m_serviceRegistration = bc.registerService(<a name="line.338"></a>
<span class="sourceLineNo">339</span>                                getServiceSpecificationsToRegister(), this,<a name="line.339"></a>
<span class="sourceLineNo">340</span>                                (Dictionary) serviceProperties);<a name="line.340"></a>
<span class="sourceLineNo">341</span>                        reg = m_serviceRegistration; // Stack confinement<a name="line.341"></a>
<span class="sourceLineNo">342</span>                    } else {<a name="line.342"></a>
<span class="sourceLineNo">343</span>                        throw new SecurityException("The bundle "<a name="line.343"></a>
<span class="sourceLineNo">344</span>                                + bc.getBundle().getBundleId()<a name="line.344"></a>
<span class="sourceLineNo">345</span>                                + " does not have the"<a name="line.345"></a>
<span class="sourceLineNo">346</span>                                + " permission to register the services "<a name="line.346"></a>
<span class="sourceLineNo">347</span>                                + Arrays.asList(m_serviceSpecifications));<a name="line.347"></a>
<span class="sourceLineNo">348</span>                    }<a name="line.348"></a>
<span class="sourceLineNo">349</span>                }<a name="line.349"></a>
<span class="sourceLineNo">350</span>            }<a name="line.350"></a>
<span class="sourceLineNo">351</span>        }<a name="line.351"></a>
<span class="sourceLineNo">352</span><a name="line.352"></a>
<span class="sourceLineNo">353</span>        // An update may happen during the registration, re-check and apply.<a name="line.353"></a>
<span class="sourceLineNo">354</span>        // This must be call outside the synchronized block.<a name="line.354"></a>
<span class="sourceLineNo">355</span>        // If the registration is null, the security helper returns false.<a name="line.355"></a>
<span class="sourceLineNo">356</span>        if (m_wasUpdated  &amp;&amp; SecurityHelper.canUpdateService(reg)) {<a name="line.356"></a>
<span class="sourceLineNo">357</span>            Properties updated = getServiceProperties();<a name="line.357"></a>
<span class="sourceLineNo">358</span>            reg.setProperties((Dictionary) updated);<a name="line.358"></a>
<span class="sourceLineNo">359</span>            m_publishedProperties = updated;<a name="line.359"></a>
<span class="sourceLineNo">360</span>            m_wasUpdated = false;<a name="line.360"></a>
<span class="sourceLineNo">361</span>        }<a name="line.361"></a>
<span class="sourceLineNo">362</span><a name="line.362"></a>
<span class="sourceLineNo">363</span>        synchronized (this) {<a name="line.363"></a>
<span class="sourceLineNo">364</span>            // Call the post-registration callback in the same thread holding<a name="line.364"></a>
<span class="sourceLineNo">365</span>            // the monitor lock.<a name="line.365"></a>
<span class="sourceLineNo">366</span>            // This allows to be sure that the callback is called once per<a name="line.366"></a>
<span class="sourceLineNo">367</span>            // registration.<a name="line.367"></a>
<span class="sourceLineNo">368</span>            // But the callback must take care to not create a deadlock<a name="line.368"></a>
<span class="sourceLineNo">369</span>            if (m_postRegistration != null) {<a name="line.369"></a>
<span class="sourceLineNo">370</span>                try {<a name="line.370"></a>
<span class="sourceLineNo">371</span>                    m_postRegistration<a name="line.371"></a>
<span class="sourceLineNo">372</span>                            .call(new Object[] { m_serviceRegistration<a name="line.372"></a>
<span class="sourceLineNo">373</span>                                    .getReference() });<a name="line.373"></a>
<span class="sourceLineNo">374</span>                } catch (Exception e) {<a name="line.374"></a>
<span class="sourceLineNo">375</span>                    m_handler.error(<a name="line.375"></a>
<span class="sourceLineNo">376</span>                            "Cannot invoke the post-registration callback "<a name="line.376"></a>
<span class="sourceLineNo">377</span>                                    + m_postRegistration.getMethod(), e);<a name="line.377"></a>
<span class="sourceLineNo">378</span>                }<a name="line.378"></a>
<span class="sourceLineNo">379</span>            }<a name="line.379"></a>
<span class="sourceLineNo">380</span>        }<a name="line.380"></a>
<span class="sourceLineNo">381</span><a name="line.381"></a>
<span class="sourceLineNo">382</span>        // Notify: ProvidedServiceListeners.serviceRegistered()<a name="line.382"></a>
<span class="sourceLineNo">383</span>        notifyListeners(+1);<a name="line.383"></a>
<span class="sourceLineNo">384</span><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>     * Withdraws the service from the service registry.<a name="line.388"></a>
<span class="sourceLineNo">389</span>     */<a name="line.389"></a>
<span class="sourceLineNo">390</span>    public void unregisterService() {<a name="line.390"></a>
<span class="sourceLineNo">391</span>        ServiceReference ref = null;<a name="line.391"></a>
<span class="sourceLineNo">392</span>        synchronized (this) {<a name="line.392"></a>
<span class="sourceLineNo">393</span>            // Create a copy of the service reference in the case we need<a name="line.393"></a>
<span class="sourceLineNo">394</span>            // to inject it to the post-unregistration callback.<a name="line.394"></a>
<span class="sourceLineNo">395</span>            if (m_serviceRegistration != null) {<a name="line.395"></a>
<span class="sourceLineNo">396</span>                ref = m_serviceRegistration.getReference();<a name="line.396"></a>
<span class="sourceLineNo">397</span>                m_serviceRegistration.unregister();<a name="line.397"></a>
<span class="sourceLineNo">398</span>                m_serviceRegistration = null;<a name="line.398"></a>
<span class="sourceLineNo">399</span>            }<a name="line.399"></a>
<span class="sourceLineNo">400</span><a name="line.400"></a>
<span class="sourceLineNo">401</span>            m_strategy.onUnpublication();<a name="line.401"></a>
<span class="sourceLineNo">402</span><a name="line.402"></a>
<span class="sourceLineNo">403</span>            // Call the post-unregistration callback in the same thread holding the monitor lock.<a name="line.403"></a>
<span class="sourceLineNo">404</span>            // This allows to be sure that the callback is called once per unregistration.<a name="line.404"></a>
<span class="sourceLineNo">405</span>            // But the callback must take care to not create a deadlock<a name="line.405"></a>
<span class="sourceLineNo">406</span>            if (m_postUnregistration != null   &amp;&amp; ref != null) {<a name="line.406"></a>
<span class="sourceLineNo">407</span>                try {<a name="line.407"></a>
<span class="sourceLineNo">408</span>                    m_postUnregistration.call(new Object[] { ref });<a name="line.408"></a>
<span class="sourceLineNo">409</span>                } catch (Exception e) {<a name="line.409"></a>
<span class="sourceLineNo">410</span>                    m_handler.error("Cannot invoke the post-unregistration callback " + m_postUnregistration.getMethod(), e);<a name="line.410"></a>
<span class="sourceLineNo">411</span>                }<a name="line.411"></a>
<span class="sourceLineNo">412</span>            }<a name="line.412"></a>
<span class="sourceLineNo">413</span>        }<a name="line.413"></a>
<span class="sourceLineNo">414</span><a name="line.414"></a>
<span class="sourceLineNo">415</span>        // Notify: ProvidedServiceListeners.serviceUnregistered()<a name="line.415"></a>
<span class="sourceLineNo">416</span>        if (ref != null) {<a name="line.416"></a>
<span class="sourceLineNo">417</span>            notifyListeners(-1);<a name="line.417"></a>
<span class="sourceLineNo">418</span>        }<a name="line.418"></a>
<span class="sourceLineNo">419</span><a name="line.419"></a>
<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
<span class="sourceLineNo">421</span><a name="line.421"></a>
<span class="sourceLineNo">422</span>    /**<a name="line.422"></a>
<span class="sourceLineNo">423</span>     * Get the current provided service state.<a name="line.423"></a>
<span class="sourceLineNo">424</span>     * @return The state of the provided service.<a name="line.424"></a>
<span class="sourceLineNo">425</span>     */<a name="line.425"></a>
<span class="sourceLineNo">426</span>    public int getState() {<a name="line.426"></a>
<span class="sourceLineNo">427</span>        if (m_serviceRegistration == null) {<a name="line.427"></a>
<span class="sourceLineNo">428</span>            return UNREGISTERED;<a name="line.428"></a>
<span class="sourceLineNo">429</span>        } else {<a name="line.429"></a>
<span class="sourceLineNo">430</span>            return REGISTERED;<a name="line.430"></a>
<span class="sourceLineNo">431</span>        }<a name="line.431"></a>
<span class="sourceLineNo">432</span>    }<a name="line.432"></a>
<span class="sourceLineNo">433</span><a name="line.433"></a>
<span class="sourceLineNo">434</span>    protected InstanceManager getInstanceManager() {<a name="line.434"></a>
<span class="sourceLineNo">435</span>        return m_handler.getInstanceManager();<a name="line.435"></a>
<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
<span class="sourceLineNo">437</span><a name="line.437"></a>
<span class="sourceLineNo">438</span>    /**<a name="line.438"></a>
<span class="sourceLineNo">439</span>     * Return the list of properties attached to this service. This list<a name="line.439"></a>
<span class="sourceLineNo">440</span>     * contains only property where a value are assigned.<a name="line.440"></a>
<span class="sourceLineNo">441</span>     *<a name="line.441"></a>
<span class="sourceLineNo">442</span>     * @return the properties attached to the provided service.<a name="line.442"></a>
<span class="sourceLineNo">443</span>     */<a name="line.443"></a>
<span class="sourceLineNo">444</span>    private Properties getServiceProperties() {<a name="line.444"></a>
<span class="sourceLineNo">445</span>        // Build the service properties list<a name="line.445"></a>
<span class="sourceLineNo">446</span>        Properties serviceProperties = new Properties();<a name="line.446"></a>
<span class="sourceLineNo">447</span>        for (Property p : m_properties.values()) {<a name="line.447"></a>
<span class="sourceLineNo">448</span>            final Object value = p.getValue();<a name="line.448"></a>
<span class="sourceLineNo">449</span>            if (value != null  &amp;&amp; value != Property.NO_VALUE) {<a name="line.449"></a>
<span class="sourceLineNo">450</span>                serviceProperties.put(p.getName(), value);<a name="line.450"></a>
<span class="sourceLineNo">451</span>            }<a name="line.451"></a>
<span class="sourceLineNo">452</span>        }<a name="line.452"></a>
<span class="sourceLineNo">453</span>        return serviceProperties;<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>    /**<a name="line.456"></a>
<span class="sourceLineNo">457</span>     * Get the list of properties attached to the service registration.<a name="line.457"></a>
<span class="sourceLineNo">458</span>     * @return the properties attached to the provided service.<a name="line.458"></a>
<span class="sourceLineNo">459</span>     */<a name="line.459"></a>
<span class="sourceLineNo">460</span>    public synchronized Property[] getProperties() {<a name="line.460"></a>
<span class="sourceLineNo">461</span>        return m_properties.values().toArray(new Property[m_properties.size()]);<a name="line.461"></a>
<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
<span class="sourceLineNo">463</span><a name="line.463"></a>
<span class="sourceLineNo">464</span>    /**<a name="line.464"></a>
<span class="sourceLineNo">465</span>     * Update the service properties. The new list of properties is sent to<a name="line.465"></a>
<span class="sourceLineNo">466</span>     * the service registry.<a name="line.466"></a>
<span class="sourceLineNo">467</span>     */<a name="line.467"></a>
<span class="sourceLineNo">468</span>    public void update() {<a name="line.468"></a>
<span class="sourceLineNo">469</span>        boolean doCallListener = false;<a name="line.469"></a>
<span class="sourceLineNo">470</span>        synchronized (this) {<a name="line.470"></a>
<span class="sourceLineNo">471</span>            // Update the service registration<a name="line.471"></a>
<span class="sourceLineNo">472</span>            if (m_serviceRegistration != null) {<a name="line.472"></a>
<span class="sourceLineNo">473</span>                Properties updated = getServiceProperties();<a name="line.473"></a>
<span class="sourceLineNo">474</span>                Dictionary oldProps = (Dictionary) ((Properties) m_publishedProperties).clone();<a name="line.474"></a>
<span class="sourceLineNo">475</span>                Dictionary newProps = (Dictionary) (updated.clone());<a name="line.475"></a>
<span class="sourceLineNo">476</span><a name="line.476"></a>
<span class="sourceLineNo">477</span>                // Remove keys that must not be compared<a name="line.477"></a>
<span class="sourceLineNo">478</span>                newProps.remove(Factory.INSTANCE_NAME_PROPERTY);<a name="line.478"></a>
<span class="sourceLineNo">479</span>                oldProps.remove(Factory.INSTANCE_NAME_PROPERTY);<a name="line.479"></a>
<span class="sourceLineNo">480</span>                newProps.remove(Constants.SERVICE_ID);<a name="line.480"></a>
<span class="sourceLineNo">481</span>                oldProps.remove(Constants.SERVICE_ID);<a name="line.481"></a>
<span class="sourceLineNo">482</span>                newProps.remove(Constants.SERVICE_PID);<a name="line.482"></a>
<span class="sourceLineNo">483</span>                oldProps.remove(Constants.SERVICE_PID);<a name="line.483"></a>
<span class="sourceLineNo">484</span>                newProps.remove("factory.name");<a name="line.484"></a>
<span class="sourceLineNo">485</span>                oldProps.remove("factory.name");<a name="line.485"></a>
<span class="sourceLineNo">486</span>                newProps.remove(ConfigurationAdmin.SERVICE_FACTORYPID);<a name="line.486"></a>
<span class="sourceLineNo">487</span>                oldProps.remove(ConfigurationAdmin.SERVICE_FACTORYPID);<a name="line.487"></a>
<span class="sourceLineNo">488</span><a name="line.488"></a>
<span class="sourceLineNo">489</span>                // Trigger the update only if the properties have changed.<a name="line.489"></a>
<span class="sourceLineNo">490</span><a name="line.490"></a>
<span class="sourceLineNo">491</span>                // First check, are the size equals<a name="line.491"></a>
<span class="sourceLineNo">492</span>                if (oldProps.size() != newProps.size()) {<a name="line.492"></a>
<span class="sourceLineNo">493</span>                    if (SecurityHelper.canUpdateService(m_serviceRegistration)) {<a name="line.493"></a>
<span class="sourceLineNo">494</span>                        m_handler.info("Updating Registration : " + oldProps.size() + " / " + newProps.size());<a name="line.494"></a>
<span class="sourceLineNo">495</span>                        m_publishedProperties = updated;<a name="line.495"></a>
<span class="sourceLineNo">496</span>                        m_serviceRegistration.setProperties(updated);<a name="line.496"></a>
<span class="sourceLineNo">497</span>                        doCallListener = true;<a name="line.497"></a>
<span class="sourceLineNo">498</span>                    }<a name="line.498"></a>
<span class="sourceLineNo">499</span>                } else {<a name="line.499"></a>
<span class="sourceLineNo">500</span>                    // Check changes<a name="line.500"></a>
<span class="sourceLineNo">501</span>                    Enumeration keys = oldProps.keys();<a name="line.501"></a>
<span class="sourceLineNo">502</span>                    boolean hasChanged = false;<a name="line.502"></a>
<span class="sourceLineNo">503</span>                    while (! hasChanged  &amp;&amp; keys.hasMoreElements()) {<a name="line.503"></a>
<span class="sourceLineNo">504</span>                        String k = (String) keys.nextElement();<a name="line.504"></a>
<span class="sourceLineNo">505</span>                        Object val = oldProps.get(k);<a name="line.505"></a>
<span class="sourceLineNo">506</span>                        if (! val.equals(updated.get(k))) {<a name="line.506"></a>
<span class="sourceLineNo">507</span>                            hasChanged = true;<a name="line.507"></a>
<span class="sourceLineNo">508</span>                        }<a name="line.508"></a>
<span class="sourceLineNo">509</span>                    }<a name="line.509"></a>
<span class="sourceLineNo">510</span>                    if (hasChanged  &amp;&amp; SecurityHelper.canUpdateService(m_serviceRegistration)) {<a name="line.510"></a>
<span class="sourceLineNo">511</span>                        m_handler.info("Updating Registration : " + updated);<a name="line.511"></a>
<span class="sourceLineNo">512</span>                        m_publishedProperties = updated;<a name="line.512"></a>
<span class="sourceLineNo">513</span>                        m_serviceRegistration.setProperties(updated);<a name="line.513"></a>
<span class="sourceLineNo">514</span>                        doCallListener = true;<a name="line.514"></a>
<span class="sourceLineNo">515</span>                    }<a name="line.515"></a>
<span class="sourceLineNo">516</span>                }<a name="line.516"></a>
<span class="sourceLineNo">517</span>            } else {<a name="line.517"></a>
<span class="sourceLineNo">518</span>                // Need to be updated later.<a name="line.518"></a>
<span class="sourceLineNo">519</span>                m_wasUpdated = true;<a name="line.519"></a>
<span class="sourceLineNo">520</span>            }<a name="line.520"></a>
<span class="sourceLineNo">521</span>        }<a name="line.521"></a>
<span class="sourceLineNo">522</span>        if (doCallListener) {<a name="line.522"></a>
<span class="sourceLineNo">523</span>            // Notify: ProvidedServiceListeners.serviceUpdated()<a name="line.523"></a>
<span class="sourceLineNo">524</span>            notifyListeners(0);<a name="line.524"></a>
<span class="sourceLineNo">525</span>        }<a name="line.525"></a>
<span class="sourceLineNo">526</span>    }<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>     * Add properties to the list.<a name="line.529"></a>
<span class="sourceLineNo">530</span>     * @param props : properties to add<a name="line.530"></a>
<span class="sourceLineNo">531</span>     */<a name="line.531"></a>
<span class="sourceLineNo">532</span>    protected void addProperties(Dictionary props) {<a name="line.532"></a>
<span class="sourceLineNo">533</span>        Enumeration keys = props.keys();<a name="line.533"></a>
<span class="sourceLineNo">534</span>        boolean updated = false;<a name="line.534"></a>
<span class="sourceLineNo">535</span>        while (keys.hasMoreElements()) {<a name="line.535"></a>
<span class="sourceLineNo">536</span>            String key = (String) keys.nextElement();<a name="line.536"></a>
<span class="sourceLineNo">537</span>            Object value = props.get(key);<a name="line.537"></a>
<span class="sourceLineNo">538</span><a name="line.538"></a>
<span class="sourceLineNo">539</span>            Property property  = m_properties.get(key);<a name="line.539"></a>
<span class="sourceLineNo">540</span>            if (property != null) {<a name="line.540"></a>
<span class="sourceLineNo">541</span>                // Already existing property<a name="line.541"></a>
<span class="sourceLineNo">542</span>                if (property.getValue() == null  || ! value.equals(property.getValue())) {<a name="line.542"></a>
<span class="sourceLineNo">543</span>                    m_properties.get(key).setValue(value);<a name="line.543"></a>
<span class="sourceLineNo">544</span>                    updated = true;<a name="line.544"></a>
<span class="sourceLineNo">545</span>                }<a name="line.545"></a>
<span class="sourceLineNo">546</span>            } else {<a name="line.546"></a>
<span class="sourceLineNo">547</span>                try {<a name="line.547"></a>
<span class="sourceLineNo">548</span>                    // Create the property.<a name="line.548"></a>
<span class="sourceLineNo">549</span>                    property = new Property(key, null, null, value, getInstanceManager(), m_handler);<a name="line.549"></a>
<span class="sourceLineNo">550</span>                    addProperty(property);<a name="line.550"></a>
<span class="sourceLineNo">551</span>                    updated = true;<a name="line.551"></a>
<span class="sourceLineNo">552</span>                } catch (ConfigurationException e) {<a name="line.552"></a>
<span class="sourceLineNo">553</span>                    m_handler.error("The propagated property " + key + " cannot be created correctly : " + e.getMessage());<a name="line.553"></a>
<span class="sourceLineNo">554</span>                }<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><a name="line.557"></a>
<span class="sourceLineNo">558</span>        if (updated) {<a name="line.558"></a>
<span class="sourceLineNo">559</span>            m_handler.info("Update triggered by adding properties " + props);<a name="line.559"></a>
<span class="sourceLineNo">560</span>            update();<a name="line.560"></a>
<span class="sourceLineNo">561</span>        }<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>    /**<a name="line.564"></a>
<span class="sourceLineNo">565</span>     * Remove properties from the list.<a name="line.565"></a>
<span class="sourceLineNo">566</span>     * @param props : properties to remove<a name="line.566"></a>
<span class="sourceLineNo">567</span>     */<a name="line.567"></a>
<span class="sourceLineNo">568</span>    protected void deleteProperties(Dictionary props) {<a name="line.568"></a>
<span class="sourceLineNo">569</span>        Enumeration keys = props.keys();<a name="line.569"></a>
<span class="sourceLineNo">570</span>        boolean mustUpdate = false;<a name="line.570"></a>
<span class="sourceLineNo">571</span>        while (keys.hasMoreElements()) {<a name="line.571"></a>
<span class="sourceLineNo">572</span>            String key = (String) keys.nextElement();<a name="line.572"></a>
<span class="sourceLineNo">573</span>            mustUpdate = mustUpdate || removeProperty(key);<a name="line.573"></a>
<span class="sourceLineNo">574</span>        }<a name="line.574"></a>
<span class="sourceLineNo">575</span><a name="line.575"></a>
<span class="sourceLineNo">576</span>        if (mustUpdate) {<a name="line.576"></a>
<span class="sourceLineNo">577</span>            m_handler.info("Update triggered when removing properties : " + props);<a name="line.577"></a>
<span class="sourceLineNo">578</span>            update();<a name="line.578"></a>
<span class="sourceLineNo">579</span>        }<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>    /**<a name="line.582"></a>
<span class="sourceLineNo">583</span>     * Get the published service specifications.<a name="line.583"></a>
<span class="sourceLineNo">584</span>     * @return the list of provided service specifications (i.e. java<a name="line.584"></a>
<span class="sourceLineNo">585</span>     * interface).<a name="line.585"></a>
<span class="sourceLineNo">586</span>     */<a name="line.586"></a>
<span class="sourceLineNo">587</span>    public String[] getServiceSpecifications() {<a name="line.587"></a>
<span class="sourceLineNo">588</span>        return m_serviceSpecifications;<a name="line.588"></a>
<span class="sourceLineNo">589</span>    }<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>     * Get the service registration.<a name="line.592"></a>
<span class="sourceLineNo">593</span>     * @return the service registration of this service.<a name="line.593"></a>
<span class="sourceLineNo">594</span>     */<a name="line.594"></a>
<span class="sourceLineNo">595</span>    public ServiceRegistration getServiceRegistration() {<a name="line.595"></a>
<span class="sourceLineNo">596</span>        return m_serviceRegistration;<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>    /**<a name="line.599"></a>
<span class="sourceLineNo">600</span>     * Sets the service controller on this provided service.<a name="line.600"></a>
<span class="sourceLineNo">601</span>     * @param field the field attached to this controller<a name="line.601"></a>
<span class="sourceLineNo">602</span>     * @param value the value the initial value<a name="line.602"></a>
<span class="sourceLineNo">603</span>     * @param specification the target specification, if &lt;code&gt;null&lt;/code&gt;<a name="line.603"></a>
<span class="sourceLineNo">604</span>     * affect all specifications.<a name="line.604"></a>
<span class="sourceLineNo">605</span>     */<a name="line.605"></a>
<span class="sourceLineNo">606</span>    public void setController(String field, boolean value, String specification) {<a name="line.606"></a>
<span class="sourceLineNo">607</span>        if (specification == null) {<a name="line.607"></a>
<span class="sourceLineNo">608</span>            m_controllers.put(ALL_SPECIFICATIONS_FOR_CONTROLLERS, new ServiceController(field, value));<a name="line.608"></a>
<span class="sourceLineNo">609</span>        } else {<a name="line.609"></a>
<span class="sourceLineNo">610</span>            m_controllers.put(specification, new ServiceController(field, value));<a name="line.610"></a>
<span class="sourceLineNo">611</span><a name="line.611"></a>
<span class="sourceLineNo">612</span>        }<a name="line.612"></a>
<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
<span class="sourceLineNo">614</span><a name="line.614"></a>
<span class="sourceLineNo">615</span>    /**<a name="line.615"></a>
<span class="sourceLineNo">616</span>     * Gets the service controller attached to the given field.<a name="line.616"></a>
<span class="sourceLineNo">617</span>     * @param field the field name<a name="line.617"></a>
<span class="sourceLineNo">618</span>     * @return the service controller, {@code null} if there is no service controller attached to the given field<a name="line.618"></a>
<span class="sourceLineNo">619</span>     * name.<a name="line.619"></a>
<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
<span class="sourceLineNo">621</span>    public ServiceController getController(String field) {<a name="line.621"></a>
<span class="sourceLineNo">622</span>        for (ServiceController controller: m_controllers.values()) {<a name="line.622"></a>
<span class="sourceLineNo">623</span>            if (field.equals(controller.m_field)) {<a name="line.623"></a>
<span class="sourceLineNo">624</span>                return controller;<a name="line.624"></a>
<span class="sourceLineNo">625</span>            }<a name="line.625"></a>
<span class="sourceLineNo">626</span>        }<a name="line.626"></a>
<span class="sourceLineNo">627</span>        return null;<a name="line.627"></a>
<span class="sourceLineNo">628</span>    }<a name="line.628"></a>
<span class="sourceLineNo">629</span><a name="line.629"></a>
<span class="sourceLineNo">630</span>    /**<a name="line.630"></a>
<span class="sourceLineNo">631</span>     * Gets the service controller handling the service publishing the given specification.<a name="line.631"></a>
<span class="sourceLineNo">632</span>     * @param spec the specification (qualified class name)<a name="line.632"></a>
<span class="sourceLineNo">633</span>     * @return the service controller, {@code null} if there is no service controller handling the service publishing<a name="line.633"></a>
<span class="sourceLineNo">634</span>     * the given service specification<a name="line.634"></a>
<span class="sourceLineNo">635</span>     */<a name="line.635"></a>
<span class="sourceLineNo">636</span>    public ServiceController getControllerBySpecification(String spec) {<a name="line.636"></a>
<span class="sourceLineNo">637</span>        return m_controllers.get(spec);<a name="line.637"></a>
<span class="sourceLineNo">638</span>    }<a name="line.638"></a>
<span class="sourceLineNo">639</span><a name="line.639"></a>
<span class="sourceLineNo">640</span>    /**<a name="line.640"></a>
<span class="sourceLineNo">641</span>     * Checks if at least one service controller is valid.<a name="line.641"></a>
<span class="sourceLineNo">642</span>     * @return &lt;code&gt;true&lt;/code&gt; if one service controller at least<a name="line.642"></a>
<span class="sourceLineNo">643</span>     * is valid.<a name="line.643"></a>
<span class="sourceLineNo">644</span>     */<a name="line.644"></a>
<span class="sourceLineNo">645</span>    private boolean isAtLeastAServiceControllerValid() {<a name="line.645"></a>
<span class="sourceLineNo">646</span>        // No controller<a name="line.646"></a>
<span class="sourceLineNo">647</span>        if (m_controllers.isEmpty()) {<a name="line.647"></a>
<span class="sourceLineNo">648</span>            return true;<a name="line.648"></a>
<span class="sourceLineNo">649</span>        }<a name="line.649"></a>
<span class="sourceLineNo">650</span><a name="line.650"></a>
<span class="sourceLineNo">651</span>        for (ServiceController controller : m_controllers.values()) {<a name="line.651"></a>
<span class="sourceLineNo">652</span>            if (controller.getValue()) {<a name="line.652"></a>
<span class="sourceLineNo">653</span>                return true;<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>        return false;<a name="line.656"></a>
<span class="sourceLineNo">657</span>    }<a name="line.657"></a>
<span class="sourceLineNo">658</span><a name="line.658"></a>
<span class="sourceLineNo">659</span>    private String[] getServiceSpecificationsToRegister() {<a name="line.659"></a>
<span class="sourceLineNo">660</span>        if (m_controllers.isEmpty()) {<a name="line.660"></a>
<span class="sourceLineNo">661</span>            return m_serviceSpecifications;<a name="line.661"></a>
<span class="sourceLineNo">662</span>        }<a name="line.662"></a>
<span class="sourceLineNo">663</span><a name="line.663"></a>
<span class="sourceLineNo">664</span>        ArrayList&lt;String&gt; l = new ArrayList&lt;String&gt;();<a name="line.664"></a>
<span class="sourceLineNo">665</span>        if (m_controllers.containsKey(ALL_SPECIFICATIONS_FOR_CONTROLLERS)) {<a name="line.665"></a>
<span class="sourceLineNo">666</span>            ServiceController ctrl = m_controllers.get(ALL_SPECIFICATIONS_FOR_CONTROLLERS);<a name="line.666"></a>
<span class="sourceLineNo">667</span>            if (ctrl.m_value) {<a name="line.667"></a>
<span class="sourceLineNo">668</span>                l.addAll(Arrays.asList(m_serviceSpecifications));<a name="line.668"></a>
<span class="sourceLineNo">669</span>            }<a name="line.669"></a>
<span class="sourceLineNo">670</span>        }<a name="line.670"></a>
<span class="sourceLineNo">671</span><a name="line.671"></a>
<span class="sourceLineNo">672</span>        for (String spec : m_controllers.keySet()) {<a name="line.672"></a>
<span class="sourceLineNo">673</span>            ServiceController ctrl = m_controllers.get(spec);<a name="line.673"></a>
<span class="sourceLineNo">674</span>            if (ctrl.m_value) {<a name="line.674"></a>
<span class="sourceLineNo">675</span>                if (!ALL_SPECIFICATIONS_FOR_CONTROLLERS.equals(spec)) { // Already added.<a name="line.675"></a>
<span class="sourceLineNo">676</span>                    if (!l.contains(spec)) {<a name="line.676"></a>
<span class="sourceLineNo">677</span>                        l.add(spec);<a name="line.677"></a>
<span class="sourceLineNo">678</span>                    }<a name="line.678"></a>
<span class="sourceLineNo">679</span>                }<a name="line.679"></a>
<span class="sourceLineNo">680</span>            } else {<a name="line.680"></a>
<span class="sourceLineNo">681</span>                l.remove(spec);<a name="line.681"></a>
<span class="sourceLineNo">682</span>            }<a name="line.682"></a>
<span class="sourceLineNo">683</span>        }<a name="line.683"></a>
<span class="sourceLineNo">684</span><a name="line.684"></a>
<span class="sourceLineNo">685</span>        return l.toArray(new String[l.size()]);<a name="line.685"></a>
<span class="sourceLineNo">686</span><a name="line.686"></a>
<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
<span class="sourceLineNo">688</span><a name="line.688"></a>
<span class="sourceLineNo">689</span>    public void setPostRegistrationCallback(Callback cb) {<a name="line.689"></a>
<span class="sourceLineNo">690</span>        m_postRegistration = cb;<a name="line.690"></a>
<span class="sourceLineNo">691</span>    }<a name="line.691"></a>
<span class="sourceLineNo">692</span><a name="line.692"></a>
<span class="sourceLineNo">693</span>    public void setPostUnregistrationCallback(Callback cb) {<a name="line.693"></a>
<span class="sourceLineNo">694</span>        m_postUnregistration = cb;<a name="line.694"></a>
<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
<span class="sourceLineNo">696</span><a name="line.696"></a>
<span class="sourceLineNo">697</span>    public int getPolicy() {<a name="line.697"></a>
<span class="sourceLineNo">698</span>        return m_policy;<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>    public Class&lt;? extends CreationStrategy&gt; getCreationStrategy() {<a name="line.701"></a>
<span class="sourceLineNo">702</span>        return m_strategy.getClass();<a name="line.702"></a>
<span class="sourceLineNo">703</span>    }<a name="line.703"></a>
<span class="sourceLineNo">704</span><a name="line.704"></a>
<span class="sourceLineNo">705</span>    /**<a name="line.705"></a>
<span class="sourceLineNo">706</span>     * Add the given listener to the provided service handler's list of listeners.<a name="line.706"></a>
<span class="sourceLineNo">707</span>     *<a name="line.707"></a>
<span class="sourceLineNo">708</span>     * @param listener the {@code ProvidedServiceListener} object to be added<a name="line.708"></a>
<span class="sourceLineNo">709</span>     * @throws NullPointerException if {@code listener} is {@code null}<a name="line.709"></a>
<span class="sourceLineNo">710</span>     */<a name="line.710"></a>
<span class="sourceLineNo">711</span>    public void addListener(ProvidedServiceListener listener) {<a name="line.711"></a>
<span class="sourceLineNo">712</span>        if (listener == null) {<a name="line.712"></a>
<span class="sourceLineNo">713</span>            throw new NullPointerException("null listener");<a name="line.713"></a>
<span class="sourceLineNo">714</span>        }<a name="line.714"></a>
<span class="sourceLineNo">715</span>        synchronized (m_listeners) {<a name="line.715"></a>
<span class="sourceLineNo">716</span>            m_listeners.add(listener);<a name="line.716"></a>
<span class="sourceLineNo">717</span>        }<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>     * Remove the given listener from the provided service handler's list of listeners.<a name="line.721"></a>
<span class="sourceLineNo">722</span>     *<a name="line.722"></a>
<span class="sourceLineNo">723</span>     * @param listener the {@code ProvidedServiceListener} object to be removed<a name="line.723"></a>
<span class="sourceLineNo">724</span>     * @throws NullPointerException if {@code listener} is {@code null}<a name="line.724"></a>
<span class="sourceLineNo">725</span>     * @throws NoSuchElementException if {@code listener} wasn't present the in provided service handler's list of listeners<a name="line.725"></a>
<span class="sourceLineNo">726</span>     */<a name="line.726"></a>
<span class="sourceLineNo">727</span>    public void removeListener(ProvidedServiceListener listener) {<a name="line.727"></a>
<span class="sourceLineNo">728</span>        if (listener == null) {<a name="line.728"></a>
<span class="sourceLineNo">729</span>            throw new NullPointerException("null listener");<a name="line.729"></a>
<span class="sourceLineNo">730</span>        }<a name="line.730"></a>
<span class="sourceLineNo">731</span>        synchronized (m_listeners) {<a name="line.731"></a>
<span class="sourceLineNo">732</span>            // We definitely cannot rely on listener's equals method...<a name="line.732"></a>
<span class="sourceLineNo">733</span>            // ...so we need to manually search for the listener, using ==.<a name="line.733"></a>
<span class="sourceLineNo">734</span>            int i = -1;<a name="line.734"></a>
<span class="sourceLineNo">735</span>            for(int j = m_listeners.size() -1; j&gt;=0 ; j--) {<a name="line.735"></a>
<span class="sourceLineNo">736</span>                if (m_listeners.get(j) == listener) {<a name="line.736"></a>
<span class="sourceLineNo">737</span>                    // Found!<a name="line.737"></a>
<span class="sourceLineNo">738</span>                    i = j;<a name="line.738"></a>
<span class="sourceLineNo">739</span>                    break;<a name="line.739"></a>
<span class="sourceLineNo">740</span>                }<a name="line.740"></a>
<span class="sourceLineNo">741</span>            }<a name="line.741"></a>
<span class="sourceLineNo">742</span>            if (i != -1) {<a name="line.742"></a>
<span class="sourceLineNo">743</span>                m_listeners.remove(i);<a name="line.743"></a>
<span class="sourceLineNo">744</span>            } else {<a name="line.744"></a>
<span class="sourceLineNo">745</span>                throw new NoSuchElementException("no such listener");<a name="line.745"></a>
<span class="sourceLineNo">746</span>            }<a name="line.746"></a>
<span class="sourceLineNo">747</span>        }<a name="line.747"></a>
<span class="sourceLineNo">748</span>    }<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>     * Notify all listeners that a change has occurred in this provided service.<a name="line.751"></a>
<span class="sourceLineNo">752</span>     *<a name="line.752"></a>
<span class="sourceLineNo">753</span>     * @param direction the "direction" of the change (+1:registration, 0:update, -1:unregistration)<a name="line.753"></a>
<span class="sourceLineNo">754</span>     */<a name="line.754"></a>
<span class="sourceLineNo">755</span>    private void notifyListeners(int direction) {<a name="line.755"></a>
<span class="sourceLineNo">756</span>        // Get a snapshot of the listeners<a name="line.756"></a>
<span class="sourceLineNo">757</span>        List&lt;ProvidedServiceListener&gt; tmp;<a name="line.757"></a>
<span class="sourceLineNo">758</span>        synchronized (m_listeners) {<a name="line.758"></a>
<span class="sourceLineNo">759</span>            tmp = new ArrayList&lt;ProvidedServiceListener&gt;(m_listeners);<a name="line.759"></a>
<span class="sourceLineNo">760</span>        }<a name="line.760"></a>
<span class="sourceLineNo">761</span>        // Do notify, outside the m_listeners lock<a name="line.761"></a>
<span class="sourceLineNo">762</span>        for (ProvidedServiceListener l : tmp) {<a name="line.762"></a>
<span class="sourceLineNo">763</span>            try {<a name="line.763"></a>
<span class="sourceLineNo">764</span>                if (direction &gt; 0) {<a name="line.764"></a>
<span class="sourceLineNo">765</span>                    l.serviceRegistered(m_handler.getInstanceManager(), this);<a name="line.765"></a>
<span class="sourceLineNo">766</span>                } else if (direction &lt; 0) {<a name="line.766"></a>
<span class="sourceLineNo">767</span>                    l.serviceUnregistered(m_handler.getInstanceManager(), this);<a name="line.767"></a>
<span class="sourceLineNo">768</span>                } else {<a name="line.768"></a>
<span class="sourceLineNo">769</span>                    l.serviceModified(m_handler.getInstanceManager(), this);<a name="line.769"></a>
<span class="sourceLineNo">770</span>                }<a name="line.770"></a>
<span class="sourceLineNo">771</span>            } catch (Throwable e) {<a name="line.771"></a>
<span class="sourceLineNo">772</span>                // Put a warning on the logger, and continue<a name="line.772"></a>
<span class="sourceLineNo">773</span>                m_handler.warn(<a name="line.773"></a>
<span class="sourceLineNo">774</span>                        String.format(<a name="line.774"></a>
<span class="sourceLineNo">775</span>                                "[%s] A ProvidedServiceListener has failed: %s",<a name="line.775"></a>
<span class="sourceLineNo">776</span>                                m_handler.getInstanceManager().getInstanceName(),<a name="line.776"></a>
<span class="sourceLineNo">777</span>                                e.getMessage())<a name="line.777"></a>
<span class="sourceLineNo">778</span>                        , e);<a name="line.778"></a>
<span class="sourceLineNo">779</span>            }<a name="line.779"></a>
<span class="sourceLineNo">780</span>        }<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>     * Removes all the listeners from this provided service before it gets disposed.<a name="line.784"></a>
<span class="sourceLineNo">785</span>     */<a name="line.785"></a>
<span class="sourceLineNo">786</span>    public void cleanup() {<a name="line.786"></a>
<span class="sourceLineNo">787</span>        synchronized (m_listeners) {<a name="line.787"></a>
<span class="sourceLineNo">788</span>            m_listeners.clear();<a name="line.788"></a>
<span class="sourceLineNo">789</span>        }<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>     * Service Controller.<a name="line.793"></a>
<span class="sourceLineNo">794</span>     */<a name="line.794"></a>
<span class="sourceLineNo">795</span>    class ServiceController {<a name="line.795"></a>
<span class="sourceLineNo">796</span>        /**<a name="line.796"></a>
<span class="sourceLineNo">797</span>         * The controller value.<a name="line.797"></a>
<span class="sourceLineNo">798</span>         */<a name="line.798"></a>
<span class="sourceLineNo">799</span>        private boolean m_value;<a name="line.799"></a>
<span class="sourceLineNo">800</span>        /**<a name="line.800"></a>
<span class="sourceLineNo">801</span>         * The field attached to this controller.<a name="line.801"></a>
<span class="sourceLineNo">802</span>         */<a name="line.802"></a>
<span class="sourceLineNo">803</span>        private final String m_field;<a name="line.803"></a>
<span class="sourceLineNo">804</span><a name="line.804"></a>
<span class="sourceLineNo">805</span>        /**<a name="line.805"></a>
<span class="sourceLineNo">806</span>         * Creates a ServiceController.<a name="line.806"></a>
<span class="sourceLineNo">807</span>         * @param field the field<a name="line.807"></a>
<span class="sourceLineNo">808</span>         * @param value the initial value<a name="line.808"></a>
<span class="sourceLineNo">809</span>         */<a name="line.809"></a>
<span class="sourceLineNo">810</span>        public ServiceController(String field, boolean value) {<a name="line.810"></a>
<span class="sourceLineNo">811</span>            m_field = field;<a name="line.811"></a>
<span class="sourceLineNo">812</span>            m_value = value;<a name="line.812"></a>
<span class="sourceLineNo">813</span>        }<a name="line.813"></a>
<span class="sourceLineNo">814</span><a name="line.814"></a>
<span class="sourceLineNo">815</span>        public String getField() {<a name="line.815"></a>
<span class="sourceLineNo">816</span>            return m_field;<a name="line.816"></a>
<span class="sourceLineNo">817</span>        }<a name="line.817"></a>
<span class="sourceLineNo">818</span><a name="line.818"></a>
<span class="sourceLineNo">819</span>        /**<a name="line.819"></a>
<span class="sourceLineNo">820</span>         * Gets the value.<a name="line.820"></a>
<span class="sourceLineNo">821</span>         * @return the value<a name="line.821"></a>
<span class="sourceLineNo">822</span>         */<a name="line.822"></a>
<span class="sourceLineNo">823</span>        public boolean getValue() {<a name="line.823"></a>
<span class="sourceLineNo">824</span>            synchronized (ProvidedService.this) {<a name="line.824"></a>
<span class="sourceLineNo">825</span>                return m_value;<a name="line.825"></a>
<span class="sourceLineNo">826</span>            }<a name="line.826"></a>
<span class="sourceLineNo">827</span>        }<a name="line.827"></a>
<span class="sourceLineNo">828</span><a name="line.828"></a>
<span class="sourceLineNo">829</span>        /**<a name="line.829"></a>
<span class="sourceLineNo">830</span>         * Sets the value.<a name="line.830"></a>
<span class="sourceLineNo">831</span>         * @param value the value<a name="line.831"></a>
<span class="sourceLineNo">832</span>         */<a name="line.832"></a>
<span class="sourceLineNo">833</span>        public void setValue(Boolean value) {<a name="line.833"></a>
<span class="sourceLineNo">834</span>            synchronized (ProvidedService.this) {<a name="line.834"></a>
<span class="sourceLineNo">835</span>                if (value != m_value) {<a name="line.835"></a>
<span class="sourceLineNo">836</span>                    // If there is a change to the ServiceController value then<a name="line.836"></a>
<span class="sourceLineNo">837</span>                    // we will<a name="line.837"></a>
<span class="sourceLineNo">838</span>                    // need to modify the registrations.<a name="line.838"></a>
<span class="sourceLineNo">839</span>                    m_value = value;<a name="line.839"></a>
<span class="sourceLineNo">840</span>                    unregisterService();<a name="line.840"></a>
<span class="sourceLineNo">841</span>                    if (getServiceSpecificationsToRegister().length != 0) {<a name="line.841"></a>
<span class="sourceLineNo">842</span>                        registerService();<a name="line.842"></a>
<span class="sourceLineNo">843</span>                    }<a name="line.843"></a>
<span class="sourceLineNo">844</span>                }<a name="line.844"></a>
<span class="sourceLineNo">845</span>            }<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>    }<a name="line.848"></a>
<span class="sourceLineNo">849</span><a name="line.849"></a>
<span class="sourceLineNo">850</span>    /**<a name="line.850"></a>
<span class="sourceLineNo">851</span>     * Singleton creation strategy.<a name="line.851"></a>
<span class="sourceLineNo">852</span>     * This strategy just creates one service object and<a name="line.852"></a>
<span class="sourceLineNo">853</span>     * returns always the same.<a name="line.853"></a>
<span class="sourceLineNo">854</span>     */<a name="line.854"></a>
<span class="sourceLineNo">855</span>    private class SingletonStrategy extends CreationStrategy {<a name="line.855"></a>
<span class="sourceLineNo">856</span><a name="line.856"></a>
<span class="sourceLineNo">857</span>        /**<a name="line.857"></a>
<span class="sourceLineNo">858</span>         * The service is going to be registered.<a name="line.858"></a>
<span class="sourceLineNo">859</span>         * @param instance the instance manager<a name="line.859"></a>
<span class="sourceLineNo">860</span>         * @param interfaces the published interfaces<a name="line.860"></a>
<span class="sourceLineNo">861</span>         * @param props the properties<a name="line.861"></a>
<span class="sourceLineNo">862</span>         * @see org.apache.felix.ipojo.handlers.providedservice.CreationStrategy#onPublication(InstanceManager, java.lang.String[], java.util.Properties)<a name="line.862"></a>
<span class="sourceLineNo">863</span>         */<a name="line.863"></a>
<span class="sourceLineNo">864</span>        public void onPublication(InstanceManager instance, String[] interfaces,<a name="line.864"></a>
<span class="sourceLineNo">865</span>                Properties props) { }<a name="line.865"></a>
<span class="sourceLineNo">866</span><a name="line.866"></a>
<span class="sourceLineNo">867</span>        /**<a name="line.867"></a>
<span class="sourceLineNo">868</span>         * The service was unpublished.<a name="line.868"></a>
<span class="sourceLineNo">869</span>         * @see org.apache.felix.ipojo.handlers.providedservice.CreationStrategy#onUnpublication()<a name="line.869"></a>
<span class="sourceLineNo">870</span>         */<a name="line.870"></a>
<span class="sourceLineNo">871</span>        public void onUnpublication() { }<a name="line.871"></a>
<span class="sourceLineNo">872</span><a name="line.872"></a>
<span class="sourceLineNo">873</span>        /**<a name="line.873"></a>
<span class="sourceLineNo">874</span>         * A service object is required.<a name="line.874"></a>
<span class="sourceLineNo">875</span>         * @param arg0 the bundle requiring the service object.<a name="line.875"></a>
<span class="sourceLineNo">876</span>         * @param arg1 the service registration.<a name="line.876"></a>
<span class="sourceLineNo">877</span>         * @return the first pojo object.<a name="line.877"></a>
<span class="sourceLineNo">878</span>         * @see org.osgi.framework.ServiceFactory#getService(org.osgi.framework.Bundle, org.osgi.framework.ServiceRegistration)<a name="line.878"></a>
<span class="sourceLineNo">879</span>         */<a name="line.879"></a>
<span class="sourceLineNo">880</span>        public Object getService(Bundle arg0, ServiceRegistration arg1) {<a name="line.880"></a>
<span class="sourceLineNo">881</span>            return m_handler.getInstanceManager().getPojoObject();<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>        /**<a name="line.884"></a>
<span class="sourceLineNo">885</span>         * A service object is released.<a name="line.885"></a>
<span class="sourceLineNo">886</span>         * @param arg0  the bundle<a name="line.886"></a>
<span class="sourceLineNo">887</span>         * @param arg1 the service registration<a name="line.887"></a>
<span class="sourceLineNo">888</span>         * @param arg2 the get service object.<a name="line.888"></a>
<span class="sourceLineNo">889</span>         * @see org.osgi.framework.ServiceFactory#ungetService(org.osgi.framework.Bundle, org.osgi.framework.ServiceRegistration, java.lang.Object)<a name="line.889"></a>
<span class="sourceLineNo">890</span>         */<a name="line.890"></a>
<span class="sourceLineNo">891</span>        public void ungetService(Bundle arg0, ServiceRegistration arg1,<a name="line.891"></a>
<span class="sourceLineNo">892</span>                Object arg2) {<a name="line.892"></a>
<span class="sourceLineNo">893</span>        }<a name="line.893"></a>
<span class="sourceLineNo">894</span><a name="line.894"></a>
<span class="sourceLineNo">895</span>    }<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>     * Service object creation policy following the OSGi Service Factory<a name="line.898"></a>
<span class="sourceLineNo">899</span>     * policy {@link ServiceFactory}.<a name="line.899"></a>
<span class="sourceLineNo">900</span>     */<a name="line.900"></a>
<span class="sourceLineNo">901</span>    private class FactoryStrategy extends CreationStrategy {<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>         * The service is going to be registered.<a name="line.904"></a>
<span class="sourceLineNo">905</span>         * @param instance the instance manager<a name="line.905"></a>
<span class="sourceLineNo">906</span>         * @param interfaces the published interfaces<a name="line.906"></a>
<span class="sourceLineNo">907</span>         * @param props the properties<a name="line.907"></a>
<span class="sourceLineNo">908</span>         * @see org.apache.felix.ipojo.handlers.providedservice.CreationStrategy#onPublication(InstanceManager, java.lang.String[], java.util.Properties)<a name="line.908"></a>
<span class="sourceLineNo">909</span>         */<a name="line.909"></a>
<span class="sourceLineNo">910</span>        public void onPublication(InstanceManager instance, String[] interfaces,<a name="line.910"></a>
<span class="sourceLineNo">911</span>                Properties props) { }<a name="line.911"></a>
<span class="sourceLineNo">912</span><a name="line.912"></a>
<span class="sourceLineNo">913</span>        /**<a name="line.913"></a>
<span class="sourceLineNo">914</span>         * The service is unpublished.<a name="line.914"></a>
<span class="sourceLineNo">915</span>         * @see org.apache.felix.ipojo.handlers.providedservice.CreationStrategy#onUnpublication()<a name="line.915"></a>
<span class="sourceLineNo">916</span>         */<a name="line.916"></a>
<span class="sourceLineNo">917</span>        public void onUnpublication() { }<a name="line.917"></a>
<span class="sourceLineNo">918</span><a name="line.918"></a>
<span class="sourceLineNo">919</span>        /**<a name="line.919"></a>
<span class="sourceLineNo">920</span>         * OSGi Service Factory getService method.<a name="line.920"></a>
<span class="sourceLineNo">921</span>         * Returns a new service object per asking bundle.<a name="line.921"></a>
<span class="sourceLineNo">922</span>         * This object is then cached by the framework.<a name="line.922"></a>
<span class="sourceLineNo">923</span>         * @param arg0 the bundle requiring the service<a name="line.923"></a>
<span class="sourceLineNo">924</span>         * @param arg1 the service registration<a name="line.924"></a>
<span class="sourceLineNo">925</span>         * @return the service object for the asking bundle<a name="line.925"></a>
<span class="sourceLineNo">926</span>         * @see org.osgi.framework.ServiceFactory#getService(org.osgi.framework.Bundle, org.osgi.framework.ServiceRegistration)<a name="line.926"></a>
<span class="sourceLineNo">927</span>         */<a name="line.927"></a>
<span class="sourceLineNo">928</span>        public Object getService(Bundle arg0, ServiceRegistration arg1) {<a name="line.928"></a>
<span class="sourceLineNo">929</span>            return m_handler.getInstanceManager().createPojoObject();<a name="line.929"></a>
<span class="sourceLineNo">930</span>        }<a name="line.930"></a>
<span class="sourceLineNo">931</span><a name="line.931"></a>
<span class="sourceLineNo">932</span>        /**<a name="line.932"></a>
<span class="sourceLineNo">933</span>         * OSGi Service Factory unget method.<a name="line.933"></a>
<span class="sourceLineNo">934</span>         * Deletes the created object for the asking bundle.<a name="line.934"></a>
<span class="sourceLineNo">935</span>         * @param arg0 the asking bundle<a name="line.935"></a>
<span class="sourceLineNo">936</span>         * @param arg1 the service registration<a name="line.936"></a>
<span class="sourceLineNo">937</span>         * @param arg2 the created service object returned for this bundle<a name="line.937"></a>
<span class="sourceLineNo">938</span>         * @see org.osgi.framework.ServiceFactory#ungetService(org.osgi.framework.Bundle, org.osgi.framework.ServiceRegistration, java.lang.Object)<a name="line.938"></a>
<span class="sourceLineNo">939</span>         */<a name="line.939"></a>
<span class="sourceLineNo">940</span>        public void ungetService(Bundle arg0, ServiceRegistration arg1,<a name="line.940"></a>
<span class="sourceLineNo">941</span>                Object arg2) {<a name="line.941"></a>
<span class="sourceLineNo">942</span>            m_handler.getInstanceManager().deletePojoObject(arg2);<a name="line.942"></a>
<span class="sourceLineNo">943</span>        }<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>    /**<a name="line.947"></a>
<span class="sourceLineNo">948</span>     * Service object creation policy creating a service object per asking iPOJO component<a name="line.948"></a>
<span class="sourceLineNo">949</span>     * instance. This creation policy follows the iPOJO Service Factory interaction pattern<a name="line.949"></a>
<span class="sourceLineNo">950</span>     * and does no support 'direct' invocation.<a name="line.950"></a>
<span class="sourceLineNo">951</span>     */<a name="line.951"></a>
<span class="sourceLineNo">952</span>    private class PerInstanceStrategy extends CreationStrategy implements IPOJOServiceFactory, InvocationHandler {<a name="line.952"></a>
<span class="sourceLineNo">953</span>        /**<a name="line.953"></a>
<span class="sourceLineNo">954</span>         * Map [ComponentInstance-&gt;ServiceObject] storing created service objects.<a name="line.954"></a>
<span class="sourceLineNo">955</span>         */<a name="line.955"></a>
<span class="sourceLineNo">956</span>        private Map/*&lt;ComponentInstance, ServiceObject&gt;*/ m_instances = new HashMap();<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 method is invoked on the proxy object.<a name="line.959"></a>
<span class="sourceLineNo">960</span>         * If the method is the {@link IPOJOServiceFactory#getService(ComponentInstance)}<a name="line.960"></a>
<span class="sourceLineNo">961</span>         * method, this method creates a service object if not already created for the asking<a name="line.961"></a>
<span class="sourceLineNo">962</span>         * component instance.<a name="line.962"></a>
<span class="sourceLineNo">963</span>         * If the method is {@link IPOJOServiceFactory#ungetService(ComponentInstance, Object)}<a name="line.963"></a>
<span class="sourceLineNo">964</span>         * the service object is unget (i.e. removed from the map and deleted).<a name="line.964"></a>
<span class="sourceLineNo">965</span>         * In all other cases, a {@link UnsupportedOperationException} is thrown as this policy<a name="line.965"></a>
<span class="sourceLineNo">966</span>         * requires to use  the {@link IPOJOServiceFactory} interaction pattern.<a name="line.966"></a>
<span class="sourceLineNo">967</span>         * @param arg0 the proxy object<a name="line.967"></a>
<span class="sourceLineNo">968</span>         * @param arg1 the called method<a name="line.968"></a>
<span class="sourceLineNo">969</span>         * @param arg2 the arguments<a name="line.969"></a>
<span class="sourceLineNo">970</span>         * @return the service object attached to the asking instance for 'get',<a name="line.970"></a>
<span class="sourceLineNo">971</span>         * &lt;code&gt;null&lt;/code&gt; for 'unget',<a name="line.971"></a>
<span class="sourceLineNo">972</span>         * a {@link UnsupportedOperationException} for all other methods.<a name="line.972"></a>
<span class="sourceLineNo">973</span>         * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])<a name="line.973"></a>
<span class="sourceLineNo">974</span>         */<a name="line.974"></a>
<span class="sourceLineNo">975</span>        public Object invoke(Object arg0, Method arg1, Object[] arg2) {<a name="line.975"></a>
<span class="sourceLineNo">976</span>            if (isGetServiceMethod(arg1)) {<a name="line.976"></a>
<span class="sourceLineNo">977</span>                return getService((ComponentInstance) arg2[0]);<a name="line.977"></a>
<span class="sourceLineNo">978</span>            }<a name="line.978"></a>
<span class="sourceLineNo">979</span><a name="line.979"></a>
<span class="sourceLineNo">980</span>            if (isUngetServiceMethod(arg1)) {<a name="line.980"></a>
<span class="sourceLineNo">981</span>                ungetService((ComponentInstance) arg2[0], arg2[1]);<a name="line.981"></a>
<span class="sourceLineNo">982</span>                return null;<a name="line.982"></a>
<span class="sourceLineNo">983</span>            }<a name="line.983"></a>
<span class="sourceLineNo">984</span><a name="line.984"></a>
<span class="sourceLineNo">985</span>            // Regular methods from java.lang.Object : equals and hashCode<a name="line.985"></a>
<span class="sourceLineNo">986</span>            if (arg1.getName().equals("equals")  &amp;&amp; arg2 != null  &amp;&amp; arg2.length == 1) {<a name="line.986"></a>
<span class="sourceLineNo">987</span>                return this.equals(arg2[0]);<a name="line.987"></a>
<span class="sourceLineNo">988</span>            }<a name="line.988"></a>
<span class="sourceLineNo">989</span><a name="line.989"></a>
<span class="sourceLineNo">990</span>            if (arg1.getName().equals("hashCode")) {<a name="line.990"></a>
<span class="sourceLineNo">991</span>                return this.hashCode();<a name="line.991"></a>
<span class="sourceLineNo">992</span>            }<a name="line.992"></a>
<span class="sourceLineNo">993</span><a name="line.993"></a>
<span class="sourceLineNo">994</span>            throw new UnsupportedOperationException("This service requires an advanced creation policy. "<a name="line.994"></a>
<span class="sourceLineNo">995</span>                    + "Before calling the service, call the getService(ComponentInstance) method to get "<a name="line.995"></a>
<span class="sourceLineNo">996</span>                    + "the service object. - Method called: " + arg1.getName());<a name="line.996"></a>
<span class="sourceLineNo">997</span>        }<a name="line.997"></a>
<span class="sourceLineNo">998</span><a name="line.998"></a>
<span class="sourceLineNo">999</span>        /**<a name="line.999"></a>
<span class="sourceLineNo">1000</span>         * A service object is required.<a name="line.1000"></a>
<span class="sourceLineNo">1001</span>         * This policy returns a service object per asking instance.<a name="line.1001"></a>
<span class="sourceLineNo">1002</span>         * @param instance the instance requiring the service object<a name="line.1002"></a>
<span class="sourceLineNo">1003</span>         * @return the service object for this instance<a name="line.1003"></a>
<span class="sourceLineNo">1004</span>         * @see org.apache.felix.ipojo.IPOJOServiceFactory#getService(org.apache.felix.ipojo.ComponentInstance)<a name="line.1004"></a>
<span class="sourceLineNo">1005</span>         */<a name="line.1005"></a>
<span class="sourceLineNo">1006</span>        public Object getService(ComponentInstance instance) {<a name="line.1006"></a>
<span class="sourceLineNo">1007</span>            Object obj = m_instances.get(instance);<a name="line.1007"></a>
<span class="sourceLineNo">1008</span>            if (obj == null) {<a name="line.1008"></a>
<span class="sourceLineNo">1009</span>                obj = m_handler.getInstanceManager().createPojoObject();<a name="line.1009"></a>
<span class="sourceLineNo">1010</span>                m_instances.put(instance, obj);<a name="line.1010"></a>
<span class="sourceLineNo">1011</span>            }<a name="line.1011"></a>
<span class="sourceLineNo">1012</span>            return obj;<a name="line.1012"></a>
<span class="sourceLineNo">1013</span>        }<a name="line.1013"></a>
<span class="sourceLineNo">1014</span><a name="line.1014"></a>
<span class="sourceLineNo">1015</span>        /**<a name="line.1015"></a>
<span class="sourceLineNo">1016</span>         * A service object is unget.<a name="line.1016"></a>
<span class="sourceLineNo">1017</span>         * The service object is removed from the map and deleted.<a name="line.1017"></a>
<span class="sourceLineNo">1018</span>         * @param instance the instance releasing the service<a name="line.1018"></a>
<span class="sourceLineNo">1019</span>         * @param svcObject the service object<a name="line.1019"></a>
<span class="sourceLineNo">1020</span>         * @see org.apache.felix.ipojo.IPOJOServiceFactory#ungetService(org.apache.felix.ipojo.ComponentInstance, java.lang.Object)<a name="line.1020"></a>
<span class="sourceLineNo">1021</span>         */<a name="line.1021"></a>
<span class="sourceLineNo">1022</span>        public void ungetService(ComponentInstance instance, Object svcObject) {<a name="line.1022"></a>
<span class="sourceLineNo">1023</span>            Object pojo = m_instances.remove(instance);<a name="line.1023"></a>
<span class="sourceLineNo">1024</span>            m_handler.getInstanceManager().deletePojoObject(pojo);<a name="line.1024"></a>
<span class="sourceLineNo">1025</span>        }<a name="line.1025"></a>
<span class="sourceLineNo">1026</span><a name="line.1026"></a>
<span class="sourceLineNo">1027</span>        /**<a name="line.1027"></a>
<span class="sourceLineNo">1028</span>         * The service is going to be registered.<a name="line.1028"></a>
<span class="sourceLineNo">1029</span>         * @param instance the instance manager<a name="line.1029"></a>
<span class="sourceLineNo">1030</span>         * @param interfaces the published interfaces<a name="line.1030"></a>
<span class="sourceLineNo">1031</span>         * @param props the properties<a name="line.1031"></a>
<span class="sourceLineNo">1032</span>         * @see org.apache.felix.ipojo.handlers.providedservice.CreationStrategy#onPublication(InstanceManager, java.lang.String[], java.util.Properties)<a name="line.1032"></a>
<span class="sourceLineNo">1033</span>         */<a name="line.1033"></a>
<span class="sourceLineNo">1034</span>        public void onPublication(InstanceManager instance, String[] interfaces,<a name="line.1034"></a>
<span class="sourceLineNo">1035</span>                Properties props) { }<a name="line.1035"></a>
<span class="sourceLineNo">1036</span><a name="line.1036"></a>
<span class="sourceLineNo">1037</span>        /**<a name="line.1037"></a>
<span class="sourceLineNo">1038</span>         * The service is going to be unregistered.<a name="line.1038"></a>
<span class="sourceLineNo">1039</span>         * The instance map is cleared. Created object are disposed.<a name="line.1039"></a>
<span class="sourceLineNo">1040</span>         * @see org.apache.felix.ipojo.handlers.providedservice.CreationStrategy#onUnpublication()<a name="line.1040"></a>
<span class="sourceLineNo">1041</span>         */<a name="line.1041"></a>
<span class="sourceLineNo">1042</span>        public void onUnpublication() {<a name="line.1042"></a>
<span class="sourceLineNo">1043</span>            Collection col = m_instances.values();<a name="line.1043"></a>
<span class="sourceLineNo">1044</span>            Iterator it = col.iterator();<a name="line.1044"></a>
<span class="sourceLineNo">1045</span>            while (it.hasNext()) {<a name="line.1045"></a>
<span class="sourceLineNo">1046</span>                m_handler.getInstanceManager().deletePojoObject(it.next());<a name="line.1046"></a>
<span class="sourceLineNo">1047</span>            }<a name="line.1047"></a>
<span class="sourceLineNo">1048</span>            m_instances.clear();<a name="line.1048"></a>
<span class="sourceLineNo">1049</span>        }<a name="line.1049"></a>
<span class="sourceLineNo">1050</span><a name="line.1050"></a>
<span class="sourceLineNo">1051</span>        /**<a name="line.1051"></a>
<span class="sourceLineNo">1052</span>         * OSGi Service Factory getService method.<a name="line.1052"></a>
<span class="sourceLineNo">1053</span>         * @param arg0 the asking bundle<a name="line.1053"></a>
<span class="sourceLineNo">1054</span>         * @param arg1 the service registration<a name="line.1054"></a>
<span class="sourceLineNo">1055</span>         * @return a proxy implementing the {@link IPOJOServiceFactory}<a name="line.1055"></a>
<span class="sourceLineNo">1056</span>         * @see org.osgi.framework.ServiceFactory#getService(org.osgi.framework.Bundle, org.osgi.framework.ServiceRegistration)<a name="line.1056"></a>
<span class="sourceLineNo">1057</span>         */<a name="line.1057"></a>
<span class="sourceLineNo">1058</span>        public Object getService(Bundle arg0, ServiceRegistration arg1) {<a name="line.1058"></a>
<span class="sourceLineNo">1059</span>            Object proxy = Proxy.newProxyInstance(getInstanceManager().getClazz().getClassLoader(),<a name="line.1059"></a>
<span class="sourceLineNo">1060</span>                    getSpecificationsWithIPOJOServiceFactory(m_serviceSpecifications, m_handler.getInstanceManager().getContext()), this);<a name="line.1060"></a>
<span class="sourceLineNo">1061</span>            return proxy;<a name="line.1061"></a>
<span class="sourceLineNo">1062</span>        }<a name="line.1062"></a>
<span class="sourceLineNo">1063</span><a name="line.1063"></a>
<span class="sourceLineNo">1064</span>        /**<a name="line.1064"></a>
<span class="sourceLineNo">1065</span>         * OSGi Service factory unget method.<a name="line.1065"></a>
<span class="sourceLineNo">1066</span>         * Does nothing.<a name="line.1066"></a>
<span class="sourceLineNo">1067</span>         * @param arg0 the asking bundle<a name="line.1067"></a>
<span class="sourceLineNo">1068</span>         * @param arg1 the service registration<a name="line.1068"></a>
<span class="sourceLineNo">1069</span>         * @param arg2 the service object created for this bundle.<a name="line.1069"></a>
<span class="sourceLineNo">1070</span>         * @see org.osgi.framework.ServiceFactory#ungetService(org.osgi.framework.Bundle, org.osgi.framework.ServiceRegistration, java.lang.Object)<a name="line.1070"></a>
<span class="sourceLineNo">1071</span>         */<a name="line.1071"></a>
<span class="sourceLineNo">1072</span>        public void ungetService(Bundle arg0, ServiceRegistration arg1,<a name="line.1072"></a>
<span class="sourceLineNo">1073</span>                Object arg2) { }<a name="line.1073"></a>
<span class="sourceLineNo">1074</span><a name="line.1074"></a>
<span class="sourceLineNo">1075</span>        /**<a name="line.1075"></a>
<span class="sourceLineNo">1076</span>         * Utility method returning the class array of provided service<a name="line.1076"></a>
<span class="sourceLineNo">1077</span>         * specification and the {@link IPOJOServiceFactory} interface.<a name="line.1077"></a>
<span class="sourceLineNo">1078</span>         * @param specs the published service interface<a name="line.1078"></a>
<span class="sourceLineNo">1079</span>         * @param bc the bundle context, used to load classes<a name="line.1079"></a>
<span class="sourceLineNo">1080</span>         * @return the class array containing provided service specification and<a name="line.1080"></a>
<span class="sourceLineNo">1081</span>         * the {@link IPOJOServiceFactory} class.<a name="line.1081"></a>
<span class="sourceLineNo">1082</span>         */<a name="line.1082"></a>
<span class="sourceLineNo">1083</span>        private Class[] getSpecificationsWithIPOJOServiceFactory(String[] specs, BundleContext bc) {<a name="line.1083"></a>
<span class="sourceLineNo">1084</span>            Class[] classes = new Class[specs.length + 1];<a name="line.1084"></a>
<span class="sourceLineNo">1085</span>            int i = 0;<a name="line.1085"></a>
<span class="sourceLineNo">1086</span>            for (i = 0; i &lt; specs.length; i++) {<a name="line.1086"></a>
<span class="sourceLineNo">1087</span>                try {<a name="line.1087"></a>
<span class="sourceLineNo">1088</span>                    classes[i] = bc.getBundle().loadClass(specs[i]);<a name="line.1088"></a>
<span class="sourceLineNo">1089</span>                } catch (ClassNotFoundException e) {<a name="line.1089"></a>
<span class="sourceLineNo">1090</span>                    // Should not happen.<a name="line.1090"></a>
<span class="sourceLineNo">1091</span>                }<a name="line.1091"></a>
<span class="sourceLineNo">1092</span>            }<a name="line.1092"></a>
<span class="sourceLineNo">1093</span>            classes[i] = IPOJOServiceFactory.class;<a name="line.1093"></a>
<span class="sourceLineNo">1094</span>            return classes;<a name="line.1094"></a>
<span class="sourceLineNo">1095</span>        }<a name="line.1095"></a>
<span class="sourceLineNo">1096</span><a name="line.1096"></a>
<span class="sourceLineNo">1097</span><a name="line.1097"></a>
<span class="sourceLineNo">1098</span>    }<a name="line.1098"></a>
<span class="sourceLineNo">1099</span><a name="line.1099"></a>
<span class="sourceLineNo">1100</span>}<a name="line.1100"></a>




























































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