| /* |
| * Copyright 2000-2013 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.openapi.vcs.impl.projectlevelman; |
| |
| import com.intellij.openapi.diagnostic.Logger; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.util.io.FileUtil; |
| import com.intellij.openapi.vcs.VcsDirectoryMapping; |
| import com.intellij.openapi.vfs.LocalFileSystem; |
| import com.intellij.util.containers.ContainerUtil; |
| |
| import java.util.*; |
| |
| import static com.intellij.util.containers.ContainerUtil.newHashMap; |
| import static com.intellij.util.containers.ContainerUtil.newLinkedList; |
| |
| /** |
| * @author irengrig |
| */ |
| public class FileWatchRequestModifier implements Runnable { |
| private static final Logger LOG = Logger.getInstance(FileWatchRequestModifier.class); |
| |
| private final Project myProject; |
| private final NewMappings myNewMappings; |
| private final Map<VcsDirectoryMapping, LocalFileSystem.WatchRequest> myDirectoryMappingWatches; |
| private final LocalFileSystem myLfs; |
| |
| public FileWatchRequestModifier(final Project project, final NewMappings newMappings, final LocalFileSystem localFileSystem) { |
| myLfs = localFileSystem; |
| myProject = project; |
| myNewMappings = newMappings; |
| myDirectoryMappingWatches = newHashMap(); |
| } |
| |
| @Override |
| public void run() { |
| if (!myProject.isInitialized() || myProject.isDisposed()) return; |
| final List<VcsDirectoryMapping> copy = myNewMappings.getDirectoryMappings(); |
| |
| final List<VcsDirectoryMapping> added = newLinkedList(copy); |
| added.removeAll(myDirectoryMappingWatches.keySet()); |
| |
| final List<VcsDirectoryMapping> deleted = newLinkedList(myDirectoryMappingWatches.keySet()); |
| deleted.removeAll(copy); |
| |
| final Map<String, VcsDirectoryMapping> toAdd = ContainerUtil.newTroveMap(FileUtil.PATH_HASHING_STRATEGY); |
| for (VcsDirectoryMapping mapping : added) { |
| if (!mapping.isDefaultMapping()) { |
| toAdd.put(FileUtil.toCanonicalPath(mapping.getDirectory()), mapping); |
| } |
| } |
| |
| final Collection<LocalFileSystem.WatchRequest> toRemove = newLinkedList(); |
| for (VcsDirectoryMapping mapping : deleted) { |
| if (mapping.isDefaultMapping()) continue; |
| final LocalFileSystem.WatchRequest removed = myDirectoryMappingWatches.remove(mapping); |
| if (removed != null) { |
| toRemove.add(removed); |
| } |
| } |
| |
| final Set<LocalFileSystem.WatchRequest> requests = myLfs.replaceWatchedRoots(toRemove, toAdd.keySet(), null); |
| for (LocalFileSystem.WatchRequest request : requests) { |
| final VcsDirectoryMapping mapping = toAdd.get(request.getRootPath()); |
| if (mapping != null) { |
| myDirectoryMappingWatches.put(mapping, request); |
| } |
| else { |
| LOG.error("root=" + request.getRootPath() + " toAdd=" + ContainerUtil.newHashSet(toAdd.keySet())); |
| } |
| } |
| } |
| } |