package org.tmatesoft.svn.core.wc2;
import java.util.Collection;
import java.util.LinkedList;
import org.tmatesoft.svn.core.SVNException;
/**
* Represents base class for all operations that can fetch object(s)
* for custom processing.
*
* <p/>
* Clients can provide their own handlers for receiving the object(s)
* by implementing {@link ISvnObjectReceiver} interface and assign it in
* {@link #setReceiver(ISvnObjectReceiver)}.
*
* @author TMate Software Ltd.
* @version 1.7
* @param <T> type of received object(s)
* @see SvnOperation
* @see ISvnObjectReceiver
* @see SvnAnnotate
* @see SvnDiffSummarize
* @see SvnGetChangelistPaths
* @see SvnGetInfo
* @see SvnGetProperties
* @see SvnGetStatus
* @see SvnList
* @see SvnLog
* @see SvnLogMergeInfo
* @see SvnSetLock
* @see SvnSetProperty
* @see SvnUnlock
*/
public class SvnReceivingOperation<T> extends SvnOperation<T> implements ISvnObjectReceiver<T> {
private ISvnObjectReceiver<T> receiver;
private T first;
private T last;
private Collection<T> receivedObjects;
protected SvnReceivingOperation(SvnOperationFactory factory) {
super(factory);
}
/**
* Sets client's object receiver.
*
* @param receiver object receiver
*/
public void setReceiver(ISvnObjectReceiver<T> receiver) {
this.receiver = receiver;
}
/**
* Returns client's object receiver.
*
* @return object receiver
*/
public ISvnObjectReceiver<T> getReceiver() {
return this.receiver;
}
/**
* Receives the object, adds it to objects list and calls
* client's receiver if exists.
*/
public void receive(SvnTarget target, T object) throws SVNException {
if (first == null) {
first = object;
}
last = object;
if (getReceivedObjects() != null) {
getReceivedObjects().add(object);
}
if (getReceiver() != null) {
getReceiver().receive(target, object);
}
}
/**
* Returns first received object from the list.
*
* @return first received object
*/
public T first() {
return this.first;
}
/**
* Returns last received object from the list.
*
* @return first received object
*/
public T last() {
return this.last;
}
/**
* Initializes list for received objects with <code>objects</code>
* or creates an empty list, calls the operation's {@link #run()}
* method.
*
* @param objects
* @return list of received objects
* @throws SVNException
*/
public Collection<T> run(Collection<T> objects) throws SVNException {
setReceivingContainer(objects != null ? objects : new LinkedList<T>());
try {
run();
return getReceivedObjects();
} finally {
setReceivingContainer(null);
}
}
@Override
protected void initDefaults() {
super.initDefaults();
this.first = null;
}
private void setReceivingContainer(Collection<T> receivingContainer) {
this.receivedObjects = receivingContainer;
}
private Collection<T> getReceivedObjects() {
return this.receivedObjects;
}
}