/*
* Copyright 2003-2011 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jetbrains.mps.messages;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.module.SModule;
/**
* @author Kostik
*/
public class Message implements IMessage {
private static final Logger LOG = LogManager.getLogger(Message.class);
private String mySender;
private MessageKind myKind;
private String myText;
private Throwable myException;
private String myHelpUrl;
private long myCreationTime = System.currentTimeMillis();
private Object myHintObject; public Message(MessageKind kind, @Nullable String sender, String text) {
myKind = kind;
mySender = sender;
myText = text;
}
public Message(MessageKind kind, @NotNull Class sender, String text) {
this(kind, sender.getSimpleName(), text);
}
public Message(MessageKind kind, String text) {
this(kind, (String) null, text);
}
@Override
public String getHelpUrl() {
return myHelpUrl;
}
public void setHelpUrl(String helpUrl) {
myHelpUrl = helpUrl;
}
/**
* @return <code>this</code> for convenience
*/
public Message setException(Throwable exception) {
myException = exception;
return this;
}
@Override
public MessageKind getKind() {
return myKind;
}
@Override
public Throwable getException() {
return myException;
}
@Override
public String getText() {
return myText;
}
@Override
public String getSender() {
return mySender;
}
public String toString() {
String prefix = ((mySender == null) ? "" : "[" + mySender + "] ");
return prefix + getText();
}
@Override
public long getCreationTime() {
return myCreationTime;
}
/**
* @return <code>this</code> for convenience
*/
public Message setHintObject(@Nullable Object obj) {
boolean error = true;
if (obj instanceof SNode) {
myHintObject = ((SNode) obj).getReference();
} else if (obj instanceof SModel) {
myHintObject = ((SModel) obj).getReference();
} else if (obj instanceof SModule) {
myHintObject = ((SModule) obj).getModuleReference();
} else {
myHintObject = obj;
error = false;
}
if (error) {
LOG.error("Adding a message with " + obj.getClass().getSimpleName() + " hint object. This can lead to memleaks. Changing hint object to a reference.", new Throwable());
}
return this;
}
@Override
public Object getHintObject() {
return myHintObject;
}
public static IMessage createMessage(@NotNull MessageKind kind, @NotNull String sender, @NotNull String text) {
return createMessage(kind, sender, text, null);
}
public static IMessage createMessage(@NotNull MessageKind kind, @NotNull String sender, @NotNull String text, @Nullable Object hint) {
Message m = new Message(kind, sender, text);
m.setHintObject(hint);
return m;
}
public static IMessage createMessage(@NotNull MessageKind kind, @NotNull String sender, @NotNull String text, @Nullable Throwable ex) {
Message m = new Message(kind, sender, text);
if (ex != null) {
m.setException(ex);
}
return m;
}
}