SVN auth
[fedora-idea.git] / plugins / svn4idea / src / org / jetbrains / idea / svn / SvnCopiesRefreshManager.java
blob7d05232726f57ccfdc0a9d80530ba5df8a7bbd88
1 /*
2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org.jetbrains.idea.svn;
18 import com.intellij.lifecycle.AtomicSectionsAware;
19 import com.intellij.lifecycle.ControlledAlarmFactory;
20 import com.intellij.lifecycle.SlowlyClosingAlarm;
21 import com.intellij.openapi.progress.ProcessCanceledException;
22 import com.intellij.openapi.progress.ProgressIndicator;
23 import com.intellij.openapi.progress.ProgressManager;
24 import com.intellij.openapi.project.Project;
25 import com.intellij.util.Consumer;
26 import com.intellij.util.concurrency.Semaphore;
28 public class SvnCopiesRefreshManager {
29 private final CopiesRefresh myCopiesRefresh;
31 public SvnCopiesRefreshManager(final Project project, final SvnFileUrlMappingImpl mapping) {
32 myCopiesRefresh = new MyVeryRefresh();
33 //myCopiesRefreshProxy = new DefendedCopiesRefreshProxy(veryRefresh);
35 final SlowlyClosingAlarm alarm = ControlledAlarmFactory.createOnOwnThread(project, "Subversion working copies refresher");
36 final Runnable refresher = new MyRefresher(project, mapping, alarm);
37 //final Runnable proxiedRefresher = myCopiesRefreshProxy.proxyRefresher(refresher);
39 final RequestsMerger requestsMerger = new RequestsMerger(refresher, new Consumer<Runnable>() {
40 public void consume(final Runnable runnable) {
41 alarm.addRequest(runnable);
43 });
44 ((MyVeryRefresh) myCopiesRefresh).setRequestMerger(requestsMerger);
47 public CopiesRefresh getCopiesRefresh() {
48 return myCopiesRefresh;
51 private class MyVeryRefresh implements CopiesRefresh {
52 private static final long ourQueryInterval = 1000;
53 private RequestsMerger myRequestMerger;
54 private final ProgressManager myPm;
56 private MyVeryRefresh() {
57 myPm = ProgressManager.getInstance();
60 public void setRequestMerger(RequestsMerger requestMerger) {
61 myRequestMerger = requestMerger;
64 public void ensureInit() {
65 synchRequest(myPm.getProgressIndicator(), true);
68 public void asynchRequest() {
69 myRequestMerger.request();
72 public void synchRequest() {
73 synchRequest(myPm.getProgressIndicator(), false);
76 private void synchRequest(final ProgressIndicator pi, final boolean isOnlyInit) {
77 final Semaphore semaphore = new Semaphore();
78 final Runnable waiter = new Runnable() {
79 public void run() {
80 semaphore.up();
83 if (isOnlyInit) {
84 myRequestMerger.ensureInitialization(waiter);
85 } else {
86 myRequestMerger.waitRefresh(waiter);
88 semaphore.down();
89 while (true) {
90 if (semaphore.waitFor(ourQueryInterval)) break;
91 if (pi != null) {
92 pi.checkCanceled();
98 private static class MyRefresher implements Runnable {
99 private final Project myProject;
100 private final SvnFileUrlMappingImpl myMapping;
101 private final AtomicSectionsAware myAtomicSectionsAware;
103 private MyRefresher(final Project project, final SvnFileUrlMappingImpl mapping, final AtomicSectionsAware atomicSectionsAware) {
104 myProject = project;
105 myMapping = mapping;
106 myAtomicSectionsAware = atomicSectionsAware;
109 public void run() {
110 try {
111 myMapping.realRefresh(myAtomicSectionsAware);
113 catch (ProcessCanceledException e) {