org.jscep.transaction.NonceQueue Maven / Gradle / Ivy
Show all versions of api Show documentation
/*
* Copyright (c) 2009-2010 David Grant
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.jscep.transaction;
import org.jscep.util.LoggingUtil;
import org.slf4j.Logger;
import java.util.AbstractQueue;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
/**
* This class provides support for detecting replay attacks.
*
* The size of this queue can be altered depending on performance
* requirements.
*
* @author David Grant
*/
public class NonceQueue extends AbstractQueue {
private static Logger LOGGER = LoggingUtil.getLogger(NonceQueue.class);
private final int size;
private final Queue backingQueue;
/**
* Creates a new NonceQueue of the specified size.
*
* @param size the size of the queue.
*/
public NonceQueue(int size) {
this.size = size;
this.backingQueue = new LinkedList();
}
@Override
public Iterator iterator() {
return backingQueue.iterator();
}
@Override
public int size() {
return backingQueue.size();
}
/**
* Inserts the specified nonce into this queue if possible.
*
* This queue will maintain a fixed size, pushing out the oldest
* nonce first, so this method will always return true.
*/
public boolean offer(Nonce nonce) {
if (size() == size) {
Nonce removedNonce = backingQueue.poll();
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Removed " + removedNonce + " from head of queue.");
}
}
return backingQueue.offer(nonce);
}
/**
* {@inheritDoc}
*/
public Nonce peek() {
return backingQueue.peek();
}
/**
* {@inheritDoc}
*/
public Nonce poll() {
return backingQueue.poll();
}
}