001package 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
022import org.apache.maven.scm.command.Command;
023import org.apache.maven.scm.provider.cvslib.AbstractCvsScmProvider;
024import org.apache.maven.scm.provider.cvslib.command.login.CvsLoginCommand;
025import org.apache.maven.scm.provider.cvslib.cvsexe.command.add.CvsExeAddCommand;
026import org.apache.maven.scm.provider.cvslib.cvsexe.command.blame.CvsExeBlameCommand;
027import org.apache.maven.scm.provider.cvslib.cvsexe.command.branch.CvsExeBranchCommand;
028import org.apache.maven.scm.provider.cvslib.cvsexe.command.changelog.CvsExeChangeLogCommand;
029import org.apache.maven.scm.provider.cvslib.cvsexe.command.checkin.CvsExeCheckInCommand;
030import org.apache.maven.scm.provider.cvslib.cvsexe.command.checkout.CvsExeCheckOutCommand;
031import org.apache.maven.scm.provider.cvslib.cvsexe.command.diff.CvsExeDiffCommand;
032import org.apache.maven.scm.provider.cvslib.cvsexe.command.export.CvsExeExportCommand;
033import org.apache.maven.scm.provider.cvslib.cvsexe.command.list.CvsExeListCommand;
034import org.apache.maven.scm.provider.cvslib.cvsexe.command.mkdir.CvsExeMkdirCommand;
035import org.apache.maven.scm.provider.cvslib.cvsexe.command.remove.CvsExeRemoveCommand;
036import org.apache.maven.scm.provider.cvslib.cvsexe.command.status.CvsExeStatusCommand;
037import org.apache.maven.scm.provider.cvslib.cvsexe.command.tag.CvsExeTagCommand;
038import org.apache.maven.scm.provider.cvslib.cvsexe.command.update.CvsExeUpdateCommand;
039import org.apache.maven.scm.provider.cvslib.repository.CvsScmProviderRepository;
040import org.codehaus.plexus.util.StringUtils;
041
042/**
043 * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
044 *
045 * @plexus.component role="org.apache.maven.scm.provider.ScmProvider" role-hint="cvs_native"
046 */
047public 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}