blob: e82e363f598a7a9f411cfc725223d061d360221b [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 org.jetbrains.idea.svn;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.*;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.messages.Topic;
import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew;
import java.io.File;
import java.util.*;
/**
* Holds what working copies we have for URLs
*/
@State(
name = "SvnBranchMapperManager",
storages = {
@Storage(
file = StoragePathMacros.APP_CONFIG + "/other.xml"
)}
)
public class SvnBranchMapperManager implements PersistentStateComponent<SvnBranchMapperManager.SvnBranchMapperHolder> {
private SvnBranchMapperHolder myStateHolder;
public static SvnBranchMapperManager getInstance() {
return ServiceManager.getService(SvnBranchMapperManager.class);
}
public SvnBranchMapperManager() {
myStateHolder = new SvnBranchMapperHolder();
}
public SvnBranchMapperHolder getState() {
return myStateHolder;
}
public void loadState(final SvnBranchMapperHolder state) {
myStateHolder = state;
}
public void put(final String url, final String value) {
myStateHolder.put(url, value);
notifyWcRootsChanged(url, Collections.unmodifiableCollection(myStateHolder.get(url)));
}
public void remove(final String url, final File value) {
final Set<String> set = myStateHolder.get(url);
if (set != null) {
set.remove(value.getAbsolutePath());
}
notifyWcRootsChanged(url, Collections.unmodifiableCollection(set));
}
private static void notifyWcRootsChanged(final String url, final Collection<String> roots) {
ApplicationManager.getApplication().getMessageBus().syncPublisher(WC_ROOTS_CHANGED).rootsChanged(url, roots);
}
public void notifyBranchesChanged(final Project project, final VirtualFile vcsRoot, final SvnBranchConfigurationNew configuration) {
final Map<String, String> map = configuration.getUrl2FileMappings(project, vcsRoot);
if (map != null) {
for (Map.Entry<String, String> entry : map.entrySet()) {
put(entry.getKey(), entry.getValue());
}
}
}
public Set<String> get(final String key) {
return myStateHolder.get(key);
}
public static class SvnBranchMapperHolder {
public Map<String, Set<String>> myMapping;
public SvnBranchMapperHolder() {
myMapping = new HashMap<String, Set<String>>();
}
public void put(final String key, final String value) {
Set<String> files = myMapping.get(key);
if (files == null) {
files = new HashSet<String>();
myMapping.put(key, files);
}
files.add(value);
}
public Set<String> get(final String key) {
return myMapping.get(key);
}
}
public static interface WcRootsChangeConsumer {
void rootsChanged(final String url, final Collection<String> roots);
}
public static final Topic<WcRootsChangeConsumer> WC_ROOTS_CHANGED =
new Topic<WcRootsChangeConsumer>("SVN_WC_ROOTS_CHANGED", WcRootsChangeConsumer.class);
}