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 java.lang.reflect.Method; 025import java.util.ArrayList; 026import java.util.HashMap; 027import java.util.List; 028import java.util.Map; 029 030import org.granite.config.flex.Destination; 031import org.granite.logging.Logger; 032import org.granite.messaging.service.ExtendedServiceExceptionHandler; 033import org.granite.messaging.service.ServiceException; 034import org.granite.tide.TideMessage; 035import org.jboss.seam.international.StatusMessage; 036import org.jboss.seam.international.StatusMessages; 037 038import flex.messaging.messages.Message; 039 040 041/** 042 * @author Venkat DANDA 043 * @author Cameron INGRAM 044 * 045 * Update services-config.xml to use the seam service exception handler 046 * <factory id="tideSeamFactory" class="org.granite.tide.seam.SeamServiceFactory" > 047 * <properties> 048 * <service-exception-handler>org.granite.tide.seam.SeamServiceExceptionHandler</service-exception-handler> 049 * </properties> 050 * </factory> 051 */ 052public class Seam21ServiceExceptionHandler extends ExtendedServiceExceptionHandler { 053 054 private static final long serialVersionUID = -1L; 055 056 private static final Logger log = Logger.getLogger(Seam21ServiceExceptionHandler.class); 057 058 059 public Seam21ServiceExceptionHandler() { 060 super(true); 061 } 062 063 public Seam21ServiceExceptionHandler(boolean logException) { 064 super(logException); 065 } 066 067 068 @Override 069 protected ServiceException getServiceException(Message request, Destination destination, String method, Throwable t) { 070 ServiceException se = super.getServiceException(request, destination, method, t); 071 072 StatusMessages statusMessages = StatusMessages.instance(); 073 if (statusMessages != null) { 074 List<TideMessage> tideMessages = new ArrayList<TideMessage>(); 075 Map<String, List<TideMessage>> tideKeyedMessages = new HashMap<String, List<TideMessage>>(); 076 try { 077 // Execute and get the messages (once again reflection hack to use protected methods) 078 Method m = StatusMessages.class.getDeclaredMethod("doRunTasks"); 079 m.setAccessible(true); 080 m.invoke(statusMessages); 081 082 Method m2 = StatusMessages.class.getDeclaredMethod("getMessages"); 083 m2.setAccessible(true); 084 @SuppressWarnings("unchecked") 085 List<StatusMessage> messages = (List<StatusMessage>)m2.invoke(statusMessages); 086 087 for (StatusMessage msg : messages) { 088 String severity = null; 089 if (msg.getSeverity() == StatusMessage.Severity.INFO) 090 severity = TideMessage.INFO; 091 else if (msg.getSeverity() == StatusMessage.Severity.WARN) 092 severity = TideMessage.WARNING; 093 else if (msg.getSeverity() == StatusMessage.Severity.ERROR) 094 severity = TideMessage.ERROR; 095 else if (msg.getSeverity() == StatusMessage.Severity.FATAL) 096 severity = TideMessage.FATAL; 097 098 tideMessages.add(new TideMessage(severity, msg.getSummary(), msg.getDetail())); 099 } 100 101 Method m3 = StatusMessages.class.getDeclaredMethod("getKeyedMessages"); 102 m3.setAccessible(true); 103 @SuppressWarnings("unchecked") 104 Map<String, List<StatusMessage>> keyedMessages = (Map<String, List<StatusMessage>>)m3.invoke(statusMessages); 105 for (Map.Entry<String, List<StatusMessage>> me : keyedMessages.entrySet()) { 106 List<TideMessage> tmsgs = new ArrayList<TideMessage>(me.getValue().size()); 107 for (StatusMessage msg : me.getValue()) { 108 String severity = null; 109 if (msg.getSeverity() == StatusMessage.Severity.INFO) 110 severity = TideMessage.INFO; 111 else if (msg.getSeverity() == StatusMessage.Severity.WARN) 112 severity = TideMessage.WARNING; 113 else if (msg.getSeverity() == StatusMessage.Severity.ERROR) 114 severity = TideMessage.ERROR; 115 else if (msg.getSeverity() == StatusMessage.Severity.FATAL) 116 severity = TideMessage.FATAL; 117 118 tmsgs.add(new TideMessage(severity, msg.getSummary(), msg.getDetail())); 119 } 120 tideKeyedMessages.put(me.getKey(), tmsgs); 121 } 122 } 123 catch (Exception e) { 124 log.error("Could not get status messages", e); 125 } 126 se.getExtendedData().put("messages", tideMessages); 127 se.getExtendedData().put("keyedMessages", tideKeyedMessages); 128 } 129 return se; 130 } 131}