All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.lastbamboo.common.ice.IceBindingRequestTrackerImpl Maven / Gradle / Ivy

package org.lastbamboo.common.ice;

import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;

import org.apache.commons.id.uuid.UUID;
import org.littleshoot.stun.stack.message.BindingRequest;
import org.littleshoot.stun.stack.message.StunMessage;

/**
 * Keeps track of Binding Requests we've seen to avoid processing a request
 * for the same transaction twice.
 */
public class IceBindingRequestTrackerImpl implements IceBindingRequestTracker
    {
    
    private final Collection m_transactionIds = 
        Collections.synchronizedSet(new LinkedHashSet());
    
    private static final int UUIDS_TO_STORE = 200;
    
    private final Map m_requestsToResponses = 
        Collections.synchronizedMap(new LinkedHashMap()
            {

            private static final long serialVersionUID = 48319719L;

            @Override
            protected boolean removeEldestEntry(
                final Map.Entry eldest) 
                {
                // This makes the map automatically purge the least used
                // entry.  
                final boolean remove = size() > 200;
                return remove;
                }
            });
    
    public void add(final BindingRequest request)
        {
        synchronized (m_transactionIds)
            {
            if (this.m_transactionIds.size() >= UUIDS_TO_STORE)
                {
                final UUID lastIn = this.m_transactionIds.iterator().next();
                this.m_transactionIds.remove(lastIn);
                }
            this.m_transactionIds.add(request.getTransactionId());
            }
        }

    public boolean recentlyProcessed(final BindingRequest request)
        {
        return this.m_transactionIds.contains(request.getTransactionId());
        }

    public void addResponse(final BindingRequest request, 
        final StunMessage response) 
        {
        this.m_requestsToResponses.put(request.getTransactionId(), response);
        }

    public StunMessage getResponse(final BindingRequest request) 
        {
        return m_requestsToResponses.get(request.getTransactionId());
        }

    }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy