blob: aaf4e49593e9d417bb25d60972521f4d906f1642 [file] [log] [blame]
/*
* Copyright (c) 2010-2013 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.spi.common.commit;
import org.eclipse.emf.cdo.common.branch.CDOBranch;
import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.internal.common.branch.CDOBranchPointImpl;
import java.text.MessageFormat;
import java.util.LinkedList;
/**
* If the meaning of this type isn't clear, there really should be more of a description here...
*
* @noextend This class is not intended to be subclassed by clients.
* @author Eike Stepper
* @since 3.0
*/
public class CDOChangeSetSegment implements CDOBranchPoint
{
private CDOBranchPoint branchPoint;
private long endTime;
public CDOChangeSetSegment(CDOBranch branch, long timeStamp, long endTime)
{
branchPoint = new CDOBranchPointImpl(branch, timeStamp);
this.endTime = endTime;
}
public CDOBranch getBranch()
{
return branchPoint.getBranch();
}
public long getTimeStamp()
{
return branchPoint.getTimeStamp();
}
public long getEndTime()
{
return endTime;
}
public CDOBranchPoint getEndPoint()
{
return getBranch().getPoint(endTime);
}
public boolean isOpenEnded()
{
return endTime == CDOBranchPoint.UNSPECIFIED_DATE;
}
/**
* @since 4.6
*/
public boolean contains(CDOBranchPoint branchPoint)
{
CDOBranch branch = branchPoint.getBranch();
if (branch != getBranch())
{
return false;
}
long timeStamp = branchPoint.getTimeStamp();
if (timeStamp < getTimeStamp())
{
return false;
}
if (!isOpenEnded() && timeStamp > endTime)
{
return false;
}
return true;
}
@Override
public String toString()
{
return MessageFormat.format("Segment[{0}, {1}, {2}]", getBranch(), getTimeStamp(), endTime); //$NON-NLS-1$
}
/**
* @since 4.6
*/
public static void handleSegments(CDOBranchPoint endPoint, Handler handler)
{
long creationTime = endPoint.getBranch().getBranchManager().getMainBranch().getBase().getTimeStamp();
handleSegments(creationTime, endPoint, handler);
}
/**
* @since 4.6
*/
public static void handleSegments(long startTime, CDOBranchPoint endPoint, Handler handler)
{
CDOBranch endBranch = endPoint.getBranch();
for (;;)
{
CDOBranchPoint base = endBranch.getBase();
long timeStamp = base.getTimeStamp();
long endTime = endPoint.getTimeStamp();
if (timeStamp <= startTime)
{
handler.handleSegment(new CDOChangeSetSegment(endBranch, startTime, endTime));
return;
}
if (!handler.handleSegment(new CDOChangeSetSegment(endBranch, timeStamp, endTime)))
{
return;
}
endPoint = base;
endBranch = base.getBranch();
}
}
/**
* @since 4.6
*/
public static void handleSegments(CDOBranchPoint startPoint, CDOBranchPoint endPoint, Handler handler)
{
CDOBranch startBranch = startPoint.getBranch();
CDOBranch endBranch = endPoint.getBranch();
while (startBranch != endBranch)
{
CDOBranchPoint base = endBranch.getBase();
if (!handler.handleSegment(new CDOChangeSetSegment(endBranch, base.getTimeStamp(), endPoint.getTimeStamp())))
{
return;
}
endPoint = base;
endBranch = base.getBranch();
}
handler.handleSegment(new CDOChangeSetSegment(startBranch, startPoint.getTimeStamp(), endPoint.getTimeStamp()));
}
/**
* @since 4.6
*/
public static CDOChangeSetSegment[] createFrom(long startTime, CDOBranchPoint endPoint)
{
final LinkedList<CDOChangeSetSegment> result = new LinkedList<CDOChangeSetSegment>();
handleSegments(startTime, endPoint, new Handler()
{
public boolean handleSegment(CDOChangeSetSegment segment)
{
result.addFirst(segment);
return true;
}
});
return result.toArray(new CDOChangeSetSegment[result.size()]);
}
public static CDOChangeSetSegment[] createFrom(CDOBranchPoint startPoint, CDOBranchPoint endPoint)
{
final LinkedList<CDOChangeSetSegment> result = new LinkedList<CDOChangeSetSegment>();
handleSegments(startPoint, endPoint, new Handler()
{
public boolean handleSegment(CDOChangeSetSegment segment)
{
result.addFirst(segment);
return true;
}
});
return result.toArray(new CDOChangeSetSegment[result.size()]);
}
/**
* @since 4.6
*/
public static boolean contains(CDOChangeSetSegment[] segments, CDOBranchPoint branchPoint)
{
for (CDOChangeSetSegment segment : segments)
{
if (segment.contains(branchPoint))
{
return true;
}
}
return false;
}
/**
* @author Eike Stepper
* @since 4.6
*/
public interface Handler
{
public boolean handleSegment(CDOChangeSetSegment segment);
}
}