You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm-commits@maven.apache.org by jv...@apache.org on 2004/01/17 23:59:50 UTC

cvs commit: maven-scm/generic-scm-api/src/java/org/apache/maven/genericscm/repository RepositoryInfo.java

jvanzyl     2004/01/17 14:59:50

  Modified:    generic-scm-api/src/java/org/apache/maven/genericscm/manager
                        DefaultScmManager.java ScmManager.java
               generic-scm-api/src/java/org/apache/maven/genericscm/repository
                        RepositoryInfo.java
  Log:
  o using the ScmManager as the basis for making a user friendly API for
    maven-scm.
  
  Revision  Changes    Path
  1.3       +93 -58    maven-scm/generic-scm-api/src/java/org/apache/maven/genericscm/manager/DefaultScmManager.java
  
  Index: DefaultScmManager.java
  ===================================================================
  RCS file: /home/cvs/maven-scm/generic-scm-api/src/java/org/apache/maven/genericscm/manager/DefaultScmManager.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- DefaultScmManager.java	13 Dec 2003 22:32:49 -0000	1.2
  +++ DefaultScmManager.java	17 Jan 2004 22:59:50 -0000	1.3
  @@ -56,87 +56,122 @@
    * ====================================================================
    */
   
  -import java.util.Hashtable;
  -
   import org.apache.maven.genericscm.ScmException;
   import org.apache.maven.genericscm.ScmFactory;
   import org.apache.maven.genericscm.command.Command;
  -import org.apache.maven.genericscm.command.CommandWrapper;
  -import org.apache.maven.genericscm.repository.Repository;
  +import org.apache.maven.genericscm.command.checkout.CheckOutCommand;
  +import org.apache.maven.genericscm.command.update.UpdateCommand;
   import org.apache.maven.genericscm.repository.RepositoryInfo;
   
  -/**
  - * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
  - * @version $Id$
  - */
  +import java.io.ByteArrayOutputStream;
  +import java.io.InputStream;
  +import java.net.URL;
  +import java.util.Enumeration;
  +
   public class DefaultScmManager implements ScmManager
   {
  -    private Hashtable factories;
  +    private ScmFactory scmFactory;
  +
       private RepositoryInfo repoInfo;
  -    
  -    /**
  -     * @param repoInfo repository descriptor
  -     */
  -    public DefaultScmManager(RepositoryInfo repoInfo)
  +
  +    private static String SERVICE = "META-INF/services/org.apache.maven.genericscm.ScmFactory";
  +
  +    public DefaultScmManager( String scmUrl )
  +        throws ScmException
  +    {
  +        this( new RepositoryInfo( scmUrl ) );
  +    }
  +
  +    public DefaultScmManager( RepositoryInfo repoInfo )
       {
           this.repoInfo = repoInfo;
  +
  +        findProviders( Thread.currentThread().getContextClassLoader() );
       }
  -    
  -    /**
  -     * @param factory The factory you want to add.
  -     */
  -    public void addScmFactory(ScmFactory factory)
  +
  +    public void checkout( String directory )
  +        throws Exception
       {
  -        if (factories == null)
  +        try
           {
  -            factories = new Hashtable();
  +            Command command = getCommand( CheckOutCommand.NAME );
  +
  +            command.setWorkingDirectory( directory );
  +
  +            command.execute();
           }
  -        factories.put(factory.getSupportedScm(), factory);
  -    }
  -    
  -    /**
  -     * @return an initialized <code>Repository</code> component
  -     */
  -    public Repository getRepository() throws ScmException
  -    {
  -        ScmFactory factory = getFactory();
  -        return factory.createRepository(repoInfo);
  -    }
  +        catch ( Exception e )
  +        {
  +            e.printStackTrace();
   
  -    /**
  -     * @return an initialized <code>CommandWrapper</code> component
  -     */
  -    public CommandWrapper getCommandWrapper() throws ScmException
  -    {
  -        ScmFactory factory = getFactory();
  -        return factory.createCommandWrapper(repoInfo);
  +            throw new Exception( "Cannot checkout sources: ", e );
  +        }
       }
   
  -    /**
  -     * @param commandName The command name like <TT>"checkout"</TT>, <TT>"changelog"</TT>
  -     * @return an initialized <code>CommandWrapper</code> component
  -     */
  -    public Command getCommand(String commandName)
  -        throws ScmException
  +    public void update( String directory )
  +        throws Exception
       {
  -        ScmFactory factory = getFactory();
  -        return factory.createCommand(repoInfo, commandName);
  +        try
  +        {
  +            Command command = getCommand( UpdateCommand.NAME );
  +
  +            command.setWorkingDirectory( directory );
  +
  +            command.execute();
  +        }
  +        catch ( Exception e )
  +        {
  +            throw new Exception( "Cannot checkout sources: ", e );
  +        }
       }
  -    
  -    private ScmFactory getFactory() throws ScmException
  +
  +    // This is the wrong place for this. As this class is working on behalf of one
  +    // SCM not many. But as I work through the design i will move this out of there.
  +
  +    protected void findProviders( ClassLoader classLoader )
       {
  -        if (repoInfo == null)
  +        try
           {
  -            throw new ScmException("RepoInfo cannot be null");
  +            for ( Enumeration e = classLoader.getResources( SERVICE ); e.hasMoreElements(); )
  +            {
  +                URL url = (URL) e.nextElement();
  +
  +                InputStream is = url.openStream();
  +
  +                byte[] buffer = new byte[1024];
  +
  +                int read = 0;
  +
  +                ByteArrayOutputStream os = new ByteArrayOutputStream();
  +
  +                while( is.available() > 0 )
  +                {
  +                    read = is.read( buffer, 0, buffer.length );
  +
  +                    if ( read < 0 )
  +                    {
  +                        break;
  +                    }
  +
  +                    os.write( buffer, 0, read );
  +                }
  +
  +                String implementation = os.toString().trim();
  +
  +                ScmFactory factory = (ScmFactory) classLoader.loadClass( implementation ).newInstance();
  +
  +                scmFactory = factory;
  +            }
           }
  -        
  -        String scmType = repoInfo.getType();
  -        ScmFactory factory = (ScmFactory)factories.get(scmType);
  -        
  -        if (factory == null)
  +        catch ( Exception e )
           {
  -            throw new ScmException(scmType + " factory doesn't exists.");
  +            e.printStackTrace();
           }
  -        return factory;
  +    }
  +
  +    protected Command getCommand( String commandName )
  +        throws ScmException
  +    {
  +        return scmFactory.createCommand( repoInfo, commandName );
       }
   }
  
  
  
  1.4       +4 -23     maven-scm/generic-scm-api/src/java/org/apache/maven/genericscm/manager/ScmManager.java
  
  Index: ScmManager.java
  ===================================================================
  RCS file: /home/cvs/maven-scm/generic-scm-api/src/java/org/apache/maven/genericscm/manager/ScmManager.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ScmManager.java	13 Dec 2003 22:32:49 -0000	1.3
  +++ ScmManager.java	17 Jan 2004 22:59:50 -0000	1.4
  @@ -63,31 +63,12 @@
   import org.apache.maven.genericscm.repository.Repository;
   import org.apache.maven.genericscm.repository.RepositoryInfo;
   
  -/**
  - * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
  - * @version $Id$
  - */
   public interface ScmManager
   {
  -    /**
  -     * @param factory The factory you want to add.
  -     */
  -    void addScmFactory(ScmFactory factory);
  -    
  -    /**
  -     * @return an initialized <code>Repository</code> component
  -     */
  -    Repository getRepository() throws ScmException;
  +    public void checkout( String directory )
  +        throws Exception;
   
  -    /**
  -     * @return an initialized <code>CommandWrapper</code> component
  -     */
  -    CommandWrapper getCommandWrapper() throws ScmException;
  +    public void update( String directory )
  +        throws Exception;
   
  -    /**
  -     * @param commandName The command name like <TT>"checkout"</TT>, <TT>"changelog"</TT>
  -     * @return an initialized <code>CommandWrapper</code> component
  -     */
  -    Command getCommand(String commandName)
  -        throws ScmException;
   }
  
  
  
  1.2       +10 -0     maven-scm/generic-scm-api/src/java/org/apache/maven/genericscm/repository/RepositoryInfo.java
  
  Index: RepositoryInfo.java
  ===================================================================
  RCS file: /home/cvs/maven-scm/generic-scm-api/src/java/org/apache/maven/genericscm/repository/RepositoryInfo.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- RepositoryInfo.java	2 Dec 2003 20:12:44 -0000	1.1
  +++ RepositoryInfo.java	17 Jan 2004 22:59:50 -0000	1.2
  @@ -70,6 +70,16 @@
       private String connectionString;
       private String password;
   
  +    public RepositoryInfo()
  +    {
  +    }
  +
  +    public RepositoryInfo(String scmUrl) throws ScmException
  +    {
  +        this.scmUrl = scmUrl;
  +        checkConnection(scmUrl);
  +    }
  +
       public void setUrl(String scmUrl) throws ScmException
       {
           checkConnection(scmUrl);