/*
* Copyright (c) 2001-2007, Inversoft Inc., All Rights Reserved
*
* 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 org.primeframework.mvc.message;
import com.google.inject.Inject;
import org.primeframework.mvc.message.scope.*;
import java.util.*;
/**
* This is the default message workflow implementation. It removes all flash messages from the session and places them
* in the request.
*
* @author Brian Pontarelli
*/
public class DefaultMessageStore implements MessageStore {
private final Map<MessageScope, Scope> scopes = new LinkedHashMap<MessageScope, Scope>();
private final RequestScope requestScope;
@Inject
public DefaultMessageStore(ApplicationScope applicationScope, SessionScope sessionScope, FlashScope flashScope, RequestScope requestScope) {
scopes.put(MessageScope.REQUEST, requestScope);
scopes.put(MessageScope.FLASH, flashScope);
scopes.put(MessageScope.SESSION, sessionScope);
scopes.put(MessageScope.APPLICATION, applicationScope);
this.requestScope = requestScope;
}
@Override
public void add(Message message) {
requestScope.add(message);
}
@Override
public void add(MessageScope scope, Message message) {
Scope s = scopes.get(scope);
s.add(message);
}
@Override
public void addAll(MessageScope scope, Collection<Message> messages) {
Scope s = scopes.get(scope);
s.addAll(messages);
}
@Override
public List<Message> get() {
List<Message> messages = new ArrayList<Message>();
for (Scope scope : scopes.values()) {
messages.addAll(scope.get());
}
return messages;
}
@Override
public List<Message> get(MessageScope scope) {
List<Message> messages = new ArrayList<Message>();
Scope s = scopes.get(scope);
messages.addAll(s.get());
return messages;
}
@Override
public List<Message> getGeneralMessages() {
List<Message> messages = get();
List<Message> list = new ArrayList<Message>();
for (Message message : messages) {
if (!(message instanceof FieldMessage)) {
list.add(message);
}
}
return list;
}
@Override
public Map<String, List<FieldMessage>> getFieldMessages() {
List<Message> messages = get();
Map<String, List<FieldMessage>> map = new HashMap<String, List<FieldMessage>>();
for (Message message : messages) {
if (message instanceof FieldMessage) {
FieldMessage fm = (FieldMessage) message;
List<FieldMessage> list = map.get(fm.getField());
if (list == null) {
list = new ArrayList<FieldMessage>();
map.put(fm.getField(), list);
}
list.add(fm);
}
}
return map;
}
@Override
public Map<String, List<FieldMessage>> getFieldMessages(MessageScope scope) {
List<Message> messages = get(scope);
Map<String, List<FieldMessage>> map = new HashMap<String, List<FieldMessage>>();
for (Message message : messages) {
if (message instanceof FieldMessage) {
FieldMessage fm = (FieldMessage) message;
List<FieldMessage> list = map.get(fm.getField());
if (list == null) {
list = new ArrayList<FieldMessage>();
map.put(fm.getField(), list);
}
list.add(fm);
}
}
return map;
}
@Override
public void clear() {
for (Scope scope : scopes.values()) {
scope.clear();
}
}
@Override
public void clear(MessageScope scope) {
scopes.get(scope).clear();
}
}