JAL-2446 add call to SequenceFeatures.delete(); use varargs for type
[jalview.git] / src / jalview / datamodel / features / SequenceFeatures.java
index 45d6ede..6165d0a 100644 (file)
@@ -3,7 +3,7 @@ package jalview.datamodel.features;
 import jalview.datamodel.SequenceFeature;
 
 import java.util.ArrayList;
-import java.util.Collections;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -56,64 +56,40 @@ public class SequenceFeatures
   }
 
   /**
-   * Returns a (possibly empty) list of features of the given type which overlap
-   * the (inclusive) sequence position range
+   * Returns a (possibly empty) list of features, optionally restricted to
+   * specified types, which overlap the given (inclusive) sequence position
+   * range
    * 
-   * @param type
    * @param from
    * @param to
+   * @param type
    * @return
    */
-  public List<SequenceFeature> findFeatures(String type, int from,
-          int to)
-  {
-    FeatureStore features = featureStore.get(type);
-    if (features == null)
-    {
-      return Collections.emptyList();
-    }
-    return features.findOverlappingFeatures(from, to);
-  }
-
-  /**
-   * Answers a list of all positional features stored, in no particular
-   * guaranteed order
-   * 
-   * @return
-   */
-  public List<SequenceFeature> getPositionalFeatures()
+  public List<SequenceFeature> findFeatures(int from, int to,
+          String... type)
   {
     List<SequenceFeature> result = new ArrayList<SequenceFeature>();
-    for (FeatureStore featureSet : featureStore.values())
+
+    for (String featureType : varargToTypes(type))
     {
-      result.addAll(featureSet.getPositionalFeatures());
+      FeatureStore features = featureStore.get(featureType);
+      if (features != null)
+      {
+        result.addAll(features.findOverlappingFeatures(from, to));
+      }
     }
-    return result;
-  }
-
-  /**
-   * Answers a list of all features stored, in no particular guaranteed order
-   * 
-   * @return
-   */
-  public List<SequenceFeature> getAllFeatures()
-  {
-    List<SequenceFeature> result = new ArrayList<SequenceFeature>();
-
-    result.addAll(getPositionalFeatures());
-
-    result.addAll(getNonPositionalFeatures());
 
     return result;
   }
 
   /**
-   * Answers a list of all features stored of the specified type, in no
-   * particular guaranteed order
+   * Answers a list of all features stored, optionally restricted to specified
+   * types, in no particular guaranteed order
    * 
+   * @param type
    * @return
    */
-  public List<SequenceFeature> getAllFeatures(String type)
+  public List<SequenceFeature> getAllFeatures(String... type)
   {
     List<SequenceFeature> result = new ArrayList<SequenceFeature>();
 
@@ -125,84 +101,81 @@ public class SequenceFeatures
   }
 
   /**
-   * Answers a list of all non-positional features stored, in no particular
-   * guaranteed order
+   * Answers a list of all positional features, optionally restricted to
+   * specified types, in no particular guaranteed order
    * 
+   * @param type
    * @return
    */
-  public List<SequenceFeature> getNonPositionalFeatures()
+  public List<SequenceFeature> getPositionalFeatures(String... type)
   {
     List<SequenceFeature> result = new ArrayList<SequenceFeature>();
-    for (FeatureStore featureSet : featureStore.values())
-    {
-      result.addAll(featureSet.getNonPositionalFeatures());
-    }
-    return result;
-  }
 
-  /**
-   * Answers a list of all contact features stored, in no particular guaranteed
-   * order
-   * 
-   * @return
-   */
-  public List<SequenceFeature> getContactFeatures()
-  {
-    List<SequenceFeature> result = new ArrayList<SequenceFeature>();
-    for (FeatureStore featureSet : featureStore.values())
+    for (String featureType : varargToTypes(type))
     {
-      result.addAll(featureSet.getContactFeatures());
+      FeatureStore featureSet = featureStore.get(featureType);
+      if (featureSet != null)
+      {
+        result.addAll(featureSet.getPositionalFeatures());
+      }
     }
     return result;
   }
 
   /**
-   * Answers a list of all positional features of the given type, in no
-   * particular guaranteed order
+   * A convenience method that converts a vararg for feature types to an
+   * Iterable, replacing the value with the stored feature types if it is null
+   * or empty
    * 
+   * @param type
    * @return
    */
