[console filter] inline bomb with 100 ms
[idea/community.git] / plugins / gradle / src / org / jetbrains / plugins / gradle / execution / GradleConsoleFilterProvider.java
1 /*
2  * Copyright 2000-2016 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 org.jetbrains.plugins.gradle.execution;
17
18 import com.intellij.execution.filters.ConsoleFilterProvider;
19 import com.intellij.execution.filters.Filter;
20 import com.intellij.execution.filters.RegexpFilter;
21 import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
22 import com.intellij.openapi.module.Module;
23 import com.intellij.openapi.module.ModuleManager;
24 import com.intellij.openapi.project.Project;
25 import com.intellij.openapi.roots.ProjectRootModificationTracker;
26 import com.intellij.openapi.util.io.FileUtil;
27 import com.intellij.openapi.util.text.StringUtil;
28 import com.intellij.psi.util.CachedValue;
29 import com.intellij.psi.util.CachedValueProvider;
30 import com.intellij.util.CachedValueImpl;
31 import org.jetbrains.annotations.NotNull;
32 import org.jetbrains.plugins.gradle.util.GradleConstants;
33
34 import java.util.regex.Matcher;
35 import java.util.regex.Pattern;
36
37 public class GradleConsoleFilterProvider implements ConsoleFilterProvider {
38   @NotNull
39   @Override
40   public Filter[] getDefaultFilters(@NotNull Project project) {
41     return new Filter[]{
42       new GradleConsoleFilter(project),
43       new RegexpFilter(project, RegexpFilter.FILE_PATH_MACROS + ":" + RegexpFilter.LINE_MACROS) {
44         private CachedValue<Boolean> myIsGradleProject = new CachedValueImpl<Boolean>(
45           () -> CachedValueProvider.Result.create(isGradleProject(), ProjectRootModificationTracker.getInstance(project)));
46
47         @Override
48         public Result applyFilter(String line, int entireLength) {
49           if (line == null || !FileUtil.isAbsolutePlatformIndependent(line)) return null;
50           if (Boolean.FALSE.equals(myIsGradleProject.getValue())) return null;
51           Result result = super.applyFilter(line, entireLength);
52           if (result == null) return null;
53           Pattern pattern = getPattern();
54           Matcher matcher = pattern.matcher(StringUtil.newBombedCharSequence(line, 100));
55           if (!matcher.lookingAt()) return result;
56           int lineStart = entireLength - line.length();
57           int start = lineStart + matcher.start();
58           int end = lineStart + matcher.end();
59           return new Result(start, end, result.getFirstHyperlinkInfo());
60         }
61
62         private boolean isGradleProject() {
63           for (Module module : ModuleManager.getInstance(project).getModules()) {
64             if (ExternalSystemApiUtil.isExternalSystemAwareModule(GradleConstants.SYSTEM_ID, module)) return true;
65           }
66           return false;
67         }
68       },
69     };
70   }
71 }