JWS-17: fix problem with undefined URL for the furtherDetails tag
[jabaws.git] / datamodel / compbio / metadata / Limit.java
index 7c9b9f7..8132832 100644 (file)
@@ -29,167 +29,207 @@ import compbio.util.SysPrefs;
 \r
 /**\r
  * A value object containing a maximum number of sequences and a maximum average\r
- * sequence length for a preset.\r
+ * sequence length for a preset. Also contains static method for determining the\r
+ * number of sequence and their average length in the List<FastaSequence>\r
  * \r
- * @see LimitsManager\r
  * \r
  * @author pvtroshin\r
  * \r
- *         Date January 2010\r
+ * @version 1.0 January 2010\r
  * \r
  * @param <T>\r
  *            the type of an executable for which this limit is defined.\r
  * \r
+ * @see LimitsManager\r
  */\r
 @XmlAccessorType(XmlAccessType.FIELD)\r
 public class Limit<T> {\r
 \r
-    private String preset;\r
-    private int seqNumber;\r
-    private int seqLength;\r
+       // Allowed to be null\r
+       private String preset;\r
+       // Cannot be 0 or below\r
+       private int seqNumber;\r
+       // Can be 0 - i.e. undefined\r
+       private int seqLength;\r
 \r
-    @XmlAttribute\r
-    boolean isDefault;\r
+       @XmlAttribute\r
+       boolean isDefault;\r
 \r
-    private Limit() {\r
-       // JAXB default constructor\r
-    }\r
+       private Limit() {\r
+               // JAXB default constructor\r
+       }\r
 \r
-    public Limit(int seqNumber, int seqLength, String preset) {\r
-       if (seqNumber <= 0) {\r
-           throw new IllegalArgumentException(\r
-                   "seqNumber - a maximum number of sequences to align must be greater than 0. Value given:"\r
-                           + seqNumber);\r
+       /**\r
+        * Instantiate the limit\r
+        * \r
+        * @param seqNumber\r
+        *            the maximum number of sequences allowed for calculation.\r
+        *            Required\r
+        * @param seqLength\r
+        *            the average length of the sequence, optional\r
+        * @param preset\r
+        *            the name of preset if any, optional\r
+        * @throws IllegalArgumentException\r
+        *             if the seqNumber is not supplied or the seqLength is negative\r
+        */\r
+       public Limit(int seqNumber, int seqLength, String preset) {\r
+               if (seqNumber <= 0) {\r
+                       throw new IllegalArgumentException(\r
+                                       "seqNumber - a maximum number of sequences to align must be greater than 0. Value given:"\r
+                                                       + seqNumber);\r
+               }\r
+               if (seqLength < 0) {\r
+                       throw new IllegalArgumentException(\r
+                                       "seqLength - an average sequence length must be greater than 0. Value given:"\r
+                                                       + seqLength);\r
+               }\r
+               this.seqNumber = seqNumber;\r
+               this.seqLength = seqLength;\r
+               this.preset = preset;\r
+               this.isDefault = false;\r
        }\r
-       if (seqLength <= 0) {\r
-           throw new IllegalArgumentException(\r
-                   "seqLength - an average sequence length must be greater than 0. Value given:"\r
-                           + seqLength);\r
+\r
+       public Limit(int seqNumber, int seqLength, String preset, boolean isDefault) {\r
+               this(seqNumber, seqNumber, preset);\r
+               this.isDefault = isDefault;\r
        }\r
-       this.seqNumber = seqNumber;\r
-       this.seqLength = seqLength;\r
-       this.preset = preset;\r
-       this.isDefault = false;\r
-    }\r
-\r
-    public Limit(int seqNumber, int seqLength, String preset, boolean isDefault) {\r
-       this(seqNumber, seqNumber, preset);\r
-       this.isDefault = isDefault;\r
-    }\r
-\r
-    public String getPreset() {\r
-       return preset;\r
-    }\r
-\r
-    public int getAvgSeqLength() {\r
-       return seqLength;\r
-    }\r
-\r
-    public int getSeqNumber() {\r
-       return seqNumber;\r
-    }\r
-\r
-    public boolean isDefault() {\r
-       return isDefault;\r
-    }\r
-\r
-    @Override\r
-    public int hashCode() {\r
-       final int prime = 31;\r
-       int result = 1;\r
-       result = prime * result + ((preset == null) ? 0 : preset.hashCode());\r
-       result = prime * result + seqLength;\r
-       result = prime * result + seqNumber;\r
-       return result;\r
-    }\r
-\r
-    @Override\r
-    public boolean equals(Object obj) {\r
-       if (this == obj)\r
-           return true;\r
-       if (obj == null)\r
-           return false;\r
-       if (getClass() != obj.getClass())\r
-           return false;\r
-       Limit other = (Limit) obj;\r
-       if (preset == null) {\r
-           if (other.preset != null)\r
-               return false;\r
-       } else if (!preset.equals(other.preset))\r
-           return false;\r
-       if (seqLength != other.seqLength)\r
-           return false;\r
-       if (seqNumber != other.seqNumber)\r
-           return false;\r
-       return true;\r
-    }\r
-\r
-    @Override\r
-    public String toString() {\r
-       String value = "";\r
-       if (isDefault) {\r
-           value = "Default Limit" + SysPrefs.newlinechar;\r
-       } else {\r
-           value = "Limit for Preset '" + preset + "'" + SysPrefs.newlinechar;\r
+\r
+       public String getPreset() {\r
+               return preset;\r
        }\r
-       value += "Maximum sequence number=" + seqNumber + SysPrefs.newlinechar;\r
-       value += "Average sequence length=" + seqLength + SysPrefs.newlinechar;\r
-       value += SysPrefs.newlinechar;\r
-       return value;\r
-    }\r
-\r
-    long numberOfLetters() {\r
-       return this.seqNumber * this.seqLength;\r
-    }\r
-\r
-    /**\r
-     * Checks if the number of sequences or their average length in the dataset\r
-     * exceeds limits the values defined by this Limit\r
-     * \r
-     * @param data\r
-     * @return true if a limit is exceeded (what is the dataset is larger then\r
-     *         the limit), false otherwise.\r
-     */\r
-    public boolean isExceeded(List<FastaSequence> data) {\r
-       if (data == null) {\r
-           throw new NullPointerException(\r
-                   "List of fasta sequences is expected!");\r
+\r
+       /**\r
+        * \r
+        * @return the allowed average sequence length\r
+        */\r
+       public int getAvgSeqLength() {\r
+               return seqLength;\r
        }\r
-       if (data.size() > this.seqNumber) {\r
-           return true;\r
+\r
+       /**\r
+        * \r
+        * @return the maximum number of sequences allowed\r
+        */\r
+       public int getSeqNumber() {\r
+               return seqNumber;\r
        }\r
-       if (this.seqLength != 0) {\r
-           if ((long) getAvgSeqLength() * data.size() > numberOfLetters()) {\r
+\r
+       /**\r
+        * \r
+        * @return true is this is a default limit to be used, false otherwise\r
+        */\r
+       public boolean isDefault() {\r
+               return isDefault;\r
+       }\r
+\r
+       @Override\r
+       public int hashCode() {\r
+               final int prime = 31;\r
+               int result = 1;\r
+               result = prime * result + ((preset == null) ? 0 : preset.hashCode());\r
+               result = prime * result + seqLength;\r
+               result = prime * result + seqNumber;\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       public boolean equals(Object obj) {\r
+               if (this == obj)\r
+                       return true;\r
+               if (obj == null)\r
+                       return false;\r
+               if (getClass() != obj.getClass())\r
+                       return false;\r
+               Limit other = (Limit) obj;\r
+               if (preset == null) {\r
+                       if (other.preset != null)\r
+                               return false;\r
+               } else if (!preset.equals(other.preset))\r
+                       return false;\r
+               if (seqLength != other.seqLength)\r
+                       return false;\r
+               if (seqNumber != other.seqNumber)\r
+                       return false;\r
                return true;\r
-           }\r
        }\r
-       return false;\r
-    }\r
-\r
-    /**\r
-     * Calculates an average sequence length of the dataset\r
-     * \r
-     * @param data\r
-     * @return an average sequence length in the input dataset\r
-     */\r
-    public static int getAvgSequenceLength(List<FastaSequence> data) {\r
-       long length = 0;\r
-       for (FastaSequence seq : data) {\r
-           length += seq.getLength();\r
+\r
+       @Override\r
+       public String toString() {\r
+               String value = "";\r
+               if (isDefault) {\r
+                       value = "Default Limits:" + SysPrefs.newlinechar;\r
+               } else {\r
+                       value = "Limits for Preset '" + preset + "'" + SysPrefs.newlinechar;\r
+               }\r
+               value += "Maximum sequence number=" + seqNumber + SysPrefs.newlinechar;\r
+               value += "Average sequence length=" + seqLength + SysPrefs.newlinechar;\r
+               return value;\r
+       }\r
+\r
+       /*\r
+        * Calculates total number of letters allowed\r
+        */\r
+       long numberOfLetters() {\r
+               return this.seqNumber * this.seqLength;\r
+       }\r
+\r
+       /**\r
+        * Checks if the number of sequences or their average length in the dataset\r
+        * exceeds this limit.\r
+        * \r
+        * @param data\r
+        *            the dataset to measure\r
+        * @return true if a limit is exceeded (what is the dataset is larger then\r
+        *         the limit), false otherwise. First check the number of sequences\r
+        *         in the dataset and if it exceeds the limit return true\r
+        *         irrespective of the average length. If the number of sequences in\r
+        *         the dataset is less than the limit and average length is defined,\r
+        *         then check whether the total number of letters (number of\r
+        *         sequence multiplied by the average sequence length) is greater\r
+        *         then the total number of letters in the dataset. Returns true if\r
+        *         the total number of letters in the dataset is greater than the\r
+        *         limit, false otherwise.\r
+        */\r
+       public boolean isExceeded(List<FastaSequence> data) {\r
+               if (data == null) {\r
+                       throw new NullPointerException(\r
+                                       "List of fasta sequences is expected!");\r
+               }\r
+               if (data.size() > this.seqNumber) {\r
+                       return true;\r
+               }\r
+               if (this.seqLength != 0 && data.size() > 0) {\r
+                       if ((long) getAvgSequenceLength(data) * data.size() > numberOfLetters()) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
        }\r
-       return (int) (length / data.size());\r
-    }\r
-\r
-    void validate() {\r
-       if (this.seqNumber < 1) {\r
-           throw new AssertionError(\r
-                   "Maximum number of sequences must be defined and be positive! Set value is: "\r
-                           + this.seqNumber);\r
+\r
+       /**\r
+        * Calculates an average sequence length of the dataset\r
+        * \r
+        * @param data\r
+        * @return an average sequence length in the input dataset\r
+        */\r
+       public static int getAvgSequenceLength(List<FastaSequence> data) {\r
+               long length = 0;\r
+               for (FastaSequence seq : data) {\r
+                       length += seq.getLength();\r
+               }\r
+               return (int) (length / data.size());\r
        }\r
-       if (this.seqLength != 0 && this.seqLength < 1) {\r
-           throw new AssertionError(\r
-                   "Average sequence length must be positive! Set value is: "\r
-                           + this.seqLength);\r
+\r
+       void validate() {\r
+               if (this.seqNumber < 1) {\r
+                       throw new AssertionError(\r
+                                       "Maximum number of sequences must be defined and be positive! Set value is: "\r
+                                                       + this.seqNumber);\r
+               }\r
+               if (this.seqLength != 0 && this.seqLength < 1) {\r
+                       throw new AssertionError(\r
+                                       "Average sequence length must be positive! Set value is: "\r
+                                                       + this.seqLength);\r
+               }\r
        }\r
-    }\r
 }\r