/* * Copyright (C) 2010 Red Hat, Inc. and/or its affiliates. * * 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.jboss.errai.bus.server; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.jboss.errai.bus.client.api.base.MessageBuilder; import org.jboss.errai.bus.client.api.messaging.Message; import org.jboss.errai.bus.client.api.messaging.MessageCallback; import org.jboss.errai.bus.server.HttpSessionProvider.SessionsContainer; import org.jboss.errai.bus.server.annotations.Service; /** * Attempts to serialize all attributes of the current HttpSession each time called. */ @Service public class SessionPassivationService implements MessageCallback { @Override public void callback(Message message) { System.out.println("Attempting to serialize the session..."); HttpServletRequest request = message.getResource(HttpServletRequest.class, HttpServletRequest.class.getName()); HttpSession session = request.getSession(); for (Enumeration<String> names = session.getAttributeNames(); names.hasMoreElements(); ) { String name = names.nextElement(); Object attribute = session.getAttribute(name); Object deserializedAttribute = null; System.out.println("Session attribute: " + name); try { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); new ObjectOutputStream(bytes).writeObject(attribute); deserializedAttribute = new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray())).readObject(); } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException("Session is not serializable! Offending attribute: " + name); } if (attribute instanceof HttpSession) { throw new RuntimeException("The session contains an HttpSession! This is not allowed!"); } if (attribute instanceof SessionsContainer) { // this could cause a NPE if session doesn't deserialize properly ((SessionsContainer) deserializedAttribute).getSession("doesn't matter"); } } MessageBuilder.createConversation(message) .subjectProvided() .done().reply(); } }