<!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> * Copyright The Apache Software Foundation<a name="line.2"></a>
<span class="sourceLineNo">003</span> *<a name="line.3"></a>
<span class="sourceLineNo">004</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.4"></a>
<span class="sourceLineNo">005</span> * or more contributor license agreements.  See the NOTICE file<a name="line.5"></a>
<span class="sourceLineNo">006</span> * distributed with this work for additional information<a name="line.6"></a>
<span class="sourceLineNo">007</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.7"></a>
<span class="sourceLineNo">008</span> * to you under the Apache License, Version 2.0 (the<a name="line.8"></a>
<span class="sourceLineNo">009</span> * "License"); you may not use this file except in compliance<a name="line.9"></a>
<span class="sourceLineNo">010</span> * with the License.  You may obtain a copy of the License at<a name="line.10"></a>
<span class="sourceLineNo">011</span> *<a name="line.11"></a>
<span class="sourceLineNo">012</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.12"></a>
<span class="sourceLineNo">013</span> *<a name="line.13"></a>
<span class="sourceLineNo">014</span> * Unless required by applicable law or agreed to in writing, software<a name="line.14"></a>
<span class="sourceLineNo">015</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.15"></a>
<span class="sourceLineNo">016</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.16"></a>
<span class="sourceLineNo">017</span> * See the License for the specific language governing permissions and<a name="line.17"></a>
<span class="sourceLineNo">018</span> * limitations under the License.<a name="line.18"></a>
<span class="sourceLineNo">019</span> */<a name="line.19"></a>
<span class="sourceLineNo">020</span>package org.apache.hadoop.hbase;<a name="line.20"></a>
<span class="sourceLineNo">021</span><a name="line.21"></a>
<span class="sourceLineNo">022</span>import java.io.DataOutput;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import java.io.IOException;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.io.OutputStream;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.util.ArrayList;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import java.util.HashMap;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import java.util.Iterator;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import java.util.List;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import java.util.Map;<a name="line.29"></a>
<span class="sourceLineNo">030</span><a name="line.30"></a>
<span class="sourceLineNo">031</span>import org.apache.hadoop.conf.Configuration;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.33"></a>
<span class="sourceLineNo">034</span><a name="line.34"></a>
<span class="sourceLineNo">035</span>import org.apache.hbase.thirdparty.org.apache.commons.collections4.iterators.UnmodifiableIterator;<a name="line.35"></a>
<span class="sourceLineNo">036</span><a name="line.36"></a>
<span class="sourceLineNo">037</span>/**<a name="line.37"></a>
<span class="sourceLineNo">038</span> * Do a shallow merge of multiple KV configuration pools. This is a very useful<a name="line.38"></a>
<span class="sourceLineNo">039</span> * utility class to easily add per-object configurations in addition to wider<a name="line.39"></a>
<span class="sourceLineNo">040</span> * scope settings. This is different from Configuration.addResource()<a name="line.40"></a>
<span class="sourceLineNo">041</span> * functionality, which performs a deep merge and mutates the common data<a name="line.41"></a>
<span class="sourceLineNo">042</span> * structure.<a name="line.42"></a>
<span class="sourceLineNo">043</span> * &lt;p&gt;<a name="line.43"></a>
<span class="sourceLineNo">044</span> * The iterator on CompoundConfiguration is unmodifiable. Obtaining iterator is an expensive<a name="line.44"></a>
<span class="sourceLineNo">045</span> * operation.<a name="line.45"></a>
<span class="sourceLineNo">046</span> * &lt;p&gt;<a name="line.46"></a>
<span class="sourceLineNo">047</span> * For clarity: the shallow merge allows the user to mutate either of the<a name="line.47"></a>
<span class="sourceLineNo">048</span> * configuration objects and have changes reflected everywhere. In contrast to a<a name="line.48"></a>
<span class="sourceLineNo">049</span> * deep merge, that requires you to explicitly know all applicable copies to<a name="line.49"></a>
<span class="sourceLineNo">050</span> * propagate changes.<a name="line.50"></a>
<span class="sourceLineNo">051</span> * <a name="line.51"></a>
<span class="sourceLineNo">052</span> * WARNING: The values set in the CompoundConfiguration are do not handle Property variable<a name="line.52"></a>
<span class="sourceLineNo">053</span> * substitution.  However, if they are set in the underlying configuration substitutions are<a name="line.53"></a>
<span class="sourceLineNo">054</span> * done. <a name="line.54"></a>
<span class="sourceLineNo">055</span> */<a name="line.55"></a>
<span class="sourceLineNo">056</span>@InterfaceAudience.Private<a name="line.56"></a>
<span class="sourceLineNo">057</span>public class CompoundConfiguration extends Configuration {<a name="line.57"></a>
<span class="sourceLineNo">058</span><a name="line.58"></a>
<span class="sourceLineNo">059</span>  private Configuration mutableConf = null;<a name="line.59"></a>
<span class="sourceLineNo">060</span><a name="line.60"></a>
<span class="sourceLineNo">061</span>  /**<a name="line.61"></a>
<span class="sourceLineNo">062</span>   * Default Constructor. Initializes empty configuration<a name="line.62"></a>
<span class="sourceLineNo">063</span>   */<a name="line.63"></a>
<span class="sourceLineNo">064</span>  public CompoundConfiguration() {<a name="line.64"></a>
<span class="sourceLineNo">065</span>  }<a name="line.65"></a>
<span class="sourceLineNo">066</span><a name="line.66"></a>
<span class="sourceLineNo">067</span>  // Devs: these APIs are the same contract as their counterparts in<a name="line.67"></a>
<span class="sourceLineNo">068</span>  // Configuration.java<a name="line.68"></a>
<span class="sourceLineNo">069</span>  private interface ImmutableConfigMap extends Iterable&lt;Map.Entry&lt;String,String&gt;&gt; {<a name="line.69"></a>
<span class="sourceLineNo">070</span>    String get(String key);<a name="line.70"></a>
<span class="sourceLineNo">071</span>    String getRaw(String key);<a name="line.71"></a>
<span class="sourceLineNo">072</span>    Class&lt;?&gt; getClassByName(String name) throws ClassNotFoundException;<a name="line.72"></a>
<span class="sourceLineNo">073</span>    int size();<a name="line.73"></a>
<span class="sourceLineNo">074</span>  }<a name="line.74"></a>
<span class="sourceLineNo">075</span><a name="line.75"></a>
<span class="sourceLineNo">076</span>  private final List&lt;ImmutableConfigMap&gt; configs = new ArrayList&lt;&gt;();<a name="line.76"></a>
<span class="sourceLineNo">077</span><a name="line.77"></a>
<span class="sourceLineNo">078</span>  static class ImmutableConfWrapper implements  ImmutableConfigMap {<a name="line.78"></a>
<span class="sourceLineNo">079</span>   private final Configuration c;<a name="line.79"></a>
<span class="sourceLineNo">080</span>    <a name="line.80"></a>
<span class="sourceLineNo">081</span>    ImmutableConfWrapper(Configuration conf) {<a name="line.81"></a>
<span class="sourceLineNo">082</span>      c = conf;<a name="line.82"></a>
<span class="sourceLineNo">083</span>    }<a name="line.83"></a>
<span class="sourceLineNo">084</span><a name="line.84"></a>
<span class="sourceLineNo">085</span>    @Override<a name="line.85"></a>
<span class="sourceLineNo">086</span>    public Iterator&lt;Map.Entry&lt;String,String&gt;&gt; iterator() {<a name="line.86"></a>
<span class="sourceLineNo">087</span>      return c.iterator();<a name="line.87"></a>
<span class="sourceLineNo">088</span>    }<a name="line.88"></a>
<span class="sourceLineNo">089</span>    <a name="line.89"></a>
<span class="sourceLineNo">090</span>    @Override<a name="line.90"></a>
<span class="sourceLineNo">091</span>    public String get(String key) {<a name="line.91"></a>
<span class="sourceLineNo">092</span>      return c.get(key);<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>    @Override<a name="line.95"></a>
<span class="sourceLineNo">096</span>    public String getRaw(String key) {<a name="line.96"></a>
<span class="sourceLineNo">097</span>      return c.getRaw(key);<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>    @Override<a name="line.100"></a>
<span class="sourceLineNo">101</span>    public Class&lt;?&gt; getClassByName(String name)<a name="line.101"></a>
<span class="sourceLineNo">102</span>        throws ClassNotFoundException {<a name="line.102"></a>
<span class="sourceLineNo">103</span>      return c.getClassByName(name);<a name="line.103"></a>
<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
<span class="sourceLineNo">105</span><a name="line.105"></a>
<span class="sourceLineNo">106</span>    @Override<a name="line.106"></a>
<span class="sourceLineNo">107</span>    public int size() {<a name="line.107"></a>
<span class="sourceLineNo">108</span>      return c.size();<a name="line.108"></a>
<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
<span class="sourceLineNo">110</span><a name="line.110"></a>
<span class="sourceLineNo">111</span>    @Override<a name="line.111"></a>
<span class="sourceLineNo">112</span>    public String toString() {<a name="line.112"></a>
<span class="sourceLineNo">113</span>      return c.toString();<a name="line.113"></a>
<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
<span class="sourceLineNo">115</span>  }<a name="line.115"></a>
<span class="sourceLineNo">116</span><a name="line.116"></a>
<span class="sourceLineNo">117</span>  /**<a name="line.117"></a>
<span class="sourceLineNo">118</span>   * If set has been called, it will create a mutableConf.  This converts the mutableConf to an<a name="line.118"></a>
<span class="sourceLineNo">119</span>   * immutable one and resets it to allow a new mutable conf.  This is used when a new map or<a name="line.119"></a>
<span class="sourceLineNo">120</span>   * conf is added to the compound configuration to preserve proper override semantics.<a name="line.120"></a>
<span class="sourceLineNo">121</span>   */<a name="line.121"></a>
<span class="sourceLineNo">122</span>  void freezeMutableConf() {<a name="line.122"></a>
<span class="sourceLineNo">123</span>    if (mutableConf == null) {<a name="line.123"></a>
<span class="sourceLineNo">124</span>      // do nothing if there is no current mutableConf<a name="line.124"></a>
<span class="sourceLineNo">125</span>      return;<a name="line.125"></a>
<span class="sourceLineNo">126</span>    }<a name="line.126"></a>
<span class="sourceLineNo">127</span><a name="line.127"></a>
<span class="sourceLineNo">128</span>    this.configs.add(0, new ImmutableConfWrapper(mutableConf));<a name="line.128"></a>
<span class="sourceLineNo">129</span>    mutableConf = null;<a name="line.129"></a>
<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
<span class="sourceLineNo">131</span><a name="line.131"></a>
<span class="sourceLineNo">132</span>  /**<a name="line.132"></a>
<span class="sourceLineNo">133</span>   * Add Hadoop Configuration object to config list.<a name="line.133"></a>
<span class="sourceLineNo">134</span>   * The added configuration overrides the previous ones if there are name collisions.<a name="line.134"></a>
<span class="sourceLineNo">135</span>   * @param conf configuration object<a name="line.135"></a>
<span class="sourceLineNo">136</span>   * @return this, for builder pattern<a name="line.136"></a>
<span class="sourceLineNo">137</span>   */<a name="line.137"></a>
<span class="sourceLineNo">138</span>  public CompoundConfiguration add(final Configuration conf) {<a name="line.138"></a>
<span class="sourceLineNo">139</span>    freezeMutableConf();<a name="line.139"></a>
<span class="sourceLineNo">140</span><a name="line.140"></a>
<span class="sourceLineNo">141</span>    if (conf instanceof CompoundConfiguration) {<a name="line.141"></a>
<span class="sourceLineNo">142</span>      this.configs.addAll(0, ((CompoundConfiguration) conf).configs);<a name="line.142"></a>
<span class="sourceLineNo">143</span>      return this;<a name="line.143"></a>
<span class="sourceLineNo">144</span>    }<a name="line.144"></a>
<span class="sourceLineNo">145</span>    // put new config at the front of the list (top priority)<a name="line.145"></a>
<span class="sourceLineNo">146</span>    this.configs.add(0, new ImmutableConfWrapper(conf));<a name="line.146"></a>
<span class="sourceLineNo">147</span>    return this;<a name="line.147"></a>
<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
<span class="sourceLineNo">149</span><a name="line.149"></a>
<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
<span class="sourceLineNo">151</span>   * Add Bytes map to config list. This map is generally<a name="line.151"></a>
<span class="sourceLineNo">152</span>   * created by HTableDescriptor or HColumnDescriptor, but can be abstractly<a name="line.152"></a>
<span class="sourceLineNo">153</span>   * used. The added configuration overrides the previous ones if there are<a name="line.153"></a>
<span class="sourceLineNo">154</span>   * name collisions.<a name="line.154"></a>
<span class="sourceLineNo">155</span>   *<a name="line.155"></a>
<span class="sourceLineNo">156</span>   * @param map<a name="line.156"></a>
<span class="sourceLineNo">157</span>   *          Bytes map<a name="line.157"></a>
<span class="sourceLineNo">158</span>   * @return this, for builder pattern<a name="line.158"></a>
<span class="sourceLineNo">159</span>   */<a name="line.159"></a>
<span class="sourceLineNo">160</span>  public CompoundConfiguration addBytesMap(<a name="line.160"></a>
<span class="sourceLineNo">161</span>      final Map&lt;Bytes, Bytes&gt; map) {<a name="line.161"></a>
<span class="sourceLineNo">162</span>    freezeMutableConf();<a name="line.162"></a>
<span class="sourceLineNo">163</span><a name="line.163"></a>
<span class="sourceLineNo">164</span>    // put new map at the front of the list (top priority)<a name="line.164"></a>
<span class="sourceLineNo">165</span>    this.configs.add(0, new ImmutableConfigMap() {<a name="line.165"></a>
<span class="sourceLineNo">166</span>      private final Map&lt;Bytes, Bytes&gt; m = map;<a name="line.166"></a>
<span class="sourceLineNo">167</span><a name="line.167"></a>
<span class="sourceLineNo">168</span>      @Override<a name="line.168"></a>
<span class="sourceLineNo">169</span>      public Iterator&lt;Map.Entry&lt;String,String&gt;&gt; iterator() {<a name="line.169"></a>
<span class="sourceLineNo">170</span>        Map&lt;String, String&gt; ret = new HashMap&lt;&gt;();<a name="line.170"></a>
<span class="sourceLineNo">171</span>        for (Map.Entry&lt;Bytes, Bytes&gt; entry : map.entrySet()) {<a name="line.171"></a>
<span class="sourceLineNo">172</span>          String key = Bytes.toString(entry.getKey().get());<a name="line.172"></a>
<span class="sourceLineNo">173</span>          String val = entry.getValue() == null ? null : Bytes.toString(entry.getValue().get());<a name="line.173"></a>
<span class="sourceLineNo">174</span>          ret.put(key, val);<a name="line.174"></a>
<span class="sourceLineNo">175</span>        }<a name="line.175"></a>
<span class="sourceLineNo">176</span>        return ret.entrySet().iterator();<a name="line.176"></a>
<span class="sourceLineNo">177</span>      }<a name="line.177"></a>
<span class="sourceLineNo">178</span>      <a name="line.178"></a>
<span class="sourceLineNo">179</span>      @Override<a name="line.179"></a>
<span class="sourceLineNo">180</span>      public String get(String key) {<a name="line.180"></a>
<span class="sourceLineNo">181</span>        Bytes ibw = new Bytes(Bytes<a name="line.181"></a>
<span class="sourceLineNo">182</span>            .toBytes(key));<a name="line.182"></a>
<span class="sourceLineNo">183</span>        if (!m.containsKey(ibw))<a name="line.183"></a>
<span class="sourceLineNo">184</span>          return null;<a name="line.184"></a>
<span class="sourceLineNo">185</span>        Bytes value = m.get(ibw);<a name="line.185"></a>
<span class="sourceLineNo">186</span>        if (value == null || value.get() == null)<a name="line.186"></a>
<span class="sourceLineNo">187</span>          return null;<a name="line.187"></a>
<span class="sourceLineNo">188</span>        return Bytes.toString(value.get());<a name="line.188"></a>
<span class="sourceLineNo">189</span>      }<a name="line.189"></a>
<span class="sourceLineNo">190</span><a name="line.190"></a>
<span class="sourceLineNo">191</span>      @Override<a name="line.191"></a>
<span class="sourceLineNo">192</span>      public String getRaw(String key) {<a name="line.192"></a>
<span class="sourceLineNo">193</span>        return get(key);<a name="line.193"></a>
<span class="sourceLineNo">194</span>      }<a name="line.194"></a>
<span class="sourceLineNo">195</span><a name="line.195"></a>
<span class="sourceLineNo">196</span>      @Override<a name="line.196"></a>
<span class="sourceLineNo">197</span>      public Class&lt;?&gt; getClassByName(String name)<a name="line.197"></a>
<span class="sourceLineNo">198</span>      throws ClassNotFoundException {<a name="line.198"></a>
<span class="sourceLineNo">199</span>        return null;<a name="line.199"></a>
<span class="sourceLineNo">200</span>      }<a name="line.200"></a>
<span class="sourceLineNo">201</span><a name="line.201"></a>
<span class="sourceLineNo">202</span>      @Override<a name="line.202"></a>
<span class="sourceLineNo">203</span>      public int size() {<a name="line.203"></a>
<span class="sourceLineNo">204</span>        return m.size();<a name="line.204"></a>
<span class="sourceLineNo">205</span>      }<a name="line.205"></a>
<span class="sourceLineNo">206</span><a name="line.206"></a>
<span class="sourceLineNo">207</span>      @Override<a name="line.207"></a>
<span class="sourceLineNo">208</span>      public String toString() {<a name="line.208"></a>
<span class="sourceLineNo">209</span>        return m.toString();<a name="line.209"></a>
<span class="sourceLineNo">210</span>      }<a name="line.210"></a>
<span class="sourceLineNo">211</span>    });<a name="line.211"></a>
<span class="sourceLineNo">212</span>    return this;<a name="line.212"></a>
<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
<span class="sourceLineNo">214</span><a name="line.214"></a>
<span class="sourceLineNo">215</span>  /**<a name="line.215"></a>
<span class="sourceLineNo">216</span>   * Add String map to config list. This map is generally created by HTableDescriptor<a name="line.216"></a>
<span class="sourceLineNo">217</span>   * or HColumnDescriptor, but can be abstractly used. The added configuration<a name="line.217"></a>
<span class="sourceLineNo">218</span>   * overrides the previous ones if there are name collisions.<a name="line.218"></a>
<span class="sourceLineNo">219</span>   *<a name="line.219"></a>
<span class="sourceLineNo">220</span>   * @return this, for builder pattern<a name="line.220"></a>
<span class="sourceLineNo">221</span>   */<a name="line.221"></a>
<span class="sourceLineNo">222</span>  public CompoundConfiguration addStringMap(final Map&lt;String, String&gt; map) {<a name="line.222"></a>
<span class="sourceLineNo">223</span>    freezeMutableConf();<a name="line.223"></a>
<span class="sourceLineNo">224</span><a name="line.224"></a>
<span class="sourceLineNo">225</span>    // put new map at the front of the list (top priority)<a name="line.225"></a>
<span class="sourceLineNo">226</span>    this.configs.add(0, new ImmutableConfigMap() {<a name="line.226"></a>
<span class="sourceLineNo">227</span>      private final Map&lt;String, String&gt; m = map;<a name="line.227"></a>
<span class="sourceLineNo">228</span><a name="line.228"></a>
<span class="sourceLineNo">229</span>      @Override<a name="line.229"></a>
<span class="sourceLineNo">230</span>      public Iterator&lt;Map.Entry&lt;String,String&gt;&gt; iterator() {<a name="line.230"></a>
<span class="sourceLineNo">231</span>        return map.entrySet().iterator();<a name="line.231"></a>
<span class="sourceLineNo">232</span>      }<a name="line.232"></a>
<span class="sourceLineNo">233</span><a name="line.233"></a>
<span class="sourceLineNo">234</span>      @Override<a name="line.234"></a>
<span class="sourceLineNo">235</span>      public String get(String key) {<a name="line.235"></a>
<span class="sourceLineNo">236</span>        return m.get(key);<a name="line.236"></a>
<span class="sourceLineNo">237</span>      }<a name="line.237"></a>
<span class="sourceLineNo">238</span><a name="line.238"></a>
<span class="sourceLineNo">239</span>      @Override<a name="line.239"></a>
<span class="sourceLineNo">240</span>      public String getRaw(String key) {<a name="line.240"></a>
<span class="sourceLineNo">241</span>        return get(key);<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>      @Override<a name="line.244"></a>
<span class="sourceLineNo">245</span>      public Class&lt;?&gt; getClassByName(String name)<a name="line.245"></a>
<span class="sourceLineNo">246</span>      throws ClassNotFoundException {<a name="line.246"></a>
<span class="sourceLineNo">247</span>        return null;<a name="line.247"></a>
<span class="sourceLineNo">248</span>      }<a name="line.248"></a>
<span class="sourceLineNo">249</span><a name="line.249"></a>
<span class="sourceLineNo">250</span>      @Override<a name="line.250"></a>
<span class="sourceLineNo">251</span>      public int size() {<a name="line.251"></a>
<span class="sourceLineNo">252</span>        return m.size();<a name="line.252"></a>
<span class="sourceLineNo">253</span>      }<a name="line.253"></a>
<span class="sourceLineNo">254</span><a name="line.254"></a>
<span class="sourceLineNo">255</span>      @Override<a name="line.255"></a>
<span class="sourceLineNo">256</span>      public String toString() {<a name="line.256"></a>
<span class="sourceLineNo">257</span>        return m.toString();<a name="line.257"></a>
<span class="sourceLineNo">258</span>      }<a name="line.258"></a>
<span class="sourceLineNo">259</span>    });<a name="line.259"></a>
<span class="sourceLineNo">260</span>    return this;<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>  @Override<a name="line.263"></a>
<span class="sourceLineNo">264</span>  public String toString() {<a name="line.264"></a>
<span class="sourceLineNo">265</span>    StringBuilder sb = new StringBuilder();<a name="line.265"></a>
<span class="sourceLineNo">266</span>    sb.append("CompoundConfiguration: " + this.configs.size() + " configs");<a name="line.266"></a>
<span class="sourceLineNo">267</span>    for (ImmutableConfigMap m : this.configs) {<a name="line.267"></a>
<span class="sourceLineNo">268</span>      sb.append(m);<a name="line.268"></a>
<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
<span class="sourceLineNo">270</span>    return sb.toString();<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>  @Override<a name="line.273"></a>
<span class="sourceLineNo">274</span>  public String get(String key) {<a name="line.274"></a>
<span class="sourceLineNo">275</span>    if (mutableConf != null) {<a name="line.275"></a>
<span class="sourceLineNo">276</span>      String value = mutableConf.get(key);<a name="line.276"></a>
<span class="sourceLineNo">277</span>      if (value != null) {<a name="line.277"></a>
<span class="sourceLineNo">278</span>        return value;<a name="line.278"></a>
<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
<span class="sourceLineNo">280</span>    }<a name="line.280"></a>
<span class="sourceLineNo">281</span><a name="line.281"></a>
<span class="sourceLineNo">282</span>    for (ImmutableConfigMap m : this.configs) {<a name="line.282"></a>
<span class="sourceLineNo">283</span>      String value = m.get(key);<a name="line.283"></a>
<span class="sourceLineNo">284</span>      if (value != null) {<a name="line.284"></a>
<span class="sourceLineNo">285</span>        return value;<a name="line.285"></a>
<span class="sourceLineNo">286</span>      }<a name="line.286"></a>
<span class="sourceLineNo">287</span>    }<a name="line.287"></a>
<span class="sourceLineNo">288</span>    return null;<a name="line.288"></a>
<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
<span class="sourceLineNo">290</span><a name="line.290"></a>
<span class="sourceLineNo">291</span>  @Override<a name="line.291"></a>
<span class="sourceLineNo">292</span>  public String getRaw(String key) {<a name="line.292"></a>
<span class="sourceLineNo">293</span>    if (mutableConf != null) {<a name="line.293"></a>
<span class="sourceLineNo">294</span>      String value = mutableConf.getRaw(key);<a name="line.294"></a>
<span class="sourceLineNo">295</span>      if (value != null) {<a name="line.295"></a>
<span class="sourceLineNo">296</span>        return value;<a name="line.296"></a>
<span class="sourceLineNo">297</span>      }<a name="line.297"></a>
<span class="sourceLineNo">298</span>    }<a name="line.298"></a>
<span class="sourceLineNo">299</span><a name="line.299"></a>
<span class="sourceLineNo">300</span>    for (ImmutableConfigMap m : this.configs) {<a name="line.300"></a>
<span class="sourceLineNo">301</span>      String value = m.getRaw(key);<a name="line.301"></a>
<span class="sourceLineNo">302</span>      if (value != null) {<a name="line.302"></a>
<span class="sourceLineNo">303</span>        return value;<a name="line.303"></a>
<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
<span class="sourceLineNo">306</span>    return null;<a name="line.306"></a>
<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
<span class="sourceLineNo">308</span><a name="line.308"></a>
<span class="sourceLineNo">309</span>  @Override<a name="line.309"></a>
<span class="sourceLineNo">310</span>  public Class&lt;?&gt; getClassByName(String name) throws ClassNotFoundException {<a name="line.310"></a>
<span class="sourceLineNo">311</span>    if (mutableConf != null) {<a name="line.311"></a>
<span class="sourceLineNo">312</span>      Class&lt;?&gt; value = mutableConf.getClassByName(name);<a name="line.312"></a>
<span class="sourceLineNo">313</span>      if (value != null) {<a name="line.313"></a>
<span class="sourceLineNo">314</span>        return value;<a name="line.314"></a>
<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
<span class="sourceLineNo">316</span>    }<a name="line.316"></a>
<span class="sourceLineNo">317</span><a name="line.317"></a>
<span class="sourceLineNo">318</span>    for (ImmutableConfigMap m : this.configs) {<a name="line.318"></a>
<span class="sourceLineNo">319</span>      Class&lt;?&gt; value = m.getClassByName(name);<a name="line.319"></a>
<span class="sourceLineNo">320</span>      if (value != null) {<a name="line.320"></a>
<span class="sourceLineNo">321</span>        return value;<a name="line.321"></a>
<span class="sourceLineNo">322</span>      }<a name="line.322"></a>
<span class="sourceLineNo">323</span>    }<a name="line.323"></a>
<span class="sourceLineNo">324</span>    throw new ClassNotFoundException();<a name="line.324"></a>
<span class="sourceLineNo">325</span>  }<a name="line.325"></a>
<span class="sourceLineNo">326</span><a name="line.326"></a>
<span class="sourceLineNo">327</span>  // TODO: This method overestimates the number of configuration settings -- if a value is masked<a name="line.327"></a>
<span class="sourceLineNo">328</span>  // by an overriding config or map, it will be counted multiple times. <a name="line.328"></a>
<span class="sourceLineNo">329</span>  @Override<a name="line.329"></a>
<span class="sourceLineNo">330</span>  public int size() {<a name="line.330"></a>
<span class="sourceLineNo">331</span>    int ret = 0;<a name="line.331"></a>
<span class="sourceLineNo">332</span><a name="line.332"></a>
<span class="sourceLineNo">333</span>    if (mutableConf != null) {<a name="line.333"></a>
<span class="sourceLineNo">334</span>      ret += mutableConf.size();<a name="line.334"></a>
<span class="sourceLineNo">335</span>    }<a name="line.335"></a>
<span class="sourceLineNo">336</span><a name="line.336"></a>
<span class="sourceLineNo">337</span>    for (ImmutableConfigMap m : this.configs) {<a name="line.337"></a>
<span class="sourceLineNo">338</span>      ret += m.size();<a name="line.338"></a>
<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
<span class="sourceLineNo">340</span>    return ret;<a name="line.340"></a>
<span class="sourceLineNo">341</span>  }<a name="line.341"></a>
<span class="sourceLineNo">342</span><a name="line.342"></a>
<span class="sourceLineNo">343</span>  /**<a name="line.343"></a>
<span class="sourceLineNo">344</span>   * Get the value of the &lt;code&gt;name&lt;/code&gt;. If the key is deprecated,<a name="line.344"></a>
<span class="sourceLineNo">345</span>   * it returns the value of the first key which replaces the deprecated key<a name="line.345"></a>
<span class="sourceLineNo">346</span>   * and is not null.<a name="line.346"></a>
<span class="sourceLineNo">347</span>   * If no such property exists,<a name="line.347"></a>
<span class="sourceLineNo">348</span>   * then &lt;code&gt;defaultValue&lt;/code&gt; is returned.<a name="line.348"></a>
<span class="sourceLineNo">349</span><a name="line.349"></a>
<span class="sourceLineNo">350</span>   * The CompooundConfiguration does not do property substitution.  To do so we need<a name="line.350"></a>
<span class="sourceLineNo">351</span>   * Configuration.getProps to be protected or package visible.  Though in hadoop2 it is<a name="line.351"></a>
<span class="sourceLineNo">352</span>   * protected, in hadoop1 the method is private and not accessible.<a name="line.352"></a>
<span class="sourceLineNo">353</span>   * <a name="line.353"></a>
<span class="sourceLineNo">354</span>   * All of the get* methods call this overridden get method.<a name="line.354"></a>
<span class="sourceLineNo">355</span>   * <a name="line.355"></a>
<span class="sourceLineNo">356</span>   * @param name property name.<a name="line.356"></a>
<span class="sourceLineNo">357</span>   * @param defaultValue default value.<a name="line.357"></a>
<span class="sourceLineNo">358</span>   * @return property value, or &lt;code&gt;defaultValue&lt;/code&gt; if the property <a name="line.358"></a>
<span class="sourceLineNo">359</span>   *         doesn't exist.                    <a name="line.359"></a>
<span class="sourceLineNo">360</span>   **/<a name="line.360"></a>
<span class="sourceLineNo">361</span>  @Override<a name="line.361"></a>
<span class="sourceLineNo">362</span>  public String get(String name, String defaultValue) {<a name="line.362"></a>
<span class="sourceLineNo">363</span>    String ret = get(name);<a name="line.363"></a>
<span class="sourceLineNo">364</span>    return ret == null ? defaultValue : ret;<a name="line.364"></a>
<span class="sourceLineNo">365</span>  }<a name="line.365"></a>
<span class="sourceLineNo">366</span><a name="line.366"></a>
<span class="sourceLineNo">367</span>  @Override<a name="line.367"></a>
<span class="sourceLineNo">368</span>  public Iterator&lt;Map.Entry&lt;String, String&gt;&gt; iterator() {<a name="line.368"></a>
<span class="sourceLineNo">369</span>    Map&lt;String, String&gt; ret = new HashMap&lt;&gt;();<a name="line.369"></a>
<span class="sourceLineNo">370</span><a name="line.370"></a>
<span class="sourceLineNo">371</span>    // add in reverse order so that oldest get overridden.<a name="line.371"></a>
<span class="sourceLineNo">372</span>    if (!configs.isEmpty()) {<a name="line.372"></a>
<span class="sourceLineNo">373</span>      for (int i = configs.size() - 1; i &gt;= 0; i--) {<a name="line.373"></a>
<span class="sourceLineNo">374</span>        ImmutableConfigMap map = configs.get(i);<a name="line.374"></a>
<span class="sourceLineNo">375</span>        Iterator&lt;Map.Entry&lt;String, String&gt;&gt; iter = map.iterator();<a name="line.375"></a>
<span class="sourceLineNo">376</span>        while (iter.hasNext()) {<a name="line.376"></a>
<span class="sourceLineNo">377</span>          Map.Entry&lt;String, String&gt; entry = iter.next();<a name="line.377"></a>
<span class="sourceLineNo">378</span>          ret.put(entry.getKey(), entry.getValue());<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><a name="line.382"></a>
<span class="sourceLineNo">383</span>    // add mutations to this CompoundConfiguration last.<a name="line.383"></a>
<span class="sourceLineNo">384</span>    if (mutableConf != null) {<a name="line.384"></a>
<span class="sourceLineNo">385</span>      Iterator&lt;Map.Entry&lt;String, String&gt;&gt; miter = mutableConf.iterator();<a name="line.385"></a>
<span class="sourceLineNo">386</span>      while (miter.hasNext()) {<a name="line.386"></a>
<span class="sourceLineNo">387</span>        Map.Entry&lt;String, String&gt; entry = miter.next();<a name="line.387"></a>
<span class="sourceLineNo">388</span>        ret.put(entry.getKey(), entry.getValue());<a name="line.388"></a>
<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
<span class="sourceLineNo">391</span><a name="line.391"></a>
<span class="sourceLineNo">392</span>    return UnmodifiableIterator.unmodifiableIterator(ret.entrySet().iterator());<a name="line.392"></a>
<span class="sourceLineNo">393</span>  }<a name="line.393"></a>
<span class="sourceLineNo">394</span><a name="line.394"></a>
<span class="sourceLineNo">395</span>  @Override<a name="line.395"></a>
<span class="sourceLineNo">396</span>  public void set(String name, String value) {<a name="line.396"></a>
<span class="sourceLineNo">397</span>    if (mutableConf == null) {<a name="line.397"></a>
<span class="sourceLineNo">398</span>      // not thread safe<a name="line.398"></a>
<span class="sourceLineNo">399</span>      mutableConf = new Configuration(false); // an empty configuration<a name="line.399"></a>
<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
<span class="sourceLineNo">401</span>    mutableConf.set(name,  value);<a name="line.401"></a>
<span class="sourceLineNo">402</span>  }<a name="line.402"></a>
<span class="sourceLineNo">403</span><a name="line.403"></a>
<span class="sourceLineNo">404</span>  /***********************************************************************************************<a name="line.404"></a>
<span class="sourceLineNo">405</span>   * These methods are unsupported, and no code using CompoundConfiguration depend upon them.<a name="line.405"></a>
<span class="sourceLineNo">406</span>   * Quickly abort upon any attempts to use them. <a name="line.406"></a>
<span class="sourceLineNo">407</span>   **********************************************************************************************/<a name="line.407"></a>
<span class="sourceLineNo">408</span><a name="line.408"></a>
<span class="sourceLineNo">409</span>  @Override<a name="line.409"></a>
<span class="sourceLineNo">410</span>  public void clear() {<a name="line.410"></a>
<span class="sourceLineNo">411</span>    throw new UnsupportedOperationException("Immutable Configuration");<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>  @Override<a name="line.414"></a>
<span class="sourceLineNo">415</span>  public void write(DataOutput out) throws IOException {<a name="line.415"></a>
<span class="sourceLineNo">416</span>    throw new UnsupportedOperationException("Immutable Configuration");<a name="line.416"></a>
<span class="sourceLineNo">417</span>  }<a name="line.417"></a>
<span class="sourceLineNo">418</span><a name="line.418"></a>
<span class="sourceLineNo">419</span>  @Override<a name="line.419"></a>
<span class="sourceLineNo">420</span>  public void writeXml(OutputStream out) throws IOException {<a name="line.420"></a>
<span class="sourceLineNo">421</span>    throw new UnsupportedOperationException("Immutable Configuration");<a name="line.421"></a>
<span class="sourceLineNo">422</span>  }<a name="line.422"></a>
<span class="sourceLineNo">423</span>}<a name="line.423"></a>




























































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