blob: 36c16f33a0fcb3f8b382b3291a3d0e49063965ae [file] [log] [blame]
/*
* Copyright 2000-2014 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 org.jetbrains.idea.svn.branchConfig;
import com.intellij.openapi.util.Ref;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.svn.SvnUtil;
import org.jetbrains.idea.svn.SvnVcs;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* @author Konstantin Kolosovsky.
*/
public class UrlSerializationHelper {
private final SvnVcs myVcs;
public UrlSerializationHelper(final SvnVcs vcs) {
myVcs = vcs;
}
public SvnBranchConfiguration prepareForSerialization(final SvnBranchConfiguration configuration) {
final Ref<Boolean> withUserInfo = new Ref<Boolean>();
final String trunkUrl = serializeUrl(configuration.getTrunkUrl(), withUserInfo);
if (Boolean.FALSE.equals(withUserInfo.get())) {
return configuration;
}
final List<String> branches = configuration.getBranchUrls();
final List<String> newBranchesList = new ArrayList<String>(branches.size());
for (String s : branches) {
newBranchesList.add(serializeUrl(s, withUserInfo));
}
return new SvnBranchConfiguration(trunkUrl, newBranchesList, withUserInfo.isNull() ? false : withUserInfo.get());
}
public SvnBranchConfiguration afterDeserialization(final String path, final SvnBranchConfiguration configuration) {
if (! configuration.isUserinfoInUrl()) {
return configuration;
}
final String userInfo = getUserInfo(path);
if (userInfo == null) {
return configuration;
}
final String newTrunkUrl = deserializeUrl(configuration.getTrunkUrl(), userInfo);
final List<String> branches = configuration.getBranchUrls();
final List<String> newBranchesList = new ArrayList<String>(branches.size());
for (String s : branches) {
newBranchesList.add(deserializeUrl(s, userInfo));
}
return new SvnBranchConfiguration(newTrunkUrl, newBranchesList, userInfo.length() > 0);
}
private static String serializeUrl(final String url, final Ref<Boolean> withUserInfo) {
if (Boolean.FALSE.equals(withUserInfo.get())) {
return url;
}
try {
final SVNURL svnurl = SVNURL.parseURIEncoded(url);
if (withUserInfo.isNull()) {
final String userInfo = svnurl.getUserInfo();
withUserInfo.set((userInfo != null) && (userInfo.length() > 0));
}
if (withUserInfo.get()) {
return SVNURL.create(svnurl.getProtocol(), null, svnurl.getHost(), SvnUtil.resolvePort(svnurl), svnurl.getURIEncodedPath(), true)
.toString();
}
}
catch (SVNException e) {
//
}
return url;
}
@Nullable
private String getUserInfo(final String path) {
final SVNURL svnurl = myVcs.getSvnFileUrlMapping().getUrlForFile(new File(path));
return svnurl != null ? svnurl.getUserInfo() : null;
}
private static String deserializeUrl(final String url, final String userInfo) {
try {
final SVNURL svnurl = SVNURL.parseURIEncoded(url);
return SVNURL.create(svnurl.getProtocol(), userInfo, svnurl.getHost(), SvnUtil.resolvePort(svnurl), svnurl.getURIEncodedPath(),
true).toString();
} catch (SVNException e) {
return url;
}
}
}