/// <summary> /// Exclude all components in the range beginning at "from" and ending at "to". /// </summary> /// /// <param name="exclude">The Exclude object to update.</param> /// <param name="from">The first component in the exclude range.</param> /// <param name="to">The last component in the exclude range.</param> private static void excludeRange(Exclude exclude, Name.Component from, Name.Component to) { if (from.compare(to) >= 0) { if (from.compare(to) == 0) { throw new Exception( "excludeRange: from == to. To exclude a single component, sue excludeOne."); } else { throw new Exception( "excludeRange: from must be less than to. Invalid range: [" + from.toEscapedString() + ", " + to.toEscapedString() + "]"); } } ArrayList entries = getExcludeEntries(exclude); int iNewFrom; int iFoundFrom = findEntryBeforeOrAt(entries, from); if (iFoundFrom < 0) { // There is no entry before "from" so insert at the beginning. entries.Insert(0, new Producer.ExcludeEntry(from, true)); iNewFrom = 0; } else { Producer.ExcludeEntry foundFrom = (Producer.ExcludeEntry)entries[iFoundFrom]; if (!foundFrom.anyFollowsComponent_) { if (foundFrom.component_.equals(from)) { // There is already an entry with "from", so just set the "ANY" flag. foundFrom.anyFollowsComponent_ = true; iNewFrom = iFoundFrom; } else { // Insert following the entry before "from". entries.Insert(iFoundFrom + 1, new Producer.ExcludeEntry(from, true)); iNewFrom = iFoundFrom + 1; } } else { // The entry before "from" already has an "ANY" flag, so do nothing. iNewFrom = iFoundFrom; } } // We have at least one "from" before "to", so we know this will find an entry. int iFoundTo = findEntryBeforeOrAt(entries, to); Producer.ExcludeEntry foundTo = (Producer.ExcludeEntry)entries[iFoundTo]; if (iFoundTo == iNewFrom) { // Insert the "to" immediately after the "from". entries.Insert(iNewFrom + 1, new Producer.ExcludeEntry(to, false)); } else { int iRemoveEnd; if (!foundTo.anyFollowsComponent_) { if (foundTo.component_.equals(to)) { // The "to" entry already exists. Remove up to it. iRemoveEnd = iFoundTo; } else { // Insert following the previous entry, which will be removed. entries.Insert(iFoundTo + 1, new Producer.ExcludeEntry(to, false)); iRemoveEnd = iFoundTo + 1; } } else { // "to" follows a component which is already followed by "ANY", meaning // the new range now encompasses it, so remove the component. iRemoveEnd = iFoundTo + 1; } // Remove intermediate entries since they are inside the range. int iRemoveBegin = iNewFrom + 1; int nRemoveNeeded = iRemoveEnd - iRemoveBegin; for (int i = 0; i < nRemoveNeeded; ++i) { ILOG.J2CsMapping.Collections.Collections.RemoveAt(entries, iRemoveBegin); } } setExcludeEntries(exclude, entries); }
/// <summary> /// Check if the component matches any of the exclude criteria. /// </summary> /// /// <param name="component">The name component to check.</param> /// <returns>True if the component matches any of the exclude criteria, /// otherwise false.</returns> public bool matches(Name.Component component) { for (int i = 0; i < entries_.Count; ++i) { if (get(i).getType() == net.named_data.jndn.Exclude.Type.ANY) { Exclude.Entry lowerBound = null; if (i > 0) { lowerBound = get(i - 1); } // Find the upper bound, possibly skipping over multiple ANY in a row. int iUpperBound; Exclude.Entry upperBound = null; for (iUpperBound = i + 1; iUpperBound < entries_.Count; ++iUpperBound) { if (get(iUpperBound).getType() == net.named_data.jndn.Exclude.Type.COMPONENT) { upperBound = get(iUpperBound); break; } } // If lowerBound != null, we already checked component equals lowerBound on the last pass. // If upperBound != null, we will check component equals upperBound on the next pass. if (upperBound != null) { if (lowerBound != null) { if (component.compare(lowerBound.getComponent()) > 0 && component.compare(upperBound.getComponent()) < 0) { return(true); } } else { if (component.compare(upperBound.getComponent()) < 0) { return(true); } } // Make i equal iUpperBound on the next pass. i = iUpperBound - 1; } else { if (lowerBound != null) { if (component.compare(lowerBound.getComponent()) > 0) { return(true); } } else { // entries_ has only ANY. return(true); } } } else { if (component.equals(get(i).getComponent())) { return(true); } } } return(false); }