Log in Help
Print
Homegatewikisventonextrassrc 〉 CowRepositoryConnectionFactory.java
 
// No package - this is deliberate

import org.apache.commons.lang.Validate;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sventon.RepositoryConnectionFactory;
import org.sventon.appl.ConfigDirectory;
import org.sventon.model.Credentials;
import org.sventon.model.RepositoryName;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.wc.SVNWCUtil;

import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.io.IOException;

/**
 * Factory class responsible for creating subversion repository connections.
 * Based on the default sventon 2.0.4 RepositoryConnectionFactoryImpl.
 */
public class CowRepositoryConnectionFactory implements RepositoryConnectionFactory {

  private final Log logger = LogFactory.getLog(getClass());

  /**
   * Root directory where to place the svn config files.
   */
  private final ConfigDirectory configurationDirectory;

  /**
   * Subversion configuration directory, where we will look for
   * <code>config</code> and <code>servers</code> files.
   */
  private final File svnconfigDirectory;

  /**
   * Constructor.
   *
   * @param configDirectory Root directory where to place the svn config files.
   *                        If the directory does not exist, it will be created.
   * @param svnconfigDirectory Directory containing the subversion
   *                        configuration data (the config and servers files).
   */
  public CowRepositoryConnectionFactory(final ConfigDirectory configDirectory,
                                        final File svnconfigDirectory) {
    Validate.notNull(configDirectory, "Configuration directory cannot be null!");
    this.configurationDirectory = configDirectory;
    this.svnconfigDirectory = svnconfigDirectory;
  }

  /**
   * {@inheritDoc}
   * <p/>
   * Note: Be sure to call <code>repository.closeSession()</code> when connection is not needed anymore.
   */
  public SVNRepository createConnection(final RepositoryName repositoryName, final SVNURL svnUrl,
                                        final Credentials credentials) throws SVNException {

    if (svnUrl == null) {
      return null;
    }

    final SVNRepository repository = SVNRepositoryFactory.create(svnUrl);
    final File configDirectory = new File(configurationDirectory.getRepositoriesDirectory(), repositoryName.toString());
    AuthenticationData ad = null;
    ISVNAuthenticationManager manager = null;
    try {
      File authFile = new File(configDirectory, "auth");
      FileInputStream fis = new FileInputStream(authFile);
      ObjectInputStream ois = new ObjectInputStream(fis);
      try {
        ad = (AuthenticationData)ois.readObject();
      }
      finally {
        ois.close();
      }
    }
    catch(Exception e) {
      logger.warn("Could not find Cow-specific authentication data for "
          + "repository " + repositoryName, e);

      // do nothing
    }
    if(ad != null) {
      manager = new CowAuthenticationManager(svnconfigDirectory);
      ((CowAuthenticationManager)manager).setAuthenticationData(ad);
    }
    else {
      // fall back on sventon default behaviour
      manager = SVNWCUtil.createDefaultAuthenticationManager(
        svnconfigDirectory, credentials.getUsername(), credentials.getPassword(), false);
    }
    repository.setAuthenticationManager(manager);
    // fetch tunnel definitions from svnconfig/config file
    repository.setTunnelProvider(
        SVNWCUtil.createDefaultOptions(svnconfigDirectory, true));
    return repository;
  }
}