View Javadoc
1   package org.apache.maven.scm.provider.cvslib.cvsexe;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   * http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.apache.maven.scm.command.Command;
23  import org.apache.maven.scm.provider.cvslib.AbstractCvsScmProvider;
24  import org.apache.maven.scm.provider.cvslib.command.login.CvsLoginCommand;
25  import org.apache.maven.scm.provider.cvslib.cvsexe.command.add.CvsExeAddCommand;
26  import org.apache.maven.scm.provider.cvslib.cvsexe.command.blame.CvsExeBlameCommand;
27  import org.apache.maven.scm.provider.cvslib.cvsexe.command.branch.CvsExeBranchCommand;
28  import org.apache.maven.scm.provider.cvslib.cvsexe.command.changelog.CvsExeChangeLogCommand;
29  import org.apache.maven.scm.provider.cvslib.cvsexe.command.checkin.CvsExeCheckInCommand;
30  import org.apache.maven.scm.provider.cvslib.cvsexe.command.checkout.CvsExeCheckOutCommand;
31  import org.apache.maven.scm.provider.cvslib.cvsexe.command.diff.CvsExeDiffCommand;
32  import org.apache.maven.scm.provider.cvslib.cvsexe.command.export.CvsExeExportCommand;
33  import org.apache.maven.scm.provider.cvslib.cvsexe.command.list.CvsExeListCommand;
34  import org.apache.maven.scm.provider.cvslib.cvsexe.command.mkdir.CvsExeMkdirCommand;
35  import org.apache.maven.scm.provider.cvslib.cvsexe.command.remove.CvsExeRemoveCommand;
36  import org.apache.maven.scm.provider.cvslib.cvsexe.command.status.CvsExeStatusCommand;
37  import org.apache.maven.scm.provider.cvslib.cvsexe.command.tag.CvsExeTagCommand;
38  import org.apache.maven.scm.provider.cvslib.cvsexe.command.update.CvsExeUpdateCommand;
39  import org.apache.maven.scm.provider.cvslib.repository.CvsScmProviderRepository;
40  import org.codehaus.plexus.util.StringUtils;
41  
42  /**
43   * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
44   *
45   * @plexus.component role="org.apache.maven.scm.provider.ScmProvider" role-hint="cvs_native"
46   */
47  public class CvsExeScmProvider
48      extends AbstractCvsScmProvider
49  {
50      /** sserver transport method */
51      public static final String TRANSPORT_SSERVER = "sserver";
52  
53      /** {@inheritDoc} */
54      protected Command getAddCommand()
55      {
56          return new CvsExeAddCommand();
57      }
58  
59      /** {@inheritDoc} */
60      protected Command getBranchCommand()
61      {
62          return new CvsExeBranchCommand();
63      }
64  
65      /** {@inheritDoc} */
66      protected Command getBlameCommand()
67      {
68          return new CvsExeBlameCommand();
69      }
70  
71      /** {@inheritDoc} */
72      protected Command getChangeLogCommand()
73      {
74          return new CvsExeChangeLogCommand();
75      }
76  
77      /** {@inheritDoc} */
78      protected Command getCheckInCommand()
79      {
80          return new CvsExeCheckInCommand();
81      }
82  
83      /** {@inheritDoc} */
84      protected Command getCheckOutCommand()
85      {
86          return new CvsExeCheckOutCommand();
87      }
88  
89      /** {@inheritDoc} */
90      protected Command getDiffCommand()
91      {
92          return new CvsExeDiffCommand();
93      }
94  
95      /** {@inheritDoc} */
96      protected Command getExportCommand()
97      {
98          return new CvsExeExportCommand();
99      }
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 = Integer.valueOf( 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 }