package org.codefaces.core.svn.internal.operations;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.codefaces.core.connectors.SCMConnector;
import org.codefaces.core.connectors.SCMResponseException;
import org.codefaces.core.models.Repo;
import org.codefaces.core.models.RepoFile;
import org.codefaces.core.models.RepoFolder;
import org.codefaces.core.models.RepoFolderRoot;
import org.codefaces.core.models.RepoResource;
import org.codefaces.core.operations.SCMOperationHandler;
import org.codefaces.core.operations.SCMOperationParameter;
import org.codefaces.core.operations.SCMOperationParameters;
import org.eclipse.core.runtime.Assert;
import org.codefaces.core.svn.internal.clientadaptor.SVNDirectoryEntry;
import org.codefaces.core.svn.internal.clientadaptor.SVNResourceKind;
import org.codefaces.core.svn.internal.connectors.SVNConnector;
public class SVNFetchChildrenOperationHandler implements SCMOperationHandler {
@Override
public Collection<RepoResource> execute(SCMConnector connector,
SCMOperationParameters parameter) {
Object folderPara = parameter.getParameter(SCMOperationParameter.REPO_FOLDER);
Assert.isTrue(folderPara instanceof RepoFolder);
RepoFolder folder = (RepoFolder) folderPara;
Repo repo = folder.getRoot().getRepo();
String username = repo.getCredential().getUser();
String password = repo.getCredential().getPassword();
String svnUrl = SVNOperationUtil.createSvnUrlFromResource(folder);
SVNConnector svnConnector = (SVNConnector) connector;
SVNDirectoryEntry[] entries = svnConnector.getSvnClient()
.getDirectoryEntries(svnUrl, username, password);
List<RepoResource> children = new ArrayList<RepoResource>();
for(SVNDirectoryEntry entry: entries){
RepoResource child = createRepoResourceFromSVNDirectoryEntry(
svnConnector, entry, folder);
if(child == null){
throw new SCMResponseException("Unknown SVN resource type for "
+ entry.getUrl());
}
children.add(child);
}
return children;
}
private RepoResource createRepoResourceFromSVNDirectoryEntry(
SVNConnector svnConnector, SVNDirectoryEntry entry, RepoResource parent) {
RepoFolderRoot root = parent.getRoot();
String id = SVNOperationUtil.generateRepoResourceID(entry);
if (entry.getResourceKind() == SVNResourceKind.FILE) {
return new RepoFile(root, parent, id, entry.getName());
} else if (entry.getResourceKind() == SVNResourceKind.DIRECTORY) {
return new RepoFolder(root, parent, id, entry.getName());
}
return null;
}
}