001/*
002 * Copyright 2010-2013 JetBrains s.r.o.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package org.jetbrains.jet.cli.common.messages;
018
019import com.google.common.collect.LinkedHashMultimap;
020import com.google.common.collect.Multimap;
021import org.jetbrains.annotations.NotNull;
022
023import java.util.Collection;
024
025public class GroupingMessageCollector implements MessageCollector {
026
027    private final MessageCollector delegate;
028
029    // File path (nullable) -> message
030    private final Multimap<String, Message> groupedMessages = LinkedHashMultimap.create();
031
032    public GroupingMessageCollector(@NotNull MessageCollector delegate) {
033        this.delegate = delegate;
034    }
035
036    @Override
037    public void report(
038            @NotNull CompilerMessageSeverity severity,
039            @NotNull String message,
040            @NotNull CompilerMessageLocation location
041    ) {
042        if (CompilerMessageSeverity.VERBOSE.contains(severity)) {
043            delegate.report(severity, message, location);
044        }
045        else {
046            groupedMessages.put(location.getPath(), new Message(severity, message, location));
047        }
048    }
049
050    public void flush() {
051        for (String path : groupedMessages.keySet()) {
052            Collection<Message> messages = groupedMessages.get(path);
053            for (Message message : messages) {
054                delegate.report(message.severity, message.message, message.location);
055            }
056        }
057        groupedMessages.clear();
058    }
059
060    private static class Message {
061        private final CompilerMessageSeverity severity;
062        private final String message;
063        private final CompilerMessageLocation location;
064
065        private Message(@NotNull CompilerMessageSeverity severity, @NotNull String message, @NotNull CompilerMessageLocation location) {
066            this.severity = severity;
067            this.message = message;
068            this.location = location;
069        }
070
071        @Override
072        public boolean equals(Object o) {
073            if (this == o) return true;
074            if (o == null || getClass() != o.getClass()) return false;
075
076            Message message1 = (Message) o;
077
078            if (!location.equals(message1.location)) return false;
079            if (!message.equals(message1.message)) return false;
080            if (severity != message1.severity) return false;
081
082            return true;
083        }
084
085        @Override
086        public int hashCode() {
087            int result = severity.hashCode();
088            result = 31 * result + message.hashCode();
089            result = 31 * result + location.hashCode();
090            return result;
091        }
092    }
093}