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
);
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() {
84 myRequestMerger
.ensureInitialization(waiter
);
86 myRequestMerger
.waitRefresh(waiter
);
90 if (semaphore
.waitFor(ourQueryInterval
)) break;
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
) {
106 myAtomicSectionsAware
= atomicSectionsAware
;
111 myMapping
.realRefresh(myAtomicSectionsAware
);
113 catch (ProcessCanceledException e
) {