package org.tmatesoft.svn.core.wc.admin;
import org.tmatesoft.svn.core.SVNCancelException;
import org.tmatesoft.svn.core.SVNErrorCode;
import org.tmatesoft.svn.core.SVNErrorMessage;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.wc.SVNErrorManager;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.DefaultSVNRepositoryPool;
import org.tmatesoft.svn.core.wc.ISVNEventHandler;
import org.tmatesoft.svn.core.wc.ISVNOptions;
import org.tmatesoft.svn.core.wc.ISVNRepositoryPool;
import org.tmatesoft.svn.core.wc.SVNEvent;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
import org.tmatesoft.svn.core.wc2.SvnOperationFactory;
import org.tmatesoft.svn.util.ISVNDebugLog;
import org.tmatesoft.svn.util.SVNDebugLog;
import org.tmatesoft.svn.util.SVNLogType;
/**
* The <b>SVNBasicClient</b> is the base class of all
* <b>SVN</b>*<b>Client</b> classes that provides a common interface
* and realization.
* <p>
* All of <b>SVN</b>*<b>Client</b> classes use inherited methods of
* <b>SVNBasicClient</b> to access Working Copies metadata, to create
* a driver object to access a repository if it's necessary, etc. In addition
* <b>SVNBasicClient</b> provides some interface methods - such as those
* that allow you to set your {@link ISVNEventHandler event handler},
* obtain run-time configuration options, and others.
* @version 1.3
* @author TMate Software Ltd.
* @since 1.2
*/
public class SVNAdminBasicClient implements ISVNEventHandler {
private ISVNRepositoryPool myRepositoryPool;
private ISVNOptions myOptions;
private ISVNEventHandler myEventDispatcher;
private ISVNDebugLog myDebugLog;
protected SVNRepository createRepository(SVNURL url, String uuid,
boolean mayReuse) throws SVNException {
SVNRepository repository = null;
if (myRepositoryPool == null) {
repository = SVNRepositoryFactory.create(url, null);
} else {
repository = myRepositoryPool.createRepository(url, mayReuse);
}
if (uuid != null) {
String reposUUID = repository.getRepositoryUUID(true);
if (!uuid.equals(reposUUID)) {
SVNErrorMessage err = SVNErrorMessage
.create(
SVNErrorCode.RA_UUID_MISMATCH,
"Repository UUID ''{0}'' doesn''t match expected UUID ''{1}''",
new Object[] { reposUUID, uuid });
SVNErrorManager.error(err, SVNLogType.WC);
}
}
repository.setDebugLog(getDebugLog());
repository.setCanceller(getEventDispatcher());
return repository;
}
protected void dispatchEvent(SVNEvent event, double progress)
throws SVNException {
if (myEventDispatcher != null) {
try {
myEventDispatcher.handleEvent(event, progress);
} catch (SVNException e) {
throw e;
} catch (Throwable th) {
SVNDebugLog.getDefaultLog().logSevere(SVNLogType.WC, th);
SVNErrorMessage err = SVNErrorMessage
.create(SVNErrorCode.UNKNOWN,
"Error while dispatching event: {0}",
new Object[] { th.getMessage() },
SVNErrorMessage.TYPE_ERROR, th);
SVNErrorManager.error(err, th, SVNLogType.DEFAULT);
}
}
}
/**
* Sets a logger to write debug log information to.
* @param log a debug logger
*/
public void setDebugLog(ISVNDebugLog log) {
myDebugLog = log;
}
/**
* Gets run-time configuration options used by this object.
* @return the run-time options being in use
*/
public ISVNOptions getOptions() {
return myOptions;
}
/**
* Redirects this call to the registered event handler (if any).
* @throws SVNCancelException if the current operation
* was cancelled
*/
public void checkCancelled() throws SVNCancelException {
if (myEventDispatcher != null) {
myEventDispatcher.checkCancelled();
}
}
/**
* Sets an event handler for this object. This event handler
* will be dispatched {@link SVNEvent} objects to provide
* detailed information about actions and progress state
* of version control operations performed by <b>do</b>*<b>()</b>
* methods of <b>SVN</b>*<b>Client</b> classes.
* @param dispatcher an event handler
*/
public void setEventHandler(ISVNEventHandler dispatcher) {
myEventDispatcher = dispatcher;
}
protected ISVNEventHandler getEventDispatcher() {
return myEventDispatcher;
}
protected SVNAdminBasicClient(final ISVNAuthenticationManager authManager, ISVNOptions options) {
this(new DefaultSVNRepositoryPool(authManager == null ? SVNWCUtil
.createDefaultAuthenticationManager() : authManager, options,
0, false), options);
}
protected SVNAdminBasicClient(ISVNRepositoryPool repositoryPool,
ISVNOptions options) {
myRepositoryPool = repositoryPool;
setOptions(options);
}
protected SVNAdminBasicClient(SvnOperationFactory of) {
myRepositoryPool = of.getRepositoryPool();
setOptions(of.getOptions());
}
/**
* Sets run-time global configuration options to this object.
* @param options the run-time configuration options
*/
public void setOptions(ISVNOptions options) {
myOptions = options;
if (myOptions == null) {
myOptions = SVNWCUtil.createDefaultOptions(true);
}
}
/**
* Returns the debug logger currently in use.
* <p>
* If no debug logger has been specified by the time this call occurs,
* a default one (returned by <code>org.tmatesoft.svn.util.SVNDebugLog.getDefaultLog()</code>)
* will be created and used.
* @return a debug logger
*/
public ISVNDebugLog getDebugLog() {
if (myDebugLog == null) {
return SVNDebugLog.getDefaultLog();
}
return myDebugLog;
}
/**
* Dispatches events to the registered event handler (if any).
* @param event the current event
* @param progress progress state (from 0 to 1)
* @throws SVNException
*/
public void handleEvent(SVNEvent event, double progress)
throws SVNException {
dispatchEvent(event, progress);
}
}