<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    package org.apache.archiva.rest.api.model;<a name="line.1"></a>
<FONT color="green">002</FONT>    /*<a name="line.2"></a>
<FONT color="green">003</FONT>     * Licensed to the Apache Software Foundation (ASF) under one<a name="line.3"></a>
<FONT color="green">004</FONT>     * or more contributor license agreements.  See the NOTICE file<a name="line.4"></a>
<FONT color="green">005</FONT>     * distributed with this work for additional information<a name="line.5"></a>
<FONT color="green">006</FONT>     * regarding copyright ownership.  The ASF licenses this file<a name="line.6"></a>
<FONT color="green">007</FONT>     * to you under the Apache License, Version 2.0 (the<a name="line.7"></a>
<FONT color="green">008</FONT>     * "License"); you may not use this file except in compliance<a name="line.8"></a>
<FONT color="green">009</FONT>     * with the License.  You may obtain a copy of the License at<a name="line.9"></a>
<FONT color="green">010</FONT>     *<a name="line.10"></a>
<FONT color="green">011</FONT>     *   http://www.apache.org/licenses/LICENSE-2.0<a name="line.11"></a>
<FONT color="green">012</FONT>     *<a name="line.12"></a>
<FONT color="green">013</FONT>     * Unless required by applicable law or agreed to in writing,<a name="line.13"></a>
<FONT color="green">014</FONT>     * software distributed under the License is distributed on an<a name="line.14"></a>
<FONT color="green">015</FONT>     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<a name="line.15"></a>
<FONT color="green">016</FONT>     * KIND, either express or implied.  See the License for the<a name="line.16"></a>
<FONT color="green">017</FONT>     * specific language governing permissions and limitations<a name="line.17"></a>
<FONT color="green">018</FONT>     * under the License.<a name="line.18"></a>
<FONT color="green">019</FONT>     */<a name="line.19"></a>
<FONT color="green">020</FONT>    <a name="line.20"></a>
<FONT color="green">021</FONT>    /**<a name="line.21"></a>
<FONT color="green">022</FONT>     * use for REST services returning Map to get a more easy way to parse json result<a name="line.22"></a>
<FONT color="green">023</FONT>     *<a name="line.23"></a>
<FONT color="green">024</FONT>     * @author Olivier Lamy<a name="line.24"></a>
<FONT color="green">025</FONT>     * @since 1.4-M3<a name="line.25"></a>
<FONT color="green">026</FONT>     */<a name="line.26"></a>
<FONT color="green">027</FONT>    public class Entry<a name="line.27"></a>
<FONT color="green">028</FONT>    {<a name="line.28"></a>
<FONT color="green">029</FONT>        private String key;<a name="line.29"></a>
<FONT color="green">030</FONT>    <a name="line.30"></a>
<FONT color="green">031</FONT>        private String value;<a name="line.31"></a>
<FONT color="green">032</FONT>    <a name="line.32"></a>
<FONT color="green">033</FONT>        public Entry()<a name="line.33"></a>
<FONT color="green">034</FONT>        {<a name="line.34"></a>
<FONT color="green">035</FONT>            // no op<a name="line.35"></a>
<FONT color="green">036</FONT>        }<a name="line.36"></a>
<FONT color="green">037</FONT>    <a name="line.37"></a>
<FONT color="green">038</FONT>        public Entry( String key, String value )<a name="line.38"></a>
<FONT color="green">039</FONT>        {<a name="line.39"></a>
<FONT color="green">040</FONT>            this.key = key;<a name="line.40"></a>
<FONT color="green">041</FONT>            this.value = value;<a name="line.41"></a>
<FONT color="green">042</FONT>        }<a name="line.42"></a>
<FONT color="green">043</FONT>    <a name="line.43"></a>
<FONT color="green">044</FONT>        public String getKey()<a name="line.44"></a>
<FONT color="green">045</FONT>        {<a name="line.45"></a>
<FONT color="green">046</FONT>            return key;<a name="line.46"></a>
<FONT color="green">047</FONT>        }<a name="line.47"></a>
<FONT color="green">048</FONT>    <a name="line.48"></a>
<FONT color="green">049</FONT>        public void setKey( String key )<a name="line.49"></a>
<FONT color="green">050</FONT>        {<a name="line.50"></a>
<FONT color="green">051</FONT>            this.key = key;<a name="line.51"></a>
<FONT color="green">052</FONT>        }<a name="line.52"></a>
<FONT color="green">053</FONT>    <a name="line.53"></a>
<FONT color="green">054</FONT>        public String getValue()<a name="line.54"></a>
<FONT color="green">055</FONT>        {<a name="line.55"></a>
<FONT color="green">056</FONT>            return value;<a name="line.56"></a>
<FONT color="green">057</FONT>        }<a name="line.57"></a>
<FONT color="green">058</FONT>    <a name="line.58"></a>
<FONT color="green">059</FONT>        public void setValue( String value )<a name="line.59"></a>
<FONT color="green">060</FONT>        {<a name="line.60"></a>
<FONT color="green">061</FONT>            this.value = value;<a name="line.61"></a>
<FONT color="green">062</FONT>        }<a name="line.62"></a>
<FONT color="green">063</FONT>    <a name="line.63"></a>
<FONT color="green">064</FONT>        @Override<a name="line.64"></a>
<FONT color="green">065</FONT>        public String toString()<a name="line.65"></a>
<FONT color="green">066</FONT>        {<a name="line.66"></a>
<FONT color="green">067</FONT>            final StringBuilder sb = new StringBuilder();<a name="line.67"></a>
<FONT color="green">068</FONT>            sb.append( "Entry" );<a name="line.68"></a>
<FONT color="green">069</FONT>            sb.append( "{key='" ).append( key ).append( '\'' );<a name="line.69"></a>
<FONT color="green">070</FONT>            sb.append( ", value='" ).append( value ).append( '\'' );<a name="line.70"></a>
<FONT color="green">071</FONT>            sb.append( '}' );<a name="line.71"></a>
<FONT color="green">072</FONT>            return sb.toString();<a name="line.72"></a>
<FONT color="green">073</FONT>        }<a name="line.73"></a>
<FONT color="green">074</FONT>    }<a name="line.74"></a>




























































</PRE>
</BODY>
</HTML>