blob: 321c298dbc0aadee41dbc21ce80c7e94d3344649 [file] [log] [blame]
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed 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.
*/
package com.intellij.cvsSupport2.connections;
import com.intellij.CvsBundle;
import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* author: lesya
*/
public final class CvsRootParser {
//:pserver;username=lesya;password=password111;hostname=hostname111;port=port111;proxy=proxy111;proxyport=proxyport111;tunnel=tumnnel111;proxyuser=proxyuser111;proxypassword=proxypassword111:c:/RepositoryPath
@NonNls private static final String PATTERN_STR = "^((.*?{0,1}(:.*?){0,1})@){0,1}([a-zA-Z0-9\\._-]+)(:(\\d*){0,1}){0,1}(.+)$";
private static final Pattern ourPattern = Pattern.compile(PATTERN_STR);
private static final String LOCAL = ":local:";
private static final int GROUP_USER_NAME_AND_PWD = 2;
private static final int GROUP_HOST = 4;
private static final int GROUP_PORT = 5;
private static final int GROUP_REPOSITORY = 7;
public CvsMethod METHOD;
public String USER_NAME;
public String HOST;
public String REPOSITORY;
public String PROXY_HOST;
public String PROXY_PORT;
public String PORT;
public String PASSWORD;
@NonNls private static final String USERNAME_FIELD_NAME = "username";
@NonNls private static final String PASSWORD_FIELD_NAME = "password";
@NonNls private static final String HOSTNAME__FIELD_NAME = "hostname";
@NonNls private static final String PROXY_FIELD_NAME = "proxy";
@NonNls private static final String PROXYPORT_FIELD_NAME = "proxyport";
@NonNls private static final String PORT_FIELD_NAME = "port";
@NotNull public static CvsRootParser valueOf(String rootString, boolean check) {
final CvsRootParser result = new CvsRootParser();
if (rootString.isEmpty()) {
if (check) {
throw new CvsRootException(CvsBundle.message("message.error.empty.cvs.root"));
}
result.METHOD = CvsMethod.PSERVER_METHOD;
return result;
}
else if (!StringUtil.startsWithChar(rootString, ':')) {
result.METHOD = CvsMethod.LOCAL_METHOD;
result.REPOSITORY = rootString;
return result;
}
if (rootString.startsWith(LOCAL)){
result.METHOD = CvsMethod.LOCAL_METHOD;
result.REPOSITORY = rootString.substring(LOCAL.length());
return result;
}
final String suffix = result.extractMethod(rootString, check);
if (CvsMethod.LOCAL_METHOD.equals(result.METHOD)) {
result.REPOSITORY = suffix;
skipTrailingRepositorySlash(result);
}
else {
if (result.HOST != null && !result.HOST.isEmpty() && result.USER_NAME != null && !result.USER_NAME.isEmpty()) {
result.REPOSITORY = suffix.trim();
}
else if (suffix.contains("@") || suffix.contains(":")){
final Matcher matcher = ourPattern.matcher(suffix);
if (matcher.matches()) {
extractUserNameAndPassword(matcher, result);
extractHostAndPort(matcher, result);
extractRepository(matcher, result);
}
else {
if (check) {
throw new CvsRootException(CvsBundle.message("error.message.wrong.remote.repository", rootString));
}
else {
result.REPOSITORY = suffix;
}
}
} else {
result.REPOSITORY = suffix;
}
}
return result;
}
private static void extractRepository(Matcher matcher, CvsRootParser cvsRoot) {
cvsRoot.REPOSITORY = matcher.group(GROUP_REPOSITORY);
skipTrailingRepositorySlash(cvsRoot);
}
private static void skipTrailingRepositorySlash(CvsRootParser cvsRoot) {
if (StringUtil.endsWithChar(cvsRoot.REPOSITORY, '/')) {
cvsRoot.REPOSITORY =
cvsRoot.REPOSITORY.substring(0, cvsRoot.REPOSITORY.length() - 1);
}
}
private static void extractHostAndPort(Matcher matcher, CvsRootParser cvsRoot) {
String host = matcher.group(GROUP_HOST);
final String port = matcher.group(GROUP_PORT);
if (port != null) {
cvsRoot.HOST = host + port;
}
else {
if (StringUtil.endsWithChar(host, ':')) {
host = host.substring(0, host.length() - 1);
}
cvsRoot.HOST = host;
}
}
private static void extractUserNameAndPassword(Matcher matcher, CvsRootParser cvsRoot) {
final String userNameAndPwd = matcher.group(GROUP_USER_NAME_AND_PWD);
if (userNameAndPwd != null && cvsRoot.USER_NAME.isEmpty()) {
cvsRoot.USER_NAME = userNameAndPwd;
}
}
@Nullable
private String tryToCutMethod(CvsMethod method, String cvsRoot) {
final String methodEntry = methodEntry(method.getName());
if (cvsRoot.startsWith(methodEntry)) {
return cvsRoot.substring(methodEntry.length());
}
if (!method.supportsProxyConnection()) {
return null;
}
final String proxyBegin = ":" + method.getName() + ";";
if (!cvsRoot.startsWith(proxyBegin)) {
return null;
}
final String tail = cvsRoot.substring(proxyBegin.length() - 1);
final int endOfProxySettings = tail.indexOf(':');
if (endOfProxySettings == -1){
return null;
}
final String proxySettings = tail.substring(0, endOfProxySettings);
final String[] paramValueStrings = proxySettings.split(";");
for (String paramValueString : paramValueStrings) {
final int eqIndex = paramValueString.indexOf("=");
if (eqIndex >= 0) {
setValue(paramValueString.substring(0, eqIndex), paramValueString.substring(eqIndex + 1));
}
}
return tail.substring(endOfProxySettings + 1);
}
private void setValue(final String paramName, final String paramValue) {
if (paramName.isEmpty() || paramValue.isEmpty()) {
return;
}
if (USERNAME_FIELD_NAME.equals(paramName)){
USER_NAME = paramValue;
}
else if(PASSWORD_FIELD_NAME.equals(paramName)){
PASSWORD = paramValue;
}
else if (HOSTNAME__FIELD_NAME.equals(paramName)){
HOST=paramValue;
}
else if (PROXY_FIELD_NAME.equals(paramName)){
PROXY_HOST= paramValue;
}
else if (PROXYPORT_FIELD_NAME.equals(paramName)){
PROXY_PORT= paramValue;
}
else if (PORT_FIELD_NAME.equals(paramName)){
PORT= paramValue;
}
}
private static String methodEntry(String method) {
return ":" + method + ":";
}
private String extractMethod(String rootString, boolean check) {
for (CvsMethod cvsMethod : CvsMethod.AVAILABLE_METHODS) {
final String tail = tryToCutMethod(cvsMethod, rootString);
if (tail != null) {
METHOD = cvsMethod;
return tail;
}
}
if (check) {
throw new CvsRootException(CvsBundle.message("message.error.invalid.cvs.root", rootString));
}
METHOD = CvsMethod.AVAILABLE_METHODS[0];
if (!StringUtil.startsWithChar(rootString, ':')) return rootString;
final int nextSep = rootString.indexOf(":", 1);
if (nextSep < 0) {
return rootString;
}
return rootString.substring(nextSep + 1);
}
private CvsRootParser() {
METHOD = null;
USER_NAME = "";
HOST = "";
REPOSITORY = "";
PORT = null;
PASSWORD = null;
}
}