001    package org.apache.maven.scm.provider;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one
005     * or more contributor license agreements.  See the NOTICE file
006     * distributed with this work for additional information
007     * regarding copyright ownership.  The ASF licenses this file
008     * to you under the Apache License, Version 2.0 (the
009     * "License"); you may not use this file except in compliance
010     * with the License.  You may obtain a copy of the License at
011     *
012     * http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing,
015     * software distributed under the License is distributed on an
016     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017     * KIND, either express or implied.  See the License for the
018     * specific language governing permissions and limitations
019     * under the License.
020     */
021    
022    import java.util.ArrayList;
023    import java.util.List;
024    
025    /**
026     * A utility class that validates and parses scm url:s. The code here is
027     * <strong>not</strong> scm provider specific.
028     * <p/>
029     * If you need methods that work for a specific scm provider, please create a
030     * similar class for that provider. E.g. create the class CvsScmUrlUtils if
031     * you need cvs specific checking/parsing.
032     * </p>
033     *
034     * @author <a href="mailto:dennisl@apache.org">Dennis Lundberg</a>
035     * @version $Id: ScmUrlUtils.java 1054130 2010-12-31 16:01:45Z olamy $
036     */
037    public abstract class ScmUrlUtils
038    {
039        private static final String ILLEGAL_SCM_URL =
040            "The scm url must be on the form 'scm:<scm provider><delimiter><provider specific part>' "
041                + "where <delimiter> can be either ':' or '|'.";
042    
043        /**
044         * Get the delimiter used in the scm url.
045         *
046         * @param scmUrl A valid scm url to parse
047         * @return The delimiter used in the scm url
048         */
049        public static String getDelimiter( String scmUrl )
050        {
051            scmUrl = scmUrl.substring( 4 );
052    
053            int index = scmUrl.indexOf( '|' );
054    
055            if ( index == -1 )
056            {
057                index = scmUrl.indexOf( ':' );
058    
059                if ( index == -1 )
060                {
061                    throw new IllegalArgumentException( "The scm url does not contain a valid delimiter." );
062                }
063            }
064    
065            return scmUrl.substring( index, index + 1 );
066        }
067    
068        /**
069         * Get the scm provider from the scm url.
070         *
071         * @param scmUrl A valid scm url to parse
072         * @return The scm provider from the scm url
073         */
074        public static String getProvider( String scmUrl )
075        {
076            String delimiter = getDelimiter( scmUrl );
077    
078            scmUrl = scmUrl.substring( 4 );
079    
080            int firstDelimiterIndex = scmUrl.indexOf( delimiter );
081    
082            return scmUrl.substring( 0, firstDelimiterIndex );
083        }
084    
085        /**
086         * Get the provider specific part of the scm url.
087         *
088         * @param scmUrl A valid scm url to parse
089         * @return The provider specific part of the scm url
090         */
091        public static String getProviderSpecificPart( String scmUrl )
092        {
093            String delimiter = getDelimiter( scmUrl );
094    
095            scmUrl = scmUrl.substring( 4 );
096    
097            int firstDelimiterIndex = scmUrl.indexOf( delimiter );
098    
099            return scmUrl.substring( firstDelimiterIndex + 1 );
100        }
101    
102        /**
103         * Validate that the scm url is in the correct format.
104         * <p/>
105         * <strong>Note</strong>: does not validate scm provider specific format.
106         * </p>
107         *
108         * @param scmUrl The scm url to validate
109         * @return <code>true</code> if the scm url is in the correct format,
110         *         otherwise <code>false</code>
111         */
112        public static boolean isValid( String scmUrl )
113        {
114            List<String> messages = validate( scmUrl );
115    
116            return messages.isEmpty();
117        }
118    
119        /**
120         * Validate that the scm url is in the correct format.
121         * <p/>
122         * <strong>Note</strong>: does not validate scm provider specific format.
123         * </p>
124         *
125         * @param scmUrl The scm url to validate
126         * @return A <code>List</code> that contains the errors that occured
127         */
128        public static List<String> validate( String scmUrl )
129        {
130            List<String> messages = new ArrayList<String>();
131    
132            if ( scmUrl == null )
133            {
134                messages.add( "The scm url cannot be null." );
135    
136                return messages;
137            }
138    
139            if ( !scmUrl.startsWith( "scm:" ) )
140            {
141                messages.add( "The scm url must start with 'scm:'." );
142    
143                return messages;
144            }
145    
146            if ( scmUrl.length() < 6 )
147            {
148                messages.add( ILLEGAL_SCM_URL );
149    
150                return messages;
151            }
152    
153            try
154            {
155                getDelimiter( scmUrl );
156            }
157            catch ( IllegalArgumentException e )
158            {
159                messages.add( e.getMessage() );
160            }
161    
162            return messages;
163        }
164    }