1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.modeshape.common.collection;
25
26 import java.util.ArrayList;
27 import java.util.Collections;
28 import java.util.LinkedList;
29 import java.util.List;
30 import java.util.concurrent.locks.ReadWriteLock;
31 import java.util.concurrent.locks.ReentrantReadWriteLock;
32 import net.jcip.annotations.ThreadSafe;
33
34
35
36
37
38 @ThreadSafe
39 public class ThreadSafeProblems extends AbstractProblems {
40 private static final long serialVersionUID = 1L;
41
42 private final ReadWriteLock lock = new ReentrantReadWriteLock();
43 private final List<Problem> problems = new LinkedList<Problem>();
44
45
46
47
48
49
50 @Override
51 public boolean hasErrors() {
52 try {
53 lock.readLock().lock();
54 return super.hasErrors();
55 } finally {
56 lock.readLock().unlock();
57 }
58 }
59
60
61
62
63
64
65 @Override
66 public boolean hasProblems() {
67 try {
68 lock.readLock().lock();
69 return super.hasProblems();
70 } finally {
71 lock.readLock().unlock();
72 }
73 }
74
75
76
77
78
79
80 @Override
81 public boolean hasInfo() {
82 try {
83 lock.readLock().lock();
84 return super.hasInfo();
85 } finally {
86 lock.readLock().unlock();
87 }
88 }
89
90
91
92
93
94
95 @Override
96 public boolean hasWarnings() {
97 try {
98 lock.readLock().lock();
99 return super.hasWarnings();
100 } finally {
101 lock.readLock().unlock();
102 }
103 }
104
105
106
107
108
109
110 @Override
111 public boolean isEmpty() {
112 try {
113 lock.readLock().lock();
114 return super.isEmpty();
115 } finally {
116 lock.readLock().unlock();
117 }
118 }
119
120
121
122
123
124
125 @Override
126 public int size() {
127 try {
128 lock.readLock().lock();
129 return super.size();
130 } finally {
131 lock.readLock().unlock();
132 }
133 }
134
135
136
137
138
139
140 @Override
141 protected void addProblem( Problem problem ) {
142 try {
143 lock.writeLock().lock();
144 problems.add(problem);
145 } finally {
146 lock.writeLock().unlock();
147 }
148 }
149
150
151
152
153
154
155 @Override
156 protected List<Problem> getProblems() {
157
158 try {
159 lock.readLock().lock();
160 return Collections.unmodifiableList(new ArrayList<Problem>(this.problems));
161 } finally {
162 lock.readLock().unlock();
163 }
164 }
165 }