Change the way to deal with Limits to simplify wrapper writing and enable couping...
[jabaws.git] / datamodel / compbio / metadata / LimitsManager.java
1 /* Copyright (c) 2009 Peter Troshin\r
2  *  \r
3  *  JAva Bioinformatics Analysis Web Services (JABAWS) @version: 1.0 \r
4  * \r
5  *  This library is free software; you can redistribute it and/or modify it under the terms of the\r
6  *  Apache License version 2 as published by the Apache Software Foundation\r
7  * \r
8  *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without\r
9  *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Apache \r
10  *  License for more details.\r
11  * \r
12  *  A copy of the license is in apache_license.txt. It is also available here:\r
13  * @see: http://www.apache.org/licenses/LICENSE-2.0.txt\r
14  * \r
15  * Any republication or derived work distributed in source code form\r
16  * must include this copyright and license notice.\r
17  */\r
18 \r
19 package compbio.metadata;\r
20 \r
21 import java.util.List;\r
22 \r
23 import javax.xml.bind.ValidationException;\r
24 import javax.xml.bind.annotation.XmlAccessType;\r
25 import javax.xml.bind.annotation.XmlAccessorType;\r
26 import javax.xml.bind.annotation.XmlRootElement;\r
27 \r
28 import compbio.util.Util;\r
29 \r
30 /**\r
31  * A collection of Limits\r
32  * \r
33  * @see Limit\r
34  * @author pvtroshin\r
35  * \r
36  * @version 1.0 January 2010\r
37  * @param <T>\r
38  *            executable type\r
39  */\r
40 @XmlRootElement(name = "limits")\r
41 @XmlAccessorType(XmlAccessType.FIELD)\r
42 public class LimitsManager<T> {\r
43 \r
44         String runnerClassName;\r
45         List<Limit<T>> limit;\r
46 \r
47         /**\r
48          * \r
49          * @return all limits defined for an executable T\r
50          */\r
51         public List<Limit<T>> getLimits() {\r
52                 return limit;\r
53         }\r
54 \r
55         @Override\r
56         public String toString() {\r
57                 return "LimitsManager [limits=" + limit + ", runnerClassName="\r
58                                 + runnerClassName + "]";\r
59         }\r
60 \r
61         /**\r
62          * \r
63          * @param presetName\r
64          * @return Limit defined for the executable T and presetName. If no limit is\r
65          *         defined for the presetName then default Limit is returned. If\r
66          *         presetName is empty or null than the default Limit will be\r
67          *         returned. If not limit defined for the type T than NULL will be\r
68          *         returned\r
69          */\r
70         public Limit<T> getLimitByName(String presetName) {\r
71                 if (limit == null) {\r
72                         return null;\r
73                 }\r
74                 if (Util.isEmpty(presetName)) {\r
75                         // return default limit\r
76                         return getDefaultLimit();\r
77                 }\r
78                 for (Limit<T> lim : limit) {\r
79                         String preset = lim.getPreset();\r
80                         if (preset == null) {\r
81                                 continue;\r
82                         }\r
83                         if (preset.equalsIgnoreCase(presetName)) {\r
84                                 return lim;\r
85                         }\r
86                 }\r
87                 return null;\r
88         }\r
89 \r
90         /**\r
91          * \r
92          * @return the default Limit for an executable type T\r
93          */\r
94         public Limit<T> getDefaultLimit() {\r
95                 for (Limit<T> lim : limit) {\r
96                         if (lim.isDefault) {\r
97                                 return lim;\r
98                         }\r
99                 }\r
100                 return null;\r
101         }\r
102 \r
103         /**\r
104          * Validate Limits\r
105          * \r
106          * @see Limit\r
107          * @see Preset\r
108          * @param presets\r
109          * @throws ValidationException\r
110          *             if any of the Limit defined is found to be invalid. That is\r
111          *             when\r
112          * \r
113          *             1) No default limit is defined\r
114          * \r
115          *             2) More than 1 default limit is defined\r
116          * \r
117          *             3) Limit's preset name does not match any presets for type T\r
118          */\r
119         public void validate(PresetManager<T> presets) throws ValidationException {\r
120                 int defaults = 0;\r
121                 for (Limit<T> lim : limit) {\r
122                         if (lim.isDefault) {\r
123                                 defaults++;\r
124                         }\r
125                 }\r
126                 if (defaults == 0) {\r
127                         throw new ValidationException("Default limit is not set!");\r
128                 }\r
129                 if (defaults > 1) {\r
130                         throw new ValidationException(\r
131                                         "Default limit is set more than once!");\r
132                 }\r
133                 if (presets != null) {\r
134                         for (Limit<T> lim : limit) {\r
135                                 lim.validate();\r
136                                 String presetName = lim.getPreset();\r
137                                 // skip "special" preset\r
138                                 if (presetName != null\r
139                                                 && !presetName\r
140                                                                 .equals(PresetManager.LOCAL_ENGINE_LIMIT_PRESET)) {\r
141                                         Preset<T> preset = presets.getPresetByName(presetName);\r
142                                         if (preset == null) {\r
143                                                 throw new ValidationException("Preset " + presetName\r
144                                                                 + " is not found!");\r
145                                         }\r
146                                 }\r
147                         }\r
148                 }\r
149         }\r
150 \r
151 }\r