Author: dennisl Date: Sun Oct 29 12:11:39 2006 New Revision: 468971 URL: http://svn.apache.org/viewvc?view=rev&rev=468971 Log: [SCM-139] Create a utility class for scm url checking/parsing.
Added: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmUrlUtils.java (with props) maven/scm/trunk/maven-scm-api/src/test/java/org/apache/maven/scm/provider/ maven/scm/trunk/maven-scm-api/src/test/java/org/apache/maven/scm/provider/ScmUrlUtilsTest.java (with props) Added: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmUrlUtils.java URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmUrlUtils.java?view=auto&rev=468971 ============================================================================== --- maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmUrlUtils.java (added) +++ maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmUrlUtils.java Sun Oct 29 12:11:39 2006 @@ -0,0 +1,160 @@ +package org.apache.maven.scm.provider; + +/* + * Copyright 2001-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.ArrayList; +import java.util.List; + +/** + * A utility class that validates and parses scm url:s. The code here is + * <strong>not</strong> scm provider specific. + * <p> + * If you need methods that work for a specific scm provider, please create a + * similar class for that provider. E.g. create the class CvsScmUrlUtils if + * you need cvs specific checking/parsing. + * </p> + * + * @author <a href="mailto:[EMAIL PROTECTED]">Dennis Lundberg</a> + * @version $Id: ScmUrlUtils.java 372209 2006-01-25 14:30:01 +0100 (on, 25 jan 2006) evenisse $ + */ +public abstract class ScmUrlUtils +{ + private final static String ILLEGAL_SCM_URL = "The scm url must be on the form " + + "'scm:<scm provider><delimiter><provider specific part>' " + + "where <delimiter> can be either ':' or '|'."; + + /** + * Get the delimiter used in the scm url. + * + * @param scmUrl A valid scm url to parse + * @return The delimiter used in the scm url + */ + public static String getDelimiter( String scmUrl ) + { + scmUrl = scmUrl.substring( 4 ); + + int index = scmUrl.indexOf( '|' ); + + if ( index == -1 ) + { + index = scmUrl.indexOf( ':' ); + + if ( index == -1 ) + { + throw new IllegalArgumentException( "The scm url does not contain a valid delimiter." ); + } + } + + return scmUrl.substring( index, index + 1 ); + } + + /** + * Get the scm provider from the scm url. + * + * @param scmUrl A valid scm url to parse + * @return The scm provider from the scm url + */ + public static String getProvider( String scmUrl ) + { + String delimiter = getDelimiter( scmUrl ); + + scmUrl = scmUrl.substring( 4 ); + + int firstDelimiterIndex = scmUrl.indexOf( delimiter ); + + return scmUrl.substring( 0, firstDelimiterIndex ); + } + + /** + * Get the provider specific part of the scm url. + * + * @param scmUrl A valid scm url to parse + * @return The provider specific part of the scm url + */ + public static String getProviderSpecificPart( String scmUrl ) + { + String delimiter = getDelimiter( scmUrl ); + + scmUrl = scmUrl.substring( 4 ); + + int firstDelimiterIndex = scmUrl.indexOf( delimiter ); + + return scmUrl.substring( firstDelimiterIndex + 1 ); + } + + /** + * Validate that the scm url is in the correct format. + * <p> + * <strong>Note</strong>: does not validate scm provider specific format. + * </p> + * + * @param scmUrl The scm url to validate + * @return <code>true</code> if the scm url is in the correct format, + * otherwise <code>false</code> + */ + public static boolean isValid( String scmUrl ) + { + List messages = validate( scmUrl ); + + return messages.isEmpty(); + } + + /** + * Validate that the scm url is in the correct format. + * <p> + * <strong>Note</strong>: does not validate scm provider specific format. + * </p> + * + * @param scmUrl The scm url to validate + * @return A <code>List</code> that contains the errors that occured + */ + public static List validate( String scmUrl ) { + List messages = new ArrayList(); + + if ( scmUrl == null ) + { + messages.add( "The scm url cannot be null." ); + + return messages; + } + + if ( !scmUrl.startsWith( "scm:" ) ) + { + messages.add( "The scm url must start with 'scm:'." ); + + return messages; + } + + if ( scmUrl.length() < 6 ) + { + messages.add( ILLEGAL_SCM_URL ); + + return messages; + } + + try + { + String delimiter = getDelimiter( scmUrl ); + } + catch ( IllegalArgumentException e ) + { + messages.add( e.getMessage() ); + } + + return messages; + } +} Propchange: maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmUrlUtils.java ------------------------------------------------------------------------------ svn:eol-style = native Added: maven/scm/trunk/maven-scm-api/src/test/java/org/apache/maven/scm/provider/ScmUrlUtilsTest.java URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-api/src/test/java/org/apache/maven/scm/provider/ScmUrlUtilsTest.java?view=auto&rev=468971 ============================================================================== --- maven/scm/trunk/maven-scm-api/src/test/java/org/apache/maven/scm/provider/ScmUrlUtilsTest.java (added) +++ maven/scm/trunk/maven-scm-api/src/test/java/org/apache/maven/scm/provider/ScmUrlUtilsTest.java Sun Oct 29 12:11:39 2006 @@ -0,0 +1,89 @@ +package org.apache.maven.scm.provider; + +/* + * Copyright 2001-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import junit.framework.TestCase; + +/** + * @author <a href="mailto:[EMAIL PROTECTED]">Dennis Lundberg</a> + * @version $Id: ScmUrlUtilsTest.java 372209 2006-01-25 14:30:01 +0100 (on, 25 jan 2006) evenisse $ + */ +public class ScmUrlUtilsTest + extends TestCase +{ + private static final String SCM_URL_CVS_COLON = "scm:cvs:local:repository:module"; + private static final String SCM_URL_CVS_PIPE = "scm:cvs|local|repository|module"; + private static final String SCM_URL_CVS_INVALID = "scm|cvs|local|repository|module"; + private static final String SCM_URL_INVALID_1 = null; + private static final String SCM_URL_INVALID_2 = "scm"; + private static final String SCM_URL_INVALID_3 = "scm:a"; + private static final String SCM_URL_INVALID_4 = "scm:a-"; + private static final String SCM_URL_VALID_1 = "scm:a:"; + private static final String SCM_URL_VALID_2 = "scm:a|"; + private static final String SCM_URL_VALID_3 = "scm:a:provider-specific-part"; + private static final String SCM_URL_VALID_4 = "scm:a|provider-specific-part"; + + public void testGetDelimiter() + throws Exception + { + assertEquals( ":", ScmUrlUtils.getDelimiter( SCM_URL_CVS_COLON ) ); + assertEquals( "|", ScmUrlUtils.getDelimiter( SCM_URL_CVS_PIPE ) ); + assertEquals( "|", ScmUrlUtils.getDelimiter( SCM_URL_CVS_INVALID ) ); + } + + public void testGetProvider() + throws Exception + { + assertEquals( "cvs", ScmUrlUtils.getProvider( SCM_URL_CVS_COLON ) ); + assertEquals( "cvs", ScmUrlUtils.getProvider( SCM_URL_CVS_PIPE ) ); + assertEquals( "cvs", ScmUrlUtils.getProvider( SCM_URL_CVS_INVALID ) ); + + assertEquals( "a", ScmUrlUtils.getProvider( SCM_URL_VALID_1 ) ); + assertEquals( "a", ScmUrlUtils.getProvider( SCM_URL_VALID_2 ) ); + assertEquals( "a", ScmUrlUtils.getProvider( SCM_URL_VALID_3 ) ); + assertEquals( "a", ScmUrlUtils.getProvider( SCM_URL_VALID_4 ) ); + } + + public void testGetProviderSpecificPart() + throws Exception + { + assertEquals( "local:repository:module", ScmUrlUtils.getProviderSpecificPart( SCM_URL_CVS_COLON ) ); + assertEquals( "local|repository|module", ScmUrlUtils.getProviderSpecificPart( SCM_URL_CVS_PIPE ) ); + assertEquals( "local|repository|module", ScmUrlUtils.getProviderSpecificPart( SCM_URL_CVS_INVALID ) ); + + assertEquals( "", ScmUrlUtils.getProviderSpecificPart( SCM_URL_VALID_1 ) ); + assertEquals( "", ScmUrlUtils.getProviderSpecificPart( SCM_URL_VALID_2 ) ); + assertEquals( "provider-specific-part", ScmUrlUtils.getProviderSpecificPart( SCM_URL_VALID_3 ) ); + assertEquals( "provider-specific-part", ScmUrlUtils.getProviderSpecificPart( SCM_URL_VALID_4 ) ); + } + + public void testIsValid() + throws Exception + { + assertTrue( ScmUrlUtils.isValid( SCM_URL_CVS_COLON ) ); + assertTrue( ScmUrlUtils.isValid( SCM_URL_CVS_PIPE ) ); + assertFalse( ScmUrlUtils.isValid( SCM_URL_CVS_INVALID ) ); + + assertTrue( ScmUrlUtils.isValid( SCM_URL_VALID_1 ) ); + assertTrue( ScmUrlUtils.isValid( SCM_URL_VALID_2 ) ); + assertTrue( ScmUrlUtils.isValid( SCM_URL_VALID_3 ) ); + assertFalse( ScmUrlUtils.isValid( SCM_URL_INVALID_1 ) ); + assertFalse( ScmUrlUtils.isValid( SCM_URL_INVALID_2 ) ); + assertFalse( ScmUrlUtils.isValid( SCM_URL_INVALID_3 ) ); + assertFalse( ScmUrlUtils.isValid( SCM_URL_INVALID_4 ) ); + } +} Propchange: maven/scm/trunk/maven-scm-api/src/test/java/org/apache/maven/scm/provider/ScmUrlUtilsTest.java ------------------------------------------------------------------------------ svn:eol-style = native