Skip to content

Package: RoundRobinStore

RoundRobinStore

nameinstructionbranchcomplexitylinemethod
RoundRobinStore()
M: 27 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 7 C: 0
0%
M: 1 C: 0
0%
RoundRobinStore(Set, boolean)
M: 31 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 8 C: 0
0%
M: 1 C: 0
0%
add(Object)
M: 12 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
clear()
M: 10 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
configure(Set, boolean)
M: 22 C: 0
0%
M: 6 C: 0
0%
M: 4 C: 0
0%
M: 7 C: 0
0%
M: 1 C: 0
0%
get()
M: 35 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 7 C: 0
0%
M: 1 C: 0
0%
hasOnly(Object)
M: 26 C: 0
0%
M: 6 C: 0
0%
M: 4 C: 0
0%
M: 5 C: 0
0%
M: 1 C: 0
0%
hasValue(Object)
M: 17 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 5 C: 0
0%
M: 1 C: 0
0%
remove(Object)
M: 12 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 4 C: 0
0%
M: 1 C: 0
0%
shuffle()
M: 14 C: 0
0%
M: 2 C: 0
0%
M: 2 C: 0
0%
M: 5 C: 0
0%
M: 1 C: 0
0%
size()
M: 12 C: 0
0%
M: 0 C: 0
100%
M: 1 C: 0
0%
M: 3 C: 0
0%
M: 1 C: 0
0%

Coverage

1: /*
2: * Copyright (c) 2012, 2017 Oracle and/or its affiliates. All rights reserved.
3: *
4: * This program and the accompanying materials are made available under the
5: * terms of the Eclipse Public License v. 2.0, which is available at
6: * http://www.eclipse.org/legal/epl-2.0.
7: *
8: * This Source Code may also be made available under the following Secondary
9: * Licenses when the conditions for such availability set forth in the
10: * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
11: * version 2 with the GNU Classpath Exception, which is available at
12: * https://www.gnu.org/software/classpath/license.html.
13: *
14: * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15: */
16:
17: package org.glassfish.grizzly.thrift.client;
18:
19: import java.util.ArrayList;
20: import java.util.Collections;
21: import java.util.List;
22: import java.util.Set;
23: import java.util.concurrent.locks.Lock;
24: import java.util.concurrent.locks.ReadWriteLock;
25: import java.util.concurrent.locks.ReentrantReadWriteLock;
26:
27: /**
28: * Returns the stored value by round-robin
29: * <p>
30: * All operations can be called dynamically and are thread-safe.
31: *
32: * @author Bongjae Chang
33: */
34: public class RoundRobinStore<T> {
35:
36: private final List<T> valueList = new ArrayList<T>();
37: private final ReadWriteLock lock = new ReentrantReadWriteLock(true);
38: private final Lock rLock = lock.readLock();
39: private final Lock wLock = lock.writeLock();
40: private int counter = 0;
41:
42: public RoundRobinStore() {
43: }
44:
45: public RoundRobinStore(final Set<T> initSet, final boolean shuffle) {
46: configure(initSet, shuffle);
47: }
48:
49: public void configure(final Set<T> initSet, final boolean shuffle) {
50:• if (initSet != null && !initSet.isEmpty()) {
51: wLock.lock();
52: try {
53: valueList.addAll(initSet);
54:• if (shuffle) {
55: Collections.shuffle(valueList);
56: }
57: } finally {
58: wLock.unlock();
59: }
60: }
61: }
62:
63: public void shuffle() {
64: wLock.lock();
65: try {
66:• if (!valueList.isEmpty()) {
67: Collections.shuffle(valueList);
68: }
69: } finally {
70: wLock.unlock();
71: }
72: }
73:
74: public void add(final T value) {
75: wLock.lock();
76: try {
77: valueList.add(value);
78: } finally {
79: wLock.unlock();
80: }
81: }
82:
83: public void remove(final T value) {
84: wLock.lock();
85: try {
86: valueList.remove(value);
87: } finally {
88: wLock.unlock();
89: }
90: }
91:
92: public T get() {
93: rLock.lock();
94: try {
95: final int valueSize = valueList.size();
96:• if (valueSize <= 0) {
97: return null;
98: }
99: final int index = (counter++ & 0x7fffffff) % valueSize;
100: return valueList.get(index);
101: } finally {
102: rLock.unlock();
103: }
104: }
105:
106: public boolean hasValue(final T value) {
107:• if (value == null) {
108: return false;
109: }
110: rLock.lock();
111: try {
112: return valueList.contains(value);
113: } finally {
114: rLock.unlock();
115: }
116: }
117:
118: public boolean hasOnly(final T value) {
119:• if (value == null) {
120: return false;
121: }
122: rLock.lock();
123: try {
124:• return valueList.size() == 1 && valueList.contains(value);
125: } finally {
126: rLock.unlock();
127: }
128: }
129:
130: public int size() {
131: rLock.lock();
132: try {
133: return valueList.size();
134: } finally {
135: rLock.unlock();
136: }
137:
138: }
139:
140: public void clear() {
141: wLock.lock();
142: try {
143: valueList.clear();
144: } finally {
145: wLock.unlock();
146: }
147: }
148: }