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);