blob: 751bac7bba3326fdd15295497ff6fc7760908219 [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.openapi.vcs.checkout;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vcs.CheckoutProvider;
import com.intellij.openapi.vcs.VcsKey;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.newvfs.NewVirtualFile;
import java.io.File;
/**
* to be called after checkout - notifiers extenders on checkout completion
*/
public class CompositeCheckoutListener implements CheckoutProvider.Listener {
private final Project myProject;
private boolean myFoundProject = false;
private File myFirstDirectory;
private VcsKey myVcsKey;
public CompositeCheckoutListener(final Project project) {
myProject = project;
}
public void directoryCheckedOut(final File directory, VcsKey vcs) {
myVcsKey = vcs;
if (!myFoundProject) {
final VirtualFile virtualFile = refreshVFS(directory);
if (virtualFile != null) {
if (myFirstDirectory == null) {
myFirstDirectory = directory;
}
notifyCheckoutListeners(directory, CheckoutListener.EP_NAME);
}
}
}
private static VirtualFile refreshVFS(final File directory) {
final Ref<VirtualFile> result = new Ref<VirtualFile>();
ApplicationManager.getApplication().runWriteAction(new Runnable() {
public void run() {
final LocalFileSystem lfs = LocalFileSystem.getInstance();
final VirtualFile vDir = lfs.refreshAndFindFileByIoFile(directory);
result.set(vDir);
if (vDir != null) {
final LocalFileSystem.WatchRequest watchRequest = lfs.addRootToWatch(vDir.getPath(), true);
((NewVirtualFile)vDir).markDirtyRecursively();
vDir.refresh(false, true);
if (watchRequest != null) {
lfs.removeWatchedRoot(watchRequest);
}
}
}
});
return result.get();
}
private void notifyCheckoutListeners(final File directory, final ExtensionPointName<CheckoutListener> epName) {
final CheckoutListener[] listeners = Extensions.getExtensions(epName);
for (CheckoutListener listener: listeners) {
myFoundProject = listener.processCheckedOutDirectory(myProject, directory);
if (myFoundProject) break;
}
if (!myFoundProject && !epName.equals(CheckoutListener.COMPLETED_EP_NAME)) {
final VcsAwareCheckoutListener[] vcsAwareExtensions = Extensions.getExtensions(VcsAwareCheckoutListener.EP_NAME);
for (VcsAwareCheckoutListener extension : vcsAwareExtensions) {
myFoundProject = extension.processCheckedOutDirectory(myProject, directory, myVcsKey);
if (myFoundProject) break;
}
}
final Project[] openProjects = ProjectManager.getInstance().getOpenProjects();
if (openProjects.length > 0){
final Project lastOpenedProject = openProjects[openProjects.length - 1];
for (CheckoutListener listener: listeners) {
listener.processOpenedProject(lastOpenedProject);
}
}
}
public void checkoutCompleted() {
if (!myFoundProject && myFirstDirectory != null) {
notifyCheckoutListeners(myFirstDirectory, CheckoutListener.COMPLETED_EP_NAME);
}
}
}