9fef4917cd6c29a5cc8b45e764753d39c3e7921e
[idea/community.git] / platform / vcs-api / src / com / intellij / openapi / vcs / ThreadLocalDefendedInvoker.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 package com.intellij.openapi.vcs;
17
18 import com.intellij.openapi.project.Project;
19
20 public abstract class ThreadLocalDefendedInvoker<T> {
21   protected final static ThreadLocal<Boolean> myThreadLocal = new ThreadLocal<Boolean>() {
22     @Override
23     protected Boolean initialValue() {
24       return Boolean.TRUE;
25     }
26   };
27
28   protected abstract T execute(Project project);
29
30   public static boolean isInside() {
31     return ! Boolean.TRUE.equals(myThreadLocal.get());
32   }
33
34   public static boolean isOutside() {
35     return ! isInside();
36   }
37
38   public T executeDefended(Project project) {
39     try {
40       myThreadLocal.set(Boolean.FALSE);
41       return execute(project);
42     } finally {
43       myThreadLocal.set(Boolean.TRUE);
44     }
45   }
46 }