added handler for apple awt bug - http://www.jetbrains.net/devnet/thread/278896
[fedora-idea.git] / platform / platform-impl / src / com / intellij / ide / ToolkitBugsProcessor.java
blob660ac475114b417bc904d5a9a01ef8aeb8ace128
1 /*
2 * Copyright 2000-2010 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 com.intellij.ide;
18 import com.intellij.openapi.diagnostic.Logger;
19 import com.intellij.openapi.util.SystemInfo;
20 import com.intellij.openapi.util.registry.Registry;
21 import com.intellij.openapi.util.text.StringUtil;
23 import java.lang.reflect.Modifier;
24 import java.util.ArrayList;
25 import java.util.List;
27 public class ToolkitBugsProcessor {
29 private static final Logger LOG = Logger.getInstance("ToolkitBugProcessor");
31 List<Handler> myHandlers = new ArrayList<Handler>();
33 public ToolkitBugsProcessor() {
34 Class<?>[] classes = getClass().getDeclaredClasses();
35 for (Class<?> each : classes) {
36 if ((each.getModifiers() & Modifier.ABSTRACT) > 0) continue;
37 if (Handler.class.isAssignableFrom(each)) {
38 try {
39 Handler eachHandler = (Handler)each.newInstance();
40 if (eachHandler.isActual()) {
41 myHandlers.add(eachHandler);
44 catch (Throwable e) {
45 LOG.error(e);
46 continue;
52 public boolean process(Throwable e) {
53 if (!Registry.is("ide.consumeKnownToolkitBugs")) return false;
55 StackTraceElement[] stack = e.getStackTrace();
56 for (Handler each : myHandlers) {
57 if (each.process(e, stack)) {
58 LOG.info("Ignored exception by toolkit bug processor, bug id=" + each.toString() + " desc=" + each.getDetails());
59 return true;
62 return false;
66 abstract static class Handler {
68 private String myDetails;
70 protected Handler() {
71 myDetails = StringUtil.getShortName(getClass().getName());
74 protected Handler(String details) {
75 myDetails = details;
78 abstract boolean process(Throwable e, StackTraceElement[] stack);
80 boolean isActual() {
81 return true;
84 public String getDetails() {
85 return myDetails;
88 @Override
89 public String toString() {
90 String className = getClass().getName();
91 String name = className.substring(className.lastIndexOf("$") + 1);
92 if (name.startsWith("Sun_")) {
93 name = name.substring("Sun_".length());
94 return "http://bugs.sun.com/view_bug.do?bug_id=" + name;
96 return super.toString();
100 static class Sun_6857057 extends Handler {
101 Sun_6857057() {
102 super("text editor component - sync between model and view while dnd operations");
105 @Override
106 public boolean process(Throwable e, StackTraceElement[] stack) {
107 if (e instanceof ArrayIndexOutOfBoundsException && stack.length > 5) {
108 return stack[0].getClassName().equals("sun.font.FontDesignMetrics")
109 && stack[0].getMethodName().equals("charsWidth")
110 && stack[5].getClassName().equals("javax.swing.text.CompositeView")
111 && stack[5].getMethodName().equals("viewToModel");
113 return false;
117 static class Apple_ExceptionOnChangingMonitors extends Handler {
119 @Override
120 boolean isActual() {
121 return SystemInfo.isMac;
124 @Override
125 boolean process(Throwable e, StackTraceElement[] stack) {
126 if (e instanceof ArrayIndexOutOfBoundsException && stack.length > 1) {
127 return stack[0].getClassName().equals("apple.awt.CWindow")
128 && stack[0].getMethodName().equals("displayChanged");
131 return false;
134 @Override
135 public String toString() {
136 return "http://www.jetbrains.net/devnet/thread/278896";