/** * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.openflowplugin.api.openflow.md.util; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Queue; import com.google.common.collect.Iterators; /** * Zipper groups together a list of queues and exposes one poll method. Polling iterates through * all groups and returns first not-null result of poll method on each queue. If after polling each * grouped queue for one time there is still null result, poll will return null. *
* Iterating keeps last position so this polling is supposed to be fairly distributed. * * @param common item type of zipped queues */ public class PollableQueuesZipper { private List> sources; private Iterator> cursor; /** * default ctor */ public PollableQueuesZipper() { sources = new ArrayList<>(); } /** * Add all member queues before first invocation of {@link PollableQueuesZipper#poll()} * @param queue to be added to group */ public void addSource(Queue queue) { sources.add(queue); } /** * @return next common product of polling member groups */ public T poll() { T item = null; if (cursor == null) { cursor = Iterators.cycle(sources); } Queue queue; for (int i = 0; i < sources.size(); i++) { queue = cursor.next(); item = queue.poll(); if (item != null) { break; } } return item; } }