-  public List<SequenceFeature> getPositionalFeatures(String type)
+  protected Iterable<String> varargToTypes(String... type)
   {
-    List<SequenceFeature> result = new ArrayList<SequenceFeature>();
-    FeatureStore featureSet = featureStore.get(type);
-    if (featureSet != null)
-    {
-      result.addAll(featureSet.getPositionalFeatures());
-    }
-    return result;
+    return type == null || type.length == 0 ? featureStore
+            .keySet() : Arrays.asList(type);
   }
 
   /**
-   * Answers a list of all contact features of the given type, in no particular
-   * guaranteed order
+   * Answers a list of all contact features, optionally restricted to specified
+   * types, in no particular guaranteed order
    * 
    * @return
    */
-  public List<SequenceFeature> getContactFeatures(String type)
+  public List<SequenceFeature> getContactFeatures(String... type)
   {
     List<SequenceFeature> result = new ArrayList<SequenceFeature>();
-    FeatureStore featureSet = featureStore.get(type);
-    if (featureSet != null)
+
+    for (String featureType : varargToTypes(type))
     {
-      result.addAll(featureSet.getContactFeatures());
+      FeatureStore featureSet = featureStore.get(featureType);
+      if (featureSet != null)
+      {
+        result.addAll(featureSet.getContactFeatures());
+      }
     }
     return result;
   }
 
   /**
-   * Answers a list of all non-positional features of the given type, in no
-   * particular guaranteed order
+   * Answers a list of all non-positional features, optionally restricted to
+   * specified types, in no particular guaranteed order
    * 
+   * @param type
+   *          if no type is specified, all are returned
    * @return
    */
-  public List<SequenceFeature> getNonPositionalFeatures(String type)
+  public List<SequenceFeature> getNonPositionalFeatures(String... type)
   {
     List<SequenceFeature> result = new ArrayList<SequenceFeature>();
-    FeatureStore featureSet = featureStore.get(type);
-    if (featureSet != null)
+
+    for (String featureType : varargToTypes(type))
     {
-      result.addAll(featureSet.getNonPositionalFeatures());
+      FeatureStore featureSet = featureStore.get(featureType);
+      if (featureSet != null)
+      {
+        result.addAll(featureSet.getNonPositionalFeatures());
+      }
     }
     return result;
   }
@@ -246,19 +219,31 @@ public class SequenceFeatures
 
   /**
    * Returns a set of the distinct feature groups present in the collection. The
-   * set may include null. The parameter determines whether the groups for
-   * positional or for non-positional features are returned.
+   * set may include null. The boolean parameter determines whether the groups
+   * for positional or for non-positional features are returned. The optional
+   * type parameter may be used to restrict to groups for specified feature
+   * types.
    * 
    * @param positionalFeatures
+   * @param type
    * @return
    */
-  public Set<String> getFeatureGroups(boolean positionalFeatures)
+  public Set<String> getFeatureGroups(boolean positionalFeatures,
+          String... type)
   {
     Set<String> groups = new HashSet<String>();
-    for (FeatureStore featureSet : featureStore.values())
+
+    Iterable<String> types = varargToTypes(type);
+
+    for (String featureType : types)
     {
-      groups.addAll(featureSet.getFeatureGroups(positionalFeatures));
+      FeatureStore featureSet = featureStore.get(featureType);
+      if (featureSet != null)
+      {
+        groups.addAll(featureSet.getFeatureGroups(positionalFeatures));
+      }
     }
+
     return groups;
   }
 
@@ -276,6 +261,7 @@ public class SequenceFeatures
           String... groups)
   {
     Set<String> result = new HashSet<String>();
+
     for (Entry<String, FeatureStore> featureType : featureStore.entrySet())
     {
       Set<String> featureGroups = featureType.getValue().getFeatureGroups(