<!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 or more<a name="line.2"></a>
<span class="sourceLineNo">003</span> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
<span class="sourceLineNo">004</span> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
<span class="sourceLineNo">005</span> * The ASF licenses this file to You under the Apache license, Version 2.0<a name="line.5"></a>
<span class="sourceLineNo">006</span> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
<span class="sourceLineNo">007</span> * the License. You may obtain a copy of the License at<a name="line.7"></a>
<span class="sourceLineNo">008</span> *<a name="line.8"></a>
<span class="sourceLineNo">009</span> *      http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
<span class="sourceLineNo">010</span> *<a name="line.10"></a>
<span class="sourceLineNo">011</span> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
<span class="sourceLineNo">012</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
<span class="sourceLineNo">013</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
<span class="sourceLineNo">014</span> * See the license for the specific language governing permissions and<a name="line.14"></a>
<span class="sourceLineNo">015</span> * limitations under the license.<a name="line.15"></a>
<span class="sourceLineNo">016</span> */<a name="line.16"></a>
<span class="sourceLineNo">017</span>package org.apache.logging.log4j.core.net.ssl;<a name="line.17"></a>
<span class="sourceLineNo">018</span><a name="line.18"></a>
<span class="sourceLineNo">019</span>import java.util.Arrays;<a name="line.19"></a>
<span class="sourceLineNo">020</span>import java.util.Objects;<a name="line.20"></a>
<span class="sourceLineNo">021</span><a name="line.21"></a>
<span class="sourceLineNo">022</span>import org.apache.logging.log4j.status.StatusLogger;<a name="line.22"></a>
<span class="sourceLineNo">023</span><a name="line.23"></a>
<span class="sourceLineNo">024</span>/**<a name="line.24"></a>
<span class="sourceLineNo">025</span> *<a name="line.25"></a>
<span class="sourceLineNo">026</span> */<a name="line.26"></a>
<span class="sourceLineNo">027</span>public class StoreConfiguration&lt;T&gt; {<a name="line.27"></a>
<span class="sourceLineNo">028</span>    protected static final StatusLogger LOGGER = StatusLogger.getLogger();<a name="line.28"></a>
<span class="sourceLineNo">029</span><a name="line.29"></a>
<span class="sourceLineNo">030</span>    private String location;<a name="line.30"></a>
<span class="sourceLineNo">031</span>    private PasswordProvider passwordProvider;<a name="line.31"></a>
<span class="sourceLineNo">032</span><a name="line.32"></a>
<span class="sourceLineNo">033</span>    public StoreConfiguration(final String location, final PasswordProvider passwordProvider) {<a name="line.33"></a>
<span class="sourceLineNo">034</span>        this.location = location;<a name="line.34"></a>
<span class="sourceLineNo">035</span>        this.passwordProvider = Objects.requireNonNull(passwordProvider, "passwordProvider");<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>    /**<a name="line.38"></a>
<span class="sourceLineNo">039</span>     * @deprecated Use {@link #StoreConfiguration(String, PasswordProvider)}<a name="line.39"></a>
<span class="sourceLineNo">040</span>     */<a name="line.40"></a>
<span class="sourceLineNo">041</span>    @Deprecated<a name="line.41"></a>
<span class="sourceLineNo">042</span>    public StoreConfiguration(final String location, final char[] password) {<a name="line.42"></a>
<span class="sourceLineNo">043</span>        this(location, new MemoryPasswordProvider(password));<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>    /**<a name="line.46"></a>
<span class="sourceLineNo">047</span>     * @deprecated Use {@link #StoreConfiguration(String, PasswordProvider)}<a name="line.47"></a>
<span class="sourceLineNo">048</span>     */<a name="line.48"></a>
<span class="sourceLineNo">049</span>    @Deprecated<a name="line.49"></a>
<span class="sourceLineNo">050</span>    public StoreConfiguration(final String location, final String password) {<a name="line.50"></a>
<span class="sourceLineNo">051</span>        this(location, new MemoryPasswordProvider(password == null ? null : password.toCharArray()));<a name="line.51"></a>
<span class="sourceLineNo">052</span>    }<a name="line.52"></a>
<span class="sourceLineNo">053</span><a name="line.53"></a>
<span class="sourceLineNo">054</span>    /**<a name="line.54"></a>
<span class="sourceLineNo">055</span>     * Clears the secret fields in this object.<a name="line.55"></a>
<span class="sourceLineNo">056</span>     */<a name="line.56"></a>
<span class="sourceLineNo">057</span>    public void clearSecrets() {<a name="line.57"></a>
<span class="sourceLineNo">058</span>        this.location = null;<a name="line.58"></a>
<span class="sourceLineNo">059</span>        this.passwordProvider = 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>    public String getLocation() {<a name="line.62"></a>
<span class="sourceLineNo">063</span>        return this.location;<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>    public void setLocation(final String location) {<a name="line.66"></a>
<span class="sourceLineNo">067</span>        this.location = location;<a name="line.67"></a>
<span class="sourceLineNo">068</span>    }<a name="line.68"></a>
<span class="sourceLineNo">069</span><a name="line.69"></a>
<span class="sourceLineNo">070</span>    /**<a name="line.70"></a>
<span class="sourceLineNo">071</span>     *<a name="line.71"></a>
<span class="sourceLineNo">072</span>     * @deprecated Use getPasswordAsCharArray()<a name="line.72"></a>
<span class="sourceLineNo">073</span>     */<a name="line.73"></a>
<span class="sourceLineNo">074</span>    @Deprecated<a name="line.74"></a>
<span class="sourceLineNo">075</span>    public String getPassword() {<a name="line.75"></a>
<span class="sourceLineNo">076</span>        return String.valueOf(this.passwordProvider.getPassword());<a name="line.76"></a>
<span class="sourceLineNo">077</span>    }<a name="line.77"></a>
<span class="sourceLineNo">078</span><a name="line.78"></a>
<span class="sourceLineNo">079</span>    public char[] getPasswordAsCharArray() {<a name="line.79"></a>
<span class="sourceLineNo">080</span>        return this.passwordProvider.getPassword();<a name="line.80"></a>
<span class="sourceLineNo">081</span>    }<a name="line.81"></a>
<span class="sourceLineNo">082</span><a name="line.82"></a>
<span class="sourceLineNo">083</span>    public void setPassword(final char[] password) {<a name="line.83"></a>
<span class="sourceLineNo">084</span>        this.passwordProvider = new MemoryPasswordProvider(password);<a name="line.84"></a>
<span class="sourceLineNo">085</span>    }<a name="line.85"></a>
<span class="sourceLineNo">086</span><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>     * @deprecated Use getPasswordAsCharArray()<a name="line.89"></a>
<span class="sourceLineNo">090</span>     */<a name="line.90"></a>
<span class="sourceLineNo">091</span>    @Deprecated<a name="line.91"></a>
<span class="sourceLineNo">092</span>    public void setPassword(final String password) {<a name="line.92"></a>
<span class="sourceLineNo">093</span>        this.passwordProvider = new MemoryPasswordProvider(password == null ? null : password.toCharArray());<a name="line.93"></a>
<span class="sourceLineNo">094</span>    }<a name="line.94"></a>
<span class="sourceLineNo">095</span><a name="line.95"></a>
<span class="sourceLineNo">096</span>    /**<a name="line.96"></a>
<span class="sourceLineNo">097</span>     * @throws StoreConfigurationException May be thrown by subclasses<a name="line.97"></a>
<span class="sourceLineNo">098</span>     */<a name="line.98"></a>
<span class="sourceLineNo">099</span>    protected T load() throws StoreConfigurationException {<a name="line.99"></a>
<span class="sourceLineNo">100</span>        return null;<a name="line.100"></a>
<span class="sourceLineNo">101</span>    }<a name="line.101"></a>
<span class="sourceLineNo">102</span><a name="line.102"></a>
<span class="sourceLineNo">103</span>    @Override<a name="line.103"></a>
<span class="sourceLineNo">104</span>    public int hashCode() {<a name="line.104"></a>
<span class="sourceLineNo">105</span>        final int prime = 31;<a name="line.105"></a>
<span class="sourceLineNo">106</span>        int result = 1;<a name="line.106"></a>
<span class="sourceLineNo">107</span>        result = prime * result + ((location == null) ? 0 : location.hashCode());<a name="line.107"></a>
<span class="sourceLineNo">108</span>        result = prime * result + Arrays.hashCode(passwordProvider.getPassword());<a name="line.108"></a>
<span class="sourceLineNo">109</span>        return result;<a name="line.109"></a>
<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
<span class="sourceLineNo">111</span><a name="line.111"></a>
<span class="sourceLineNo">112</span>    @Override<a name="line.112"></a>
<span class="sourceLineNo">113</span>    public boolean equals(final Object obj) {<a name="line.113"></a>
<span class="sourceLineNo">114</span>        if (this == obj) {<a name="line.114"></a>
<span class="sourceLineNo">115</span>            return true;<a name="line.115"></a>
<span class="sourceLineNo">116</span>        }<a name="line.116"></a>
<span class="sourceLineNo">117</span>        if (obj == null) {<a name="line.117"></a>
<span class="sourceLineNo">118</span>            return false;<a name="line.118"></a>
<span class="sourceLineNo">119</span>        }<a name="line.119"></a>
<span class="sourceLineNo">120</span>        if (getClass() != obj.getClass()) {<a name="line.120"></a>
<span class="sourceLineNo">121</span>            return false;<a name="line.121"></a>
<span class="sourceLineNo">122</span>        }<a name="line.122"></a>
<span class="sourceLineNo">123</span>        final StoreConfiguration&lt;?&gt; other = (StoreConfiguration&lt;?&gt;) obj;<a name="line.123"></a>
<span class="sourceLineNo">124</span>        if (location == null) {<a name="line.124"></a>
<span class="sourceLineNo">125</span>            if (other.location != null) {<a name="line.125"></a>
<span class="sourceLineNo">126</span>                return false;<a name="line.126"></a>
<span class="sourceLineNo">127</span>            }<a name="line.127"></a>
<span class="sourceLineNo">128</span>        } else if (!location.equals(other.location)) {<a name="line.128"></a>
<span class="sourceLineNo">129</span>            return false;<a name="line.129"></a>
<span class="sourceLineNo">130</span>        }<a name="line.130"></a>
<span class="sourceLineNo">131</span>        if (!Arrays.equals(passwordProvider.getPassword(), other.passwordProvider.getPassword())) {<a name="line.131"></a>
<span class="sourceLineNo">132</span>            return false;<a name="line.132"></a>
<span class="sourceLineNo">133</span>        }<a name="line.133"></a>
<span class="sourceLineNo">134</span>        return true;<a name="line.134"></a>
<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
<span class="sourceLineNo">136</span>}<a name="line.136"></a>




























































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