@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;
}
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;
/**
* 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
{
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);