/** * GRANITE DATA SERVICES * Copyright (C) 2006-2015 GRANITE DATA SERVICES S.A.S. * * This file is part of the Granite Data Services Platform. * * Granite Data Services is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * Granite Data Services is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA, or see <http://www.gnu.org/licenses/>. */ package org.granite.messaging.amf.process; import java.util.Date; import org.granite.config.GraniteConfig; import org.granite.context.GraniteContext; import org.granite.logging.Logger; import org.granite.messaging.service.ServiceException; import org.granite.messaging.service.ServiceFactory; import org.granite.messaging.service.ServiceInvoker; import org.granite.messaging.service.security.SecurityService; import org.granite.messaging.service.security.SecurityServiceException; import org.granite.messaging.webapp.ServletGraniteContext; import org.granite.util.UUIDUtil; import flex.messaging.messages.AcknowledgeMessage; import flex.messaging.messages.CommandMessage; import flex.messaging.messages.ErrorMessage; import flex.messaging.messages.Message; import flex.messaging.messages.RemotingMessage; /** * @author Franck WOLFF */ public abstract class AMF3MessageProcessor { private static final Logger log = Logger.getLogger(AMF3MessageProcessor.class); public static Message process(Message request) { GraniteContext context = GraniteContext.getCurrentInstance(); AMF3MessageInterceptor interceptor = ((GraniteConfig)context.getGraniteConfig()).getAmf3MessageInterceptor(); Message response = null; try { if (interceptor != null) interceptor.before(request); if (request instanceof RemotingMessage) response = processRemotingMessage((RemotingMessage)request); else if (request instanceof CommandMessage) response = processCommandMessage((CommandMessage)request); else throw new IllegalArgumentException("Unknown request message type: " + request); } finally { if (interceptor != null) interceptor.after(request, response); } if (context.getSessionId() != null) { response.setHeader("org.granite.sessionId", context.getSessionId()); if (((ServletGraniteContext)context).getSession(false) != null) { long serverTime = new Date().getTime(); ((ServletGraniteContext)context).getSession().setAttribute(GraniteContext.SESSION_LAST_ACCESSED_TIME_KEY, serverTime); response.setHeader("org.granite.time", serverTime); response.setHeader("org.granite.sessionExp", ((ServletGraniteContext)context).getSession().getMaxInactiveInterval()); } } return response; } public static Message processCommandMessage(CommandMessage request) { log.debug(">> Processing AMF3 request:\n%s", request); Message response = null; if (request.isSecurityOperation()) { GraniteContext context = GraniteContext.getCurrentInstance(); GraniteConfig config = context.getGraniteConfig(); if (!config.hasSecurityService()) log.warn("Ignored security operation (no security settings in granite-config.xml): %s", request); else { SecurityService securityService = config.getSecurityService(); try { if (request.isLoginOperation()) securityService.login(request.getBody(), (String)request.getHeader(Message.CREDENTIALS_CHARSET_HEADER)); else if (request.isLogoutOperation()) securityService.logout(); else log.warn("Unknown security operation: %s", request); } catch (Exception e) { if (e instanceof SecurityServiceException) { securityService.handleSecurityException((SecurityServiceException)e); log.debug(e, "Could not process security operation: %s", request); } else log.error(e, "Could not process security operation: %s", request); response = new ErrorMessage(request, e, true); } } } if (response == null) { response = new AcknowledgeMessage(request, true); // For SDK 2.0.1_Hotfix2. if (request.isSecurityOperation()) response.setBody("success"); } // For SDK 2.0.1_Hotfix2. if ("nil".equals(request.getHeader(Message.DS_ID_HEADER))) response.getHeaders().put(Message.DS_ID_HEADER, UUIDUtil.randomUUID()); log.debug("<< Returning AMF3 response:\n%s", response); return response; } public static Message processRemotingMessage(RemotingMessage request) { log.debug(">> Processing AMF3 request:\n%s", request); Message response = null; try { // Execute method on service. ServiceFactory factory = ServiceFactory.getFactoryInstance(request); ServiceInvoker<?> service = factory.getServiceInstance(request); Object result = service.invoke(request); response = new AcknowledgeMessage(request, true); response.setBody(result); } catch (ServiceException e) { log.debug(e, "Could not process remoting message: %s", request); response = new ErrorMessage(request, e); } log.debug("<< Returning AMF3 response:\n%s", response); return response; } }