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