package org.tmatesoft.svn.core.internal.wc2.old;
import java.util.Collection;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.internal.wc.SVNErrorManager;
import org.tmatesoft.svn.core.internal.wc16.SVNCopyClient16;
import org.tmatesoft.svn.core.internal.wc16.SVNMoveClient16;
import org.tmatesoft.svn.core.internal.wc2.compat.SvnCodec;
import org.tmatesoft.svn.core.wc.ISVNExternalsHandler;
import org.tmatesoft.svn.core.wc.SVNCopySource;
import org.tmatesoft.svn.core.wc2.SvnCopy;
import org.tmatesoft.svn.core.wc2.SvnCopySource;
import org.tmatesoft.svn.core.wc2.SvnTarget;
import org.tmatesoft.svn.util.SVNLogType;
public class SvnOldCopy extends SvnOldRunner<Void, SvnCopy> {
@Override
protected Void run() throws SVNException {
if (getOperation().isDisjoint()) {
return disjointCopy();
} else if (getOperation().isVirtual()) {
return virtualCopy();
} else {
return copy();
}
}
private Void disjointCopy() throws SVNException {
assert !getOperation().isMove();
final SVNCopyClient16 client = new SVNCopyClient16(getOperation().getRepositoryPool(), getOperation().getOptions());
client.setEventHandler(getOperation().getEventHandler());
client.setCommitHandler(null);
client.setExternalsHandler(ISVNExternalsHandler.DEFAULT);
client.setOptions(getOperation().getOptions());
Collection<SvnTarget> targets = getOperation().getTargets();
for (SvnTarget target : targets) {
if (target.isURL()) {
throwCannotPerformOnUrl(target, "disjoint", "copy");
}
client.doCopy(target.getFile());
}
return null;
}
private Void virtualCopy() throws SVNException {
SVNMoveClient16 client = new SVNMoveClient16(getOperation().getRepositoryPool(), getOperation().getOptions());
client.setEventHandler(getOperation().getEventHandler());
client.setOptions(getOperation().getOptions());
final SvnTarget target = getOperation().getFirstTarget();
if (target.isURL()) {
throwCannotPerformOnUrl(target, "virtual", getOperation().isMove() ? "move" : "copy");
}
final SVNCopySource[] sources = getCopySources();
for (SVNCopySource source : sources) {
client.doVirtualCopy(source.getFile(), target.getFile(), getOperation().isMove());
}
return null;
}
private Void copy() throws SVNException {
final SVNCopyClient16 client = new SVNCopyClient16(getOperation().getRepositoryPool(), getOperation().getOptions());
client.setEventHandler(getOperation().getEventHandler());
client.setCommitHandler(null);
client.setExternalsHandler(ISVNExternalsHandler.DEFAULT);
client.setOptions(getOperation().getOptions());
final SvnTarget target = getOperation().getFirstTarget();
final SVNCopySource[] sources = getCopySources();
if (target.isURL()) {
client.doCopy(sources, target.getURL(), getOperation().isMove(), getOperation().isMakeParents(), getOperation().isFailWhenDstExists(),
null, null);
} else {
client.doCopy(sources, target.getFile(), getOperation().isMove(), getOperation().isMakeParents(), getOperation().isFailWhenDstExists());
}
return null;
}
private SVNCopySource[] getCopySources() {
SVNCopySource[] sources = new SVNCopySource[getOperation().getSources().size()];
int i = 0;
for (SvnCopySource newSource : getOperation().getSources()) {
sources[i] = SvnCodec.copySource(newSource);
i++;
}
return sources;
}
private void throwCannotPerformOnUrl(SvnTarget target, String kind, String operation) throws SVNException {
SVNErrorMessage err = SVNErrorMessage.create(SVNErrorCode.UNSUPPORTED_FEATURE,
"Cannot perform ''{0}'' {1}: ''{2}'' is URL", new Object[] {
kind, operation, target
});
SVNErrorManager.error(err, SVNLogType.WC);
}
}