blob: e99adaee7787ef647e39f3161155ccaf9ffd05d1 [file] [log] [blame]
package org.apache.maven.scm.provider.bazaar.repository;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.maven.scm.provider.ScmProviderRepositoryWithHost;
import org.codehaus.plexus.util.StringUtils;
import java.io.File;
/**
* @author <a href="mailto:torbjorn@smorgrav.org">Torbj�rn Eikli Sm�rgrav</a>
* @version $Id$
*/
public class BazaarScmProviderRepository
extends ScmProviderRepositoryWithHost
{
//Known and tested protocols
private static final String FILE = "file://";
private static final String SFTP = "sftp://";
private static final String FTP = "ftp://";
private static final String AFTP = "aftp://";
private static final String HTTP = "http://";
private static final String HTTPS = "https://";
private static final String UNKNOWN = "";
private final String path;
private final String protocol;
private final String orgUrl;
public BazaarScmProviderRepository( String url )
{
orgUrl = url;
protocol = getProtocol( url );
path = parseUrl( url );
}
public String getURI()
{
if ( FILE.equals( protocol ) )
{
return orgUrl;
}
else
{
return protocol + ( needsAuthentication() ? addUser() + addPassword() + addAt() : "" ) + addHost()
+ addPort() + addPath();
}
}
/**
* @return A message if the repository as an invalid URI, null if the URI seems fine.
*/
public String validateURI()
{
String msg = null;
if ( UNKNOWN.equals( protocol ) )
{
msg = "Unknown protocol (URL should start with something like 'sftp://' or 'file://'";
}
else if ( needsAuthentication() )
{
if ( getUser() == null )
{
msg = "Username is missing for protocol " + protocol;
}
else if ( getPassword() == null )
{
msg = "Password is missing for protocol " + protocol;
}
else if ( getHost() == null )
{
msg = "Host (eg. www.myhost.com) is missing for protocol " + protocol;
}
}
else if ( getPort() != 0 && getHost() == null )
{
msg = "Got port information without any host for protocol " + protocol;
}
if ( msg != null )
{
msg = "Something could be wrong about the repository URL: " + orgUrl + "\nReason: " + msg
+ "\nCheck http://maven.apache.org/scm for usage and hints.";
}
return msg;
}
private String getProtocol( String url )
{
String prot = UNKNOWN;
if ( url.startsWith( FILE ) )
{
prot = FILE;
}
else if ( url.startsWith( FTP ) )
{
prot = FTP;
}
else if ( url.startsWith( SFTP ) )
{
prot = SFTP;
}
else if ( url.startsWith( AFTP ) )
{
prot = AFTP;
}
else if ( url.startsWith( HTTP ) )
{
prot = HTTP;
}
else if ( url.startsWith( HTTPS ) )
{
prot = HTTPS;
}
return prot;
}
private String parseUrl( String url )
{
if ( UNKNOWN.equals( protocol ) )
{
return url;
}
//Strip protocol
url = url.substring( protocol.length() );
url = parseUsernameAndPassword( url );
url = parseHostAndPort( url );
url = parsePath( url );
return url; //is now only the path
}
private String parseHostAndPort( String url )
{
if ( !FILE.equals( protocol ) )
{
int indexSlash = url.indexOf( "/" );
String hostPort = url;
if ( indexSlash > 0 )
{
hostPort = url.substring( 0, indexSlash );
}
int indexColon = hostPort.indexOf( ":" );
if ( indexColon > 0 )
{
setHost( hostPort.substring( 0, indexColon ) );
url = StringUtils.replace( url, getHost(), "" );
setPort( Integer.parseInt( hostPort.substring( indexColon + 1 ) ) );
url = StringUtils.replace( url, ":" + getPort(), "" );
}
else
{
setHost( hostPort );
url = StringUtils.replace( url, getHost(), "" );
}
}
return url;
}
private String parseUsernameAndPassword( String url )
{
if ( needsAuthentication() )
{
String[] split = url.split( "@" );
if ( split.length == 2 )
{
url = split[1]; //Strip away 'username:password@' from url
split = split[0].split( ":" );
if ( split.length == 2 )
{ //both username and password
setUser( split[0] );
setPassword( split[1] );
}
else
{ //only username
setUser( split[0] );
}
}
}
return url;
}
private String parsePath( String url )
{
if ( FILE.equals( protocol ) )
{
//Use OS dependent path separator
url = StringUtils.replace( url, "/", File.separator );
//Test first path separator (*nix systems use them to denote root)
File tmpFile = new File( url ); //most likly a *nix system
String url2 = url.substring( File.pathSeparator.length() );
File tmpFile2 = new File( url2 ); //most likly a windows system
if ( !tmpFile.exists() && !tmpFile2.exists() )
{
// This is trouble - Trouble is reported in validateURI()
}
url = tmpFile2.exists() ? url2 : url;
//Use URL path separator
url = StringUtils.replace( url, File.separator, "/" );
}
return url;
}
private String addUser()
{
return ( getUser() == null ) ? "" : getUser();
}
private String addPassword()
{
return ( getPassword() == null ) ? "" : ":" + getPassword();
}
private String addAt()
{
return needsAuthentication() ? "@" : "";
}
private String addHost()
{
return ( getHost() == null ) ? "" : getHost();
}
private String addPort()
{
return ( getPort() == 0 ) ? "" : ":" + getPort();
}
private String addPath()
{
return path;
}
private boolean needsAuthentication()
{
return SFTP.equals( protocol ) || FTP.equals( protocol ) || HTTPS.equals( protocol ) || AFTP.equals( protocol );
}
/** {@inheritDoc} */
public String toString()
{
return "Bazaar Repository Interpreted from: " + orgUrl + ":\nProtocol: " + protocol + "\nHost: "
+ getHost() + "\nPort: " + getPort() + "\nUsername: " + getUser() + "\nPassword: " + getPassword()
+ "\nPath: " + path;
}
}