001    package org.apache.maven.scm.provider.cvslib.cvsexe;
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 org.apache.maven.scm.command.Command;
023    import org.apache.maven.scm.provider.cvslib.AbstractCvsScmProvider;
024    import org.apache.maven.scm.provider.cvslib.command.login.CvsLoginCommand;
025    import org.apache.maven.scm.provider.cvslib.cvsexe.command.add.CvsExeAddCommand;
026    import org.apache.maven.scm.provider.cvslib.cvsexe.command.blame.CvsExeBlameCommand;
027    import org.apache.maven.scm.provider.cvslib.cvsexe.command.branch.CvsExeBranchCommand;
028    import org.apache.maven.scm.provider.cvslib.cvsexe.command.changelog.CvsExeChangeLogCommand;
029    import org.apache.maven.scm.provider.cvslib.cvsexe.command.checkin.CvsExeCheckInCommand;
030    import org.apache.maven.scm.provider.cvslib.cvsexe.command.checkout.CvsExeCheckOutCommand;
031    import org.apache.maven.scm.provider.cvslib.cvsexe.command.diff.CvsExeDiffCommand;
032    import org.apache.maven.scm.provider.cvslib.cvsexe.command.export.CvsExeExportCommand;
033    import org.apache.maven.scm.provider.cvslib.cvsexe.command.list.CvsExeListCommand;
034    import org.apache.maven.scm.provider.cvslib.cvsexe.command.mkdir.CvsExeMkdirCommand;
035    import org.apache.maven.scm.provider.cvslib.cvsexe.command.remove.CvsExeRemoveCommand;
036    import org.apache.maven.scm.provider.cvslib.cvsexe.command.status.CvsExeStatusCommand;
037    import org.apache.maven.scm.provider.cvslib.cvsexe.command.tag.CvsExeTagCommand;
038    import org.apache.maven.scm.provider.cvslib.cvsexe.command.update.CvsExeUpdateCommand;
039    import org.apache.maven.scm.provider.cvslib.repository.CvsScmProviderRepository;
040    import org.codehaus.plexus.util.StringUtils;
041    
042    /**
043     * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
044     * @version $Id: CvsExeScmProvider.java 1134851 2011-06-12 01:24:05Z godin $
045     * @plexus.component role="org.apache.maven.scm.provider.ScmProvider" role-hint="cvs_native"
046     */
047    public class CvsExeScmProvider
048        extends AbstractCvsScmProvider
049    {
050        /** sserver transport method */
051        public static final String TRANSPORT_SSERVER = "sserver";
052    
053        /** {@inheritDoc} */
054        protected Command getAddCommand()
055        {
056            return new CvsExeAddCommand();
057        }
058    
059        /** {@inheritDoc} */
060        protected Command getBranchCommand()
061        {
062            return new CvsExeBranchCommand();
063        }
064    
065        /** {@inheritDoc} */
066        protected Command getBlameCommand()
067        {
068            return new CvsExeBlameCommand();
069        }
070    
071        /** {@inheritDoc} */
072        protected Command getChangeLogCommand()
073        {
074            return new CvsExeChangeLogCommand();
075        }
076    
077        /** {@inheritDoc} */
078        protected Command getCheckInCommand()
079        {
080            return new CvsExeCheckInCommand();
081        }
082    
083        /** {@inheritDoc} */
084        protected Command getCheckOutCommand()
085        {
086            return new CvsExeCheckOutCommand();
087        }
088    
089        /** {@inheritDoc} */
090        protected Command getDiffCommand()
091        {
092            return new CvsExeDiffCommand();
093        }
094    
095        /** {@inheritDoc} */
096        protected Command getExportCommand()
097        {
098            return new CvsExeExportCommand();
099        }
100    
101        /** {@inheritDoc} */
102        protected Command getListCommand()
103        {
104            return new CvsExeListCommand();
105        }
106    
107        /** {@inheritDoc} */
108        protected Command getLoginCommand()
109        {
110            return new CvsLoginCommand();
111        }
112    
113        /** {@inheritDoc} */
114        protected Command getRemoveCommand()
115        {
116            return new CvsExeRemoveCommand();
117        }
118    
119        /** {@inheritDoc} */
120        protected Command getStatusCommand()
121        {
122            return new CvsExeStatusCommand();
123        }
124    
125        /** {@inheritDoc} */
126        protected Command getTagCommand()
127        {
128            return new CvsExeTagCommand();
129        }
130    
131        /** {@inheritDoc} */
132        protected Command getUpdateCommand()
133        {
134            return new CvsExeUpdateCommand();
135        }
136        
137        /** {@inheritDoc} */
138        protected Command getMkdirCommand()
139        {
140            return new CvsExeMkdirCommand();
141        }    
142    
143        /** {@inheritDoc} */
144        protected ScmUrlParserResult parseScmUrl( String scmSpecificUrl, char delimiter )
145        {
146            ScmUrlParserResult result = super.parseScmUrl( scmSpecificUrl, delimiter );
147            if ( result.getMessages().isEmpty() )
148            {
149                return result;
150            }
151    
152            result.resetMessages();
153    
154            String[] tokens = StringUtils.split( scmSpecificUrl, Character.toString( delimiter ) );
155    
156            String cvsroot;
157    
158            String transport = tokens[0];
159    
160            // support sserver
161            if ( transport.equalsIgnoreCase( TRANSPORT_SSERVER ) )
162            {
163                if ( tokens.length < 4 || tokens.length > 5 && transport.equalsIgnoreCase( TRANSPORT_SSERVER ) )
164                {
165                    result.getMessages().add( "The connection string contains too few tokens." );
166    
167                    return result;
168                }
169    
170                //create the cvsroot as the remote cvsroot
171                if ( tokens.length == 4 )
172                {
173                    cvsroot = ":" + transport + ":" + tokens[1] + ":" + tokens[2];
174                }
175                else
176                {
177                    cvsroot = ":" + transport + ":" + tokens[1] + ":" + tokens[2] + ":" + tokens[3];
178                }
179            }
180            else
181            {
182                result.getMessages().add( "Unknown transport: " + transport );
183    
184                return result;
185            }
186    
187            String user = null;
188    
189            String password = null;
190    
191            String host = null;
192    
193            String path = null;
194    
195            String module = null;
196    
197            int port = -1;
198    
199            if ( transport.equalsIgnoreCase( TRANSPORT_SSERVER ) )
200            {
201                //sspi:[username@]host:[port]path:module
202                String userhost = tokens[1];
203    
204                int index = userhost.indexOf( '@' );
205    
206                if ( index == -1 )
207                {
208                    user = "";
209    
210                    host = userhost;
211                }
212                else
213                {
214                    user = userhost.substring( 0, index );
215    
216                    host = userhost.substring( index + 1 );
217                }
218    
219                // no port specified
220                if ( tokens.length == 4 )
221                {
222                    path = tokens[2];
223                    module = tokens[3];
224                }
225                else
226                {
227                    // getting port
228                    try
229                    {
230                        port = new Integer( tokens[2] ).intValue();
231                        path = tokens[3];
232                        module = tokens[4];
233                    }
234                    catch ( Exception e )
235                    {
236                        //incorrect
237                        result.getMessages().add( "Your scm url is invalid, could not get port value." );
238    
239                        return result;
240                    }
241                }
242    
243                // cvsroot format is :sspi:host:path
244                cvsroot = ":" + transport + ":" + host + ":";
245    
246                if ( port != -1 )
247                {
248                    cvsroot += port;
249                }
250    
251                cvsroot += path;
252            }
253    
254            if ( port == -1 )
255            {
256                result.setRepository( new CvsScmProviderRepository( cvsroot, transport, user, password, host, path,
257                                                                    module ) );
258            }
259            else
260            {
261                result.setRepository( new CvsScmProviderRepository( cvsroot, transport, user, password, host, port,
262                                                                    path, module ) );
263            }
264    
265            return result;
266        }
267    }