From 7b212ef60f58ed201b2489fc5c640d5474645b2d Mon Sep 17 00:00:00 2001 From: aheritier Date: Fri, 10 Mar 2006 23:13:28 +0000 Subject: [PATCH] extract the subversion address from the repo connection settings (anonymous and dev) to use it with the svn executable. git-svn-id: https://svn.apache.org/repos/asf/maven/maven-1/plugins/trunk@384947 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/maven/xdoc/util/ScmUtil.java | 621 +++++++++--------- .../plugin-resources/templates/scm/svn.xml | 8 +- 2 files changed, 311 insertions(+), 318 deletions(-) diff --git a/xdoc/src/main/org/apache/maven/xdoc/util/ScmUtil.java b/xdoc/src/main/org/apache/maven/xdoc/util/ScmUtil.java index efe4f822..a8ec5d2e 100644 --- a/xdoc/src/main/org/apache/maven/xdoc/util/ScmUtil.java +++ b/xdoc/src/main/org/apache/maven/xdoc/util/ScmUtil.java @@ -21,386 +21,377 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; - -import org.apache.maven.scm.manager.NoSuchScmProviderException; -import org.apache.maven.scm.manager.ScmManager; import org.apache.maven.scm.provider.clearcase.ClearCaseScmProvider; import org.apache.maven.scm.provider.clearcase.repository.ClearCaseScmProviderRepository; import org.apache.maven.scm.provider.perforce.PerforceScmProvider; import org.apache.maven.scm.provider.perforce.repository.PerforceScmProviderRepository; import org.apache.maven.scm.provider.starteam.StarteamScmProvider; import org.apache.maven.scm.provider.starteam.repository.StarteamScmProviderRepository; -import org.apache.maven.scm.repository.ScmRepository; import org.apache.maven.scm.repository.ScmRepositoryException; - import org.apache.maven.util.EnhancedStringTokenizer; /** - * Utility class to manage SCM informations. - * NOTE: This is very CVS specific, but I would like to try additional SCM - * package like subversion ASAP. - * + * Utility class to manage SCM informations. NOTE: This is very CVS specific, + * but I would like to try additional SCM package like subversion ASAP. + * * @author Jason van Zyl * @author Arnaud Heritier * @version $Id$ */ -public final class ScmUtil -{ - /** - * Get the SCM type. - * - * @param scmConnection the scm connection to analyse. - * @return the scm type : cvs, svn , ... - */ - public String getScmType( final String scmConnection ) - { - if ( isValid( scmConnection ) ) - { - return splitSCMConnection( scmConnection )[1]; - } +public final class ScmUtil { + /** + * Get the SCM type. + * + * @param scmConnection + * the scm connection to analyse. + * @return the scm type : cvs, svn , ... + */ + public String getScmType(final String scmConnection) { + if (isValid(scmConnection)) { + return splitSCMConnection(scmConnection)[1]; + } - return null; - } + return null; + } - /** - * Get cvs connection string. - * Used in xdocs/src/plugin-resources/templates/scm/cvs.xml. - * If username == "", assumes anonymous (pserver) connection. In this case, - * inserts a separator (':' or '|') between the username and '@' to indicate - * that there is a password and that it is empty. - * If username != "" it replaces username in conn. - * - * @param conn six token connection string - * @param username username override if non-empty. - * @return CVS root. - */ - public String getCvsConnection( String conn, String username ) - { - String[] tokens = splitSCMConnection( conn ); + /** + * Get cvs connection string. Used in + * xdocs/src/plugin-resources/templates/scm/cvs.xml. If username == "", + * assumes anonymous (pserver) connection. In this case, inserts a separator + * (':' or '|') between the username and '@' to indicate that there is a + * password and that it is empty. If username != "" it replaces username in + * conn. + * + * @param conn + * six token connection string + * @param username + * username override if non-empty. + * @return CVS root. + */ + public String getCvsConnection(String conn, String username) { + String[] tokens = splitSCMConnection(conn); - if ( !tokens[1].equals( "cvs" ) ) - { - return ""; - } + if (!tokens[1].equals("cvs")) { + return ""; + } - String separator = getSCMConnectionSeparator( conn ); + String separator = getSCMConnectionSeparator(conn); - if ( tokens[3].indexOf( '@' ) >= 0 ) - { - if ( username.length() == 0 ) - { - username = - tokens[3].substring( 0, tokens[3].indexOf( '@' ) ) - + separator; - } + if (tokens[3].indexOf('@') >= 0) { + if (username.length() == 0) { + username = tokens[3].substring(0, tokens[3].indexOf('@')) + + separator; + } - tokens[3] = - username + "@" - + tokens[3].substring( tokens[3].indexOf( '@' ) + 1 ); - } + tokens[3] = username + "@" + + tokens[3].substring(tokens[3].indexOf('@') + 1); + } - String result = - tokens[0] + ":" + tokens[1] + separator + tokens[2] - + separator + tokens[3] + separator + tokens[4] + separator - + tokens[5]; + String result = tokens[0] + ":" + tokens[1] + separator + tokens[2] + + separator + tokens[3] + separator + tokens[4] + separator + + tokens[5]; - return result; - } + return result; + } - /** - * Get cvs module. Used in - * xdocs/src/plugin-resources/templates/scm/cvs.xml. - * - * @param conn six token connection string - * @return CVS module. - */ - public String getCvsModule( String conn ) - { - if ( isValid( conn ) ) - { - String[] tokens = splitSCMConnection( conn ); + /** + * Get cvs module. Used in xdocs/src/plugin-resources/templates/scm/cvs.xml. + * + * @param conn + * six token connection string + * @return CVS module. + */ + public String getCvsModule(String conn) { + if (isValid(conn)) { + String[] tokens = splitSCMConnection(conn); - if ( !tokens[1].equals( "cvs" ) ) - { - return ""; - } + if (!tokens[1].equals("cvs")) { + return ""; + } - return tokens[5]; - } + return tokens[5]; + } - return null; - } + return null; + } - /** - * Create the documentation to provide an developer access with a Perforce SCM. - * For example, generate the following command line: - *

