001 /*
002 GRANITE DATA SERVICES
003 Copyright (C) 2011 GRANITE DATA SERVICES S.A.S.
004
005 This file is part of Granite Data Services.
006
007 Granite Data Services is free software; you can redistribute it and/or modify
008 it under the terms of the GNU Library General Public License as published by
009 the Free Software Foundation; either version 2 of the License, or (at your
010 option) any later version.
011
012 Granite Data Services is distributed in the hope that it will be useful, but
013 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015 for more details.
016
017 You should have received a copy of the GNU Library General Public License
018 along with this library; if not, see <http://www.gnu.org/licenses/>.
019 */
020
021 package org.granite.tide.seam21;
022
023 import static org.jboss.seam.annotations.Install.FRAMEWORK;
024
025 import java.lang.reflect.Method;
026 import java.util.ArrayList;
027 import java.util.HashMap;
028 import java.util.List;
029 import java.util.Map;
030
031 import org.granite.tide.TideMessage;
032 import org.granite.tide.seam.AbstractSeamServiceContext;
033 import org.granite.util.Reflections;
034 import org.jboss.seam.ScopeType;
035 import org.jboss.seam.annotations.Install;
036 import org.jboss.seam.annotations.Name;
037 import org.jboss.seam.annotations.Scope;
038 import org.jboss.seam.annotations.intercept.BypassInterceptors;
039 import org.jboss.seam.international.StatusMessage;
040 import org.jboss.seam.international.StatusMessages;
041
042
043 /**
044 * @author William DRAI
045 */
046 @Scope(ScopeType.SESSION)
047 @Name("org.granite.tide.seam.serviceContext")
048 @Install(precedence=FRAMEWORK+1)
049 @BypassInterceptors
050 public class Seam21ServiceContext extends AbstractSeamServiceContext {
051
052 private static final long serialVersionUID = 1L;
053
054
055 @Override
056 protected void initTideMessages() {
057 StatusMessages.instance();
058 }
059
060 @Override
061 protected void clearTideMessages() {
062 StatusMessages statusMessages = StatusMessages.instance();
063 if (statusMessages instanceof TideStatusMessages)
064 ((TideStatusMessages)statusMessages).clear();
065 else {
066 try {
067 Reflections.invoke(statusMessages.getClass().getMethod("clear"), statusMessages);
068 }
069 catch (Exception e) {
070 log.error("Could not clear list of TideMessages", e);
071 }
072 }
073 }
074
075
076 /**
077 * Retrieve current messages
078 *
079 * @return list of messages
080 */
081 @Override
082 protected org.granite.tide.TideStatusMessages getTideMessages() {
083 StatusMessages statusMessages = StatusMessages.instance();
084 if (statusMessages == null)
085 return org.granite.tide.TideStatusMessages.EMPTY_STATUS_MESSAGES;
086
087 try {
088 // Execute and get the messages (once again reflection hack to use protected methods)
089 Method m = StatusMessages.class.getDeclaredMethod("doRunTasks");
090 m.setAccessible(true);
091 m.invoke(statusMessages);
092
093 Method m2 = StatusMessages.class.getDeclaredMethod("getMessages");
094 m2.setAccessible(true);
095 @SuppressWarnings("unchecked")
096 List<StatusMessage> messages = (List<StatusMessage>)m2.invoke(statusMessages);
097 List<TideMessage> tideMessages = new ArrayList<TideMessage>(messages.size());
098
099 log.debug("Found Messages: %b", !messages.isEmpty());
100 for (StatusMessage msg : messages) {
101 String severity = null;
102 if (msg.getSeverity() == StatusMessage.Severity.INFO)
103 severity = TideMessage.INFO;
104 else if (msg.getSeverity() == StatusMessage.Severity.WARN)
105 severity = TideMessage.WARNING;
106 else if (msg.getSeverity() == StatusMessage.Severity.ERROR)
107 severity = TideMessage.ERROR;
108 else if (msg.getSeverity() == StatusMessage.Severity.FATAL)
109 severity = TideMessage.FATAL;
110
111 tideMessages.add(new TideMessage(severity, msg.getSummary(), msg.getDetail()));
112 }
113
114 Method m3 = StatusMessages.class.getDeclaredMethod("getKeyedMessages");
115 m3.setAccessible(true);
116 @SuppressWarnings("unchecked")
117 Map<String, List<StatusMessage>> keyedMessages = (Map<String, List<StatusMessage>>)m3.invoke(statusMessages);
118 Map<String, List<TideMessage>> tideKeyedMessages = new HashMap<String, List<TideMessage>>(keyedMessages.size());
119 for (Map.Entry<String, List<StatusMessage>> me : keyedMessages.entrySet()) {
120 List<TideMessage> tmsgs = new ArrayList<TideMessage>(me.getValue().size());
121 for (StatusMessage msg : me.getValue()) {
122 String severity = null;
123 if (msg.getSeverity() == StatusMessage.Severity.INFO)
124 severity = TideMessage.INFO;
125 else if (msg.getSeverity() == StatusMessage.Severity.WARN)
126 severity = TideMessage.WARNING;
127 else if (msg.getSeverity() == StatusMessage.Severity.ERROR)
128 severity = TideMessage.ERROR;
129 else if (msg.getSeverity() == StatusMessage.Severity.FATAL)
130 severity = TideMessage.FATAL;
131
132 tmsgs.add(new TideMessage(severity, msg.getSummary(), msg.getDetail()));
133 }
134 tideKeyedMessages.put(me.getKey(), tmsgs);
135 }
136
137 return new org.granite.tide.TideStatusMessages(tideMessages, tideKeyedMessages);
138 }
139 catch (Exception e) {
140 log.error("Could not get status messages", e);
141 }
142
143 return org.granite.tide.TideStatusMessages.EMPTY_STATUS_MESSAGES;
144 }
145 }