5602 |
07 Apr 11 |
nicklas |
1 |
/** |
5602 |
07 Apr 11 |
nicklas |
$Id$ |
5602 |
07 Apr 11 |
nicklas |
3 |
|
5602 |
07 Apr 11 |
nicklas |
Copyright (C) 2011 Nicklas Nordborg |
5602 |
07 Apr 11 |
nicklas |
5 |
|
5602 |
07 Apr 11 |
nicklas |
This file is part of BASE - BioArray Software Environment. |
5602 |
07 Apr 11 |
nicklas |
Available at http://base.thep.lu.se/ |
5602 |
07 Apr 11 |
nicklas |
8 |
|
5602 |
07 Apr 11 |
nicklas |
BASE is free software; you can redistribute it and/or |
5602 |
07 Apr 11 |
nicklas |
modify it under the terms of the GNU General Public License |
5602 |
07 Apr 11 |
nicklas |
as published by the Free Software Foundation; either version 3 |
5602 |
07 Apr 11 |
nicklas |
of the License, or (at your option) any later version. |
5602 |
07 Apr 11 |
nicklas |
13 |
|
5602 |
07 Apr 11 |
nicklas |
BASE is distributed in the hope that it will be useful, |
5602 |
07 Apr 11 |
nicklas |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
5602 |
07 Apr 11 |
nicklas |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
5602 |
07 Apr 11 |
nicklas |
GNU General Public License for more details. |
5602 |
07 Apr 11 |
nicklas |
18 |
|
5602 |
07 Apr 11 |
nicklas |
You should have received a copy of the GNU General Public License |
5602 |
07 Apr 11 |
nicklas |
along with BASE. If not, see <http://www.gnu.org/licenses/>. |
5602 |
07 Apr 11 |
nicklas |
21 |
*/ |
5602 |
07 Apr 11 |
nicklas |
22 |
package net.sf.basedb.util.extensions.manager; |
5602 |
07 Apr 11 |
nicklas |
23 |
|
5602 |
07 Apr 11 |
nicklas |
24 |
import java.util.ArrayList; |
5602 |
07 Apr 11 |
nicklas |
25 |
import java.util.LinkedList; |
5602 |
07 Apr 11 |
nicklas |
26 |
import java.util.List; |
5602 |
07 Apr 11 |
nicklas |
27 |
import java.util.Map; |
5602 |
07 Apr 11 |
nicklas |
28 |
import java.util.TreeMap; |
6372 |
06 Dec 13 |
nicklas |
29 |
import java.util.WeakHashMap; |
5602 |
07 Apr 11 |
nicklas |
30 |
|
5602 |
07 Apr 11 |
nicklas |
31 |
/** |
5602 |
07 Apr 11 |
nicklas |
Class for collecting results from a scan for new/deleted/updated |
5602 |
07 Apr 11 |
nicklas |
extensions. |
5602 |
07 Apr 11 |
nicklas |
34 |
|
5602 |
07 Apr 11 |
nicklas |
@author Nicklas |
5602 |
07 Apr 11 |
nicklas |
@since 3.0 |
5602 |
07 Apr 11 |
nicklas |
@base.modified $Date$ |
5602 |
07 Apr 11 |
nicklas |
38 |
*/ |
5602 |
07 Apr 11 |
nicklas |
39 |
public class ProcessResults |
5602 |
07 Apr 11 |
nicklas |
40 |
{ |
5602 |
07 Apr 11 |
nicklas |
41 |
|
5602 |
07 Apr 11 |
nicklas |
42 |
private final long startTime; |
5602 |
07 Apr 11 |
nicklas |
43 |
|
5602 |
07 Apr 11 |
nicklas |
44 |
private Map<ExtensionsFile, FileResults> fileResults; |
6372 |
06 Dec 13 |
nicklas |
45 |
private Map<ExtensionsFile, FileResults> oldFileResults; |
6372 |
06 Dec 13 |
nicklas |
46 |
|
5602 |
07 Apr 11 |
nicklas |
47 |
private boolean hasError; |
5602 |
07 Apr 11 |
nicklas |
48 |
private int numErrorFiles; |
5602 |
07 Apr 11 |
nicklas |
49 |
private long endTime; |
5602 |
07 Apr 11 |
nicklas |
50 |
private String summary; |
5602 |
07 Apr 11 |
nicklas |
51 |
|
5602 |
07 Apr 11 |
nicklas |
52 |
/** |
5602 |
07 Apr 11 |
nicklas |
Create a new process results object. |
5602 |
07 Apr 11 |
nicklas |
54 |
*/ |
5616 |
27 Apr 11 |
nicklas |
55 |
public ProcessResults() |
5602 |
07 Apr 11 |
nicklas |
56 |
{ |
6372 |
06 Dec 13 |
nicklas |
57 |
this(null); |
6372 |
06 Dec 13 |
nicklas |
58 |
} |
6372 |
06 Dec 13 |
nicklas |
59 |
|
6372 |
06 Dec 13 |
nicklas |
60 |
/** |
6372 |
06 Dec 13 |
nicklas |
Create a new process results object, keeping information about |
6372 |
06 Dec 13 |
nicklas |
previous results. |
6372 |
06 Dec 13 |
nicklas |
@since 3.2.4 |
6372 |
06 Dec 13 |
nicklas |
64 |
*/ |
6372 |
06 Dec 13 |
nicklas |
65 |
public ProcessResults(ProcessResults oldResults) |
6372 |
06 Dec 13 |
nicklas |
66 |
{ |
5602 |
07 Apr 11 |
nicklas |
67 |
this.fileResults = new TreeMap<ExtensionsFile, FileResults>(); |
6372 |
06 Dec 13 |
nicklas |
68 |
this.oldFileResults = new WeakHashMap<ExtensionsFile, FileResults>(); |
6372 |
06 Dec 13 |
nicklas |
69 |
if (oldResults != null) |
6372 |
06 Dec 13 |
nicklas |
70 |
{ |
6372 |
06 Dec 13 |
nicklas |
71 |
oldFileResults.putAll(oldResults.oldFileResults); |
6372 |
06 Dec 13 |
nicklas |
72 |
} |
5602 |
07 Apr 11 |
nicklas |
73 |
this.hasError = false; |
5602 |
07 Apr 11 |
nicklas |
74 |
this.numErrorFiles = 0; |
5602 |
07 Apr 11 |
nicklas |
75 |
this.startTime = System.currentTimeMillis(); |
5602 |
07 Apr 11 |
nicklas |
76 |
} |
5602 |
07 Apr 11 |
nicklas |
77 |
|
5602 |
07 Apr 11 |
nicklas |
78 |
/** |
5602 |
07 Apr 11 |
nicklas |
Get the start time of the scan as a millisecond value. |
5602 |
07 Apr 11 |
nicklas |
@see System#currentTimeMillis() |
5602 |
07 Apr 11 |
nicklas |
81 |
*/ |
5602 |
07 Apr 11 |
nicklas |
82 |
public long getStartTime() |
5602 |
07 Apr 11 |
nicklas |
83 |
{ |
5602 |
07 Apr 11 |
nicklas |
84 |
return startTime; |
5602 |
07 Apr 11 |
nicklas |
85 |
} |
5602 |
07 Apr 11 |
nicklas |
86 |
|
5602 |
07 Apr 11 |
nicklas |
87 |
/** |
5602 |
07 Apr 11 |
nicklas |
Get the end time of the scan as a millisecond value. |
5602 |
07 Apr 11 |
nicklas |
@see System#currentTimeMillis() |
5602 |
07 Apr 11 |
nicklas |
90 |
*/ |
5602 |
07 Apr 11 |
nicklas |
91 |
public long getEndTime() |
5602 |
07 Apr 11 |
nicklas |
92 |
{ |
5602 |
07 Apr 11 |
nicklas |
93 |
return endTime; |
5602 |
07 Apr 11 |
nicklas |
94 |
} |
5602 |
07 Apr 11 |
nicklas |
95 |
|
5602 |
07 Apr 11 |
nicklas |
96 |
/** |
5603 |
08 Apr 11 |
nicklas |
Set the end time of the scan. |
5603 |
08 Apr 11 |
nicklas |
98 |
*/ |
5603 |
08 Apr 11 |
nicklas |
99 |
public void setEnded() |
5603 |
08 Apr 11 |
nicklas |
100 |
{ |
5603 |
08 Apr 11 |
nicklas |
101 |
this.endTime = System.currentTimeMillis(); |
5603 |
08 Apr 11 |
nicklas |
102 |
} |
5603 |
08 Apr 11 |
nicklas |
103 |
|
5603 |
08 Apr 11 |
nicklas |
104 |
|
5603 |
08 Apr 11 |
nicklas |
105 |
/** |
5602 |
07 Apr 11 |
nicklas |
Get a summary of the scan results as a textual description. |
5602 |
07 Apr 11 |
nicklas |
107 |
*/ |
5602 |
07 Apr 11 |
nicklas |
108 |
public String getSummary() |
5602 |
07 Apr 11 |
nicklas |
109 |
{ |
5602 |
07 Apr 11 |
nicklas |
110 |
return summary; |
5602 |
07 Apr 11 |
nicklas |
111 |
} |
5602 |
07 Apr 11 |
nicklas |
112 |
|
5602 |
07 Apr 11 |
nicklas |
113 |
/** |
5602 |
07 Apr 11 |
nicklas |
Set a summary of the results. |
5602 |
07 Apr 11 |
nicklas |
115 |
*/ |
5602 |
07 Apr 11 |
nicklas |
116 |
public void setSummary(String summary) |
5602 |
07 Apr 11 |
nicklas |
117 |
{ |
5602 |
07 Apr 11 |
nicklas |
118 |
this.summary = summary; |
5602 |
07 Apr 11 |
nicklas |
119 |
} |
5602 |
07 Apr 11 |
nicklas |
120 |
|
5602 |
07 Apr 11 |
nicklas |
121 |
/** |
5602 |
07 Apr 11 |
nicklas |
Check if the scan was successful or not. For more detailed |
5602 |
07 Apr 11 |
nicklas |
information use {@link #getResults(ExtensionsFile)}. |
5602 |
07 Apr 11 |
nicklas |
@return TRUE if there was any problems, FALSE if everything was |
5602 |
07 Apr 11 |
nicklas |
successful |
5602 |
07 Apr 11 |
nicklas |
126 |
*/ |
5602 |
07 Apr 11 |
nicklas |
127 |
public boolean hasError() |
5602 |
07 Apr 11 |
nicklas |
128 |
{ |
5602 |
07 Apr 11 |
nicklas |
129 |
return hasError; |
5602 |
07 Apr 11 |
nicklas |
130 |
} |
5602 |
07 Apr 11 |
nicklas |
131 |
|
5602 |
07 Apr 11 |
nicklas |
132 |
/** |
5602 |
07 Apr 11 |
nicklas |
The number of extension files that could not be completely loaded |
5602 |
07 Apr 11 |
nicklas |
because of an error. |
5602 |
07 Apr 11 |
nicklas |
135 |
*/ |
5602 |
07 Apr 11 |
nicklas |
136 |
public int getNumErrorFiles() |
5602 |
07 Apr 11 |
nicklas |
137 |
{ |
5602 |
07 Apr 11 |
nicklas |
138 |
return numErrorFiles; |
5602 |
07 Apr 11 |
nicklas |
139 |
} |
5602 |
07 Apr 11 |
nicklas |
140 |
|
5602 |
07 Apr 11 |
nicklas |
141 |
public List<FileResults> getAllResults() |
5602 |
07 Apr 11 |
nicklas |
142 |
{ |
5602 |
07 Apr 11 |
nicklas |
143 |
return new ArrayList<FileResults>(fileResults.values()); |
5602 |
07 Apr 11 |
nicklas |
144 |
} |
5602 |
07 Apr 11 |
nicklas |
145 |
|
5602 |
07 Apr 11 |
nicklas |
146 |
/** |
6372 |
06 Dec 13 |
nicklas |
Get the results for a specific extensions file. If |
6372 |
06 Dec 13 |
nicklas |
no current results exists, old results are searched. |
5602 |
07 Apr 11 |
nicklas |
@param xtFile The extensions file to get the results for |
5602 |
07 Apr 11 |
nicklas |
@return A {@link FileResults} object or null if the |
5602 |
07 Apr 11 |
nicklas |
extensions file is not found |
5602 |
07 Apr 11 |
nicklas |
152 |
*/ |
5602 |
07 Apr 11 |
nicklas |
153 |
public FileResults getResults(ExtensionsFile xtFile) |
5602 |
07 Apr 11 |
nicklas |
154 |
{ |
6372 |
06 Dec 13 |
nicklas |
155 |
FileResults results = fileResults.get(xtFile); |
6372 |
06 Dec 13 |
nicklas |
156 |
if (results == null) results = oldFileResults.get(xtFile); |
6372 |
06 Dec 13 |
nicklas |
157 |
return results; |
5602 |
07 Apr 11 |
nicklas |
158 |
} |
5602 |
07 Apr 11 |
nicklas |
159 |
|
5602 |
07 Apr 11 |
nicklas |
160 |
/** |
6372 |
06 Dec 13 |
nicklas |
Forget old processing results for the given file. |
6372 |
06 Dec 13 |
nicklas |
Should be called when an extension has been uninstalled, |
6372 |
06 Dec 13 |
nicklas |
@param xtFile The extensions file to forget |
6372 |
06 Dec 13 |
nicklas |
@since 3.2.4 |
6372 |
06 Dec 13 |
nicklas |
165 |
*/ |
6372 |
06 Dec 13 |
nicklas |
166 |
public void forgetOldResults(ExtensionsFile xtFile) |
6372 |
06 Dec 13 |
nicklas |
167 |
{ |
6372 |
06 Dec 13 |
nicklas |
168 |
oldFileResults.remove(xtFile); |
6372 |
06 Dec 13 |
nicklas |
169 |
} |
6372 |
06 Dec 13 |
nicklas |
170 |
|
6372 |
06 Dec 13 |
nicklas |
171 |
/** |
5603 |
08 Apr 11 |
nicklas |
Sets a short overall status message for an entire file. Example: |
5603 |
08 Apr 11 |
nicklas |
"Installed", "Failed", etc. |
5603 |
08 Apr 11 |
nicklas |
@param xtFile The file to set the status on |
5603 |
08 Apr 11 |
nicklas |
@param status The status message |
5603 |
08 Apr 11 |
nicklas |
@see #addMessage(ExtensionsFile, String) |
5603 |
08 Apr 11 |
nicklas |
@see #addErrorMessage(ExtensionsFile, String) |
5603 |
08 Apr 11 |
nicklas |
178 |
*/ |
5603 |
08 Apr 11 |
nicklas |
179 |
public void setStatus(ExtensionsFile xtFile, String status) |
5603 |
08 Apr 11 |
nicklas |
180 |
{ |
5603 |
08 Apr 11 |
nicklas |
181 |
FileResults m = fileResults.get(xtFile); |
5603 |
08 Apr 11 |
nicklas |
182 |
if (m == null) |
5603 |
08 Apr 11 |
nicklas |
183 |
{ |
6520 |
18 Aug 14 |
nicklas |
184 |
m = new FileResults(xtFile, oldFileResults.get(xtFile)); |
5603 |
08 Apr 11 |
nicklas |
185 |
fileResults.put(xtFile, m); |
6372 |
06 Dec 13 |
nicklas |
186 |
oldFileResults.put(xtFile, m); |
7233 |
17 Nov 16 |
nicklas |
187 |
if (xtFile.hasError()) |
7233 |
17 Nov 16 |
nicklas |
188 |
{ |
7233 |
17 Nov 16 |
nicklas |
189 |
hasError = true; |
7233 |
17 Nov 16 |
nicklas |
190 |
numErrorFiles++; |
7233 |
17 Nov 16 |
nicklas |
191 |
m.hasError = true; |
7233 |
17 Nov 16 |
nicklas |
192 |
} |
5603 |
08 Apr 11 |
nicklas |
193 |
} |
5603 |
08 Apr 11 |
nicklas |
194 |
m.status = status; |
5603 |
08 Apr 11 |
nicklas |
195 |
} |
5603 |
08 Apr 11 |
nicklas |
196 |
|
5603 |
08 Apr 11 |
nicklas |
197 |
/** |
5602 |
07 Apr 11 |
nicklas |
Adds a detailed message indicating a successful operation |
5602 |
07 Apr 11 |
nicklas |
to a file. |
5602 |
07 Apr 11 |
nicklas |
@param xtFile The file to add the message to |
5602 |
07 Apr 11 |
nicklas |
@param message The message |
5602 |
07 Apr 11 |
nicklas |
@see #addErrorMessage(ExtensionsFile, String) |
5602 |
07 Apr 11 |
nicklas |
203 |
*/ |
5602 |
07 Apr 11 |
nicklas |
204 |
public void addMessage(ExtensionsFile xtFile, String message) |
5602 |
07 Apr 11 |
nicklas |
205 |
{ |
5602 |
07 Apr 11 |
nicklas |
206 |
addMessage(xtFile, message, false); |
5602 |
07 Apr 11 |
nicklas |
207 |
} |
5602 |
07 Apr 11 |
nicklas |
208 |
|
5602 |
07 Apr 11 |
nicklas |
209 |
/** |
5602 |
07 Apr 11 |
nicklas |
Adds a detailed message inidcating a failed operation |
5602 |
07 Apr 11 |
nicklas |
to a file. |
5602 |
07 Apr 11 |
nicklas |
@param xtFile The file to add the message to |
5602 |
07 Apr 11 |
nicklas |
@param message The message |
5602 |
07 Apr 11 |
nicklas |
214 |
*/ |
5602 |
07 Apr 11 |
nicklas |
215 |
public void addErrorMessage(ExtensionsFile xtFile, String message) |
5602 |
07 Apr 11 |
nicklas |
216 |
{ |
5602 |
07 Apr 11 |
nicklas |
217 |
addMessage(xtFile, message, true); |
5602 |
07 Apr 11 |
nicklas |
218 |
} |
5602 |
07 Apr 11 |
nicklas |
219 |
|
5602 |
07 Apr 11 |
nicklas |
220 |
private void addMessage(ExtensionsFile xtFile, String message, boolean error) |
5602 |
07 Apr 11 |
nicklas |
221 |
{ |
5602 |
07 Apr 11 |
nicklas |
222 |
FileResults m = fileResults.get(xtFile); |
5602 |
07 Apr 11 |
nicklas |
223 |
if (m == null) |
5602 |
07 Apr 11 |
nicklas |
224 |
{ |
6520 |
18 Aug 14 |
nicklas |
225 |
m = new FileResults(xtFile, oldFileResults.get(xtFile)); |
5602 |
07 Apr 11 |
nicklas |
226 |
fileResults.put(xtFile, m); |
6372 |
06 Dec 13 |
nicklas |
227 |
oldFileResults.put(xtFile, m); |
5602 |
07 Apr 11 |
nicklas |
228 |
} |
5602 |
07 Apr 11 |
nicklas |
229 |
m.messages.add(message); |
5602 |
07 Apr 11 |
nicklas |
230 |
if (error) |
5602 |
07 Apr 11 |
nicklas |
231 |
{ |
5602 |
07 Apr 11 |
nicklas |
232 |
if (!m.hasError) numErrorFiles++; |
5602 |
07 Apr 11 |
nicklas |
233 |
hasError = true; |
5602 |
07 Apr 11 |
nicklas |
234 |
m.hasError = true; |
5602 |
07 Apr 11 |
nicklas |
235 |
m.status = "Error"; |
5602 |
07 Apr 11 |
nicklas |
236 |
} |
5602 |
07 Apr 11 |
nicklas |
237 |
} |
5602 |
07 Apr 11 |
nicklas |
238 |
|
5602 |
07 Apr 11 |
nicklas |
239 |
/** |
5602 |
07 Apr 11 |
nicklas |
Scan results for a single XML or JAR file. |
5602 |
07 Apr 11 |
nicklas |
241 |
|
5602 |
07 Apr 11 |
nicklas |
242 |
*/ |
5602 |
07 Apr 11 |
nicklas |
243 |
public static class FileResults |
5602 |
07 Apr 11 |
nicklas |
244 |
{ |
5602 |
07 Apr 11 |
nicklas |
245 |
|
5602 |
07 Apr 11 |
nicklas |
246 |
private final ExtensionsFile xtFile; |
6372 |
06 Dec 13 |
nicklas |
247 |
private final long time; |
5602 |
07 Apr 11 |
nicklas |
248 |
List<String> messages; |
5602 |
07 Apr 11 |
nicklas |
249 |
boolean hasError = false; |
5602 |
07 Apr 11 |
nicklas |
250 |
String status = null; |
5602 |
07 Apr 11 |
nicklas |
251 |
|
6520 |
18 Aug 14 |
nicklas |
252 |
FileResults(ExtensionsFile xtFile, FileResults old) |
5602 |
07 Apr 11 |
nicklas |
253 |
{ |
5602 |
07 Apr 11 |
nicklas |
254 |
this.xtFile = xtFile; |
6372 |
06 Dec 13 |
nicklas |
255 |
this.time = System.currentTimeMillis(); |
5602 |
07 Apr 11 |
nicklas |
256 |
this.messages = new LinkedList<String>(); |
6520 |
18 Aug 14 |
nicklas |
257 |
if (old != null) |
6520 |
18 Aug 14 |
nicklas |
258 |
{ |
6520 |
18 Aug 14 |
nicklas |
259 |
hasError = old.hasError; |
6520 |
18 Aug 14 |
nicklas |
260 |
status = old.status; |
6520 |
18 Aug 14 |
nicklas |
261 |
messages.addAll(old.messages); |
6520 |
18 Aug 14 |
nicklas |
262 |
} |
5602 |
07 Apr 11 |
nicklas |
263 |
} |
5602 |
07 Apr 11 |
nicklas |
264 |
|
5602 |
07 Apr 11 |
nicklas |
265 |
public ExtensionsFile getExtensionsFile() |
5602 |
07 Apr 11 |
nicklas |
266 |
{ |
5602 |
07 Apr 11 |
nicklas |
267 |
return xtFile; |
5602 |
07 Apr 11 |
nicklas |
268 |
} |
5602 |
07 Apr 11 |
nicklas |
269 |
|
5602 |
07 Apr 11 |
nicklas |
270 |
/** |
6372 |
06 Dec 13 |
nicklas |
Get the time of the results as a millisecond value. |
6372 |
06 Dec 13 |
nicklas |
@since 3.2.4 |
6372 |
06 Dec 13 |
nicklas |
273 |
*/ |
6372 |
06 Dec 13 |
nicklas |
274 |
public long getTime() |
6372 |
06 Dec 13 |
nicklas |
275 |
{ |
6372 |
06 Dec 13 |
nicklas |
276 |
return time; |
6372 |
06 Dec 13 |
nicklas |
277 |
} |
6372 |
06 Dec 13 |
nicklas |
278 |
|
6372 |
06 Dec 13 |
nicklas |
279 |
/** |
5602 |
07 Apr 11 |
nicklas |
If there was an error in this file or not. |
5602 |
07 Apr 11 |
nicklas |
@return TRUE if there was an error, FALSE if successful |
5602 |
07 Apr 11 |
nicklas |
282 |
*/ |
5602 |
07 Apr 11 |
nicklas |
283 |
public boolean hasError() |
5602 |
07 Apr 11 |
nicklas |
284 |
{ |
5602 |
07 Apr 11 |
nicklas |
285 |
return hasError; |
5602 |
07 Apr 11 |
nicklas |
286 |
} |
5602 |
07 Apr 11 |
nicklas |
287 |
|
5602 |
07 Apr 11 |
nicklas |
288 |
/** |
5602 |
07 Apr 11 |
nicklas |
A short status message indicating the completed |
5602 |
07 Apr 11 |
nicklas |
results on this file. |
5602 |
07 Apr 11 |
nicklas |
@see #getMessages() |
5602 |
07 Apr 11 |
nicklas |
292 |
*/ |
5602 |
07 Apr 11 |
nicklas |
293 |
public String getStatus() |
5602 |
07 Apr 11 |
nicklas |
294 |
{ |
5602 |
07 Apr 11 |
nicklas |
295 |
return status; |
5602 |
07 Apr 11 |
nicklas |
296 |
} |
5602 |
07 Apr 11 |
nicklas |
297 |
|
5602 |
07 Apr 11 |
nicklas |
298 |
/** |
5602 |
07 Apr 11 |
nicklas |
A list of detailed messages, indicating the results of |
5602 |
07 Apr 11 |
nicklas |
individual operation on this file. |
5602 |
07 Apr 11 |
nicklas |
301 |
*/ |
5602 |
07 Apr 11 |
nicklas |
302 |
public List<String> getMessages() |
5602 |
07 Apr 11 |
nicklas |
303 |
{ |
5602 |
07 Apr 11 |
nicklas |
304 |
return messages; |
5602 |
07 Apr 11 |
nicklas |
305 |
} |
5602 |
07 Apr 11 |
nicklas |
306 |
|
5602 |
07 Apr 11 |
nicklas |
307 |
} |
5602 |
07 Apr 11 |
nicklas |
308 |
|
5602 |
07 Apr 11 |
nicklas |
309 |
} |