blob: 559f03e659c350b057065bc7cf4db1168498b45e [file] [log] [blame]
/*
* 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
*
* https://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.
*
*/
package org.apache.ivy.plugins.repository.vfs;
import org.apache.ivy.Ivy;
import static org.apache.ivy.util.StringUtils.isNullOrEmpty;
public class VfsURI {
private String host;
private String passwd;
private String path;
private String scheme;
private String user;
// VFS Schemes
private static final String SCHEME_CIFS = "smb";
private static final String SCHEME_FILE = "file";
private static final String SCHEME_FTP = "ftp";
@SuppressWarnings("unused")
private static final String SCHEME_HTTP = "http";
@SuppressWarnings("unused")
private static final String SCHEME_HTTPS = "https";
private static final String SCHEME_SFTP = "sftp";
@SuppressWarnings("unused")
private static final String SCHEME_WEBDAV = "webdav";
public static final String[] SUPPORTED_SCHEMES = new String[] {
// add other schemes here if other can be tested on your machine
SCHEME_FILE};
/**
* Create a set of valid VFS URIs for the file access protocol
*
* @param scheme String
* @param resource
* relative path (from the base repo) to the resource to be accessed
* @param ivy Ivy
* @return VfsURI
*/
public static VfsURI vfsURIFactory(String scheme, String resource, Ivy ivy) {
VfsURI vfsURI = null;
switch (scheme) {
case SCHEME_CIFS:
vfsURI = new VfsURI(SCHEME_CIFS, ivy.getVariable(VfsTestHelper.PROP_VFS_USER_ID),
ivy.getVariable(VfsTestHelper.PROP_VFS_USER_PASSWD),
ivy.getVariable(VfsTestHelper.PROP_VFS_HOST),
ivy.getVariable(VfsTestHelper.PROP_VFS_SAMBA_REPO) + "/" + resource);
break;
case SCHEME_FILE:
vfsURI = new VfsURI(SCHEME_FILE, null, null, null, VfsTestHelper.CWD + "/"
+ VfsTestHelper.TEST_REPO_DIR + "/" + resource);
break;
case SCHEME_FTP:
vfsURI = new VfsURI(SCHEME_FTP, ivy.getVariable(VfsTestHelper.PROP_VFS_USER_ID),
ivy.getVariable(VfsTestHelper.PROP_VFS_USER_PASSWD),
ivy.getVariable(VfsTestHelper.PROP_VFS_HOST), VfsTestHelper.CWD + "/"
+ VfsTestHelper.TEST_REPO_DIR + "/" + resource);
break;
case SCHEME_SFTP:
vfsURI = new VfsURI(SCHEME_SFTP, ivy.getVariable(VfsTestHelper.PROP_VFS_USER_ID),
ivy.getVariable(VfsTestHelper.PROP_VFS_USER_PASSWD),
ivy.getVariable(VfsTestHelper.PROP_VFS_HOST), VfsTestHelper.CWD + "/"
+ VfsTestHelper.TEST_REPO_DIR + "/" + resource);
break;
}
return vfsURI;
}
/**
* Create a wellformed VFS resource identifier
*
* @param scheme
* the name of the scheme used to access the resource
* @param user
* a user name. May be <code>null</code>
* @param passwd
* a passwd. May be <code>null</code>
* @param host
* a host identifier. May be <code>null</code>
* @param path
* a scheme specific path to a resource
*/
public VfsURI(String scheme, String user, String passwd, String host, String path) {
this.scheme = scheme.trim();
if (user != null) {
this.user = user.trim();
} else {
this.user = null;
}
if (passwd != null) {
this.passwd = passwd.trim();
} else {
this.passwd = null;
}
if (host != null) {
this.host = host.trim();
} else {
this.host = null;
}
this.path = normalizePath(path);
}
/**
* Return a well-formed VFS Resource identifier
*
* @return <code>String</code> representing a well formed VFS resource identifier
*/
public String getVfsURI() {
StringBuilder uri = new StringBuilder();
uri.append(this.scheme).append("://");
// not all resource identifiers include user/passwd specifiers
if (!isNullOrEmpty(user)) {
uri.append(this.user).append(":");
if (!isNullOrEmpty(passwd)) {
this.passwd = passwd.trim();
} else {
this.passwd = "";
}
uri.append(this.passwd).append("@");
}
// not all resource identifiers include a host specifier
if (!isNullOrEmpty(host)) {
this.host = host.trim();
uri.append(this.host);
}
uri.append(this.path);
return uri.toString();
}
/**
* Convert a resource path to the format required for a VFS resource identifier
*
* @param path
* <code>String</code> path to the resource
* @return <code>String</code> representing a normalized resource path
*/
private String normalizePath(String path) {
// all backslashes replaced with forward slashes
String normalizedPath = path.replaceAll("\\\\", "/");
// collapse multiple instance of forward slashes to single slashes
normalizedPath = normalizedPath.replaceAll("//+", "/");
// ensure that our path starts with a forward slash
if (!normalizedPath.startsWith("/")) {
normalizedPath = "/" + normalizedPath;
}
return normalizedPath.trim();
}
public String toString() {
return getVfsURI();
}
public String getScheme() {
return scheme;
}
}