Next version of JABA
[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  *         Date 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