p4 -H hostname -p port -u username -P password path

- *

p4 -H hostname -p port -u username -P password path submit -c changement

- * - * @param perforceRepo - * @see http://www.perforce.com/perforce/doc.051/manuals/cmdref/index.html - */ - public String developerAccessPerforce( String devConnection ) - { - StringBuffer command = new StringBuffer(); - char delim = getSCMConnectionSeparator( devConnection ).charAt( 0 ); + /** + * Get svn connection string. Used in + * xdocs/src/plugin-resources/templates/scm/svn.xml. It removes the first + * two elements (scm:svn:) + * + * @param conn + * the repository connection + * @return CVS root. + */ + public String getSvnConnection(String conn) { + if (conn != null && conn.length() > 8 + && "svn".equals(conn.substring(4, 7))) + return conn.substring(8); + else { + System.err + .println("Your subversion connection does not seem to be valid: " + + conn); + return ""; + } + } - PerforceScmProvider perforceProvider= new PerforceScmProvider(); - PerforceScmProviderRepository perforceRepo; + /** + * Create the documentation to provide an developer access with a + * Perforce SCM. For example, generate the following command + * line: + *

+ * p4 -H hostname -p port -u username -P password path + *

+ *

+ * p4 -H hostname -p port -u username -P password path submit -c changement + *

+ * + * @param devConnection + * @see
http://www.perforce.com/perforce/doc.051/manuals/cmdref/index.html + */ + public String developerAccessPerforce(String devConnection) { + StringBuffer command = new StringBuffer(); + char delim = getSCMConnectionSeparator(devConnection).charAt(0); - String scmSpecificUrl = devConnection.substring( 13 ); + PerforceScmProvider perforceProvider = new PerforceScmProvider(); + PerforceScmProviderRepository perforceRepo; - try - { - perforceRepo = (PerforceScmProviderRepository) - perforceProvider.makeProviderScmRepository( scmSpecificUrl, delim ); - } - catch (ScmRepositoryException e) - { - System.err.println( "Your developerConnection does not seem to be valid: " + e.getMessage() ); - return ""; - } + String scmSpecificUrl = devConnection.substring(13); + try { + perforceRepo = (PerforceScmProviderRepository) perforceProvider + .makeProviderScmRepository(scmSpecificUrl, delim); + } catch (ScmRepositoryException e) { + System.err + .println("Your developerConnection does not seem to be valid: " + + e.getMessage()); + return ""; + } - command.append( "p4" ); - if ( !StringUtils.isEmpty( perforceRepo.getHost() ) ) - { - command.append( " -H " ).append( perforceRepo.getHost() ); - } - if ( perforceRepo.getPort() > 0 ) - { - command.append( " -p " + perforceRepo.getPort() ); - } - command.append( " -u username" ); - command.append( " -P password" ); - command.append( " " ); - command.append( perforceRepo.getPath() ); - command.append( "\n" ); - command.append( "p4 submit -c \"A comment\"" ); + command.append("p4"); + if (!StringUtils.isEmpty(perforceRepo.getHost())) { + command.append(" -H ").append(perforceRepo.getHost()); + } + if (perforceRepo.getPort() > 0) { + command.append(" -p " + perforceRepo.getPort()); + } + command.append(" -u username"); + command.append(" -P password"); + command.append(" "); + command.append(perforceRepo.getPath()); + command.append("\n"); + command.append("p4 submit -c \"A comment\""); - return command.toString(); - } + return command.toString(); + } - // Starteam + // Starteam - /** - * Create the documentation to provide an developer access with a Starteam SCM. - * For example, generate the following command line: - *

