replaced <code></code> with more concise {@code}
[idea/community.git] / platform / platform-impl / src / com / intellij / diagnostic / LogMessageEx.java
1 /*
2  * Copyright 2000-2011 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.diagnostic;
17
18 import com.intellij.openapi.diagnostic.Attachment;
19 import com.intellij.openapi.diagnostic.IdeaLoggingEvent;
20 import com.intellij.openapi.diagnostic.Logger;
21 import com.intellij.util.ExceptionUtil;
22 import org.jetbrains.annotations.NonNls;
23 import org.jetbrains.annotations.NotNull;
24 import org.jetbrains.annotations.Nullable;
25
26 import java.io.PrintStream;
27 import java.io.PrintWriter;
28 import java.util.Arrays;
29 import java.util.Collection;
30 import java.util.Collections;
31
32 /**
33  * @author ksafonov
34  */
35 public class LogMessageEx extends LogMessage {
36   private final IdeaLoggingEvent myEvent;
37   private final String myTitle;
38   private final String myNotificationText;
39
40   /**
41    * @param title            text to show in Event Log tool window entry (it comes before 'more')
42    * @param notificationText text to show in the error balloon that is popped up automatically
43    */
44   public LogMessageEx(IdeaLoggingEvent aEvent, String title, String notificationText) {
45     super(aEvent);
46     myEvent = aEvent;
47     myTitle = title;
48     myNotificationText = notificationText;
49   }
50
51   /**
52    * @return text to show in the error balloon that is popped up automatically
53    */
54   public String getNotificationText() {
55     return myNotificationText;
56   }
57
58   /**
59    * @return text to show in Event Log tool window entry (it comes before 'more')
60    */
61   public String getTitle() {
62     return myTitle;
63   }
64
65   public IdeaLoggingEvent toEvent() {
66     return myEvent;
67   }
68
69   /**
70    * @param userMessage      user-friendly message description (short, single line if possible)
71    * @param details          technical details (exception stack trace etc.)
72    * @param attachments      attachments that will be suggested to include to the report
73    */
74   public static IdeaLoggingEvent createEvent(String userMessage, final String details, final Attachment... attachments) {
75     return createEvent(userMessage, details, userMessage, null, Arrays.asList(attachments));
76   }
77
78
79   /**
80    * @param userMessage      user-friendly message description (short, single line if possible)
81    * @param details          technical details (exception stack trace etc.)
82    * @param title            text to show in Event Log tool window entry (it comes before 'more'), use {@code null} to reuse {@code userMessage}
83    * @param notificationText text to show in the error balloon that is popped up automatically. Default is {@code com.intellij.diagnostic.IdeMessagePanel#INTERNAL_ERROR_NOTICE}
84    * @param attachments      attachments that will be suggested to include to the report
85    */
86   public static IdeaLoggingEvent createEvent(final String userMessage,
87                                              final String details,
88                                              @Nullable final String title,
89                                              @Nullable final String notificationText,
90                                              final Collection<Attachment> attachments) {
91     final Throwable throwable = new Throwable() {
92       @Override
93       public void printStackTrace(PrintWriter s) {
94         s.print(details);
95       }
96
97       @Override
98       public void printStackTrace(PrintStream s) {
99         s.print(details);
100       }
101     };
102
103     return new IdeaLoggingEvent(userMessage, throwable) {
104       @Override
105       public Object getData() {
106         final LogMessageEx logMessageEx = new LogMessageEx(this, title != null ? title : userMessage, notificationText);
107         for (Attachment attachment : attachments) {
108           logMessageEx.addAttachment(attachment);
109         }
110         return logMessageEx;
111       }
112     };
113   }
114
115   public static void error(@NotNull Logger logger, @NonNls @NotNull String message, @NotNull String... attachmentText) {
116     error(logger, message, new Throwable(), attachmentText);
117   }
118
119   public static void error(@NotNull Logger logger,
120                            @NotNull String message,
121                            @NotNull Throwable cause,
122                            @NotNull String... attachmentText) {
123     StringBuilder detailsBuffer = new StringBuilder();
124     for (String detail : attachmentText) {
125       detailsBuffer.append(detail).append(",");
126     }
127     if (attachmentText.length > 0 && detailsBuffer.length() > 0) {
128       detailsBuffer.setLength(detailsBuffer.length() - 1);
129     }
130     Attachment attachment = detailsBuffer.length() > 0 ? new Attachment("current-context.txt", detailsBuffer.toString()) : null;
131     logger.error(createEvent(message, ExceptionUtil.getThrowableText(cause), null, null, attachment));
132   }
133
134   /**
135    * @param userMessage      user-friendly message description (short, single line if possible)
136    * @param details          technical details (exception stack trace etc.)
137    * @param title            text to show in Event Log tool window entry (it comes before 'more'), use {@code null} to reuse {@code userMessage}
138    * @param notificationText text to show in the error balloon that is popped up automatically. Default is {@code com.intellij.diagnostic.IdeMessagePanel#INTERNAL_ERROR_NOTICE}
139    * @param attachment       attachment that will be suggested to include to the report
140    */
141   public static IdeaLoggingEvent createEvent(String userMessage,
142                                              final String details,
143                                              @Nullable final String title,
144                                              @Nullable final String notificationText,
145                                              @Nullable Attachment attachment) {
146     return createEvent(userMessage, details, title, notificationText,
147                        attachment != null ? Collections.singletonList(attachment) : Collections.emptyList());
148   }
149 }