001 package org.apache.maven.scm.provider.tfs; 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.net.URI; 023 024 import org.apache.maven.scm.CommandParameters; 025 import org.apache.maven.scm.ScmException; 026 import org.apache.maven.scm.ScmFileSet; 027 import org.apache.maven.scm.command.add.AddScmResult; 028 import org.apache.maven.scm.command.blame.BlameScmResult; 029 import org.apache.maven.scm.command.branch.BranchScmResult; 030 import org.apache.maven.scm.command.changelog.ChangeLogScmResult; 031 import org.apache.maven.scm.command.checkin.CheckInScmResult; 032 import org.apache.maven.scm.command.checkout.CheckOutScmResult; 033 import org.apache.maven.scm.command.diff.DiffScmResult; 034 import org.apache.maven.scm.command.edit.EditScmResult; 035 import org.apache.maven.scm.command.export.ExportScmResult; 036 import org.apache.maven.scm.command.list.ListScmResult; 037 import org.apache.maven.scm.command.status.StatusScmResult; 038 import org.apache.maven.scm.command.tag.TagScmResult; 039 import org.apache.maven.scm.command.unedit.UnEditScmResult; 040 import org.apache.maven.scm.command.update.UpdateScmResult; 041 import org.apache.maven.scm.provider.AbstractScmProvider; 042 import org.apache.maven.scm.provider.ScmProviderRepository; 043 import org.apache.maven.scm.provider.tfs.command.TfsAddCommand; 044 import org.apache.maven.scm.provider.tfs.command.TfsBranchCommand; 045 import org.apache.maven.scm.provider.tfs.command.TfsChangeLogCommand; 046 import org.apache.maven.scm.provider.tfs.command.TfsCheckInCommand; 047 import org.apache.maven.scm.provider.tfs.command.TfsCheckOutCommand; 048 import org.apache.maven.scm.provider.tfs.command.TfsEditCommand; 049 import org.apache.maven.scm.provider.tfs.command.TfsListCommand; 050 import org.apache.maven.scm.provider.tfs.command.TfsStatusCommand; 051 import org.apache.maven.scm.provider.tfs.command.TfsTagCommand; 052 import org.apache.maven.scm.provider.tfs.command.TfsUnEditCommand; 053 import org.apache.maven.scm.provider.tfs.command.TfsUpdateCommand; 054 import org.apache.maven.scm.provider.tfs.command.blame.TfsBlameCommand; 055 import org.apache.maven.scm.repository.ScmRepositoryException; 056 057 /** 058 * @plexus.component role="org.apache.maven.scm.provider.ScmProvider" role-hint="tfs" 059 */ 060 public class TfsScmProvider 061 extends AbstractScmProvider 062 { 063 064 public static final String TFS_URL_FORMAT = 065 "[[domain\\]username[;password]@]http[s]://server_name[:port]:workspace:$/TeamProject/Path/To/Project"; 066 067 // ---------------------------------------------------------------------- 068 // ScmProvider Implementation 069 // ---------------------------------------------------------------------- 070 071 public String getScmType() 072 { 073 return "tfs"; 074 } 075 076 public ScmProviderRepository makeProviderScmRepository( String scmUrl, char delimiter ) 077 throws ScmRepositoryException 078 { 079 // Look for the TFS URL after any '@' delmiter used to pass 080 // usernames/password etc 081 // We deliberately look for the last '@' character as username could 082 // contain an '@' also. 083 int lastAtPos = scmUrl.lastIndexOf( '@' ); 084 getLogger().info( "scmUrl - " + scmUrl ); 085 086 String tfsUrl = ( lastAtPos < 0 ) ? scmUrl : scmUrl.substring( lastAtPos + 1 ); 087 String usernamePassword = ( lastAtPos < 0 ) ? null : scmUrl.substring( 0, lastAtPos ); 088 089 // Look for TFS path after the end of the TFS URL 090 int tfsPathPos = tfsUrl.lastIndexOf( delimiter + "$/" ); 091 String serverPath = "$/"; 092 if ( tfsPathPos > 0 ) 093 { 094 serverPath = tfsUrl.substring( tfsPathPos + 1 ); 095 tfsUrl = tfsUrl.substring( 0, tfsPathPos ); 096 } 097 098 // Look for workspace ater the end of the TFS URL 099 int workspacePos = tfsUrl.lastIndexOf( delimiter ); 100 String workspace = tfsUrl.substring( workspacePos + 1 ); 101 tfsUrl = tfsUrl.substring( 0, workspacePos ); 102 103 try 104 { 105 // Use URI's validation to determine if valid URI. 106 URI tfsUri = URI.create( tfsUrl ); 107 String scheme = tfsUri.getScheme(); 108 getLogger().info( "Scheme - " + scheme ); 109 if ( scheme == null || !( scheme.equalsIgnoreCase( "http" ) || scheme.equalsIgnoreCase( "https" ) ) ) 110 { 111 throw new ScmRepositoryException( "TFS Url \"" + tfsUrl + "\" is not a valid URL. " 112 + "The TFS Url syntax is " + TFS_URL_FORMAT ); 113 } 114 } 115 catch ( IllegalArgumentException e ) 116 { 117 throw new ScmRepositoryException( "TFS Url \"" + tfsUrl + "\" is not a valid URL. The TFS Url syntax is " 118 + TFS_URL_FORMAT ); 119 } 120 121 String username = null; 122 String password = null; 123 124 if ( usernamePassword != null ) 125 { 126 // Deliberately not using .split here in case password contains a 127 // ';' 128 int delimPos = usernamePassword.indexOf( ';' ); 129 username = ( delimPos < 0 ) ? usernamePassword : usernamePassword.substring( 0, delimPos ); 130 password = ( delimPos < 0 ) ? null : usernamePassword.substring( delimPos + 1 ); 131 } 132 133 return new TfsScmProviderRepository( tfsUrl, username, password, serverPath, workspace ); 134 } 135 136 protected ChangeLogScmResult changelog( ScmProviderRepository repository, ScmFileSet fileSet, 137 CommandParameters parameters ) 138 throws ScmException 139 { 140 TfsChangeLogCommand command = new TfsChangeLogCommand(); 141 command.setLogger( getLogger() ); 142 return (ChangeLogScmResult) command.execute( repository, fileSet, parameters ); 143 } 144 145 protected CheckOutScmResult checkout( ScmProviderRepository repository, ScmFileSet fileSet, 146 CommandParameters parameters ) 147 throws ScmException 148 { 149 TfsCheckOutCommand command = new TfsCheckOutCommand(); 150 command.setLogger( getLogger() ); 151 return (CheckOutScmResult) command.execute( repository, fileSet, parameters ); 152 } 153 154 protected EditScmResult edit( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) 155 throws ScmException 156 { 157 TfsEditCommand command = new TfsEditCommand(); 158 command.setLogger( getLogger() ); 159 return (EditScmResult) command.execute( repository, fileSet, parameters ); 160 } 161 162 protected UnEditScmResult unedit( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) 163 throws ScmException 164 { 165 TfsUnEditCommand command = new TfsUnEditCommand(); 166 command.setLogger( getLogger() ); 167 return (UnEditScmResult) command.execute( repository, fileSet, parameters ); 168 } 169 170 protected StatusScmResult status( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) 171 throws ScmException 172 { 173 TfsStatusCommand command = new TfsStatusCommand(); 174 command.setLogger( getLogger() ); 175 return (StatusScmResult) command.execute( repository, fileSet, parameters ); 176 } 177 178 protected UpdateScmResult update( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) 179 throws ScmException 180 { 181 TfsUpdateCommand command = new TfsUpdateCommand(); 182 command.setLogger( getLogger() ); 183 return (UpdateScmResult) command.execute( repository, fileSet, parameters ); 184 } 185 186 protected CheckInScmResult checkin( ScmProviderRepository repository, ScmFileSet fileSet, 187 CommandParameters parameters ) 188 throws ScmException 189 { 190 TfsCheckInCommand command = new TfsCheckInCommand(); 191 command.setLogger( getLogger() ); 192 return (CheckInScmResult) command.execute( repository, fileSet, parameters ); 193 } 194 195 public AddScmResult add( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) 196 throws ScmException 197 { 198 TfsAddCommand command = new TfsAddCommand(); 199 command.setLogger( getLogger() ); 200 return (AddScmResult) command.execute( repository, fileSet, parameters ); 201 } 202 203 protected TagScmResult tag( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) 204 throws ScmException 205 { 206 TfsTagCommand command = new TfsTagCommand(); 207 command.setLogger( getLogger() ); 208 return (TagScmResult) command.execute( repository, fileSet, parameters ); 209 } 210 211 protected BranchScmResult branch( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) 212 throws ScmException 213 { 214 TfsBranchCommand command = new TfsBranchCommand(); 215 command.setLogger( getLogger() ); 216 return (BranchScmResult) command.execute( repository, fileSet, parameters ); 217 } 218 219 protected ListScmResult list( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) 220 throws ScmException 221 { 222 TfsListCommand command = new TfsListCommand(); 223 command.setLogger( getLogger() ); 224 return (ListScmResult) command.execute( repository, fileSet, parameters ); 225 } 226 227 protected BlameScmResult blame( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) 228 throws ScmException 229 { 230 TfsBlameCommand command = new TfsBlameCommand(); 231 command.setLogger( getLogger() ); 232 return (BlameScmResult) command.execute( repository, fileSet, parameters ); 233 } 234 235 protected DiffScmResult diff( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) 236 throws ScmException 237 { 238 // Because tf launches only external diffs 239 return super.diff( repository, fileSet, parameters ); 240 } 241 242 protected ExportScmResult export( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters ) 243 throws ScmException 244 { 245 // Use checkout instead 246 return super.export( repository, fileSet, parameters ); 247 } 248 249 }