X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2Ffeatures%2FFeatureStore.java;h=1451892985f1f26d63e2c1693e41d8e0c9a66e2c;hb=28e9024f09a78a9625ed4defa2012bf342bec51e;hp=d832f4de226f8ebeaf2c0a7f3fb23b75a2e098fe;hpb=da8e34c5aeee5e83aa844d374eb21e4c2e3cebef;p=jalview.git diff --git a/src/jalview/datamodel/features/FeatureStore.java b/src/jalview/datamodel/features/FeatureStore.java index d832f4d..1451892 100644 --- a/src/jalview/datamodel/features/FeatureStore.java +++ b/src/jalview/datamodel/features/FeatureStore.java @@ -259,21 +259,26 @@ public abstract class FeatureStore implements FeatureStoreI @Override public boolean addFeature(SequenceFeature feature) { - if (contains(feature)) - { - return false; - } - - /* - * keep a record of feature groups - */ - if (!feature.isNonPositional()) - { - positionalFeatureGroups.add(feature.getFeatureGroup()); - } + // if (contains(feature)) + // { + // return false; + // } + + // /* + // * keep a record of feature groups + // */ + // if (!feature.isNonPositional()) + // { + // positionalFeatureGroups.add(feature.getFeatureGroup()); + // } if (feature.isContactFeature()) { + if (containsContactFeature(feature)) + { + return false; + } + positionalFeatureGroups.add(feature.getFeatureGroup()); if (feature.begin > lastContactStart) { lastContactStart = feature.begin; @@ -282,11 +287,23 @@ public abstract class FeatureStore implements FeatureStoreI } else if (feature.isNonPositional()) { + if (containsNonPositional(feature)) + { + return false; + } + addNonPositionalFeature(feature); } else { - addPositionalFeature(feature); + // allow for check with + if (checkContainsPositionalFeatureForAdd(feature) + || !addPositionalFeature(feature)) + { + return false; + } + positionalFeatureGroups.add(feature.getFeatureGroup()); + // addPositionalFeature(feature); if (feature.begin > lastStart) { lastStart = feature.begin; @@ -343,8 +360,10 @@ public abstract class FeatureStore implements FeatureStoreI /** * Adds one feature to the IntervalStore that can manage nested features * (creating the IntervalStore if necessary) + * + * @return true if added -- allowing for late checking during addition */ - abstract protected void addPositionalFeature(SequenceFeature feature); + abstract protected boolean addPositionalFeature(SequenceFeature feature); /** * Adds the feature to the list of non-positional features (with lazy @@ -381,21 +400,50 @@ public abstract class FeatureStore implements FeatureStoreI { if (feature.isNonPositional()) { - return nonPositionalFeatures == null ? false - : nonPositionalFeatures.contains(feature); + return containsNonPositional(feature); + } if (feature.isContactFeature()) { - return contactFeatureStarts != null - && feature.begin <= lastContactStart - && listContains(contactFeatureStarts, feature); + return containsContactFeature(feature); + } + return containsPositionalFeature(feature); + + } + + /** + * A check that can be overridden if the check is being done during the add + * operation itself. + * + * @param feature + * @return + */ + protected boolean checkContainsPositionalFeatureForAdd( + SequenceFeature feature) + { + return containsPositionalFeature(feature); + } + + private boolean containsPositionalFeature(SequenceFeature feature) + { return features == null || feature.begin > lastStart ? false : containsFeature(feature); } + private boolean containsContactFeature(SequenceFeature feature) + { + return contactFeatureStarts != null && feature.begin <= lastContactStart + && listContains(contactFeatureStarts, feature); + } + + private boolean containsNonPositional(SequenceFeature feature) + { + return nonPositionalFeatures == null ? false + : nonPositionalFeatures.contains(feature); + } abstract protected boolean containsFeature(SequenceFeature feature);