| /* |
| * Copyright (c) OSGi Alliance (2015, 2016). All Rights Reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * 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 "AS IS" 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.osgi.util.pushstream; |
| |
| import java.util.concurrent.BlockingQueue; |
| |
| /** |
| * {@link QueuePolicyOption} provides a standard set of simple |
| * {@link QueuePolicy} implementations. |
| * |
| * @see QueuePolicy |
| */ |
| public enum QueuePolicyOption { |
| /** |
| * Attempt to add the supplied event to the queue. If the queue is unable to |
| * immediately accept the value then discard the value at the head of the |
| * queue and try again. Repeat this process until the event is enqueued. |
| */ |
| DISCARD_OLDEST { |
| @Override |
| public <T, U extends BlockingQueue<PushEvent<? extends T>>> QueuePolicy<T, U> getPolicy() { |
| return (queue, event) -> { |
| while (!queue.offer(event)) { |
| queue.poll(); |
| } |
| }; |
| } |
| }, |
| /** |
| * Attempt to add the supplied event to the queue, blocking until the |
| * enqueue is successful. |
| */ |
| BLOCK { |
| @Override |
| public <T, U extends BlockingQueue<PushEvent<? extends T>>> QueuePolicy<T, U> getPolicy() { |
| return (queue, event) -> { |
| try { |
| queue.put(event); |
| } catch (InterruptedException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| }; |
| } |
| }, |
| /** |
| * Attempt to add the supplied event to the queue, throwing an exception if |
| * the queue is full. |
| */ |
| FAIL { |
| @Override |
| public <T, U extends BlockingQueue<PushEvent<? extends T>>> QueuePolicy<T, U> getPolicy() { |
| return (queue, event) -> queue.add(event); |
| } |
| }; |
| |
| /** |
| * @return a {@link QueuePolicy} implementation |
| */ |
| public abstract <T, U extends BlockingQueue<PushEvent<? extends T>>> QueuePolicy<T, U> getPolicy(); |
| |
| } |