X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2Ffeatures%2FFeatureAttributes.java;h=a57fd555db83cc840c26846acf7e81c48bf3d07f;hb=ceba202c97c435a5a0f70307961ba74316bd8312;hp=10249f37ab68ae90b4557f706edb54e421b3e128;hpb=788e840cc150aa4777a370cebfdf5d17589bbbaf;p=jalview.git diff --git a/src/jalview/datamodel/features/FeatureAttributes.java b/src/jalview/datamodel/features/FeatureAttributes.java index 10249f3..a57fd55 100644 --- a/src/jalview/datamodel/features/FeatureAttributes.java +++ b/src/jalview/datamodel/features/FeatureAttributes.java @@ -1,3 +1,23 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.datamodel.features; import java.util.ArrayList; @@ -9,17 +29,29 @@ import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; +import jalview.bin.ApplicationSingletonProvider; +import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI; + /** * A singleton class to hold the set of attributes known for each feature type */ -public class FeatureAttributes +public class FeatureAttributes implements ApplicationSingletonI { public enum Datatype { Character, Number, Mixed } - private static FeatureAttributes instance = new FeatureAttributes(); + public static FeatureAttributes getInstance() + { + return (FeatureAttributes) ApplicationSingletonProvider + .getInstance(FeatureAttributes.class); + } + + private FeatureAttributes() + { + attributes = new HashMap<>(); + } /* * map, by feature type, of a map, by attribute name, of @@ -100,18 +132,23 @@ public class FeatureAttributes if (value != null) { value = value.trim(); + if (value.isEmpty()) + { + return; + } /* * Parse numeric value unless we have previously * seen text data for this attribute type */ - if (type == null || type == Datatype.Number) + if ((type == null && couldBeNumber(value)) + || type == Datatype.Number) { try { float f = Float.valueOf(value); - min = hasValue ? Float.min(min, f) : f; - max = hasValue ? Float.max(max, f) : f; + min = hasValue ? Math.min(min, f) : f; + max = hasValue ? Math.max(max, f) : f; hasValue = true; type = (type == null || type == Datatype.Number) ? Datatype.Number @@ -129,11 +166,23 @@ public class FeatureAttributes hasValue = false; } } + else + { + /* + * if not a number, and not seen before... + */ + type = Datatype.Character; + min = 0f; + max = 0f; + hasValue = false; + } } } /** - * Answers the description of the attribute, if recorded and unique, or null if either no, or more than description is recorded + * Answers the description of the attribute, if recorded and unique, or null + * if either no, or more than description is recorded + * * @return */ public String getDescription() @@ -173,21 +222,6 @@ public class FeatureAttributes } /** - * Answers the singleton instance of this class - * - * @return - */ - public static FeatureAttributes getInstance() - { - return instance; - } - - private FeatureAttributes() - { - attributes = new HashMap<>(); - } - - /** * Answers the attribute names known for the given feature type, in * alphabetical order (not case sensitive), or an empty set if no attributes * are known. An attribute name is typically 'simple' e.g. "AC", but may be @@ -207,6 +241,34 @@ public class FeatureAttributes } /** + * A partial check that the string is numeric - only checks the first + * character. Returns true if the first character is a digit, or if it is '.', + * '+' or '-' and not the only character. Otherwise returns false (including + * for an empty string). Note this is not a complete check as it returns true + * for (e.g.) "1A". + * + * @param f + * @return + */ + public static boolean couldBeNumber(String f) + { + int len = f.length(); + if (len == 0) + { + return false; + } + char ch = f.charAt(0); + switch (ch) + { + case '.': + case '+': + case '-': + return len > 1; + } + return (ch <= '9' && ch >= '0'); + } + + /** * Answers true if at least one attribute is known for the given feature type, * else false * @@ -334,7 +396,7 @@ public class FeatureAttributes { return; } - + Map atts = attributes.get(featureType); if (atts == null) { @@ -371,4 +433,27 @@ public class FeatureAttributes } return null; } + + /** + * Resets all attribute metadata + */ + public void clear() + { + attributes.clear(); + } + + /** + * Resets attribute metadata for one feature type + * + * @param featureType + */ + public void clear(String featureType) + { + Map map = attributes.get(featureType); + if (map != null) + { + map.clear(); + } + + } }