DisEMBL and GlobProt web services further work
[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 (Util.isEmpty(presetName)) {\r
72                         // return default limit\r
73                         return getDefaultLimit();\r
74                 }\r
75                 for (Limit<T> lim : limit) {\r
76                         String preset = lim.getPreset();\r
77                         if (preset == null) {\r
78                                 continue;\r
79                         }\r
80                         if (preset.equalsIgnoreCase(presetName)) {\r
81                                 return lim;\r
82                         }\r
83                 }\r
84                 return null;\r
85         }\r
86 \r
87         /**\r
88          * \r
89          * @return the default Limit for an executable type T\r
90          */\r
91         public Limit<T> getDefaultLimit() {\r
92                 for (Limit<T> lim : limit) {\r
93                         if (lim.isDefault) {\r
94                                 return lim;\r
95                         }\r
96                 }\r
97                 return null;\r
98         }\r
99 \r
100         /**\r
101          * Validate Limits\r
102          * \r
103          * @see Limit\r
104          * @see Preset\r
105          * @param presets\r
106          * @throws ValidationException\r
107          *             if any of the Limit defined is found to be invalid. That is\r
108          *             when\r
109          * \r
110          *             1) No default limit is defined\r
111          * \r
112          *             2) More than 1 default limit is defined\r
113          * \r
114          *             3) Limit's preset name does not match any presets for type T\r
115          */\r
116         public void validate(PresetManager<T> presets) throws ValidationException {\r
117                 int defaults = 0;\r
118                 for (Limit<T> lim : limit) {\r
119                         if (lim.isDefault) {\r
120                                 defaults++;\r
121                         }\r
122                 }\r
123                 if (defaults == 0) {\r
124                         throw new ValidationException("Default limit is not set!");\r
125                 }\r
126                 if (defaults > 1) {\r
127                         throw new ValidationException(\r
128                                         "Default limit is set more than once!");\r
129                 }\r
130                 if (presets != null) {\r
131                         for (Limit<T> lim : limit) {\r
132                                 lim.validate();\r
133                                 String presetName = lim.getPreset();\r
134                                 // skip "special" preset\r
135                                 if (presetName != null\r
136                                                 && !presetName\r
137                                                                 .equals(PresetManager.LOCAL_ENGINE_LIMIT_PRESET)) {\r
138                                         Preset<T> preset = presets.getPresetByName(presetName);\r
139                                         if (preset == null) {\r
140                                                 throw new ValidationException("Preset " + presetName\r
141                                                                 + " is not found!");\r
142                                         }\r
143                                 }\r
144                         }\r
145                 }\r
146         }\r
147 \r
148 }\r