blob: 4eb5f8b0c7b7392bcbe48917562d386bba6a5ec7 [file] [log] [blame]
package org.jetbrains.idea.svn.api;
import com.intellij.util.ReflectionUtil;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.svn.SvnVcs;
import org.jetbrains.idea.svn.add.AddClient;
import org.jetbrains.idea.svn.annotate.AnnotateClient;
import org.jetbrains.idea.svn.browse.BrowseClient;
import org.jetbrains.idea.svn.change.ChangeListClient;
import org.jetbrains.idea.svn.checkin.CheckinClient;
import org.jetbrains.idea.svn.checkin.ImportClient;
import org.jetbrains.idea.svn.checkout.CheckoutClient;
import org.jetbrains.idea.svn.checkout.ExportClient;
import org.jetbrains.idea.svn.cleanup.CleanupClient;
import org.jetbrains.idea.svn.conflict.ConflictClient;
import org.jetbrains.idea.svn.content.ContentClient;
import org.jetbrains.idea.svn.copy.CopyMoveClient;
import org.jetbrains.idea.svn.delete.DeleteClient;
import org.jetbrains.idea.svn.diff.DiffClient;
import org.jetbrains.idea.svn.history.HistoryClient;
import org.jetbrains.idea.svn.info.InfoClient;
import org.jetbrains.idea.svn.integrate.MergeClient;
import org.jetbrains.idea.svn.lock.LockClient;
import org.jetbrains.idea.svn.properties.PropertyClient;
import org.jetbrains.idea.svn.revert.RevertClient;
import org.jetbrains.idea.svn.status.StatusClient;
import org.jetbrains.idea.svn.update.RelocateClient;
import org.jetbrains.idea.svn.update.UpdateClient;
import org.jetbrains.idea.svn.upgrade.UpgradeClient;
import org.tmatesoft.svn.core.wc.ISVNStatusFileProvider;
import java.util.Map;
/**
* @author Konstantin Kolosovsky.
*/
public abstract class ClientFactory {
@NotNull
protected SvnVcs myVcs;
protected AddClient addClient;
protected AnnotateClient annotateClient;
protected ContentClient contentClient;
protected HistoryClient historyClient;
protected RevertClient revertClient;
protected DeleteClient deleteClient;
protected StatusClient statusClient;
protected InfoClient infoClient;
protected CopyMoveClient copyMoveClient;
protected ConflictClient conflictClient;
protected PropertyClient propertyClient;
protected MergeClient mergeClient;
protected ChangeListClient changeListClient;
protected CheckoutClient checkoutClient;
protected LockClient myLockClient;
protected CleanupClient myCleanupClient;
protected RelocateClient myRelocateClient;
protected VersionClient myVersionClient;
protected ImportClient myImportClient;
protected ExportClient myExportClient;
protected UpgradeClient myUpgradeClient;
protected BrowseClient myBrowseClient;
protected DiffClient myDiffClient;
protected CheckinClient myCheckinClient;
protected RepositoryFeaturesClient myRepositoryFeaturesClient;
@NotNull private final Map<Class, Class> myClientImplementations = ContainerUtil.newHashMap();
protected ClientFactory(@NotNull SvnVcs vcs) {
myVcs = vcs;
setup();
}
protected abstract void setup();
protected <T extends SvnClient> void put(@NotNull Class<T> type, @NotNull Class<? extends T> implementation) {
myClientImplementations.put(type, implementation);
}
@SuppressWarnings("unchecked")
@NotNull
protected <T extends SvnClient> Class<? extends T> get(@NotNull Class<T> type) {
Class<? extends T> implementation = myClientImplementations.get(type);
if (implementation == null) {
throw new IllegalArgumentException("No implementation registered for " + type);
}
return implementation;
}
/**
* TODO: Provide more robust way for the default settings here - probably some default Command instance could be used.
*/
@NotNull
public <T extends SvnClient> T create(@NotNull Class<T> type, boolean isActive) {
T client = prepare(ReflectionUtil.newInstance(get(type)));
client.setIsActive(isActive);
return client;
}
@NotNull
public AddClient createAddClient() {
return prepare(addClient);
}
@NotNull
public AnnotateClient createAnnotateClient() {
return prepare(annotateClient);
}
@NotNull
public ContentClient createContentClient() {
return prepare(contentClient);
}
@NotNull
public HistoryClient createHistoryClient() {
return prepare(historyClient);
}
@NotNull
public RevertClient createRevertClient() {
return prepare(revertClient);
}
@NotNull
public StatusClient createStatusClient() {
return prepare(statusClient);
}
@NotNull
public StatusClient createStatusClient(@Nullable ISVNStatusFileProvider provider, @NotNull ProgressTracker handler) {
return createStatusClient();
}
@NotNull
public InfoClient createInfoClient() {
return prepare(infoClient);
}
// TODO: Update this in same like other clients - move to corresponding package, rename clients
// New instances should be always created by this method, as setXxx() methods are currently used in update logic
@NotNull
public abstract UpdateClient createUpdateClient();
@NotNull
public DeleteClient createDeleteClient() {
return prepare(deleteClient);
}
@NotNull
public CopyMoveClient createCopyMoveClient() {
return prepare(copyMoveClient);
}
@NotNull
public ConflictClient createConflictClient() {
return prepare(conflictClient);
}
@NotNull
public PropertyClient createPropertyClient() {
return prepare(propertyClient);
}
@NotNull
public MergeClient createMergeClient() {
return prepare(mergeClient);
}
@NotNull
public ChangeListClient createChangeListClient() {
return prepare(changeListClient);
}
@NotNull
public CheckoutClient createCheckoutClient() {
return prepare(checkoutClient);
}
@NotNull
public LockClient createLockClient() {
return prepare(myLockClient);
}
@NotNull
public CleanupClient createCleanupClient() {
return prepare(myCleanupClient);
}
@NotNull
public RelocateClient createRelocateClient() {
return prepare(myRelocateClient);
}
@NotNull
public VersionClient createVersionClient() {
return prepare(myVersionClient);
}
@NotNull
public ImportClient createImportClient() {
return prepare(myImportClient);
}
@NotNull
public ExportClient createExportClient() {
return prepare(myExportClient);
}
@NotNull
public UpgradeClient createUpgradeClient() {
return prepare(myUpgradeClient);
}
@NotNull
public BrowseClient createBrowseClient() {
return prepare(myBrowseClient);
}
@NotNull
public DiffClient createDiffClient() {
return prepare(myDiffClient);
}
@NotNull
public CheckinClient createCheckinClient() {
return prepare(myCheckinClient);
}
@NotNull
public RepositoryFeaturesClient createRepositoryFeaturesClient() {
return prepare(myRepositoryFeaturesClient);
}
@NotNull
protected <T extends SvnClient> T prepare(@NotNull T client) {
client.setVcs(myVcs);
client.setFactory(this);
client.setIsActive(true);
return client;
}
}