<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../.resources/report.css" type="text/css"/><link rel="shortcut icon" href="../.resources/report.gif" type="image/gif"/><title>AbstractUniqueMessageAttributeCache.java</title><link rel="stylesheet" href="../.resources/prettify.css" type="text/css"/><script type="text/javascript" src="../.resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../.sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Coverage Report</a> &gt; <a href="index.source.html" class="el_package">org.apache.rampart</a> &gt; <span class="el_source">AbstractUniqueMessageAttributeCache.java</span></div><h1>AbstractUniqueMessageAttributeCache.java</h1><pre class="source lang-java linenums">/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.rampart;

/**
 * An abstract class which implements UniqueMessageAttributeCache interface.
 */
public abstract class AbstractUniqueMessageAttributeCache implements UniqueMessageAttributeCache {

    /**
     * Maximum lift time of a cached value. If cached value exceeds this value it will be discarded.
     */
<span class="fc" id="L26">    private int maximumLifeTimeOfNonce = 60 * 5;</span>

    /**
     * Default constructor.
     */
    public AbstractUniqueMessageAttributeCache()
<span class="fc" id="L32">    {</span>
<span class="fc" id="L33">    }</span>

    /**
     * Constructor with maximum life time as a parameter.
     * @param maxTime Maximum life time in seconds.
     */
    public AbstractUniqueMessageAttributeCache(int maxTime)
<span class="fc" id="L40">    {</span>
<span class="fc" id="L41">        maximumLifeTimeOfNonce = maxTime;</span>
<span class="fc" id="L42">    }</span>

    /**
     * Sets the maximum life time of a message id.
     * @param maxTime Maximum life time in seconds.
     */
    public void setMaximumLifeTimeOfAnAttribute(int maxTime)
    {
<span class="fc" id="L50">        maximumLifeTimeOfNonce = maxTime;</span>
<span class="fc" id="L51">    }</span>

    /**
     * Gets the maximum life time of a message id.
     * @return Gets message id life time in seconds.
     */
    public int getMaximumLifeTimeOfAnAttribute()
    {
<span class="fc" id="L59">        return maximumLifeTimeOfNonce;</span>
    }
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.eclemma.org/jacoco">JaCoCo</a> 0.7.5.201505241946</span></div></body></html>