stcmd co -x -nologo -stop -p myusername:mypassword@myhost:1234/projecturl -is

- *

stcmd ci -x -nologo -stop -p myusername:mypassword@myhost:1234/projecturl -f NCI -is

- * - * @param starteamRepo - */ - public String developerAccessStarteam( String devConnection ) - { + /** + * Create the documentation to provide an developer access with a + * Starteam SCM. For example, generate the following command + * line: + *

+ * stcmd co -x -nologo -stop -p myusername:mypassword@myhost:1234/projecturl + * -is + *

+ *

+ * stcmd ci -x -nologo -stop -p myusername:mypassword@myhost:1234/projecturl + * -f NCI -is + *

+ * + * @param devConnection + */ + public String developerAccessStarteam(String devConnection) { - StringBuffer command = new StringBuffer(); - char delim = getSCMConnectionSeparator( devConnection ).charAt( 0 ); + StringBuffer command = new StringBuffer(); + char delim = getSCMConnectionSeparator(devConnection).charAt(0); - StarteamScmProvider starteamProvider= new StarteamScmProvider(); - StarteamScmProviderRepository starteamRepo; + StarteamScmProvider starteamProvider = new StarteamScmProvider(); + StarteamScmProviderRepository starteamRepo; - String scmSpecificUrl = devConnection.substring( 13 ); + String scmSpecificUrl = devConnection.substring(13); - try - { - starteamRepo = (StarteamScmProviderRepository) - starteamProvider.makeProviderScmRepository( scmSpecificUrl, delim ); - } - catch (ScmRepositoryException e) - { - System.err.println( "Your developerConnection does not seem to be valid: " + e.getMessage() ); - return ""; - } + try { + starteamRepo = (StarteamScmProviderRepository) starteamProvider + .makeProviderScmRepository(scmSpecificUrl, delim); + } catch (ScmRepositoryException e) { + System.err + .println("Your developerConnection does not seem to be valid: " + + e.getMessage()); + return ""; + } - // Safety: remove the username/password if present - String fullUrl = StringUtils.replace( starteamRepo.getFullUrl(), starteamRepo.getUser(), "username" ); - fullUrl = StringUtils.replace( fullUrl, starteamRepo.getPassword(), "password" ); + // Safety: remove the username/password if present + String fullUrl = StringUtils.replace(starteamRepo.getFullUrl(), + starteamRepo.getUser(), "username"); + fullUrl = StringUtils.replace(fullUrl, starteamRepo.getPassword(), + "password"); - command.append( "stcmd co -x -nologo -stop -p " ); - command.append( fullUrl ); - command.append( " -is" ); - command.append( "\n" ); - command.append( "stcmd ci -x -nologo -stop -p " ); - command.append( fullUrl ); - command.append( " -f NCI -is" ); + command.append("stcmd co -x -nologo -stop -p "); + command.append(fullUrl); + command.append(" -is"); + command.append("\n"); + command.append("stcmd ci -x -nologo -stop -p "); + command.append(fullUrl); + command.append(" -f NCI -is"); - return command.toString(); - } + return command.toString(); + } + /** + * Create the documentation to provide an developer access with a + * Clearcase SCM. For example, generate the following command + * line: + *

+ * cleartool checkout module + *

+ * + * @param devConnection + */ + public String developerAccessClearCase(String devConnection) { - /** - * Create the documentation to provide an developer access with a Clearcase SCM. - * For example, generate the following command line: - *

cleartool checkout module

- * - * @param clearCaseRepo - */ - public String developerAccessClearCase( String devConnection ) - { + StringBuffer command = new StringBuffer(); + char delim = getSCMConnectionSeparator(devConnection).charAt(0); - StringBuffer command = new StringBuffer(); - char delim = getSCMConnectionSeparator( devConnection ).charAt( 0 ); + ClearCaseScmProvider clearCaseProvider = new ClearCaseScmProvider(); + ClearCaseScmProviderRepository clearCaseRepo; - ClearCaseScmProvider clearCaseProvider= new ClearCaseScmProvider(); - ClearCaseScmProviderRepository clearCaseRepo; + String scmSpecificUrl = devConnection.substring(14); - String scmSpecificUrl = devConnection.substring( 14 ); + try { + clearCaseRepo = (ClearCaseScmProviderRepository) clearCaseProvider + .makeProviderScmRepository(scmSpecificUrl, delim); + } catch (ScmRepositoryException e) { + System.err + .println("Your developerConnection does not seem to be valid: " + + e.getMessage()); + return ""; + } - try - { - clearCaseRepo = (ClearCaseScmProviderRepository) - clearCaseProvider.makeProviderScmRepository( scmSpecificUrl, delim ); - } - catch (ScmRepositoryException e) - { - System.err.println( "Your developerConnection does not seem to be valid: " + e.getMessage() ); - return ""; - } + command.append("cleartool checkout ").append( + clearCaseRepo.getViewName("id")); - command.append( "cleartool checkout " ).append( clearCaseRepo.getViewName( "id" ) ); + return command.toString(); + } - return command.toString(); - } + /** + * Splits an SCM string into parts. + * + * @param connection + * @return A string array of SCM parts + */ + public String[] splitSCMConnection(String connection) { + if (connection == null) { + throw new NullPointerException("repository connection is null"); + } + if (connection.length() < 5) { + throw new IllegalArgumentException( + "repository connection is too short"); + } - /** - * Splits an SCM string into parts. - * - * @param connection - * @return A string array of SCM parts - */ - public String[] splitSCMConnection( String connection ) - { - if ( connection == null ) - { - throw new NullPointerException( "repository connection is null" ); - } + if (!connection.startsWith("scm:")) { + throw new IllegalArgumentException( + "repository connection must start with scm:"); + } - if ( connection.length() < 5 ) - { - throw new IllegalArgumentException( - "repository connection is too short" ); - } + String delimiter = getSCMConnectionSeparator(connection); - if ( !connection.startsWith( "scm:" ) ) - { - throw new IllegalArgumentException( - "repository connection must start with scm:" ); - } + // If the tokenizer is going to work correctly then the character + // following "scm" must be the same as the delimiter, which is not + // always the case. Therefor we give it a modified connection. + String modifiedConnection = "scm" + delimiter + connection.substring(4); - String delimiter = getSCMConnectionSeparator( connection ); + EnhancedStringTokenizer tok = new EnhancedStringTokenizer( + modifiedConnection, delimiter); - // If the tokenizer is going to work correctly then the character - // following "scm" must be the same as the delimiter, which is not - // always the case. Therefor we give it a modified connection. - String modifiedConnection = - "scm" + delimiter + connection.substring( 4 ); + String[] tokens = tokenizerToArray(tok); - EnhancedStringTokenizer tok = - new EnhancedStringTokenizer( modifiedConnection, delimiter ); + // for a valid repository, it should be scm: at least + if ((tokens.length >= 1) && tokens[1].equals("cvs")) { + if ((tokens.length >= 2) && tokens[2].equals("local")) { + if (tokens.length == 6) { + if ((tokens[3].length() > 0) && !tokens[3].equals("local")) { + throw new IllegalArgumentException( + "cvs local repository connection string must specify 5 tokens, or an empty 3rd token if 6"); + } + } else if (tokens.length == 5) { + String[] newTokens = new String[6]; - String[] tokens = tokenizerToArray( tok ); + newTokens[0] = tokens[0]; + newTokens[1] = tokens[1]; + newTokens[2] = tokens[2]; + newTokens[3] = ""; + newTokens[4] = tokens[3]; + newTokens[5] = tokens[4]; + tokens = newTokens; + } else { + throw new IllegalArgumentException( + "cvs local repository connection string doesn't contain five tokens"); + } + } - // for a valid repository, it should be scm: at least - if ( ( tokens.length >= 1 ) && tokens[1].equals( "cvs" ) ) - { - if ( ( tokens.length >= 2 ) && tokens[2].equals( "local" ) ) - { - if ( tokens.length == 6 ) - { - if ( ( tokens[3].length() > 0 ) - && !tokens[3].equals( "local" ) ) - { - throw new IllegalArgumentException( - "cvs local repository connection string must specify 5 tokens, or an empty 3rd token if 6" ); - } - } - else if ( tokens.length == 5 ) - { - String[] newTokens = new String[6]; + if (tokens.length != 6) { + throw new IllegalArgumentException( + "cvs repository connection string doesn't contain six tokens"); + } + } - newTokens[0] = tokens[0]; - newTokens[1] = tokens[1]; - newTokens[2] = tokens[2]; - newTokens[3] = ""; - newTokens[4] = tokens[3]; - newTokens[5] = tokens[4]; - tokens = newTokens; - } - else - { - throw new IllegalArgumentException( - "cvs local repository connection string doesn't contain five tokens" ); - } - } + return tokens; + } - if ( tokens.length != 6 ) - { - throw new IllegalArgumentException( - "cvs repository connection string doesn't contain six tokens" ); - } - } + /** + * Get the separator used in an SCM string + * + * @param connection + * @return String that can be either ":" or "|" + */ + public String getSCMConnectionSeparator(String connection) { + if (connection == null) { + throw new NullPointerException("repository connection is null"); + } - return tokens; - } + if (connection.indexOf("|") != -1) { + return "|"; + } else { + return ":"; + } + } - /** - * Get the separator used in an SCM string - * @param connection - * @return String that can be either ":" or "|" - */ - public String getSCMConnectionSeparator( String connection ) - { - if ( connection == null ) - { - throw new NullPointerException( "repository connection is null" ); - } + /** + * Converts a tokenizer to an array of strings FIXME: This should be in a + * string util class. + * + * @param tok + * @return String[] + */ + public String[] tokenizerToArray(EnhancedStringTokenizer tok) { + List l = new ArrayList(); - if ( connection.indexOf( "|" ) != -1 ) - { - return "|"; - } - else - { - return ":"; - } - } + while (tok.hasMoreTokens()) { + l.add(tok.nextToken()); + } - /** - * Converts a tokenizer to an array of strings FIXME: This should be in a - * string util class. - * - * @param tok - * @return String[] - */ - public String[] tokenizerToArray( EnhancedStringTokenizer tok ) - { - List l = new ArrayList(); + return (String[]) l.toArray(new String[l.size()]); + } - while ( tok.hasMoreTokens() ) - { - l.add( tok.nextToken() ); - } + /** + * Simple check for a value in the POM. Due to the Jelly swizzling fields + * that aren't set come out as empty strings. This will not be required when + * the new lazy evaluation mechanism is put in place. + * + * @param value + * POM value to test. + * @return Is the value valid. + */ + protected boolean isValid(String value) { + if ((value != null) && !value.trim().equals("")) { + return true; + } - return (String[]) l.toArray( new String[l.size()] ); - } - - /** - * Simple check for a value in the POM. Due to the Jelly swizzling fields that aren't set come - * out as empty strings. This will not be required when the new lazy evaluation mechanism is put - * in place. - * - * @param value POM value to test. - * @return Is the value valid. - */ - protected boolean isValid( String value ) - { - if ( ( value != null ) && !value.trim().equals( "" ) ) - { - return true; - } - - return false; - } + return false; + } } diff --git a/xdoc/src/plugin-resources/templates/scm/svn.xml b/xdoc/src/plugin-resources/templates/scm/svn.xml index 3bb623bd..dbf60d05 100644 --- a/xdoc/src/plugin-resources/templates/scm/svn.xml +++ b/xdoc/src/plugin-resources/templates/scm/svn.xml @@ -12,6 +12,7 @@ #if ($repository.connection && $repository.connection != '') #set ($connscm = $scmUtil.getScmType($repository.connection)) + #set ($svnconn = $scmUtil.getSvnConnection($repository.connection)) #set ($conn = $repository.connection) @@ -40,13 +41,14 @@ bundle="plugin-resources.templates.templates" />

- svn checkout $conn $project.artifactId + svn checkout $svnconn $project.artifactId #end #if ($repository.developerConnection && $repository.developerConnection != '') - #set ($connscm = $scmUtil.getScmType($repository.developerConnection)) + #set ($connscm = $scmUtil.getScmType($repository.developerConnection)) + #set ($svnconn = $scmUtil.getSvnConnection($repository.developerConnection)) #set ($conn = $repository.developerConnection) @@ -77,7 +79,7 @@ bundle="plugin-resources.templates.templates" />

- svn checkout $conn $project.artifactId + svn checkout $svnconn $project.artifactId