/*
* ====================================================================
* Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://svnkit.com/license.html.
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
* ====================================================================
*/
package org.tmatesoft.svn.core;
/**
* The <b>SVNMergeRange</b> class represents a range of merged revisions.
*
* @version 1.3
* @author TMate Software Ltd.
* @since 1.2
*/
public class SVNMergeRange implements Comparable {
private long myStartRevision;
private long myEndRevision;
private boolean myIsInheritable;
/**
* Constructs a new <code>SVNMergeRange</code> object.
*
* @param startRevision start revision of this merge range
* @param endRevision end revision of this merge range
* @param isInheritable whether this range is inheritable or not
*/
public SVNMergeRange(long startRevision, long endRevision, boolean isInheritable) {
myStartRevision = startRevision;
myEndRevision = endRevision;
myIsInheritable = isInheritable;
}
/**
* Returns the end revision of this merge range.
* @return end revision
*/
public long getEndRevision() {
return myEndRevision;
}
/**
* Returns the start revision of this merge range.
* @return start revision
*/
public long getStartRevision() {
return myStartRevision;
}
/**
* Sets the end revision of this merge range. This method is used by <code>SVNKit</code>
* internals and is not intended for API users.
*
* @param endRevision merge range end revision
*/
public void setEndRevision(long endRevision) {
myEndRevision = endRevision;
}
/**
* Sets the start revision of this merge range. This method is used by <code>SVNKit</code>
* internals and is not intended for API users.
*
* @param startRevision merge range start revision
*/
public void setStartRevision(long startRevision) {
myStartRevision = startRevision;
}
/**
* Compares this object to another one.
*
* <p/>
* Note: merge range {@link #isInheritable() inheritance} is not taken into account when comparing two
* <code>SVNMergeRange</code> objects.
*
* @param o object to compare to
* @return <code>0</code> if <code>o</code> is exactly this object or
* <code>o.getStartRevision() == this.getStartRevision() && o.getEndRevision() == this.getEndRevision()</code>;
* <code>-1</code> if either <code>this.getStartRevision() < o.getStartRevision()</code> or
* <code>this.getStartRevision() == o.getStartRevision() && this.getEndRevision() < o.getEndRevision()</code>;
* <code>1</code> if either <code>this.getStartRevision() > o.getStartRevision()</code> or
* <code>this.getStartRevision() == o.getStartRevision() && this.getEndRevision() > o.getEndRevision()</code>
*/
public int compareTo(Object o) {
if (o == this) {
return 0;
}
if (o == null || o.getClass() != SVNMergeRange.class) {
return 1;
}
SVNMergeRange range = (SVNMergeRange) o;
if (range.myStartRevision == myStartRevision &&
range.myEndRevision == myEndRevision) {
return 0;
} else if (range.myStartRevision == myStartRevision) {
return myEndRevision < range.myEndRevision ? -1 : 1;
}
return myStartRevision < range.myStartRevision ? -1 : 1;
}
/**
* Says if this object is equal to <code>obj</code> or not.
*
* <p/>
* Identical to <code>this.compareTo(obj) == 0</code>.
*
* @param obj object ot compare to
* @return <span class="javakeyword">true</span> if equal; otherwise <span class="javakeyword">false</span>
*/
public boolean equals(Object obj) {
return this.compareTo(obj) == 0;
}
/**
* Combines this merge range and the given <code>range</code> into a single one.
*
* <p/>
* Combining may only occur if {@link #canCombine(SVNMergeRange, boolean)} returns <span class="javakeyword">true</span>
* for the specified parameters.
*
* <p/>
* Note: combining changes the state of this object.
*
* @param range range to combine with this range
* @param considerInheritance whether inheritance information should be taken into account
* @return if combining occurs, returns this object which is now a combination
* of the two ranges; otherwise returns <code>range</code>
*/
public SVNMergeRange combine(SVNMergeRange range, boolean considerInheritance) {
if (canCombine(range, considerInheritance)) {
myStartRevision = Math.min(myStartRevision, range.getStartRevision());
myEndRevision = Math.max(myEndRevision, range.getEndRevision());
myIsInheritable = myIsInheritable || range.myIsInheritable;
return this;
}
return range;
}
/**
* Tells whether this range can me combined with the given <code>range</code> depending on
* inheritance or not.
*
* <p/>
* Combining may occur only when two ranges intersect each other what may be checked by the following case:
* <code>range1.getStartRevision() <= range2.getEndRevision() && range2.getStartRevision() <= range1.getEndRevision()</code>.
* If this condition evaluates to <span class="javakeyword">true</span>, then the ranges intersect.
*
* @param range range to combine with this range
* @param considerInheritance whether inheritance information should be taken into account or not
* @return <span class="javakeyword">true</span> when the ranges intersect,
* <code>considerInheritance</code> is not set, or if set, both ranges
* have the same inheritance; otherwise <span class="javakeyword">false</span>
*/
public boolean canCombine(SVNMergeRange range, boolean considerInheritance) {
if (range != null && myStartRevision <= range.getEndRevision() &&
range.getStartRevision() <= myEndRevision) {
if (!considerInheritance || (considerInheritance && myIsInheritable == range.myIsInheritable)) {
return true;
}
}
return false;
}
/**
* Says whether this range contains the specified <code>range</code> depending on inheritance or not.
*
* @param range range to check
* @param considerInheritance whether inheritance information should be taken into account or not
* @return <span class="javakeyword">true</span> if this range contains the
* specified <code>range</code>; otherwise <span class="javakeyword">false</span>
*/
public boolean contains(SVNMergeRange range, boolean considerInheritance) {
return range != null && myStartRevision <= range.myStartRevision &&
range.myEndRevision <= myEndRevision &&
(!considerInheritance || (!myIsInheritable == !range.myIsInheritable));
}
/**
* Says whether this range intersects the specified <code>range</code> depending on inheritance or not.
*
* @param range range to check
* @param considerInheritance whether inheritance information should be taken into account or not
* @return <span class="javakeyword">true</span> if this range intersects the
* specified <code>range</code>; otherwise <span class="javakeyword">false</span>
*/
public boolean intersects(SVNMergeRange range, boolean considerInheritance) {
return range != null && myStartRevision + 1 <= range.myEndRevision &&
range.myStartRevision + 1 <= myEndRevision &&
(!considerInheritance || (!myIsInheritable == !range.myIsInheritable));
}
/**
* Swaps the start revision and the end revision of this merge range object.
*
* @return this object itself
*/
public SVNMergeRange swapEndPoints() {
long tmp = myStartRevision;
myStartRevision = myEndRevision;
myEndRevision = tmp;
return this;
}
/**
* Tells whether this merge range should be inherited by treewise descendants of the path to which the range applies.
*
* @return <span class="javakeyword">true</span> if inheritable; otherwise <span class="javakeyword">false</span>
*/
public boolean isInheritable() {
return myIsInheritable;
}
/**
* Sets whether this merge range is inheritable or not.
* This method is used by <code>SVNKit</code> internals and is not intended for API users.
*
* @param isInheritable whether this range is inheritable or not
*/
public void setInheritable(boolean isInheritable) {
myIsInheritable = isInheritable;
}
/**
* Makes an exact copy of this object.
*
* @return exact copy of this object
*/
public SVNMergeRange dup() {
return new SVNMergeRange(myStartRevision, myEndRevision, myIsInheritable);
}
/**
* Return a string representation of this object.
* @return this object as a string
*/
public String toString() {
String output = "";
if (myStartRevision == myEndRevision - 1) {
output += String.valueOf(myEndRevision);
} else {
output += String.valueOf(myStartRevision + 1) + "-" + String.valueOf(myEndRevision);
}
if (!isInheritable()) {
output += SVNMergeRangeList.MERGE_INFO_NONINHERITABLE_STRING;
}
return output;
}
}